This commit is contained in:
QC 2014-01-30 10:02:01 +01:00
parent bbe4a3d330
commit 760a634731
3 changed files with 73 additions and 61 deletions

View File

@ -63,10 +63,11 @@ static char **get_dmenu ( )
int index = 0;
char buffer[1024];
while(fgets(buffer, 1024, stdin) != NULL) {
retv = realloc(retv, (index+2)*sizeof(char*));
retv[index] = strdup(buffer);
retv[index][strlen(buffer)-1] = '\0';
while ( fgets( buffer, 1024, stdin ) != NULL ) {
retv = realloc( retv, ( index+2 )*sizeof( char* ) );
retv[index] = strdup( buffer );
retv[index][strlen( buffer )-1] = '\0';
retv[index+1] = NULL;
index++;
}
@ -116,13 +117,14 @@ SwitcherMode dmenu_switcher_dialog ( char **input )
if ( n == -2 ) {
retv = DMENU_DIALOG;
} else if ( n >=0 && list[n] != NULL ) {
fputs(list[n],stdout);
fputs( list[n],stdout );
}
for ( unsigned int i=0; list[i] != NULL; i++ ) {
free( list[i] );
}
free(list);
free( list );
return retv;
}

View File

@ -62,7 +62,7 @@ static inline int execsh( const char *cmd ,int run_in_term )
return execlp( "/bin/sh", "sh", "-c", cmd, NULL );
}
static void exec_json( const char *cmd, int run_in_term)
static void exec_json( const char *cmd, int run_in_term )
{
if ( !cmd || !cmd[0] ) return;
@ -85,7 +85,7 @@ typedef struct pmenu {
char **commands;
} pmenu;
static struct json_object * read_json_file_descr(FILE *fd)
static struct json_object * read_json_file_descr( FILE *fd )
{
struct json_object *jo = NULL;
enum json_tokener_error err;
@ -93,21 +93,23 @@ static struct json_object * read_json_file_descr(FILE *fd)
char buffer[64];
ssize_t len = 0;
while( (len = fread(buffer, 1, 64, fd)) > 0) {
jo = json_tokener_parse_ex(tok, buffer, len);
while ( ( len = fread( buffer, 1, 64, fd ) ) > 0 ) {
jo = json_tokener_parse_ex( tok, buffer, len );
if((err = json_tokener_get_error(tok)) != json_tokener_continue)
{
if(err != json_tokener_success) {
fprintf(stderr, "Error parsing json file: %s\n", json_tokener_error_desc(err));
if ( ( err = json_tokener_get_error( tok ) ) != json_tokener_continue ) {
if ( err != json_tokener_success ) {
fprintf( stderr, "Error parsing json file: %s\n", json_tokener_error_desc( err ) );
jo = NULL;
}
break;
}
}
}
// Get reference before we destroy the tokener.
if(jo) json_object_get(jo);
json_tokener_free(tok);
if ( jo ) json_object_get( jo );
json_tokener_free( tok );
return jo;
}
@ -120,59 +122,64 @@ static pmenu *get_json ( )
#endif
struct json_object *jo = NULL;
if(json_input_file != NULL) {
if (json_input_file[0] == '-' && json_input_file[1] == '\0') {
jo = read_json_file_descr(stdin);
}
else if (json_input_file[0] == '{' && strlen(json_input_file) > 3) {
jo = json_tokener_parse(json_input_file);
}
else
{
FILE *fd = fopen(json_input_file, "r");
if(fd == NULL) {
fprintf(stderr, "Failed to open file: %s: %s\n",
json_input_file, strerror(errno));
if ( json_input_file != NULL ) {
if ( json_input_file[0] == '-' && json_input_file[1] == '\0' ) {
jo = read_json_file_descr( stdin );
} else if ( json_input_file[0] == '{' && strlen( json_input_file ) > 3 ) {
jo = json_tokener_parse( json_input_file );
} else {
FILE *fd = fopen( json_input_file, "r" );
if ( fd == NULL ) {
fprintf( stderr, "Failed to open file: %s: %s\n",
json_input_file, strerror( errno ) );
return NULL;
}
jo = read_json_file_descr(fd);
fclose(fd);
jo = read_json_file_descr( fd );
fclose( fd );
}
}
}
if(jo && json_object_get_type(jo) != json_type_object) {
fprintf(stderr, "Json file has invalid root type.\n");
json_object_put(jo);
if ( jo && json_object_get_type( jo ) != json_type_object ) {
fprintf( stderr, "Json file has invalid root type.\n" );
json_object_put( jo );
jo = NULL;
}
// Create error and exit.
if(jo == NULL ) {
if ( jo == NULL ) {
return NULL;
}
pmenu *retv = allocate_clear(sizeof(*retv));
pmenu *retv = allocate_clear( sizeof( *retv ) );
struct json_object *jo2;
if(json_object_object_get_ex(jo, "prompt", &jo2)) {
retv->prompt = strdup(json_object_get_string(jo2));
}
if(json_object_object_get_ex(jo, "run-in-terminal", &jo2)) {
retv->execute_in_term = json_object_get_int(jo2);
if ( json_object_object_get_ex( jo, "prompt", &jo2 ) ) {
retv->prompt = strdup( json_object_get_string( jo2 ) );
}
if(json_object_object_get_ex(jo, "commands", &jo2)) {
json_object_object_foreach(jo2, key, child) {
if ( json_object_object_get_ex( jo, "run-in-terminal", &jo2 ) ) {
retv->execute_in_term = json_object_get_int( jo2 );
}
if ( json_object_object_get_ex( jo, "commands", &jo2 ) ) {
json_object_object_foreach( jo2, key, child ) {
retv->entries= realloc( retv->entries, ( retv->num_entries+2 )*sizeof( char* ) );
retv->entries[retv->num_entries] = strdup( key);
retv->entries[retv->num_entries] = strdup( key );
retv->entries[retv->num_entries+1] = NULL;
retv->commands= realloc( retv->commands, ( retv->num_entries+2 )*sizeof( char* ) );
retv->commands[retv->num_entries] = strdup( json_object_get_string(child));
retv->commands[retv->num_entries] = strdup( json_object_get_string( child ) );
retv->commands[retv->num_entries+1] = NULL;
retv->num_entries++;
}
}
json_object_put(jo);
json_object_put( jo );
@ -213,7 +220,7 @@ SwitcherMode json_switcher_dialog ( char **input )
return retv;
}
if(list->num_entries > 0) {
if ( list->num_entries > 0 ) {
int shift=0;
int n = menu( list->entries, input, list->prompt, NULL, &shift,token_match, NULL );
@ -221,20 +228,23 @@ SwitcherMode json_switcher_dialog ( char **input )
if ( n == -2 ) {
retv = JSON_DIALOG;
} else if ( n >=0 && list->commands[n] != NULL ) {
exec_json( list->commands[n], list->execute_in_term);
exec_json( list->commands[n], list->execute_in_term );
}
} else {
fprintf(stderr, "No commands found in json file\n");
fprintf( stderr, "No commands found in json file\n" );
}
for ( unsigned int i=0; i < list->num_entries; i++ ) {
free( list->entries[i] );
free( list->commands[i] );
}
if(list->entries)free( list->entries );
if(list->commands)free( list->commands );
if(list->prompt)free( list->prompt );
if ( list->entries )free( list->entries );
if ( list->commands )free( list->commands );
if ( list->prompt )free( list->prompt );
return retv;
}

View File

@ -1202,8 +1202,7 @@ void run_switcher( int fmode, SwitcherMode mode )
#endif // __QC_MODE__
else if ( mode == JSON_DIALOG ) {
retv = json_switcher_dialog ( &input );
}
else if ( mode == DMENU_DIALOG ) {
} else if ( mode == DMENU_DIALOG ) {
retv = dmenu_switcher_dialog ( &input );
}
@ -1387,7 +1386,7 @@ int main( int argc, char *argv[] )
find_arg_str( argc, argv, "-term", &( config.terminal_emulator ) );
if(find_arg ( argc, argv, "-zeltak") >= 0) {
if ( find_arg ( argc, argv, "-zeltak" ) >= 0 ) {
config.zeltak_mode = 1;
}
@ -1398,7 +1397,8 @@ int main( int argc, char *argv[] )
find_arg_int( argc, argv, "-lines",&( config.menu_lines ) );
find_arg_int( argc, argv, "-loc", &( config.location ) );
if( find_arg( argc, argv, "-hmode" ) >= 0) {
if ( find_arg( argc, argv, "-hmode" ) >= 0 ) {
config.wmode = HORIZONTAL;
}
@ -1432,11 +1432,11 @@ int main( int argc, char *argv[] )
run_switcher( NOFORK, MARK_DIALOG );
#endif
} else if ( find_arg( argc, argv, "-json" ) >= 0 ) {
find_arg_str( argc, argv, "-json", &json_input_file);
find_arg_str( argc, argv, "-json", &json_input_file );
run_switcher( NOFORK, JSON_DIALOG );
} else if ( find_arg( argc, argv, "-dmenu" ) >= 0 ) {
find_arg_str( argc, argv, "-dmenu", &dmenu_prompt);
run_switcher( NOFORK, DMENU_DIALOG);
find_arg_str( argc, argv, "-dmenu", &dmenu_prompt );
run_switcher( NOFORK, DMENU_DIALOG );
} else {
// Daemon mode, Listen to key presses..