[DMenu] Add option to read from file instead of stdin.

This commit is contained in:
Dave Davenport 2015-12-03 18:21:23 +01:00
parent 2195efd3bf
commit 697abdfdfc
3 changed files with 25 additions and 4 deletions

View File

@ -7,6 +7,7 @@
- Autodetect number of HW-threads. - Autodetect number of HW-threads.
- Disabled by default. - Disabled by default.
- Highlight multiple selected rows (#287) - Highlight multiple selected rows (#287)
- Dmenu can read from file instead of stdin.
Improvements: Improvements:
- Improve speed of reading stdin in dmenu mode. - Improve speed of reading stdin in dmenu mode.
- Correctly handle modifier keys now. Should now support most weird keyboard layouts and switching between them. - Correctly handle modifier keys now. Should now support most weird keyboard layouts and switching between them.

View File

@ -29,7 +29,7 @@
[ -display *display* ] [ -display *display* ]
[ -bc *color* ] [ -bc *color* ]
[ -bw *width* ] [ -bw *width* ]
[ -dmenu [ -p *prompt* ] [ -sep *separator* ] [ -l *selected line* ] [ -mesg ] [ -select ] ] [ -dmenu [ -p *prompt* ] [ -sep *separator* ] [ -l *selected line* ] [ -mesg ] [ -select ] [ -input *input* ] ]
[ -filter *filter* ] [ -filter *filter* ]
[ -ssh-client *client* ] [ -ssh-client *client* ]
[ -ssh-command *command* ] [ -ssh-command *command* ]
@ -632,6 +632,10 @@ Dump the filtered list to stdout and quit.
This can be used to get the list as **rofi** would filter it. This can be used to get the list as **rofi** would filter it.
Use together with `-filter` command. Use together with `-filter` command.
`-input` *file*
Reads from *file* instead of stdin.
### Message dialog ### Message dialog
`-e` *message* `-e` *message*

View File

@ -33,6 +33,7 @@
#include <string.h> #include <string.h>
#include <ctype.h> #include <ctype.h>
#include <stdint.h> #include <stdint.h>
#include <errno.h>
#include "rofi.h" #include "rofi.h"
#include "dialogs/dmenu.h" #include "dialogs/dmenu.h"
#include "helper.h" #include "helper.h"
@ -63,7 +64,7 @@ typedef struct _DmenuModePrivateData
unsigned int cmd_list_length; unsigned int cmd_list_length;
} DmenuModePrivateData; } DmenuModePrivateData;
static char **get_dmenu ( unsigned int *length ) static char **get_dmenu ( FILE *fd, unsigned int *length )
{ {
TICK_N ( "Read stdin START" ); TICK_N ( "Read stdin START" );
char **retv = NULL; char **retv = NULL;
@ -73,7 +74,7 @@ static char **get_dmenu ( unsigned int *length )
gchar *data = NULL; gchar *data = NULL;
size_t data_l = 0; size_t data_l = 0;
ssize_t l = 0; ssize_t l = 0;
while ( ( l = getdelim ( &data, &data_l, config.separator, stdin ) ) > 0 ) { while ( ( l = getdelim ( &data, &data_l, config.separator, fd ) ) > 0 ) {
if ( rvlength < ( *length + 2 ) ) { if ( rvlength < ( *length + 2 ) ) {
rvlength *= 2; rvlength *= 2;
retv = g_realloc ( retv, ( rvlength ) * sizeof ( char* ) ); retv = g_realloc ( retv, ( rvlength ) * sizeof ( char* ) );
@ -286,7 +287,22 @@ static void dmenu_mode_init ( Mode *sw )
if ( find_arg ( "-i" ) >= 0 ) { if ( find_arg ( "-i" ) >= 0 ) {
config.case_sensitive = FALSE; config.case_sensitive = FALSE;
} }
pd->cmd_list = get_dmenu ( &( pd->cmd_list_length ) ); FILE *fd = NULL;
str = NULL;
if ( find_arg_str ("-input", &str)) {
char *estr = rofi_expand_path(str);
fd = fopen(str, "r");
if(fd == NULL ){
char *msg = g_markup_printf_escaped("Failed to open file: <b>%s</b>:\n\t<i>%s</i>", estr, strerror(errno));
error_dialog (msg,TRUE);
g_free(msg);
g_free(estr);
return;
}
g_free(estr);
}
pd->cmd_list = get_dmenu ( fd == NULL?stdin:fd , &( pd->cmd_list_length ) );
if(fd != NULL ) fclose(fd);
} }
static int dmenu_token_match ( const Mode *sw, char **tokens, int not_ascii, int case_sensitive, unsigned int index ) static int dmenu_token_match ( const Mode *sw, char **tokens, int not_ascii, int case_sensitive, unsigned int index )