diff --git a/config/config.c b/config/config.c index ec8cdb69..4950dba5 100644 --- a/config/config.c +++ b/config/config.c @@ -30,41 +30,41 @@ Settings config = { // Set the default window opacity. // This option only works when running a composite manager. // -o - .window_opacity = 100, + .window_opacity = 100, // Border width around the window. - .menu_bw = 1, + .menu_bw = 1, // The width of the switcher. (0-100 in % > 100 in pixels) - .menu_width = 50, + .menu_width = 50, // Maximum number of options to show. - .menu_lines = 15, + .menu_lines = 15, // Font - .menu_font = "mono-12", + .menu_font = "mono-12", // Foreground color - .menu_fg = "#222222", + .menu_fg = "#222222", // Background color - .menu_bg = "#f2f1f0", + .menu_bg = "#f2f1f0", // Foreground color (selected) - .menu_hlfg = "#ffffff", + .menu_hlfg = "#ffffff", // Background color (selected) - .menu_hlbg = "#005577", + .menu_hlbg = "#005577", // Border color. - .menu_bc = "black", + .menu_bc = "black", // Directly select when only 1 choice is left - .zeltak_mode = 0, + .zeltak_mode = 0, // Terminal to use. (for ssh and open in terminal) .terminal_emulator = "x-terminal-emulator", #ifdef I3 // Auto-detected. no longer used. - .i3_mode = 0, + .i3_mode = 0, #endif // Key binding - .window_key = "F12", - .run_key = "mod1+F2", - .ssh_key = "mod1+F3", + .window_key = "F12", + .run_key = "mod1+F2", + .ssh_key = "mod1+F3", // Location of the window. WL_CENTER, WL_NORTH_WEST, WL_NORTH,WL_NORTH_EAST, etc. - .location = WL_CENTER, + .location = WL_CENTER, // Mode of window, list (Vertical) or dmenu like (Horizontal) - .wmode = VERTICAL, + .wmode = VERTICAL, // Padding of the window. - .padding = 5 + .padding = 5 }; diff --git a/include/rofi.h b/include/rofi.h index 6e6f1310..01e164a3 100644 --- a/include/rofi.h +++ b/include/rofi.h @@ -3,18 +3,19 @@ #include #include -#define MAX(a, b) ((a) > (b) ? (a) : (b)) -#define MIN(a, b) ((a) < (b) ? (a) : (b)) -#define NEAR(a,o,b) ((b) > (a)-(o) && (b) < (a)+(o)) -#define OVERLAP(a,b,c,d) (((a)==(c) && (b)==(d)) || MIN((a)+(b), (c)+(d)) - MAX((a), (c)) > 0) -#define INTERSECT(x,y,w,h,x1,y1,w1,h1) (OVERLAP((x),(w),(x1),(w1)) && OVERLAP((y),(h),(y1),(h1))) +#define MAX( a, b ) ( ( a ) > ( b ) ? ( a ) : ( b ) ) +#define MIN( a, b ) ( ( a ) < ( b ) ? ( a ) : ( b ) ) +#define NEAR( a, o, b ) ( ( b ) > ( a ) - ( o ) && ( b ) < ( a ) + ( o ) ) +#define OVERLAP( a, b, c, d ) ( ( ( a ) == ( c ) && ( b ) == ( d ) ) || MIN ( ( a ) + ( b ), ( c ) + ( d ) ) - MAX ( ( a ), ( c ) ) > 0 ) +#define INTERSECT( x, y, w, h, x1, y1, w1, h1 ) ( OVERLAP ( ( x ), ( w ), ( x1 ), ( w1 ) ) && OVERLAP ( ( y ), ( h ), ( y1 ), ( h1 ) ) ) extern const char *cache_dir; #ifdef HAVE_I3_IPC_H -extern char *i3_socket_path; +extern char *i3_socket_path; #endif -typedef enum { +typedef enum +{ WINDOW_SWITCHER, RUN_DIALOG, SSH_DIALOG, @@ -24,46 +25,48 @@ typedef enum { NEXT_DIALOG } SwitcherMode; -typedef enum { - MENU_OK = 0, +typedef enum +{ + MENU_OK = 0, MENU_CANCEL = -1, MENU_NEXT = -2, MENU_CUSTOM_INPUT = -3, MENU_ENTRY_DELETE = -4 - } MenuReturn; typedef int ( *menu_match_cb )( char **tokens, const char *input, int index, void *data ); -MenuReturn menu( char **lines, char **input, char *prompt, - Time *time, int *shift, - menu_match_cb mmc, void *mmc_data, - int *selected_line ); +MenuReturn menu ( char **lines, char **input, char *prompt, + Time *time, int *shift, + menu_match_cb mmc, void *mmc_data, + int *selected_line ); /** * Allocator wrappers */ -void* allocate( unsigned long bytes ) __attribute__((malloc)); -void* allocate_clear( unsigned long bytes ); -void* reallocate( void *ptr, unsigned long bytes ); +void* allocate ( unsigned long bytes ) __attribute__( ( malloc ) ); +void* allocate_clear ( unsigned long bytes ); +void* reallocate ( void *ptr, unsigned long bytes ); -void catch_exit( __attribute__( ( unused ) ) int sig ); +void catch_exit ( __attribute__( ( unused ) ) int sig ); -typedef enum _WindowLocation { - WL_CENTER = 0, - WL_NORTH_WEST = 1, - WL_NORTH = 2, - WL_NORTH_EAST = 3, - WL_EAST = 4, - WL_EAST_SOUTH = 5, - WL_SOUTH = 6, - WL_SOUTH_WEST = 7, - WL_WEST = 8 +typedef enum _WindowLocation +{ + WL_CENTER = 0, + WL_NORTH_WEST = 1, + WL_NORTH = 2, + WL_NORTH_EAST = 3, + WL_EAST = 4, + WL_EAST_SOUTH = 5, + WL_SOUTH = 6, + WL_SOUTH_WEST = 7, + WL_WEST = 8 } WindowLocation; -typedef enum { +typedef enum +{ VERTICAL = 0, HORIZONTAL = 1 } WindowMode; @@ -71,38 +74,39 @@ typedef enum { * Settings */ -typedef struct _Settings { +typedef struct _Settings +{ // Window settings - unsigned int window_opacity; + unsigned int window_opacity; // Menu settings - unsigned int menu_bw; - unsigned int menu_width; - unsigned int menu_lines; - char * menu_font; - char * menu_fg; - char * menu_bg; - char * menu_hlfg; - char * menu_hlbg; - char * menu_bc; + unsigned int menu_bw; + unsigned int menu_width; + unsigned int menu_lines; + char * menu_font; + char * menu_fg; + char * menu_bg; + char * menu_hlfg; + char * menu_hlbg; + char * menu_bc; // Behavior - unsigned int zeltak_mode; - char * terminal_emulator; + unsigned int zeltak_mode; + char * terminal_emulator; #ifdef HAVE_I3_IPC_H - unsigned int i3_mode; + unsigned int i3_mode; #endif // Key bindings - char * window_key; - char * run_key; - char * ssh_key; - WindowLocation location; - WindowMode wmode; - unsigned int padding; + char * window_key; + char * run_key; + char * ssh_key; + WindowLocation location; + WindowMode wmode; + unsigned int padding; } Settings; extern Settings config; int token_match ( char **tokens, const char *input, - __attribute__( ( unused ) )int index, - __attribute__( ( unused ) )void *data ); + __attribute__( ( unused ) ) int index, + __attribute__( ( unused ) ) void *data ); #endif diff --git a/include/textbox.h b/include/textbox.h index 4e4061b1..7fbc3a0e 100644 --- a/include/textbox.h +++ b/include/textbox.h @@ -1,47 +1,49 @@ #ifndef __TEXTBOX_H__ #define __TEXTBOX_H__ -typedef struct { +typedef struct +{ unsigned long flags; - Window window, parent; - short x, y, w, h; - short cursor; - XftFont *font; - XftColor color_fg, color_bg; - char *text, *prompt; - XIM xim; - XIC xic; - XGlyphInfo extents; + Window window, parent; + short x, y, w, h; + short cursor; + XftFont *font; + XftColor color_fg, color_bg; + char *text, *prompt; + XIM xim; + XIC xic; + XGlyphInfo extents; } textbox; -typedef enum { - TB_AUTOHEIGHT = 1<<0, - TB_AUTOWIDTH = 1<<1, - TB_LEFT = 1<<16, - TB_RIGHT = 1<<17, - TB_CENTER = 1<<18, - TB_EDITABLE = 1<<19, +typedef enum +{ + TB_AUTOHEIGHT = 1 << 0, + TB_AUTOWIDTH = 1 << 1, + TB_LEFT = 1 << 16, + TB_RIGHT = 1 << 17, + TB_CENTER = 1 << 18, + TB_EDITABLE = 1 << 19, } TextboxFlags; -textbox* textbox_create( Window parent, - TextboxFlags flags, - short x, short y, short w, short h, - char *font, char *fg, char *bg, - char *text, char *prompt ); +textbox* textbox_create ( Window parent, + TextboxFlags flags, + short x, short y, short w, short h, + char *font, char *fg, char *bg, + char *text, char *prompt ); -void textbox_free( textbox *tb ); +void textbox_free ( textbox *tb ); -void textbox_font( textbox *tb, char *font, char *fg, char *bg ); +void textbox_font ( textbox *tb, char *font, char *fg, char *bg ); -void textbox_text( textbox *tb, char *text ); -void textbox_show( textbox *tb ); -void textbox_draw( textbox *tb ); +void textbox_text ( textbox *tb, char *text ); +void textbox_show ( textbox *tb ); +void textbox_draw ( textbox *tb ); -int textbox_keypress( textbox *tb, XEvent *ev ); +int textbox_keypress ( textbox *tb, XEvent *ev ); -void textbox_cursor_end( textbox *tb ); +void textbox_cursor_end ( textbox *tb ); #endif //__TEXTBOX_H__ diff --git a/include/xrmoptions.h b/include/xrmoptions.h index e46ba11a..7fa8a522 100644 --- a/include/xrmoptions.h +++ b/include/xrmoptions.h @@ -1,5 +1,5 @@ #ifndef __XRMOPTIONS_H__ #define __XRMOPTIONS_H__ -void parse_xresource_options( Display *display ); +void parse_xresource_options ( Display *display ); #endif diff --git a/source/dmenu-dialog.c b/source/dmenu-dialog.c index 49a70fe1..939a24cb 100644 --- a/source/dmenu-dialog.c +++ b/source/dmenu-dialog.c @@ -42,16 +42,19 @@ static char **get_dmenu ( ) { char buffer[1024]; char **retv = NULL; - int index = 0; + int index = 0; - while ( fgets( buffer, 1024, stdin ) != NULL ) { - retv = reallocate( retv, ( index+2 )*sizeof( char* ) ); - retv[index] = strdup( buffer ); - retv[index+1] = NULL; + while ( fgets ( buffer, 1024, stdin ) != NULL ) + { + retv = reallocate ( retv, ( index + 2 ) * sizeof ( char* ) ); + retv[index] = strdup ( buffer ); + retv[index + 1] = NULL; // Filter out line-end. - if ( retv[index][strlen( buffer )-1] == '\n' ) - retv[index][strlen( buffer )-1] = '\0'; + if ( retv[index][strlen ( buffer ) - 1] == '\n' ) + { + retv[index][strlen ( buffer ) - 1] = '\0'; + } index++; } @@ -61,27 +64,36 @@ static char **get_dmenu ( ) SwitcherMode dmenu_switcher_dialog ( char **input ) { - int selected_line = 0; - SwitcherMode retv = MODE_EXIT; + int selected_line = 0; + SwitcherMode retv = MODE_EXIT; // act as a launcher - char **list = get_dmenu( ); + char **list = get_dmenu ( ); - int mretv = menu( list, input, dmenu_prompt,NULL, NULL, - token_match, NULL, &selected_line ); + int mretv = menu ( list, input, dmenu_prompt, NULL, NULL, + token_match, NULL, &selected_line ); - if ( mretv == MENU_NEXT ) { + if ( mretv == MENU_NEXT ) + { retv = DMENU_DIALOG; - } else if ( mretv == MENU_OK && list[selected_line] != NULL ) { - fputs( list[selected_line],stdout ); - } else if ( mretv == MENU_CUSTOM_INPUT && *input != NULL && *input[0] != '\0' ) { - fputs( *input, stdout ); + } + else if ( mretv == MENU_OK && list[selected_line] != NULL ) + { + fputs ( list[selected_line], stdout ); + } + else if ( mretv == MENU_CUSTOM_INPUT && *input != NULL && *input[0] != '\0' ) + { + fputs ( *input, stdout ); } - for ( unsigned int i=0; list != NULL && list[i] != NULL; i++ ) { - free( list[i] ); + for ( unsigned int i = 0; list != NULL && list[i] != NULL; i++ ) + { + free ( list[i] ); } - if ( list != NULL ) free( list ); + if ( list != NULL ) + { + free ( list ); + } return retv; } diff --git a/source/rofi.c b/source/rofi.c index edfd614c..a14fd1d7 100644 --- a/source/rofi.c +++ b/source/rofi.c @@ -70,16 +70,16 @@ #include "xrmoptions.h" -#define LINE_MARGIN 4 +#define LINE_MARGIN 4 -#define OPAQUE 0xffffffff -#define OPACITY "_NET_WM_WINDOW_OPACITY" -#define I3_SOCKET_PATH_PROP "I3_SOCKET_PATH" -#define FORK 1 -#define NOFORK 2 +#define OPAQUE 0xffffffff +#define OPACITY "_NET_WM_WINDOW_OPACITY" +#define I3_SOCKET_PATH_PROP "I3_SOCKET_PATH" +#define FORK 1 +#define NOFORK 2 -xdgHandle xdg_handle; +xdgHandle xdg_handle; const char *cache_dir = NULL; /** @@ -87,336 +87,389 @@ const char *cache_dir = NULL; * Matches tokenized. */ int token_match ( char **tokens, const char *input, - __attribute__( ( unused ) )int index, - __attribute__( ( unused ) )void *data ) + __attribute__( ( unused ) ) int index, + __attribute__( ( unused ) ) void *data ) { int match = 1; // Do a tokenized match. - if ( tokens ) for ( int j = 1; match && tokens[j]; j++ ) { - match = ( strcasestr( input, tokens[j] ) != NULL ); + if ( tokens ) + { + for ( int j = 1; match && tokens[j]; j++ ) + { + match = ( strcasestr ( input, tokens[j] ) != NULL ); } + } return match; } -void* allocate( unsigned long bytes ) +void* allocate ( unsigned long bytes ) { - if ( bytes == 0 ) return NULL; + if ( bytes == 0 ) + { + return NULL; + } - void *ptr = malloc( bytes ); + void *ptr = malloc ( bytes ); - if ( !ptr ) { - fprintf( stderr, "malloc failed!\n" ); - exit( EXIT_FAILURE ); + if ( !ptr ) + { + fprintf ( stderr, "malloc failed!\n" ); + exit ( EXIT_FAILURE ); } return ptr; } -void* allocate_clear( unsigned long bytes ) +void* allocate_clear ( unsigned long bytes ) { - if ( bytes == 0 ) return NULL; + if ( bytes == 0 ) + { + return NULL; + } - void *ptr = allocate( bytes ); - memset( ptr, 0, bytes ); + void *ptr = allocate ( bytes ); + memset ( ptr, 0, bytes ); return ptr; } -void* reallocate( void *ptr, unsigned long bytes ) +void* reallocate ( void *ptr, unsigned long bytes ) { - if ( bytes == 0 ) return NULL; + if ( bytes == 0 ) + { + return NULL; + } - ptr = realloc( ptr, bytes ); + ptr = realloc ( ptr, bytes ); - if ( !ptr ) { - fprintf( stderr, "realloc failed!\n" ); - exit( EXIT_FAILURE ); + if ( !ptr ) + { + fprintf ( stderr, "realloc failed!\n" ); + exit ( EXIT_FAILURE ); } return ptr; } -static char **tokenize( const char *input ) +static char **tokenize ( const char *input ) { - if ( input == NULL ) return NULL; + if ( input == NULL ) + { + return NULL; + } char *saveptr = NULL, *token; - char **retv = NULL; + char **retv = NULL; // First entry is always full (modified) stringtext. - int num_tokens = 1; + int num_tokens = 1; //First entry is string that is modified. - retv = allocate ( 2*sizeof( char* ) ); - retv[0] = strdup( input ); + retv = allocate ( 2 * sizeof ( char* ) ); + retv[0] = strdup ( input ); retv[1] = NULL; // Iterate over tokens. // strtok should still be valid for utf8. for ( - token = strtok_r( retv[0], " ", &saveptr ); + token = strtok_r ( retv[0], " ", &saveptr ); token != NULL; - token = strtok_r( NULL, " ", &saveptr ) ) { - retv = reallocate( retv, sizeof( char* )*( num_tokens+2 ) ); - retv[num_tokens+1] = NULL; - retv[num_tokens] = token; + token = strtok_r ( NULL, " ", &saveptr ) ) + { + retv = reallocate ( retv, sizeof ( char* ) * ( num_tokens + 2 ) ); + retv[num_tokens + 1] = NULL; + retv[num_tokens] = token; num_tokens++; } return retv; } -static inline void tokenize_free( char **ip ) +static inline void tokenize_free ( char **ip ) { - if ( ip == NULL ) return; + if ( ip == NULL ) + { + return; + } if ( ip[0] ) - free( ip[0] ); + { + free ( ip[0] ); + } - free( ip ); + free ( ip ); } #ifdef HAVE_I3_IPC_H // Path to HAVE_I3_IPC_H socket. char *i3_socket_path = NULL; // Focus window on HAVE_I3_IPC_H window manager. -static void focus_window_i3( const char *socket_path, int id ) +static void focus_window_i3 ( const char *socket_path, int id ) { - i3_ipc_header_t head; - char command[128]; - int s, t, len; + i3_ipc_header_t head; + char command[128]; + int s, t, len; struct sockaddr_un remote; - if ( strlen( socket_path ) > UNIX_PATH_MAX ) { - fprintf( stderr, "Socket path is to long. %zd > %d\n", strlen( socket_path ), UNIX_PATH_MAX ); + if ( strlen ( socket_path ) > UNIX_PATH_MAX ) + { + fprintf ( stderr, "Socket path is to long. %zd > %d\n", strlen ( socket_path ), UNIX_PATH_MAX ); return; } - if ( ( s = socket( AF_UNIX, SOCK_STREAM, 0 ) ) == -1 ) { - fprintf( stderr, "Failed to open connection to I3: %s\n", strerror( errno ) ); + if ( ( s = socket ( AF_UNIX, SOCK_STREAM, 0 ) ) == -1 ) + { + fprintf ( stderr, "Failed to open connection to I3: %s\n", strerror ( errno ) ); return; } remote.sun_family = AF_UNIX; - strcpy( remote.sun_path, socket_path ); - len = strlen( remote.sun_path ) + sizeof( remote.sun_family ); + strcpy ( remote.sun_path, socket_path ); + len = strlen ( remote.sun_path ) + sizeof ( remote.sun_family ); - if ( connect( s, ( struct sockaddr * )&remote, len ) == -1 ) { - fprintf( stderr, "Failed to connect to I3 (%s): %s\n", socket_path,strerror( errno ) ); - close( s ); - return ; + if ( connect ( s, ( struct sockaddr * ) &remote, len ) == -1 ) + { + fprintf ( stderr, "Failed to connect to I3 (%s): %s\n", socket_path, strerror ( errno ) ); + close ( s ); + return; } // Formulate command - snprintf( command, 128, "[id=\"%d\"] focus", id ); + snprintf ( command, 128, "[id=\"%d\"] focus", id ); // Prepare header. - memcpy( head.magic, I3_IPC_MAGIC, 6 ); - head.size = strlen( command ); + memcpy ( head.magic, I3_IPC_MAGIC, 6 ); + head.size = strlen ( command ); head.type = I3_IPC_MESSAGE_TYPE_COMMAND; // Send header. - send( s, &head, sizeof( head ),0 ); + send ( s, &head, sizeof ( head ), 0 ); // Send message - send( s, command, strlen( command ),0 ); + send ( s, command, strlen ( command ), 0 ); // Receive header. - t = recv( s, &head, sizeof( head ),0 ); + t = recv ( s, &head, sizeof ( head ), 0 ); - if ( t == sizeof( head ) ) { - recv( s, command, head.size, 0 ); + if ( t == sizeof ( head ) ) + { + recv ( s, command, head.size, 0 ); } - close( s ); + close ( s ); } #endif -void catch_exit( __attribute__( ( unused ) ) int sig ) +void catch_exit ( __attribute__( ( unused ) ) int sig ) { - while ( 0 < waitpid( -1, NULL, WNOHANG ) ); + while ( 0 < waitpid ( -1, NULL, WNOHANG ) ) + { + ; + } } // cli arg handling -static int find_arg( const int argc, char * const argv[], const char * const key ) +static int find_arg ( const int argc, char * const argv[], const char * const key ) { int i; - for ( i = 0; i < argc && strcasecmp( argv[i], key ); i++ ); + for ( i = 0; i < argc && strcasecmp ( argv[i], key ); i++ ) + { + ; + } - return i < argc ? i: -1; + return i < argc ? i : -1; } -static void find_arg_str( int argc, char *argv[], char *key, char** val ) +static void find_arg_str ( int argc, char *argv[], char *key, char** val ) { - int i = find_arg( argc, argv, key ); + int i = find_arg ( argc, argv, key ); - if ( val != NULL && i > 0 && i < argc-1 ) { - *val = argv[i+1]; + if ( val != NULL && i > 0 && i < argc - 1 ) + { + *val = argv[i + 1]; } } static void find_arg_int ( int argc, char *argv[], char *key, unsigned int *val ) { - int i = find_arg( argc, argv, key ); + int i = find_arg ( argc, argv, key ); - if ( val != NULL && i > 0 && i < ( argc-1 ) ) { - *val = strtol( argv[i+1], NULL, 10 ); + if ( val != NULL && i > 0 && i < ( argc - 1 ) ) + { + *val = strtol ( argv[i + 1], NULL, 10 ); } } unsigned int NumlockMask = 0; -Display *display = NULL; -Screen *screen; -Window root; -int screen_id; +Display *display = NULL; +Screen *screen; +Window root; +int screen_id; -static int ( *xerror )( Display *, XErrorEvent * ); +static int ( *xerror )( Display *, XErrorEvent * ); -#define ATOM_ENUM(x) x -#define ATOM_CHAR(x) #x +#define ATOM_ENUM( x ) x +#define ATOM_CHAR( x ) # x -#define EWMH_ATOMS(X) \ -X(_NET_SUPPORTING_WM_CHECK),\ -X(_NET_CLIENT_LIST),\ -X(_NET_CLIENT_LIST_STACKING),\ -X(_NET_NUMBER_OF_DESKTOPS),\ -X(_NET_CURRENT_DESKTOP),\ -X(_NET_DESKTOP_GEOMETRY),\ -X(_NET_DESKTOP_VIEWPORT),\ -X(_NET_WORKAREA),\ -X(_NET_ACTIVE_WINDOW),\ -X(_NET_CLOSE_WINDOW),\ -X(_NET_MOVERESIZE_WINDOW),\ -X(_NET_WM_NAME),\ -X(_NET_WM_STATE),\ -X(_NET_WM_STATE_SKIP_TASKBAR),\ -X(_NET_WM_STATE_SKIP_PAGER),\ -X(_NET_WM_STATE_FULLSCREEN),\ -X(_NET_WM_STATE_ABOVE),\ -X(_NET_WM_STATE_BELOW),\ -X(_NET_WM_STATE_DEMANDS_ATTENTION),\ -X(_NET_WM_DESKTOP),\ -X(_NET_SUPPORTED) +#define EWMH_ATOMS( X ) \ + X ( _NET_SUPPORTING_WM_CHECK ), \ + X ( _NET_CLIENT_LIST ), \ + X ( _NET_CLIENT_LIST_STACKING ), \ + X ( _NET_NUMBER_OF_DESKTOPS ), \ + X ( _NET_CURRENT_DESKTOP ), \ + X ( _NET_DESKTOP_GEOMETRY ), \ + X ( _NET_DESKTOP_VIEWPORT ), \ + X ( _NET_WORKAREA ), \ + X ( _NET_ACTIVE_WINDOW ), \ + X ( _NET_CLOSE_WINDOW ), \ + X ( _NET_MOVERESIZE_WINDOW ), \ + X ( _NET_WM_NAME ), \ + X ( _NET_WM_STATE ), \ + X ( _NET_WM_STATE_SKIP_TASKBAR ), \ + X ( _NET_WM_STATE_SKIP_PAGER ), \ + X ( _NET_WM_STATE_FULLSCREEN ), \ + X ( _NET_WM_STATE_ABOVE ), \ + X ( _NET_WM_STATE_BELOW ), \ + X ( _NET_WM_STATE_DEMANDS_ATTENTION ), \ + X ( _NET_WM_DESKTOP ), \ + X ( _NET_SUPPORTED ) -enum { EWMH_ATOMS( ATOM_ENUM ), NETATOMS }; -const char *netatom_names[] = { EWMH_ATOMS( ATOM_CHAR ) }; -Atom netatoms[NETATOMS]; +enum { EWMH_ATOMS ( ATOM_ENUM ), NETATOMS }; +const char *netatom_names[] = { EWMH_ATOMS ( ATOM_CHAR ) }; +Atom netatoms[NETATOMS]; // X error handler -int oops( __attribute__( ( unused ) ) Display *d, XErrorEvent *ee ) +int oops ( __attribute__( ( unused ) ) Display *d, XErrorEvent *ee ) { if ( ee->error_code == BadWindow || ( ee->request_code == X_GrabButton && ee->error_code == BadAccess ) || ( ee->request_code == X_GrabKey && ee->error_code == BadAccess ) - ) return 0; + ) + { + return 0; + } - fprintf( stderr, "error: request code=%d, error code=%d\n", ee->request_code, ee->error_code ); - return xerror( display, ee ); + fprintf ( stderr, "error: request code=%d, error code=%d\n", ee->request_code, ee->error_code ); + return xerror ( display, ee ); } // usable space on a monitor -typedef struct { +typedef struct +{ int x, y, w, h; int l, r, t, b; } workarea; // window lists -typedef struct { +typedef struct +{ Window *array; - void **data; - int len; + void **data; + int len; } winlist; winlist *cache_client; winlist *cache_xattr; -#define winlist_ascend(l,i,w) for ((i) = 0; (i) < (l)->len && (((w) = (l)->array[i]) || 1); (i)++) -#define winlist_descend(l,i,w) for ((i) = (l)->len-1; (i) >= 0 && (((w) = (l)->array[i]) || 1); (i)--) +#define winlist_ascend( l, i, w ) for ( ( i ) = 0; ( i ) < ( l )->len && ( ( ( w ) = ( l )->array[i] ) || 1 ); ( i )++ ) +#define winlist_descend( l, i, w ) for ( ( i ) = ( l )->len - 1; ( i ) >= 0 && ( ( ( w ) = ( l )->array[i] ) || 1 ); ( i )-- ) -#define WINLIST 32 +#define WINLIST 32 -winlist* winlist_new() +winlist* winlist_new () { - winlist *l = allocate( sizeof( winlist ) ); - l->len = 0; - l->array = allocate( sizeof( Window ) * ( WINLIST+1 ) ); - l->data = allocate( sizeof( void* ) * ( WINLIST+1 ) ); + winlist *l = allocate ( sizeof ( winlist ) ); + l->len = 0; + l->array = allocate ( sizeof ( Window ) * ( WINLIST + 1 ) ); + l->data = allocate ( sizeof ( void* ) * ( WINLIST + 1 ) ); return l; } -int winlist_append( winlist *l , Window w, void *d ) +int winlist_append ( winlist *l, Window w, void *d ) { - if ( l->len > 0 && !( l->len % WINLIST ) ) { - l->array = reallocate( l->array, sizeof( Window ) * ( l->len+WINLIST+1 ) ); - l->data = reallocate( l->data, sizeof( void* ) * ( l->len+WINLIST+1 ) ); + if ( l->len > 0 && !( l->len % WINLIST ) ) + { + l->array = reallocate ( l->array, sizeof ( Window ) * ( l->len + WINLIST + 1 ) ); + l->data = reallocate ( l->data, sizeof ( void* ) * ( l->len + WINLIST + 1 ) ); } // Make clang-check happy. // TODO: make clang-check clear this should never be 0. - if(l->data == NULL || l->array == NULL) return 0; + if ( l->data == NULL || l->array == NULL ) + { + return 0; + } - l->data[l->len] = d; + l->data[l->len] = d; l->array[l->len++] = w; - return l->len-1; + return l->len - 1; } -void winlist_empty( winlist *l ) +void winlist_empty ( winlist *l ) { - while ( l->len > 0 ) free( l->data[--( l->len )] ); + while ( l->len > 0 ) + { + free ( l->data[--( l->len )] ); + } } -void winlist_free( winlist *l ) +void winlist_free ( winlist *l ) { - winlist_empty( l ); - free( l->array ); - free( l->data ); - free( l ); + winlist_empty ( l ); + free ( l->array ); + free ( l->data ); + free ( l ); } -int winlist_find( winlist *l, Window w ) +int winlist_find ( winlist *l, Window w ) { // iterate backwards. theory is: windows most often accessed will be // nearer the end. testing with kcachegrind seems to support this... - int i; + int i; Window o = 0; - winlist_descend( l, i, o ) if ( w == o ) return i; + winlist_descend ( l, i, o ) if ( w == o ) + { + return i; + } return -1; } -#define CLIENTTITLE 100 -#define CLIENTCLASS 50 -#define CLIENTNAME 50 -#define CLIENTSTATE 10 -#define CLIENTROLE 50 +#define CLIENTTITLE 100 +#define CLIENTCLASS 50 +#define CLIENTNAME 50 +#define CLIENTSTATE 10 +#define CLIENTROLE 50 // a managable window -typedef struct { - Window window, trans; +typedef struct +{ + Window window, trans; XWindowAttributes xattr; - char title[CLIENTTITLE]; - char class[CLIENTCLASS]; - char name[CLIENTNAME]; - char role[CLIENTROLE]; - int states; - Atom state[CLIENTSTATE]; - workarea monitor; + char title[CLIENTTITLE]; + char class[CLIENTCLASS]; + char name[CLIENTNAME]; + char role[CLIENTROLE]; + int states; + Atom state[CLIENTSTATE]; + workarea monitor; } client; // allocate a pixel value for an X named color -static unsigned int color_get( const char *const name ) +static unsigned int color_get ( const char *const name ) { - XColor color; - Colormap map = DefaultColormap( display, screen_id ); - return XAllocNamedColor( display, map, name, &color, &color ) ? color.pixel: None; + XColor color; + Colormap map = DefaultColormap ( display, screen_id ); + return XAllocNamedColor ( display, map, name, &color, &color ) ? color.pixel : None; } // find mouse pointer location -int pointer_get( Window root, int *x, int *y ) +int pointer_get ( Window root, int *x, int *y ) { *x = 0; *y = 0; - Window rr, cr; - int rxr, ryr, wxr, wyr; + Window rr, cr; + int rxr, ryr, wxr, wyr; unsigned int mr; - if ( XQueryPointer( display, root, &rr, &cr, &rxr, &ryr, &wxr, &wyr, &mr ) ) { + if ( XQueryPointer ( display, root, &rr, &cr, &rxr, &ryr, &wxr, &wyr, &mr ) ) + { *x = rxr; *y = ryr; return 1; @@ -425,40 +478,45 @@ int pointer_get( Window root, int *x, int *y ) return 0; } -int take_keyboard( Window w ) +int take_keyboard ( Window w ) { int i; - for ( i = 0; i < 1000; i++ ) { - if ( XGrabKeyboard( display, w, True, GrabModeAsync, GrabModeAsync, CurrentTime ) == GrabSuccess ) + for ( i = 0; i < 1000; i++ ) + { + if ( XGrabKeyboard ( display, w, True, GrabModeAsync, GrabModeAsync, CurrentTime ) == GrabSuccess ) + { return 1; + } struct timespec rsl = { 0, 100000L }; - nanosleep(&rsl, NULL); + nanosleep ( &rsl, NULL ); } return 0; } -void release_keyboard() +void release_keyboard () { - XUngrabKeyboard( display, CurrentTime ); + XUngrabKeyboard ( display, CurrentTime ); } // XGetWindowAttributes with caching -XWindowAttributes* window_get_attributes( Window w ) +XWindowAttributes* window_get_attributes ( Window w ) { - int idx = winlist_find( cache_xattr, w ); + int idx = winlist_find ( cache_xattr, w ); - if ( idx < 0 ) { - XWindowAttributes *cattr = allocate( sizeof( XWindowAttributes ) ); + if ( idx < 0 ) + { + XWindowAttributes *cattr = allocate ( sizeof ( XWindowAttributes ) ); - if ( XGetWindowAttributes( display, w, cattr ) ) { - winlist_append( cache_xattr, w, cattr ); + if ( XGetWindowAttributes ( display, w, cattr ) ) + { + winlist_append ( cache_xattr, w, cattr ); return cattr; } - free( cattr ); + free ( cattr ); return NULL; } @@ -466,31 +524,47 @@ XWindowAttributes* window_get_attributes( Window w ) } // retrieve a property of any type from a window -int window_get_prop( Window w, Atom prop, Atom *type, int *items, void *buffer, unsigned int bytes ) +int window_get_prop ( Window w, Atom prop, Atom *type, int *items, void *buffer, unsigned int bytes ) { Atom _type; - if ( !type ) type = &_type; + if ( !type ) + { + type = &_type; + } int _items; - if ( !items ) items = &_items; + if ( !items ) + { + items = &_items; + } - int format; + int format; unsigned long nitems, nbytes; unsigned char *ret = NULL; - memset( buffer, 0, bytes ); + memset ( buffer, 0, bytes ); - if ( XGetWindowProperty( display, w, prop, 0, bytes/4, False, AnyPropertyType, type, - &format, &nitems, &nbytes, &ret ) == Success && ret && *type != None && format ) { - if ( format == 8 ) memmove( buffer, ret, MIN( bytes, nitems ) ); + if ( XGetWindowProperty ( display, w, prop, 0, bytes / 4, False, AnyPropertyType, type, + &format, &nitems, &nbytes, &ret ) == Success && ret && *type != None && format ) + { + if ( format == 8 ) + { + memmove ( buffer, ret, MIN ( bytes, nitems ) ); + } - if ( format == 16 ) memmove( buffer, ret, MIN( bytes, nitems * sizeof( short ) ) ); + if ( format == 16 ) + { + memmove ( buffer, ret, MIN ( bytes, nitems * sizeof ( short ) ) ); + } - if ( format == 32 ) memmove( buffer, ret, MIN( bytes, nitems * sizeof( long ) ) ); + if ( format == 32 ) + { + memmove ( buffer, ret, MIN ( bytes, nitems * sizeof ( long ) ) ); + } - *items = ( int )nitems; - XFree( ret ); + *items = ( int ) nitems; + XFree ( ret ); return 1; } @@ -499,85 +573,98 @@ int window_get_prop( Window w, Atom prop, Atom *type, int *items, void *buffer, // retrieve a text property from a window // technically we could use window_get_prop(), but this is better for character set support -char* window_get_text_prop( Window w, Atom atom ) +char* window_get_text_prop ( Window w, Atom atom ) { XTextProperty prop; - char *res = NULL; - char **list = NULL; - int count; + char *res = NULL; + char **list = NULL; + int count; - if ( XGetTextProperty( display, w, &prop, atom ) && prop.value && prop.nitems ) { - if ( prop.encoding == XA_STRING ) { - res = allocate( strlen( ( char* )prop.value )+1 ); + if ( XGetTextProperty ( display, w, &prop, atom ) && prop.value && prop.nitems ) + { + if ( prop.encoding == XA_STRING ) + { + res = allocate ( strlen ( ( char * ) prop.value ) + 1 ); // make clang-check happy. - if(res) { - strcpy( res, ( char* )prop.value ); + if ( res ) + { + strcpy ( res, ( char * ) prop.value ); } - } else if ( Xutf8TextPropertyToTextList( display, &prop, &list, &count ) >= Success && count > 0 && *list ) { - res = allocate( strlen( *list )+1 ); + } + else if ( Xutf8TextPropertyToTextList ( display, &prop, &list, &count ) >= Success && count > 0 && *list ) + { + res = allocate ( strlen ( *list ) + 1 ); // make clang-check happy. - if(res) { - strcpy( res, *list ); + if ( res ) + { + strcpy ( res, *list ); } - XFreeStringList( list ); + XFreeStringList ( list ); } } - if ( prop.value ) XFree( prop.value ); + if ( prop.value ) + { + XFree ( prop.value ); + } return res; } -int window_get_atom_prop( Window w, Atom atom, Atom *list, int count ) +int window_get_atom_prop ( Window w, Atom atom, Atom *list, int count ) { Atom type; - int items; - return window_get_prop( w, atom, &type, &items, list, count*sizeof( Atom ) ) && type == XA_ATOM ? items:0; + int items; + return window_get_prop ( w, atom, &type, &items, list, count * sizeof ( Atom ) ) && type == XA_ATOM ? items : 0; } -void window_set_atom_prop( Window w, Atom prop, Atom *atoms, int count ) +void window_set_atom_prop ( Window w, Atom prop, Atom *atoms, int count ) { - XChangeProperty( display, w, prop, XA_ATOM, 32, PropModeReplace, ( unsigned char* )atoms, count ); + XChangeProperty ( display, w, prop, XA_ATOM, 32, PropModeReplace, ( unsigned char * ) atoms, count ); } -int window_get_cardinal_prop(Window w, Atom atom, unsigned long *list, int count) +int window_get_cardinal_prop ( Window w, Atom atom, unsigned long *list, int count ) { Atom type; int items; - return window_get_prop(w, atom, &type, &items, list, count*sizeof(unsigned long)) && type == XA_CARDINAL ? items:0; + return window_get_prop ( w, atom, &type, &items, list, count * sizeof ( unsigned long ) ) && type == XA_CARDINAL ? items : 0; } // a ClientMessage -int window_send_message( Window target, Window subject, Atom atom, unsigned long protocol, unsigned long mask, Time time ) +int window_send_message ( Window target, Window subject, Atom atom, unsigned long protocol, unsigned long mask, Time time ) { XEvent e; - memset( &e, 0, sizeof( XEvent ) ); - e.xclient.type = ClientMessage; + memset ( &e, 0, sizeof ( XEvent ) ); + e.xclient.type = ClientMessage; e.xclient.message_type = atom; - e.xclient.window = subject; + e.xclient.window = subject; e.xclient.data.l[0] = protocol; - e.xclient.data.l[1] = time; + e.xclient.data.l[1] = time; e.xclient.send_event = True; - e.xclient.format = 32; - int r = XSendEvent( display, target, False, mask, &e ) ?1:0; - XFlush( display ); + e.xclient.format = 32; + int r = XSendEvent ( display, target, False, mask, &e ) ? 1 : 0; + XFlush ( display ); return r; } // find the dimensions of the monitor displaying point x,y -void monitor_dimensions( Screen *screen, int x, int y, workarea *mon ) +void monitor_dimensions ( Screen *screen, int x, int y, workarea *mon ) { - memset( mon, 0, sizeof( workarea ) ); - mon->w = WidthOfScreen( screen ); - mon->h = HeightOfScreen( screen ); + memset ( mon, 0, sizeof ( workarea ) ); + mon->w = WidthOfScreen ( screen ); + mon->h = HeightOfScreen ( screen ); // locate the current monitor - if ( XineramaIsActive( display ) ) { - int monitors; - XineramaScreenInfo *info = XineramaQueryScreens( display, &monitors ); + if ( XineramaIsActive ( display ) ) + { + int monitors; + XineramaScreenInfo *info = XineramaQueryScreens ( display, &monitors ); - if ( info ) { - for ( int i = 0; i < monitors; i++ ) { - if ( INTERSECT( x, y, 1, 1, info[i].x_org, info[i].y_org, info[i].width, info[i].height ) ) { + if ( info ) + { + for ( int i = 0; i < monitors; i++ ) + { + if ( INTERSECT ( x, y, 1, 1, info[i].x_org, info[i].y_org, info[i].width, info[i].height ) ) + { mon->x = info[i].x_org; mon->y = info[i].y_org; mon->w = info[i].width; @@ -587,349 +674,442 @@ void monitor_dimensions( Screen *screen, int x, int y, workarea *mon ) } } - XFree( info ); + XFree ( info ); } } // determine which monitor holds the active window, or failing that the mouse pointer -void monitor_active( workarea *mon ) +void monitor_active ( workarea *mon ) { - Window root = RootWindow( display, XScreenNumberOfScreen( screen ) ); + Window root = RootWindow ( display, XScreenNumberOfScreen ( screen ) ); unsigned long id; - Atom type; - int count; + Atom type; + int count; - if ( window_get_prop( root, netatoms[_NET_ACTIVE_WINDOW], &type, &count, &id, 1 ) - && type == XA_WINDOW && count > 0 ) { - XWindowAttributes *attr = window_get_attributes( id ); - monitor_dimensions( screen, attr->x, attr->y, mon ); + if ( window_get_prop ( root, netatoms[_NET_ACTIVE_WINDOW], &type, &count, &id, 1 ) + && type == XA_WINDOW && count > 0 ) + { + XWindowAttributes *attr = window_get_attributes ( id ); + monitor_dimensions ( screen, attr->x, attr->y, mon ); return; } int x, y; - if ( pointer_get( root, &x, &y ) ) { - monitor_dimensions( screen, x, y, mon ); + if ( pointer_get ( root, &x, &y ) ) + { + monitor_dimensions ( screen, x, y, mon ); return; } - monitor_dimensions( screen, 0, 0, mon ); + monitor_dimensions ( screen, 0, 0, mon ); } // _NET_WM_STATE_* -int client_has_state( client *c, Atom state ) +int client_has_state ( client *c, Atom state ) { int i; for ( i = 0; i < c->states; i++ ) - if ( c->state[i] == state ) return 1; + { + if ( c->state[i] == state ) + { + return 1; + } + } return 0; } // collect info on any window // doesn't have to be a window we'll end up managing -client* window_client( Window win ) +client* window_client ( Window win ) { - if ( win == None ) return NULL; + if ( win == None ) + { + return NULL; + } - int idx = winlist_find( cache_client, win ); + int idx = winlist_find ( cache_client, win ); - if ( idx >= 0 ) { + if ( idx >= 0 ) + { return cache_client->data[idx]; } // if this fails, we're up that creek - XWindowAttributes *attr = window_get_attributes( win ); + XWindowAttributes *attr = window_get_attributes ( win ); - if ( !attr ) return NULL; + if ( !attr ) + { + return NULL; + } - client *c = allocate_clear( sizeof( client ) ); + client *c = allocate_clear ( sizeof ( client ) ); c->window = win; // copy xattr so we don't have to care when stuff is freed - memmove( &c->xattr, attr, sizeof( XWindowAttributes ) ); - XGetTransientForHint( display, win, &c->trans ); + memmove ( &c->xattr, attr, sizeof ( XWindowAttributes ) ); + XGetTransientForHint ( display, win, &c->trans ); - c->states = window_get_atom_prop( win, netatoms[_NET_WM_STATE], c->state, CLIENTSTATE ); + c->states = window_get_atom_prop ( win, netatoms[_NET_WM_STATE], c->state, CLIENTSTATE ); char *name; - if ( ( name = window_get_text_prop( c->window, netatoms[_NET_WM_NAME] ) ) && name ) { - snprintf( c->title, CLIENTTITLE, "%s", name ); - free( name ); - } else if ( XFetchName( display, c->window, &name ) ) { - snprintf( c->title, CLIENTTITLE, "%s", name ); - XFree( name ); + if ( ( name = window_get_text_prop ( c->window, netatoms[_NET_WM_NAME] ) ) && name ) + { + snprintf ( c->title, CLIENTTITLE, "%s", name ); + free ( name ); + } + else if ( XFetchName ( display, c->window, &name ) ) + { + snprintf ( c->title, CLIENTTITLE, "%s", name ); + XFree ( name ); } - name = window_get_text_prop ( c->window, XInternAtom( display, "WM_WINDOW_ROLE", False ) ); + name = window_get_text_prop ( c->window, XInternAtom ( display, "WM_WINDOW_ROLE", False ) ); - if ( name != NULL ) { - snprintf( c->role, CLIENTROLE, "%s", name ); - XFree( name ); + if ( name != NULL ) + { + snprintf ( c->role, CLIENTROLE, "%s", name ); + XFree ( name ); } XClassHint chint; - if ( XGetClassHint( display, c->window, &chint ) ) { - snprintf( c->class, CLIENTCLASS, "%s", chint.res_class ); - snprintf( c->name, CLIENTNAME, "%s", chint.res_name ); - XFree( chint.res_class ); - XFree( chint.res_name ); + if ( XGetClassHint ( display, c->window, &chint ) ) + { + snprintf ( c->class, CLIENTCLASS, "%s", chint.res_class ); + snprintf ( c->name, CLIENTNAME, "%s", chint.res_name ); + XFree ( chint.res_class ); + XFree ( chint.res_name ); } - monitor_dimensions( c->xattr.screen, c->xattr.x, c->xattr.y, &c->monitor ); - winlist_append( cache_client, c->window, c ); + monitor_dimensions ( c->xattr.screen, c->xattr.x, c->xattr.y, &c->monitor ); + winlist_append ( cache_client, c->window, c ); return c; } unsigned int windows_modmask; -KeySym windows_keysym; +KeySym windows_keysym; unsigned int rundialog_modmask; -KeySym rundialog_keysym; +KeySym rundialog_keysym; unsigned int sshdialog_modmask; -KeySym sshdialog_keysym; +KeySym sshdialog_keysym; -Window main_window = None; -GC gc = NULL; +Window main_window = None; +GC gc = NULL; #include "textbox.h" -void menu_draw( textbox *text, textbox **boxes, int max_lines,int num_lines, int *last_offset, int selected, char **filtered ) +void menu_draw ( textbox *text, textbox **boxes, int max_lines, int num_lines, int *last_offset, int selected, char **filtered ) { - int i,offset=0; - textbox_draw( text ); + int i, offset = 0; + textbox_draw ( text ); // selected row is always visible. // If selected is visible do not scroll. - if ( ( selected - ( *last_offset ) ) < ( max_lines ) &&( selected-( *last_offset ) ) >= 0 ) offset = *last_offset; - else { + if ( ( selected - ( *last_offset ) ) < ( max_lines ) && ( selected - ( *last_offset ) ) >= 0 ) + { + offset = *last_offset; + } + else + { // If selected is above visible, scroll up. - if ( ( selected-( *last_offset ) ) >= ( max_lines ) ) { - offset = selected-max_lines+1; + if ( ( selected - ( *last_offset ) ) >= ( max_lines ) ) + { + offset = selected - max_lines + 1; // Scroll down otherwise - } else if ( ( selected-( *last_offset ) ) < 0 ) { + } + else if ( ( selected - ( *last_offset ) ) < 0 ) + { offset = selected; } // Sanitize - if ( offset >= ( num_lines ) ) offset = num_lines-max_lines-1; + if ( offset >= ( num_lines ) ) + { + offset = num_lines - max_lines - 1; + } *last_offset = offset; } - for ( i = 0; i < max_lines; i++ ) { - if ( filtered[i+offset] == NULL ) { - textbox_font( boxes[i], config.menu_font, - config.menu_fg, - config.menu_bg ); - textbox_text( boxes[i], "" ); - } else { - textbox_font( boxes[i], config.menu_font, - ( i+offset ) == selected ? config.menu_hlfg: config.menu_fg, - ( i+offset ) == selected ? config.menu_hlbg: config.menu_bg ); - textbox_text( boxes[i], filtered[i+offset] ); + for ( i = 0; i < max_lines; i++ ) + { + if ( filtered[i + offset] == NULL ) + { + textbox_font ( boxes[i], config.menu_font, + config.menu_fg, + config.menu_bg ); + textbox_text ( boxes[i], "" ); + } + else + { + textbox_font ( boxes[i], config.menu_font, + ( i + offset ) == selected ? config.menu_hlfg : config.menu_fg, + ( i + offset ) == selected ? config.menu_hlbg : config.menu_bg ); + textbox_text ( boxes[i], filtered[i + offset] ); } - textbox_draw( boxes[i] ); + textbox_draw ( boxes[i] ); } } /* Very bad implementation of tab completion. -* It will complete to the common prefix -*/ -static int calculate_common_prefix( char **filtered, int max_lines ) + * It will complete to the common prefix + */ +static int calculate_common_prefix ( char **filtered, int max_lines ) { int length_prefix = 0; - if ( filtered && filtered[0] != NULL ) { - int found = 1; - char *p = filtered[0]; + if ( filtered && filtered[0] != NULL ) + { + int found = 1; + char *p = filtered[0]; - do { + do + { found = 1; - for ( int j=0; j < max_lines && filtered[j] != NULL; j++ ) { - if ( filtered[j][length_prefix] == '\0' || filtered[j][length_prefix] != *p ) { + for ( int j = 0; j < max_lines && filtered[j] != NULL; j++ ) + { + if ( filtered[j][length_prefix] == '\0' || filtered[j][length_prefix] != *p ) + { if ( found ) - found=0; + { + found = 0; + } break; } } if ( found ) + { length_prefix++; + } p++; } while ( found ); // cut off to be valid utf8. - for ( int j = 0; j < length_prefix; ) { - if((filtered[0][j]&0x80) == 0){j++;} - else if ((filtered[0][j]&0xf0) == 0xc0) { + for ( int j = 0; j < length_prefix; ) + { + if ( ( filtered[0][j] & 0x80 ) == 0 ) + { + j++; + } + else if ( ( filtered[0][j] & 0xf0 ) == 0xc0 ) + { // 2 bytes - if((j+2) >= length_prefix) length_prefix = j; - j+=2; - }else if ((filtered[0][j]&0xf0) == 0xe0) { + if ( ( j + 2 ) >= length_prefix ) + { + length_prefix = j; + } + j += 2; + } + else if ( ( filtered[0][j] & 0xf0 ) == 0xe0 ) + { // 3 bytes - if((j+3) >= length_prefix) length_prefix = j; - j+=3; - }else if ((filtered[0][j]&0xf0) == 0xf0) { + if ( ( j + 3 ) >= length_prefix ) + { + length_prefix = j; + } + j += 3; + } + else if ( ( filtered[0][j] & 0xf0 ) == 0xf0 ) + { // 4 bytes - if((j+4) >= length_prefix) length_prefix = j; - j+=4; - }else{j++;}; + if ( ( j + 4 ) >= length_prefix ) + { + length_prefix = j; + } + j += 4; + } + else + { + j++; + }; } } return length_prefix; } -int window_match ( char **tokens, __attribute__( ( unused ) )const char *input, int index, void *data ) +int window_match ( char **tokens, __attribute__( ( unused ) ) const char *input, int index, void *data ) { - int match =1; - winlist *ids = ( winlist * )data; - client *c = window_client( ids->array[index] ); + int match = 1; + winlist *ids = ( winlist * ) data; + client *c = window_client ( ids->array[index] ); - if ( tokens ) for ( int j = 1; match && tokens[j]; j++ ) { + if ( tokens ) + { + for ( int j = 1; match && tokens[j]; j++ ) + { int test = 0; if ( !test && c->title[0] != '\0' ) - test = ( strcasestr( c->title, tokens[j] ) != NULL ); + { + test = ( strcasestr ( c->title, tokens[j] ) != NULL ); + } if ( !test && c->class[0] != '\0' ) - test = ( strcasestr( c->class, tokens[j] ) != NULL ); + { + test = ( strcasestr ( c->class, tokens[j] ) != NULL ); + } if ( !test && c->role[0] != '\0' ) - test = ( strcasestr( c->role, tokens[j] ) != NULL ); + { + test = ( strcasestr ( c->role, tokens[j] ) != NULL ); + } if ( !test && c->name[0] != '\0' ) - test = ( strcasestr( c->name, tokens[j] ) != NULL ); + { + test = ( strcasestr ( c->name, tokens[j] ) != NULL ); + } - if ( test == 0 ) match = 0; + if ( test == 0 ) + { + match = 0; + } } + } return match; } -MenuReturn menu( char **lines, char **input, char *prompt, Time *time, int *shift, - menu_match_cb mmc, void *mmc_data, int *selected_line ) +MenuReturn menu ( char **lines, char **input, char *prompt, Time *time, int *shift, + menu_match_cb mmc, void *mmc_data, int *selected_line ) { - int retv = MENU_CANCEL; - unsigned int i,j; - workarea mon; - monitor_active( &mon ); + int retv = MENU_CANCEL; + unsigned int i, j; + workarea mon; + monitor_active ( &mon ); - unsigned int num_lines = 0; - int last_offset = 0; - unsigned int selected = 0; + unsigned int num_lines = 0; + int last_offset = 0; + unsigned int selected = 0; - for ( ; lines != NULL && lines[num_lines]; num_lines++ ); - - unsigned int max_lines = MIN( config.menu_lines, num_lines ); - - // Calculate as float to stop silly, big rounding down errors. - int w = config.menu_width < 101 ? ( mon.w/100.0f )*( float )config.menu_width: config.menu_width; - int x = mon.x + ( mon.w - w )/2; - int element_width = w -( 2*( config.padding ) ); - - if ( config.wmode == HORIZONTAL ) { - element_width = ( w-( 2*( config.padding ) )-max_lines*LINE_MARGIN )/( max_lines+1 ); + for (; lines != NULL && lines[num_lines]; num_lines++ ) + { + ; } - Window box; + unsigned int max_lines = MIN ( config.menu_lines, num_lines ); + + // Calculate as float to stop silly, big rounding down errors. + int w = config.menu_width < 101 ? ( mon.w / 100.0f ) * ( float ) config.menu_width : config.menu_width; + int x = mon.x + ( mon.w - w ) / 2; + int element_width = w - ( 2 * ( config.padding ) ); + + if ( config.wmode == HORIZONTAL ) + { + element_width = ( w - ( 2 * ( config.padding ) ) - max_lines * LINE_MARGIN ) / ( max_lines + 1 ); + } + + Window box; XWindowAttributes attr; // main window isn't explicitly destroyed in case we switch modes. Reusing it prevents flicker - if ( main_window != None && XGetWindowAttributes( display, main_window, &attr ) ) { + if ( main_window != None && XGetWindowAttributes ( display, main_window, &attr ) ) + { box = main_window; - } else { - box = XCreateSimpleWindow( display, root, x, 0, w, 300, - config.menu_bw, color_get( config.menu_bc ), - color_get( config.menu_bg ) ); - XSelectInput( display, box, ExposureMask ); + } + else + { + box = XCreateSimpleWindow ( display, root, x, 0, w, 300, + config.menu_bw, color_get ( config.menu_bc ), + color_get ( config.menu_bg ) ); + XSelectInput ( display, box, ExposureMask ); - gc = XCreateGC( display, box, 0, 0 ); - XSetLineAttributes( display, gc, 2, LineOnOffDash, CapButt, JoinMiter ); - XSetForeground( display, gc, color_get( config.menu_bc ) ); + gc = XCreateGC ( display, box, 0, 0 ); + XSetLineAttributes ( display, gc, 2, LineOnOffDash, CapButt, JoinMiter ); + XSetForeground ( display, gc, color_get ( config.menu_bc ) ); // make it an unmanaged window - window_set_atom_prop( box, netatoms[_NET_WM_STATE], &netatoms[_NET_WM_STATE_ABOVE], 1 ); + window_set_atom_prop ( box, netatoms[_NET_WM_STATE], &netatoms[_NET_WM_STATE_ABOVE], 1 ); XSetWindowAttributes sattr; sattr.override_redirect = True; - XChangeWindowAttributes( display, box, CWOverrideRedirect, &sattr ); + XChangeWindowAttributes ( display, box, CWOverrideRedirect, &sattr ); main_window = box; // Set the WM_NAME - XStoreName( display, box, "rofi" ); + XStoreName ( display, box, "rofi" ); // Hack to set window opacity. - unsigned int opacity_set = ( unsigned int )( ( config.window_opacity/100.0 )* OPAQUE ); - XChangeProperty( display, box, XInternAtom( display, OPACITY, False ), - XA_CARDINAL, 32, PropModeReplace, - ( unsigned char * ) &opacity_set, 1L ); + unsigned int opacity_set = ( unsigned int ) ( ( config.window_opacity / 100.0 ) * OPAQUE ); + XChangeProperty ( display, box, XInternAtom ( display, OPACITY, False ), + XA_CARDINAL, 32, PropModeReplace, + ( unsigned char * ) &opacity_set, 1L ); } // search text input - textbox *text = textbox_create( box, TB_AUTOHEIGHT|TB_EDITABLE, - ( config.padding ), - ( config.padding ), - element_width, 1, - config.menu_font, config.menu_fg, config.menu_bg, - ( input!= NULL )?*input:"", prompt ); - textbox_show( text ); + textbox *text = textbox_create ( box, TB_AUTOHEIGHT | TB_EDITABLE, + ( config.padding ), + ( config.padding ), + element_width, 1, + config.menu_font, config.menu_fg, config.menu_bg, + ( input != NULL ) ? *input : "", prompt ); + textbox_show ( text ); int line_height = text->font->ascent + text->font->descent; // filtered list display - textbox **boxes = allocate_clear( sizeof( textbox* ) * max_lines ); + textbox **boxes = allocate_clear ( sizeof ( textbox* ) * max_lines ); - int columns = 1; + int columns = 1; - if ( config.wmode == HORIZONTAL ) { + if ( config.wmode == HORIZONTAL ) + { // Number of columns is the width of the screen - the inner margins + trailing line margin. - columns = ( w-2*( config.padding )+LINE_MARGIN )/( element_width+LINE_MARGIN ); + columns = ( w - 2 * ( config.padding ) + LINE_MARGIN ) / ( element_width + LINE_MARGIN ); } - for ( i = 0; i < max_lines; i++ ) { - int col = ( i+1 )%columns; - int line = ( i+1 )/columns; - boxes[i] = textbox_create( box, - 0, - ( config.padding )+col*( element_width+LINE_MARGIN ), // X - line * line_height + config.padding +( ( config.wmode == HORIZONTAL )?0:LINE_MARGIN ), // y - element_width, // w - line_height, // h - config.menu_font, config.menu_fg, config.menu_bg, lines[i], NULL ); - textbox_show( boxes[i] ); + for ( i = 0; i < max_lines; i++ ) + { + int col = ( i + 1 ) % columns; + int line = ( i + 1 ) / columns; + boxes[i] = textbox_create ( box, + 0, + ( config.padding ) + col * ( element_width + LINE_MARGIN ), // X + line * line_height + config.padding + ( ( config.wmode == HORIZONTAL ) ? 0 : LINE_MARGIN ), // y + element_width, // w + line_height, // h + config.menu_font, config.menu_fg, config.menu_bg, lines[i], NULL ); + textbox_show ( boxes[i] ); } // filtered list - char **filtered = allocate_clear( sizeof( char* ) * num_lines ); - int *line_map = allocate_clear( sizeof( int ) * num_lines ); + char **filtered = allocate_clear ( sizeof ( char* ) * num_lines ); + int *line_map = allocate_clear ( sizeof ( int ) * num_lines ); unsigned int filtered_lines = 0; - if ( input && *input ) { - char **tokens = tokenize( *input ); + if ( input && *input ) + { + char **tokens = tokenize ( *input ); // input changed - for ( i = 0, j = 0; i < num_lines ; i++ ) { - int match = mmc( tokens,lines[i], i, mmc_data ); + for ( i = 0, j = 0; i < num_lines; i++ ) + { + int match = mmc ( tokens, lines[i], i, mmc_data ); // If each token was matched, add it to list. - if ( match ) { - line_map[j] = i; + if ( match ) + { + line_map[j] = i; filtered[j++] = lines[i]; filtered_lines++; } } - tokenize_free( tokens ); - } else { + tokenize_free ( tokens ); + } + else + { int jin = 0; - for ( i = 0; i < num_lines; i++ ) { + for ( i = 0; i < num_lines; i++ ) + { filtered[jin] = lines[i]; line_map[jin] = i; jin++; @@ -939,229 +1119,308 @@ MenuReturn menu( char **lines, char **input, char *prompt, Time *time, int *shif // resize window vertically to suit // Subtract the margin of the last row. - int h = line_height * ( max_lines+1 ) + ( config.padding )*2 +LINE_MARGIN; + int h = line_height * ( max_lines + 1 ) + ( config.padding ) * 2 + LINE_MARGIN; - if ( config.wmode == HORIZONTAL ) { - h = line_height+( config.padding )*2; + if ( config.wmode == HORIZONTAL ) + { + h = line_height + ( config.padding ) * 2; } // Default location is center. - int y = mon.y + ( mon.h - h )/2; + int y = mon.y + ( mon.h - h ) / 2; // Determine window location - switch ( config.location ) { - case WL_NORTH_WEST: - x=mon.x; + switch ( config.location ) + { + case WL_NORTH_WEST: + x = mon.x; - case WL_NORTH: - y=mon.y; - break; + case WL_NORTH: + y = mon.y; + break; - case WL_NORTH_EAST: - y=mon.y; + case WL_NORTH_EAST: + y = mon.y; - case WL_EAST: - x=mon.x+mon.w-w; - break; + case WL_EAST: + x = mon.x + mon.w - w; + break; - case WL_EAST_SOUTH: - x=mon.x+mon.w-w; + case WL_EAST_SOUTH: + x = mon.x + mon.w - w; - case WL_SOUTH: - y=mon.y+mon.h-h; - break; + case WL_SOUTH: + y = mon.y + mon.h - h; + break; - case WL_SOUTH_WEST: - y=mon.y+mon.h-h; + case WL_SOUTH_WEST: + y = mon.y + mon.h - h; - case WL_WEST: - x=mon.x; - break; + case WL_WEST: + x = mon.x; + break; - case WL_CENTER: - default: - break; + case WL_CENTER: + default: + break; } - XMoveResizeWindow( display, box, x, y, w, h ); - XMapRaised( display, box ); + XMoveResizeWindow ( display, box, x, y, w, h ); + XMapRaised ( display, box ); - take_keyboard( box ); + take_keyboard ( box ); - for ( ;; ) { + for (;; ) + { XEvent ev; - XNextEvent( display, &ev ); + XNextEvent ( display, &ev ); - if ( ev.type == Expose ) { - while ( XCheckTypedEvent( display, Expose, &ev ) ); + if ( ev.type == Expose ) + { + while ( XCheckTypedEvent ( display, Expose, &ev ) ) + { + ; + } - menu_draw( text, boxes, max_lines,num_lines,&last_offset, selected, filtered ); + menu_draw ( text, boxes, max_lines, num_lines, &last_offset, selected, filtered ); // Why do we need the specian -1? - if ( config.wmode == VERTICAL ) { - XDrawLine( display, main_window, gc, ( config.padding ), - line_height+( config.padding )+( LINE_MARGIN-2 )/2, - w-( ( config.padding ) )-1, - line_height+( config.padding ) +( LINE_MARGIN-2 )/2 ); + if ( config.wmode == VERTICAL ) + { + XDrawLine ( display, main_window, gc, ( config.padding ), + line_height + ( config.padding ) + ( LINE_MARGIN - 2 ) / 2, + w - ( ( config.padding ) ) - 1, + line_height + ( config.padding ) + ( LINE_MARGIN - 2 ) / 2 ); + } + } + else if ( ev.type == KeyPress ) + { + while ( XCheckTypedEvent ( display, KeyPress, &ev ) ) + { + ; } - } else if ( ev.type == KeyPress ) { - while ( XCheckTypedEvent( display, KeyPress, &ev ) ); if ( time ) + { *time = ev.xkey.time; + } - KeySym key = XkbKeycodeToKeysym( display, ev.xkey.keycode, 0, 0 ); + KeySym key = XkbKeycodeToKeysym ( display, ev.xkey.keycode, 0, 0 ); - if ( ( ( ev.xkey.state&ShiftMask ) == ShiftMask ) && - key == XK_slash ) { - retv = MENU_NEXT; + if ( ( ( ev.xkey.state & ShiftMask ) == ShiftMask ) && + key == XK_slash ) + { + retv = MENU_NEXT; *selected_line = 0; break; - } else if ( ( ( ev.xkey.state&ShiftMask ) == ShiftMask ) && - key == XK_Delete ) { - if ( filtered[selected] != NULL ) { + } + else if ( ( ( ev.xkey.state & ShiftMask ) == ShiftMask ) && + key == XK_Delete ) + { + if ( filtered[selected] != NULL ) + { *selected_line = line_map[selected]; - retv = MENU_ENTRY_DELETE; + retv = MENU_ENTRY_DELETE; break; } } - int rc = textbox_keypress( text, &ev ); + int rc = textbox_keypress ( text, &ev ); - if ( rc < 0 ) { + if ( rc < 0 ) + { if ( shift != NULL ) - ( *shift ) = ( ( ev.xkey.state&ShiftMask ) == ShiftMask ); + { + ( *shift ) = ( ( ev.xkey.state & ShiftMask ) == ShiftMask ); + } - if ( filtered && filtered[selected] ) { - retv = MENU_OK; + if ( filtered && filtered[selected] ) + { + retv = MENU_OK; *selected_line = line_map[selected]; - } else { + } + else + { retv = MENU_CUSTOM_INPUT; } break; - } else if ( rc ) { - char **tokens = tokenize( text->text ); + } + else if ( rc ) + { + char **tokens = tokenize ( text->text ); // input changed - for ( i = 0, j = 0; i < num_lines ; i++ ) { - int match = mmc( tokens,lines[i], i, mmc_data ); + for ( i = 0, j = 0; i < num_lines; i++ ) + { + int match = mmc ( tokens, lines[i], i, mmc_data ); // If each token was matched, add it to list. - if ( match ) { - line_map[j] = i; + if ( match ) + { + line_map[j] = i; filtered[j++] = lines[i]; } } // Cleanup + bookkeeping. filtered_lines = j; - selected = MIN( selected, j-1 ); + selected = MIN ( selected, j - 1 ); - for ( ; j < num_lines; j++ ) + for (; j < num_lines; j++ ) + { filtered[j] = NULL; + } - if ( config.zeltak_mode && filtered_lines == 1 ) { - if ( filtered[selected] ) { - retv = MENU_OK; + if ( config.zeltak_mode && filtered_lines == 1 ) + { + if ( filtered[selected] ) + { + retv = MENU_OK; *selected_line = line_map[selected]; - } else { - fprintf( stderr, "We should never hit this." ); - abort(); + } + else + { + fprintf ( stderr, "We should never hit this." ); + abort (); } break; } - tokenize_free( tokens ); - } else { + tokenize_free ( tokens ); + } + else + { // unhandled key - KeySym key = XkbKeycodeToKeysym( display, ev.xkey.keycode, 0, 0 ); + KeySym key = XkbKeycodeToKeysym ( display, ev.xkey.keycode, 0, 0 ); if ( key == XK_Escape // pressing one of the global key bindings closes the switcher. this allows fast closing of the menu if an item is not selected || ( ( windows_modmask == AnyModifier || ev.xkey.state & windows_modmask ) && key == windows_keysym ) || ( ( rundialog_modmask == AnyModifier || ev.xkey.state & rundialog_modmask ) && key == rundialog_keysym ) || ( ( sshdialog_modmask == AnyModifier || ev.xkey.state & sshdialog_modmask ) && key == sshdialog_keysym ) - ) { + ) + { retv = MENU_CANCEL; break; - } else { + } + else + { // Up or Shift-Tab if ( key == XK_Up || ( key == XK_Tab && ev.xkey.state & ShiftMask ) || - ( key == XK_j && ev.xkey.state& ControlMask ) ) { - if ( selected == 0 ) selected = filtered_lines; + ( key == XK_j && ev.xkey.state & ControlMask ) ) + { + if ( selected == 0 ) + { + selected = filtered_lines; + } - if ( selected > 0 ) selected --; - } else if ( key == XK_Down || - ( key == XK_k && ev.xkey.state& ControlMask ) ) { - selected = selected < filtered_lines-1 ? MIN( filtered_lines-1, selected+1 ): 0; - } else if ( key == XK_Page_Up ) { - if ( selected < max_lines ) selected = 0; + if ( selected > 0 ) + { + selected--; + } + } + else if ( key == XK_Down || + ( key == XK_k && ev.xkey.state & ControlMask ) ) + { + selected = selected < filtered_lines - 1 ? MIN ( filtered_lines - 1, selected + 1 ) : 0; + } + else if ( key == XK_Page_Up ) + { + if ( selected < max_lines ) + { + selected = 0; + } else - selected -= ( max_lines-1 ); - } else if ( key == XK_Page_Down ) { - selected += ( max_lines-1 ); + { + selected -= ( max_lines - 1 ); + } + } + else if ( key == XK_Page_Down ) + { + selected += ( max_lines - 1 ); - if ( selected >= num_lines ) selected = num_lines-1; - } else if ( key == XK_Home || key == XK_KP_Home ) { + if ( selected >= num_lines ) + { + selected = num_lines - 1; + } + } + else if ( key == XK_Home || key == XK_KP_Home ) + { selected = 0; - } else if ( key == XK_End || key == XK_KP_End ) { - selected = num_lines-1; - } else if ( key == XK_Tab ) { - if ( filtered_lines == 1 ) { - if ( filtered[selected] ) { - retv = MENU_OK; + } + else if ( key == XK_End || key == XK_KP_End ) + { + selected = num_lines - 1; + } + else if ( key == XK_Tab ) + { + if ( filtered_lines == 1 ) + { + if ( filtered[selected] ) + { + retv = MENU_OK; *selected_line = line_map[selected]; - } else { - fprintf( stderr, "We should never hit this." ); - abort(); + } + else + { + fprintf ( stderr, "We should never hit this." ); + abort (); } break; } - int length_prefix = calculate_common_prefix( filtered, num_lines ); + int length_prefix = calculate_common_prefix ( filtered, num_lines ); // TODO: memcmp to utf8 aware cmp. - if ( length_prefix && memcmp( filtered[0], text->text, length_prefix ) ) { + if ( length_prefix && memcmp ( filtered[0], text->text, length_prefix ) ) + { // Do not want to modify original string, so make copy. // not eff.. - char * str = allocate (sizeof(char)*(length_prefix+1)); - memcpy( str,filtered[0], length_prefix ); + char * str = allocate ( sizeof ( char ) * ( length_prefix + 1 ) ); + memcpy ( str, filtered[0], length_prefix ); str[length_prefix] = '\0'; - textbox_text( text, str ); - textbox_cursor_end( text ); - free( str ); - } else { - selected = selected < filtered_lines-1 ? MIN( filtered_lines-1, selected+1 ): 0; + textbox_text ( text, str ); + textbox_cursor_end ( text ); + free ( str ); + } + else + { + selected = selected < filtered_lines - 1 ? MIN ( filtered_lines - 1, selected + 1 ) : 0; } } } } - menu_draw( text, boxes, max_lines,num_lines, &last_offset, selected, filtered ); + menu_draw ( text, boxes, max_lines, num_lines, &last_offset, selected, filtered ); } } - release_keyboard(); + release_keyboard (); - if ( *input != NULL ) free( *input ); + if ( *input != NULL ) + { + free ( *input ); + } - *input = strdup( text->text ); + *input = strdup ( text->text ); - textbox_free( text ); + textbox_free ( text ); for ( i = 0; i < max_lines; i++ ) - textbox_free( boxes[i] ); + { + textbox_free ( boxes[i] ); + } - free( boxes ); + free ( boxes ); - free( filtered ); - free( line_map ); + free ( filtered ); + free ( line_map ); return retv; } @@ -1171,87 +1430,106 @@ MenuReturn menu( char **lines, char **input, char *prompt, Time *time, int *shif SwitcherMode run_switcher_window ( char **input ) { - SwitcherMode retv = MODE_EXIT; + SwitcherMode retv = MODE_EXIT; // find window list - Atom type; - int nwins; + Atom type; + int nwins; unsigned long wins[100]; - if ( window_get_prop( root, netatoms[_NET_CLIENT_LIST_STACKING], - &type, &nwins, wins, 100 * sizeof( unsigned long ) ) - && type == XA_WINDOW ) { - char pattern[50]; - int i; - unsigned int classfield = 0; - unsigned long desktops = 0; + if ( window_get_prop ( root, netatoms[_NET_CLIENT_LIST_STACKING], + &type, &nwins, wins, 100 * sizeof ( unsigned long ) ) + && type == XA_WINDOW ) + { + char pattern[50]; + int i; + unsigned int classfield = 0; + unsigned long desktops = 0; // windows we actually display. may be slightly different to _NET_CLIENT_LIST_STACKING // if we happen to have a window destroyed while we're working... - winlist *ids = winlist_new(); + winlist *ids = winlist_new (); // calc widths of fields - for ( i = nwins-1; i > -1; i-- ) { + for ( i = nwins - 1; i > -1; i-- ) + { client *c; - if ( ( c = window_client( wins[i] ) ) + if ( ( c = window_client ( wins[i] ) ) && !c->xattr.override_redirect - && !client_has_state( c, netatoms[_NET_WM_STATE_SKIP_PAGER] ) - && !client_has_state( c, netatoms[_NET_WM_STATE_SKIP_TASKBAR] ) ) { - - classfield = MAX( classfield, strlen( c->class ) ); + && !client_has_state ( c, netatoms[_NET_WM_STATE_SKIP_PAGER] ) + && !client_has_state ( c, netatoms[_NET_WM_STATE_SKIP_TASKBAR] ) ) + { + classfield = MAX ( classfield, strlen ( c->class ) ); #ifdef HAVE_I3_IPC_H // In i3 mode, skip the i3bar completely. - if ( config.i3_mode && strstr( c->class, "i3bar" ) != NULL ) continue; + if ( config.i3_mode && strstr ( c->class, "i3bar" ) != NULL ) + { + continue; + } #endif - winlist_append( ids, c->window, NULL ); + winlist_append ( ids, c->window, NULL ); } } // Create pattern for printing the line. - if (!window_get_cardinal_prop(root, netatoms[_NET_NUMBER_OF_DESKTOPS], &desktops, 1)) + if ( !window_get_cardinal_prop ( root, netatoms[_NET_NUMBER_OF_DESKTOPS], &desktops, 1 ) ) + { desktops = 1; -#ifdef HAVE_I3_IPC_H - if(config.i3_mode) { - sprintf(pattern, "%%-%ds %%s", MAX(5, classfield)); - }else { -#endif - sprintf(pattern, "%%-%ds %%-%ds %%s", desktops < 10 ? 1 : 2, MAX(5, classfield)); -#ifdef HAVE_I3_IPC_H } +#ifdef HAVE_I3_IPC_H + if ( config.i3_mode ) + { + sprintf ( pattern, "%%-%ds %%s", MAX ( 5, classfield ) ); + } + else + { #endif - char **list = allocate_clear( sizeof( char* ) * ( ids->len+1 ) ); - int lines = 0; + sprintf ( pattern, "%%-%ds %%-%ds %%s", desktops < 10 ? 1 : 2, MAX ( 5, classfield ) ); +#ifdef HAVE_I3_IPC_H + } +#endif + char **list = allocate_clear ( sizeof ( char* ) * ( ids->len + 1 ) ); + int lines = 0; // build the actual list Window w = 0; - winlist_ascend( ids, i, w ) { + winlist_ascend ( ids, i, w ) + { client *c; - if ( ( c = window_client( w ) ) ) { + if ( ( c = window_client ( w ) ) ) + { // final line format unsigned long wmdesktop; - char desktop[5]; + char desktop[5]; desktop[0] = 0; - char *line = allocate( strlen( c->title ) + strlen( c->class ) + classfield + 50 ); + char *line = allocate ( strlen ( c->title ) + strlen ( c->class ) + classfield + 50 ); #ifdef HAVE_I3_IPC_H - if(!config.i3_mode) { + if ( !config.i3_mode ) + { #endif - // find client's desktop. this is zero-based, so we adjust by since most - // normal people don't think like this :-) - if (!window_get_cardinal_prop(c->window, netatoms[_NET_WM_DESKTOP], &wmdesktop, 1)) - wmdesktop = 0xFFFFFFFF; - - if (wmdesktop < 0xFFFFFFFF) - sprintf(desktop, "%d", (int)wmdesktop+1); - - sprintf(line, pattern, desktop, c->class, c->title); -#ifdef HAVE_I3_IPC_H - }else{ - sprintf(line, pattern, c->class, c->title); + // find client's desktop. this is zero-based, so we adjust by since most + // normal people don't think like this :-) + if ( !window_get_cardinal_prop ( c->window, netatoms[_NET_WM_DESKTOP], &wmdesktop, 1 ) ) + { + wmdesktop = 0xFFFFFFFF; } + + if ( wmdesktop < 0xFFFFFFFF ) + { + sprintf ( desktop, "%d", (int) wmdesktop + 1 ); + } + + sprintf ( line, pattern, desktop, c->class, c->title ); +#ifdef HAVE_I3_IPC_H + } + else + { + sprintf ( line, pattern, c->class, c->title ); + } #endif list[lines++] = line; @@ -1259,42 +1537,49 @@ SwitcherMode run_switcher_window ( char **input ) } Time time; int selected_line = 0; - MenuReturn mretv = menu( list, input, ">", &time, NULL,window_match, ids ,&selected_line ); + MenuReturn mretv = menu ( list, input, ">", &time, NULL, window_match, ids, &selected_line ); - if ( mretv == MENU_NEXT ) { + if ( mretv == MENU_NEXT ) + { retv = NEXT_DIALOG; - } else if ( mretv == MENU_OK && list[selected_line] ) { + } + else if ( mretv == MENU_OK && list[selected_line] ) + { #ifdef HAVE_I3_IPC_H - if ( config.i3_mode ) { + if ( config.i3_mode ) + { // Hack for i3. - focus_window_i3( i3_socket_path,ids->array[selected_line] ); - } else + focus_window_i3 ( i3_socket_path, ids->array[selected_line] ); + } + else #endif { // Change to the desktop of the selected window/client. // TODO: get rid of strtol - window_send_message(root, root, netatoms[_NET_CURRENT_DESKTOP], strtol(list[selected_line], NULL, 10)-1, - SubstructureNotifyMask | SubstructureRedirectMask, time); - XSync(display, False); + window_send_message ( root, root, netatoms[_NET_CURRENT_DESKTOP], strtol ( list[selected_line], NULL, 10 ) - 1, + SubstructureNotifyMask | SubstructureRedirectMask, time ); + XSync ( display, False ); - window_send_message( root, ids->array[selected_line], netatoms[_NET_ACTIVE_WINDOW], 2, // 2 = pager - SubstructureNotifyMask | SubstructureRedirectMask, time ); + window_send_message ( root, ids->array[selected_line], netatoms[_NET_ACTIVE_WINDOW], 2, // 2 = pager + SubstructureNotifyMask | SubstructureRedirectMask, time ); } } for ( i = 0; i < lines; i++ ) - free( list[i] ); + { + free ( list[i] ); + } - free( list ); - winlist_free( ids ); + free ( list ); + winlist_free ( ids ); } return retv; } -void run_switcher( int fmode, SwitcherMode mode ) +void run_switcher ( int fmode, SwitcherMode mode ) { // TODO: this whole function is messy. build a nicer solution @@ -1303,136 +1588,188 @@ void run_switcher( int fmode, SwitcherMode mode ) // this also happens to isolate the Xft font stuff in a child process // that gets cleaned up every time. that library shows some valgrind // strangeness... - if ( fmode == FORK ) { - if ( fork() ) return; + if ( fmode == FORK ) + { + if ( fork () ) + { + return; + } - display = XOpenDisplay( 0 ); - XSync( display, True ); + display = XOpenDisplay ( 0 ); + XSync ( display, True ); } char *input = NULL; - do { + do + { SwitcherMode retv = MODE_EXIT; - if ( mode == WINDOW_SWITCHER ) { - retv = run_switcher_window( &input ); - } else if ( mode == RUN_DIALOG ) { - retv = run_switcher_dialog( &input ); - } else if ( mode == SSH_DIALOG ) { - retv = ssh_switcher_dialog( &input ); + if ( mode == WINDOW_SWITCHER ) + { + retv = run_switcher_window ( &input ); } - else if ( mode == DMENU_DIALOG ) { + else if ( mode == RUN_DIALOG ) + { + retv = run_switcher_dialog ( &input ); + } + else if ( mode == SSH_DIALOG ) + { + retv = ssh_switcher_dialog ( &input ); + } + else if ( mode == DMENU_DIALOG ) + { retv = dmenu_switcher_dialog ( &input ); } - if ( retv == NEXT_DIALOG ) { - mode = ( mode+1 )%NUM_DIALOGS; - } else { + if ( retv == NEXT_DIALOG ) + { + mode = ( mode + 1 ) % NUM_DIALOGS; + } + else + { mode = retv; } } while ( mode != MODE_EXIT ); - if ( input != NULL ) { - free( input ); + if ( input != NULL ) + { + free ( input ); } - if ( fmode == FORK ) { - exit( EXIT_SUCCESS ); + if ( fmode == FORK ) + { + exit ( EXIT_SUCCESS ); } } // KeyPress event -void handle_keypress( XEvent *ev ) +void handle_keypress ( XEvent *ev ) { - KeySym key = XkbKeycodeToKeysym( display, ev->xkey.keycode, 0, 0 ); + KeySym key = XkbKeycodeToKeysym ( display, ev->xkey.keycode, 0, 0 ); if ( ( windows_modmask == AnyModifier || ev->xkey.state & windows_modmask ) && - key == windows_keysym ) { - run_switcher( FORK , WINDOW_SWITCHER ); + key == windows_keysym ) + { + run_switcher ( FORK, WINDOW_SWITCHER ); } if ( ( rundialog_modmask == AnyModifier || ev->xkey.state & rundialog_modmask ) && - key == rundialog_keysym ) { - run_switcher( FORK , RUN_DIALOG ); + key == rundialog_keysym ) + { + run_switcher ( FORK, RUN_DIALOG ); } if ( ( sshdialog_modmask == AnyModifier || ev->xkey.state & sshdialog_modmask ) && - key == sshdialog_keysym ) { - run_switcher( FORK , SSH_DIALOG ); + key == sshdialog_keysym ) + { + run_switcher ( FORK, SSH_DIALOG ); } - } // convert a Mod+key arg to mod mask and keysym -void parse_key( char *combo, unsigned int *mod, KeySym *key ) +void parse_key ( char *combo, unsigned int *mod, KeySym *key ) { unsigned int modmask = 0; - if ( strcasestr( combo, "shift" ) ) modmask |= ShiftMask; + if ( strcasestr ( combo, "shift" ) ) + { + modmask |= ShiftMask; + } - if ( strcasestr( combo, "control" ) ) modmask |= ControlMask; + if ( strcasestr ( combo, "control" ) ) + { + modmask |= ControlMask; + } - if ( strcasestr( combo, "mod1" ) ) modmask |= Mod1Mask; + if ( strcasestr ( combo, "mod1" ) ) + { + modmask |= Mod1Mask; + } - if ( strcasestr( combo, "alt" ) ) modmask |= Mod1Mask; + if ( strcasestr ( combo, "alt" ) ) + { + modmask |= Mod1Mask; + } - if ( strcasestr( combo, "mod2" ) ) modmask |= Mod2Mask; + if ( strcasestr ( combo, "mod2" ) ) + { + modmask |= Mod2Mask; + } - if ( strcasestr( combo, "mod3" ) ) modmask |= Mod3Mask; + if ( strcasestr ( combo, "mod3" ) ) + { + modmask |= Mod3Mask; + } - if ( strcasestr( combo, "mod4" ) ) modmask |= Mod4Mask; + if ( strcasestr ( combo, "mod4" ) ) + { + modmask |= Mod4Mask; + } - if ( strcasestr( combo, "mod5" ) ) modmask |= Mod5Mask; + if ( strcasestr ( combo, "mod5" ) ) + { + modmask |= Mod5Mask; + } - *mod = modmask ? modmask: AnyModifier; + *mod = modmask ? modmask : AnyModifier; - char i = strlen( combo ); + char i = strlen ( combo ); - while ( i > 0 && !strchr( "-+", combo[i-1] ) ) i--; + while ( i > 0 && !strchr ( "-+", combo[i - 1] ) ) + { + i--; + } - KeySym sym = XStringToKeysym( combo+i ); + KeySym sym = XStringToKeysym ( combo + i ); - if ( sym == NoSymbol || ( !modmask && ( strchr( combo, '-' ) || strchr( combo, '+' ) ) ) ) { - fprintf( stderr, "sorry, cannot understand key combination: %s\n", combo ); - exit( EXIT_FAILURE ); + if ( sym == NoSymbol || ( !modmask && ( strchr ( combo, '-' ) || strchr ( combo, '+' ) ) ) ) + { + fprintf ( stderr, "sorry, cannot understand key combination: %s\n", combo ); + exit ( EXIT_FAILURE ); } *key = sym; } // bind a key combination on a root window, compensating for Lock* states -void grab_key( unsigned int modmask, KeySym key ) +void grab_key ( unsigned int modmask, KeySym key ) { - KeyCode keycode = XKeysymToKeycode( display, key ); - XUngrabKey( display, keycode, AnyModifier, root ); + KeyCode keycode = XKeysymToKeycode ( display, key ); + XUngrabKey ( display, keycode, AnyModifier, root ); - if ( modmask != AnyModifier ) { + if ( modmask != AnyModifier ) + { // bind to combinations of mod and lock masks, so caps and numlock don't confuse people - XGrabKey( display, keycode, modmask, root, True, GrabModeAsync, GrabModeAsync ); - XGrabKey( display, keycode, modmask|LockMask, root, True, GrabModeAsync, GrabModeAsync ); + XGrabKey ( display, keycode, modmask, root, True, GrabModeAsync, GrabModeAsync ); + XGrabKey ( display, keycode, modmask | LockMask, root, True, GrabModeAsync, GrabModeAsync ); - if ( NumlockMask ) { - XGrabKey( display, keycode, modmask|NumlockMask, root, True, GrabModeAsync, GrabModeAsync ); - XGrabKey( display, keycode, modmask|NumlockMask|LockMask, root, True, GrabModeAsync, GrabModeAsync ); + if ( NumlockMask ) + { + XGrabKey ( display, keycode, modmask | NumlockMask, root, True, GrabModeAsync, GrabModeAsync ); + XGrabKey ( display, keycode, modmask | NumlockMask | LockMask, root, True, GrabModeAsync, GrabModeAsync ); } - } else { + } + else + { // nice simple single key bind - XGrabKey( display, keycode, AnyModifier, root, True, GrabModeAsync, GrabModeAsync ); + XGrabKey ( display, keycode, AnyModifier, root, True, GrabModeAsync, GrabModeAsync ); } } #ifdef HAVE_I3_IPC_H -static inline void display_get_i3_path( Display *display ) +static inline void display_get_i3_path ( Display *display ) { config.i3_mode = 0; - Atom atom = XInternAtom( display, I3_SOCKET_PATH_PROP,True ); + Atom atom = XInternAtom ( display, I3_SOCKET_PATH_PROP, True ); - if ( atom != None ) { - i3_socket_path = window_get_text_prop( root, atom ); + if ( atom != None ) + { + i3_socket_path = window_get_text_prop ( root, atom ); - if ( i3_socket_path != NULL ) { + if ( i3_socket_path != NULL ) + { config.i3_mode = 1; } } @@ -1443,164 +1780,199 @@ static inline void display_get_i3_path( Display *display ) /** * Help function. This calls man. */ -void help() +void help () { - int code = execlp( "man","man", MANPAGE_PATH,NULL ); + int code = execlp ( "man", "man", MANPAGE_PATH, NULL ); - if ( code == -1 ) { - fprintf( stderr, "Failed to execute man: %s\n", strerror( errno ) ); + if ( code == -1 ) + { + fprintf ( stderr, "Failed to execute man: %s\n", strerror ( errno ) ); } } -int main( int argc, char *argv[] ) +int main ( int argc, char *argv[] ) { int i, j; // catch help request - if ( find_arg( argc, argv, "-help" ) >= 0 - || find_arg( argc, argv, "--help" ) >= 0 - || find_arg( argc, argv, "-h" ) >= 0 ) { - help(); + if ( find_arg ( argc, argv, "-help" ) >= 0 + || find_arg ( argc, argv, "--help" ) >= 0 + || find_arg ( argc, argv, "-h" ) >= 0 ) + { + help (); return EXIT_SUCCESS; } - if ( find_arg( argc, argv, "-v" ) >= 0 || - find_arg( argc, argv, "-version" ) >= 0 ) { - - fprintf( stdout, "Version: "VERSION"\n" ); + if ( find_arg ( argc, argv, "-v" ) >= 0 || + find_arg ( argc, argv, "-version" ) >= 0 ) + { + fprintf ( stdout, "Version: "VERSION "\n" ); return EXIT_SUCCESS; } // Get DISPLAY - char *display_str= getenv( "DISPLAY" ); - find_arg_str( argc, argv, "-display", &display_str ); + char *display_str = getenv ( "DISPLAY" ); + find_arg_str ( argc, argv, "-display", &display_str ); - if ( !( display = XOpenDisplay( display_str ) ) ) { - fprintf( stderr, "cannot open display!\n" ); + if ( !( display = XOpenDisplay ( display_str ) ) ) + { + fprintf ( stderr, "cannot open display!\n" ); return EXIT_FAILURE; } // Initialize xdg, so we can grab the xdgCacheHome - if ( xdgInitHandle( &xdg_handle ) == NULL ) { - fprintf( stderr, "Failed to initialize XDG\n" ); + if ( xdgInitHandle ( &xdg_handle ) == NULL ) + { + fprintf ( stderr, "Failed to initialize XDG\n" ); return EXIT_FAILURE; } - cache_dir = xdgCacheHome( &xdg_handle ); + cache_dir = xdgCacheHome ( &xdg_handle ); - signal( SIGCHLD, catch_exit ); - screen = DefaultScreenOfDisplay( display ); - screen_id = DefaultScreen( display ); - root = DefaultRootWindow( display ); - XSync( display, False ); - xerror = XSetErrorHandler( oops ); - XSync( display, False ); + signal ( SIGCHLD, catch_exit ); + screen = DefaultScreenOfDisplay ( display ); + screen_id = DefaultScreen ( display ); + root = DefaultRootWindow ( display ); + XSync ( display, False ); + xerror = XSetErrorHandler ( oops ); + XSync ( display, False ); // determine numlock mask so we can bind on keys with and without it - XModifierKeymap *modmap = XGetModifierMapping( display ); + XModifierKeymap *modmap = XGetModifierMapping ( display ); for ( i = 0; i < 8; i++ ) - for ( j = 0; j < ( int )modmap->max_keypermod; j++ ) - if ( modmap->modifiermap[i*modmap->max_keypermod+j] == XKeysymToKeycode( display, XK_Num_Lock ) ) - NumlockMask = ( 1<= 0 ) { - config.zeltak_mode = 1; + { + for ( j = 0; j < ( int ) modmap->max_keypermod; j++ ) + { + if ( modmap->modifiermap[i * modmap->max_keypermod + j] == XKeysymToKeycode ( display, XK_Num_Lock ) ) + { + NumlockMask = ( 1 << i ); + } + } } - if ( find_arg( argc, argv, "-hmode" ) >= 0 ) { + XFreeModifiermap ( modmap ); + + cache_client = winlist_new (); + cache_xattr = winlist_new (); + + // X atom values + for ( i = 0; i < NETATOMS; i++ ) + { + netatoms[i] = XInternAtom ( display, netatom_names[i], False ); + } + + parse_xresource_options ( display ); + + find_arg_str ( argc, argv, "-font", &( config.menu_font ) ); + find_arg_str ( argc, argv, "-fg", &( config.menu_fg ) ); + find_arg_str ( argc, argv, "-bg", &( config.menu_bg ) ); + find_arg_str ( argc, argv, "-hlfg", &( config.menu_hlfg ) ); + find_arg_str ( argc, argv, "-hlbg", &( config.menu_hlbg ) ); + find_arg_str ( argc, argv, "-bc", &( config.menu_bc ) ); + find_arg_str ( argc, argv, "-term", &( config.terminal_emulator ) ); + find_arg_int ( argc, argv, "-bw", &( config.menu_bw ) ); + find_arg_int ( argc, argv, "-o", &( config.window_opacity ) ); + find_arg_int ( argc, argv, "-width", &( config.menu_width ) ); + find_arg_int ( argc, argv, "-lines", &( config.menu_lines ) ); + find_arg_int ( argc, argv, "-loc", &( config.location ) ); + find_arg_int ( argc, argv, "-padding", &( config.padding ) ); + + if ( find_arg ( argc, argv, "-zeltak" ) >= 0 ) + { + config.zeltak_mode = 1; + } + + if ( find_arg ( argc, argv, "-hmode" ) >= 0 ) + { config.wmode = HORIZONTAL; } #ifdef HAVE_I3_IPC_H // Check for i3 - display_get_i3_path( display ); + display_get_i3_path ( display ); #endif // flags to run immediately and exit - if ( find_arg( argc, argv, "-now" ) >= 0 ) { - run_switcher( NOFORK, WINDOW_SWITCHER ); - } else if ( find_arg( argc, argv, "-rnow" ) >= 0 ) { - run_switcher( NOFORK, RUN_DIALOG ); - } else if ( find_arg( argc, argv, "-snow" ) >= 0 ) { - run_switcher( NOFORK, SSH_DIALOG ); - } else if ( find_arg( argc, argv, "-dmenu" ) >= 0 ) { - find_arg_str( argc, argv, "-p", &dmenu_prompt ); - run_switcher( NOFORK, DMENU_DIALOG ); - } else { + if ( find_arg ( argc, argv, "-now" ) >= 0 ) + { + run_switcher ( NOFORK, WINDOW_SWITCHER ); + } + else if ( find_arg ( argc, argv, "-rnow" ) >= 0 ) + { + run_switcher ( NOFORK, RUN_DIALOG ); + } + else if ( find_arg ( argc, argv, "-snow" ) >= 0 ) + { + run_switcher ( NOFORK, SSH_DIALOG ); + } + else if ( find_arg ( argc, argv, "-dmenu" ) >= 0 ) + { + find_arg_str ( argc, argv, "-p", &dmenu_prompt ); + run_switcher ( NOFORK, DMENU_DIALOG ); + } + else + { // Daemon mode, Listen to key presses.. - find_arg_str( argc, argv, "-key", &( config.window_key ) ); - parse_key( config.window_key, &windows_modmask, &windows_keysym ); - grab_key( windows_modmask, windows_keysym ); + find_arg_str ( argc, argv, "-key", &( config.window_key ) ); + parse_key ( config.window_key, &windows_modmask, &windows_keysym ); + grab_key ( windows_modmask, windows_keysym ); - find_arg_str( argc, argv, "-rkey",&( config.run_key ) ); - parse_key( config.run_key, &rundialog_modmask, &rundialog_keysym ); - grab_key( rundialog_modmask, rundialog_keysym ); + find_arg_str ( argc, argv, "-rkey", &( config.run_key ) ); + parse_key ( config.run_key, &rundialog_modmask, &rundialog_keysym ); + grab_key ( rundialog_modmask, rundialog_keysym ); - find_arg_str( argc, argv, "-skey",&( config.ssh_key ) ); - parse_key( config.ssh_key, &sshdialog_modmask, &sshdialog_keysym ); - grab_key( sshdialog_modmask, sshdialog_keysym ); + find_arg_str ( argc, argv, "-skey", &( config.ssh_key ) ); + parse_key ( config.ssh_key, &sshdialog_modmask, &sshdialog_keysym ); + grab_key ( sshdialog_modmask, sshdialog_keysym ); XEvent ev; - for ( ;; ) { + for (;; ) + { // caches only live for a single event - winlist_empty( cache_xattr ); - winlist_empty( cache_client ); + winlist_empty ( cache_xattr ); + winlist_empty ( cache_client ); // block and wait for something - XNextEvent( display, &ev ); + XNextEvent ( display, &ev ); - if ( ev.xany.window == None ) continue; + if ( ev.xany.window == None ) + { + continue; + } - if ( ev.type == KeyPress ) handle_keypress( &ev ); + if ( ev.type == KeyPress ) + { + handle_keypress ( &ev ); + } } } // Cleanup - if ( display != NULL ) { - - if ( main_window != None ) { - XFreeGC( display,gc ); - XDestroyWindow( display,main_window ); - XCloseDisplay( display ); + if ( display != NULL ) + { + if ( main_window != None ) + { + XFreeGC ( display, gc ); + XDestroyWindow ( display, main_window ); + XCloseDisplay ( display ); } } - winlist_free( cache_xattr ); - winlist_free( cache_client ); + winlist_free ( cache_xattr ); + winlist_free ( cache_client ); #ifdef HAVE_I3_IPC_H - if ( i3_socket_path != NULL ) free( i3_socket_path ); + if ( i3_socket_path != NULL ) + { + free ( i3_socket_path ); + } #endif - xdgWipeHandle( &xdg_handle ); + xdgWipeHandle ( &xdg_handle ); return EXIT_SUCCESS; } diff --git a/source/run-dialog.c b/source/run-dialog.c index 1a728739..08887257 100644 --- a/source/run-dialog.c +++ b/source/run-dialog.c @@ -45,151 +45,176 @@ #include #endif -#define RUN_CACHE_FILE "rofi-2.runcache" +#define RUN_CACHE_FILE "rofi-2.runcache" -static inline int execsh( const char *cmd ,int run_in_term ) +static inline int execsh ( const char *cmd, int run_in_term ) { // use sh for args parsing if ( run_in_term ) - return execlp( config.terminal_emulator, config.terminal_emulator, "-e", "sh", "-c", cmd, NULL ); + { + return execlp ( config.terminal_emulator, config.terminal_emulator, "-e", "sh", "-c", cmd, NULL ); + } - return execlp( "/bin/sh", "sh", "-c", cmd, NULL ); + return execlp ( "/bin/sh", "sh", "-c", cmd, NULL ); } -typedef struct _element{ - long int index; - char name[1024]; -}element; -static int element_sort_func(const void *ea,const void *eb) +typedef struct _element { - element *a = *(element **)ea; - element *b = *(element **)eb; + long int index; + char name[1024]; +}element; +static int element_sort_func ( const void *ea, const void *eb ) +{ + element *a = *(element * *) ea; + element *b = *(element * *) eb; return b->index - a->index; } // execute sub-process -static pid_t exec_cmd( const char *cmd, int run_in_term ) +static pid_t exec_cmd ( const char *cmd, int run_in_term ) { - if ( !cmd || !cmd[0] ) return -1; - - signal( SIGCHLD, catch_exit ); - pid_t pid = fork(); - - if ( !pid ) { - setsid(); - execsh( cmd, run_in_term ); - exit( EXIT_FAILURE ); + if ( !cmd || !cmd[0] ) + { + return -1; } - int curr = -1; - unsigned int index = 0; - element **retv = NULL; + signal ( SIGCHLD, catch_exit ); + pid_t pid = fork (); + + if ( !pid ) + { + setsid (); + execsh ( cmd, run_in_term ); + exit ( EXIT_FAILURE ); + } + + int curr = -1; + unsigned int index = 0; + element **retv = NULL; /** * This happens in non-critical time (After launching app) * It is allowed to be a bit slower. */ - size_t path_length = strlen( cache_dir ) + strlen( RUN_CACHE_FILE )+3; - char *path = allocate( path_length ); - snprintf( path, path_length, "%s/%s", cache_dir, RUN_CACHE_FILE ); - FILE *fd = fopen ( path, "r" ); + size_t path_length = strlen ( cache_dir ) + strlen ( RUN_CACHE_FILE ) + 3; + char *path = allocate ( path_length ); + snprintf ( path, path_length, "%s/%s", cache_dir, RUN_CACHE_FILE ); + FILE *fd = fopen ( path, "r" ); - if ( fd != NULL ) { + if ( fd != NULL ) + { char buffer[1024]; - while ( fgets( buffer,1024,fd ) != NULL ) { - if(strlen(buffer) == 0) continue; - retv = reallocate( retv, ( index+2 )*sizeof( element* ) ); - retv[index] = allocate(sizeof(element)); - buffer[strlen( buffer )-1] = '\0'; + while ( fgets ( buffer, 1024, fd ) != NULL ) + { + if ( strlen ( buffer ) == 0 ) + { + continue; + } + retv = reallocate ( retv, ( index + 2 ) * sizeof ( element* ) ); + retv[index] = allocate ( sizeof ( element ) ); + buffer[strlen ( buffer ) - 1] = '\0'; char * start = NULL; - retv[index]->index = strtol(buffer, &start, 10); - snprintf(retv[index]->name, 1024, "%s", start+1); - retv[index+1] = NULL; + retv[index]->index = strtol ( buffer, &start, 10 ); + snprintf ( retv[index]->name, 1024, "%s", start + 1 ); + retv[index + 1] = NULL; - if ( strcasecmp( retv[index]->name, cmd ) == 0 ) { + if ( strcasecmp ( retv[index]->name, cmd ) == 0 ) + { curr = index; } index++; } - fclose( fd ); + fclose ( fd ); } - if(curr < 0) { - retv = reallocate( retv, ( index+2 )*sizeof( element* ) ); - retv[index] = allocate(sizeof(element)); - retv[index]->index = 1; - snprintf(retv[index]->name, 1024, "%s", cmd); - index++; - }else { - retv[curr]->index++; + if ( curr < 0 ) + { + retv = reallocate ( retv, ( index + 2 ) * sizeof ( element* ) ); + retv[index] = allocate ( sizeof ( element ) ); + retv[index]->index = 1; + snprintf ( retv[index]->name, 1024, "%s", cmd ); + index++; + } + else + { + retv[curr]->index++; } // Sort the list. - qsort(retv, index, sizeof(element*), element_sort_func); + qsort ( retv, index, sizeof ( element* ), element_sort_func ); /** * Write out the last 25 results again. */ fd = fopen ( path, "w" ); - if ( fd ) { - - for ( int i = 0; i < ( int )index && i < 20; i++ ) { - if(retv[i]->name && retv[i]->name[0] != '\0') { - fprintf(fd, "%ld %s\n", - retv[i]->index, - retv[i]->name - ); + if ( fd ) + { + for ( int i = 0; i < ( int ) index && i < 20; i++ ) + { + if ( retv[i]->name && retv[i]->name[0] != '\0' ) + { + fprintf ( fd, "%ld %s\n", + retv[i]->index, + retv[i]->name + ); } } - fclose( fd ); + fclose ( fd ); } - for ( int i=0; retv != NULL && retv[i] != NULL; i++ ) { - free( retv[i] ); + for ( int i = 0; retv != NULL && retv[i] != NULL; i++ ) + { + free ( retv[i] ); } - free( retv ); + free ( retv ); - free( path ); + free ( path ); return pid; } // execute sub-process -static void delete_entry( const char *cmd ) +static void delete_entry ( const char *cmd ) { - int curr = -1; - unsigned int index = 0; - element **retv = NULL; + int curr = -1; + unsigned int index = 0; + element **retv = NULL; /** * This happens in non-critical time (After launching app) * It is allowed to be a bit slower. */ - char *path = allocate( strlen( cache_dir ) + strlen( RUN_CACHE_FILE )+3 ); - sprintf( path, "%s/%s", cache_dir, RUN_CACHE_FILE ); + char *path = allocate ( strlen ( cache_dir ) + strlen ( RUN_CACHE_FILE ) + 3 ); + sprintf ( path, "%s/%s", cache_dir, RUN_CACHE_FILE ); FILE *fd = fopen ( path, "r" ); - if ( fd != NULL ) { + if ( fd != NULL ) + { char buffer[1024]; - while ( fgets( buffer,1024,fd ) != NULL ) { - if(strlen(buffer) == 0) continue; - retv = reallocate( retv, ( index+2 )*sizeof( element* ) ); - retv[index] = allocate(sizeof(element)); - buffer[strlen( buffer )-1] = '\0'; + while ( fgets ( buffer, 1024, fd ) != NULL ) + { + if ( strlen ( buffer ) == 0 ) + { + continue; + } + retv = reallocate ( retv, ( index + 2 ) * sizeof ( element* ) ); + retv[index] = allocate ( sizeof ( element ) ); + buffer[strlen ( buffer ) - 1] = '\0'; char * start = NULL; - retv[index]->index = strtol(buffer, &start, 10); - snprintf(retv[index]->name, 1024, "%s", start+1); - retv[index+1] = NULL; + retv[index]->index = strtol ( buffer, &start, 10 ); + snprintf ( retv[index]->name, 1024, "%s", start + 1 ); + retv[index + 1] = NULL; - if ( strcasecmp( retv[index]->name, cmd ) == 0 ) { + if ( strcasecmp ( retv[index]->name, cmd ) == 0 ) + { curr = index; } index++; } - fclose( fd ); + fclose ( fd ); } /** @@ -197,88 +222,107 @@ static void delete_entry( const char *cmd ) */ fd = fopen ( path, "w" ); - if ( fd ) { - for ( int i = 0; i < ( int )index && i < 20; i++ ) { - if ( i != curr ) { - if(retv[i]->name && retv[i]->name[0] != '\0') { - fprintf(fd, "%ld %s\n", - retv[i]->index, - retv[i]->name - ); + if ( fd ) + { + for ( int i = 0; i < ( int ) index && i < 20; i++ ) + { + if ( i != curr ) + { + if ( retv[i]->name && retv[i]->name[0] != '\0' ) + { + fprintf ( fd, "%ld %s\n", + retv[i]->index, + retv[i]->name + ); } } } - fclose( fd ); + fclose ( fd ); } - for ( int i=0; retv != NULL && retv[i] != NULL; i++ ) { - free( retv[i] ); + for ( int i = 0; retv != NULL && retv[i] != NULL; i++ ) + { + free ( retv[i] ); } - free( retv ); - - free( path ); + free ( retv ); + free ( path ); } static int sort_func ( const void *a, const void *b ) { - const char *astr = *( const char * const * )a; - const char *bstr = *( const char * const * )b; - return strcasecmp( astr,bstr ); + const char *astr = *( const char * const * ) a; + const char *bstr = *( const char * const * ) b; + return strcasecmp ( astr, bstr ); } static char ** get_apps ( ) { - unsigned int num_favorites = 0; - unsigned int index = 0; - char *path; - char **retv = NULL; + unsigned int num_favorites = 0; + unsigned int index = 0; + char *path; + char **retv = NULL; #ifdef TIMING struct timespec start, stop; - clock_gettime( CLOCK_REALTIME, &start ); + clock_gettime ( CLOCK_REALTIME, &start ); #endif - if ( getenv( "PATH" ) == NULL ) return NULL; + if ( getenv ( "PATH" ) == NULL ) + { + return NULL; + } - path = allocate( strlen( cache_dir ) + strlen( RUN_CACHE_FILE )+3 ); - sprintf( path, "%s/%s", cache_dir, RUN_CACHE_FILE ); + path = allocate ( strlen ( cache_dir ) + strlen ( RUN_CACHE_FILE ) + 3 ); + sprintf ( path, "%s/%s", cache_dir, RUN_CACHE_FILE ); FILE *fd = fopen ( path, "r" ); - if ( fd != NULL ) { + if ( fd != NULL ) + { char buffer[1024]; - while ( fgets( buffer,1024,fd ) != NULL ) { - if(strlen(buffer) == 0) continue; - buffer[strlen( buffer )-1] = '\0'; + while ( fgets ( buffer, 1024, fd ) != NULL ) + { + if ( strlen ( buffer ) == 0 ) + { + continue; + } + buffer[strlen ( buffer ) - 1] = '\0'; char *start = NULL; // Don't use result. - strtol(buffer, &start, 10); - if(start == NULL) continue; - retv = reallocate( retv, ( index+2 )*sizeof( char* ) ); - retv[index] = strdup( start+1 ); - retv[index+1] = NULL; + strtol ( buffer, &start, 10 ); + if ( start == NULL ) + { + continue; + } + retv = reallocate ( retv, ( index + 2 ) * sizeof ( char* ) ); + retv[index] = strdup ( start + 1 ); + retv[index + 1] = NULL; index++; num_favorites++; } - fclose( fd ); + fclose ( fd ); } - free( path ); + free ( path ); - path = strdup( getenv( "PATH" ) ); + path = strdup ( getenv ( "PATH" ) ); - for ( const char *dirname = strtok( path, ":" ); dirname != NULL; dirname = strtok( NULL, ":" ) ) { - DIR *dir = opendir( dirname ); + for ( const char *dirname = strtok ( path, ":" ); dirname != NULL; dirname = strtok ( NULL, ":" ) ) + { + DIR *dir = opendir ( dirname ); - if ( dir != NULL ) { + if ( dir != NULL ) + { struct dirent *dent; - while ( ( dent=readdir( dir ) )!=NULL ) { + while ( ( dent = readdir ( dir ) ) != NULL ) + { if ( dent->d_type != DT_REG && dent->d_type != DT_LNK && - dent->d_type != DT_UNKNOWN ) { + dent->d_type != DT_UNKNOWN ) + { continue; } @@ -286,72 +330,93 @@ static char ** get_apps ( ) // This is a nice little penalty, but doable? time will tell. // given num_favorites is max 25. - for ( unsigned int j = 0; found == 0 && j < num_favorites; j++ ) { - if ( strcasecmp( dent->d_name, retv[j] ) == 0 ) found = 1; + for ( unsigned int j = 0; found == 0 && j < num_favorites; j++ ) + { + if ( strcasecmp ( dent->d_name, retv[j] ) == 0 ) + { + found = 1; + } } - if ( found == 1 ) continue; + if ( found == 1 ) + { + continue; + } - retv = reallocate( retv, ( index+2 )*sizeof( char* ) ); - retv[index] = strdup( dent->d_name ); - retv[index+1] = NULL; + retv = reallocate ( retv, ( index + 2 ) * sizeof ( char* ) ); + retv[index] = strdup ( dent->d_name ); + retv[index + 1] = NULL; index++; } - closedir( dir ); + closedir ( dir ); } } // TODO: check this is still fast enough. (takes 1ms on laptop.) - if(index > num_favorites) { - qsort( &retv[num_favorites],index-num_favorites, sizeof( char* ), sort_func ); + if ( index > num_favorites ) + { + qsort ( &retv[num_favorites], index - num_favorites, sizeof ( char* ), sort_func ); } - free( path ); + free ( path ); #ifdef TIMING - clock_gettime( CLOCK_REALTIME, &stop ); + clock_gettime ( CLOCK_REALTIME, &stop ); - if ( stop.tv_sec != start.tv_sec ) { - stop.tv_nsec += ( stop.tv_sec-start.tv_sec )*1e9; + if ( stop.tv_sec != start.tv_sec ) + { + stop.tv_nsec += ( stop.tv_sec - start.tv_sec ) * 1e9; } - long diff = stop.tv_nsec-start.tv_nsec; - printf( "Time elapsed: %ld us\n", diff/1000 ); + long diff = stop.tv_nsec - start.tv_nsec; + printf ( "Time elapsed: %ld us\n", diff / 1000 ); #endif return retv; } SwitcherMode run_switcher_dialog ( char **input ) { - int shift=0; - int selected_line = 0; - SwitcherMode retv = MODE_EXIT; + int shift = 0; + int selected_line = 0; + SwitcherMode retv = MODE_EXIT; // act as a launcher - char **cmd_list = get_apps( ); + char **cmd_list = get_apps ( ); - if ( cmd_list == NULL ) { - cmd_list = allocate( 2*sizeof( char * ) ); - cmd_list[0] = strdup( "No applications found" ); + if ( cmd_list == NULL ) + { + cmd_list = allocate ( 2 * sizeof ( char * ) ); + cmd_list[0] = strdup ( "No applications found" ); cmd_list[1] = NULL; } - int mretv = menu( cmd_list, input, "$", NULL, &shift,token_match, NULL, &selected_line ); + int mretv = menu ( cmd_list, input, "$", NULL, &shift, token_match, NULL, &selected_line ); - if ( mretv == MENU_NEXT ) { + if ( mretv == MENU_NEXT ) + { retv = NEXT_DIALOG; - } else if ( mretv == MENU_OK && cmd_list[selected_line] != NULL ) { - exec_cmd( cmd_list[selected_line], shift ); - } else if ( mretv == MENU_CUSTOM_INPUT && *input != NULL && *input[0] != '\0' ) { - exec_cmd( *input, shift ); - } else if ( mretv == MENU_ENTRY_DELETE && cmd_list[selected_line] ) { + } + else if ( mretv == MENU_OK && cmd_list[selected_line] != NULL ) + { + exec_cmd ( cmd_list[selected_line], shift ); + } + else if ( mretv == MENU_CUSTOM_INPUT && *input != NULL && *input[0] != '\0' ) + { + exec_cmd ( *input, shift ); + } + else if ( mretv == MENU_ENTRY_DELETE && cmd_list[selected_line] ) + { delete_entry ( cmd_list[selected_line] ); retv = RUN_DIALOG; } - for ( int i=0; cmd_list != NULL && cmd_list[i] != NULL; i++ ) { - free( cmd_list[i] ); + for ( int i = 0; cmd_list != NULL && cmd_list[i] != NULL; i++ ) + { + free ( cmd_list[i] ); } - if ( cmd_list != NULL ) free( cmd_list ); + if ( cmd_list != NULL ) + { + free ( cmd_list ); + } return retv; } diff --git a/source/ssh-dialog.c b/source/ssh-dialog.c index b9c23f39..0f405297 100644 --- a/source/ssh-dialog.c +++ b/source/ssh-dialog.c @@ -45,54 +45,61 @@ #include #endif -#define SSH_CACHE_FILE "rofi.sshcache" +#define SSH_CACHE_FILE "rofi.sshcache" -static inline int execshssh( const char *host ) +static inline int execshssh ( const char *host ) { - return execlp( config.terminal_emulator, config.terminal_emulator, "-e", "ssh", host, NULL ); + return execlp ( config.terminal_emulator, config.terminal_emulator, "-e", "ssh", host, NULL ); } // execute sub-process -static pid_t exec_ssh( const char *cmd ) +static pid_t exec_ssh ( const char *cmd ) { - if ( !cmd || !cmd[0] ) return -1; - - signal( SIGCHLD, catch_exit ); - pid_t pid = fork(); - - if ( !pid ) { - setsid(); - execshssh( cmd ); - exit( EXIT_FAILURE ); + if ( !cmd || !cmd[0] ) + { + return -1; } - int curr = -1; - unsigned int index = 0; - char **retv = NULL; + signal ( SIGCHLD, catch_exit ); + pid_t pid = fork (); + + if ( !pid ) + { + setsid (); + execshssh ( cmd ); + exit ( EXIT_FAILURE ); + } + + int curr = -1; + unsigned int index = 0; + char **retv = NULL; /** * This happens in non-critical time (After launching app) * It is allowed to be a bit slower. */ - char *path = allocate( strlen( cache_dir ) + strlen( SSH_CACHE_FILE )+3 ); - sprintf( path, "%s/%s", cache_dir, SSH_CACHE_FILE ); + char *path = allocate ( strlen ( cache_dir ) + strlen ( SSH_CACHE_FILE ) + 3 ); + sprintf ( path, "%s/%s", cache_dir, SSH_CACHE_FILE ); FILE *fd = fopen ( path, "r" ); - if ( fd != NULL ) { + if ( fd != NULL ) + { char buffer[1024]; - while ( fgets( buffer,1024,fd ) != NULL ) { - retv = reallocate( retv, ( index+2 )*sizeof( char* ) ); - buffer[strlen( buffer )-1] = '\0'; - retv[index] = strdup( buffer ); - retv[index+1] = NULL; + while ( fgets ( buffer, 1024, fd ) != NULL ) + { + retv = reallocate ( retv, ( index + 2 ) * sizeof ( char* ) ); + buffer[strlen ( buffer ) - 1] = '\0'; + retv[index] = strdup ( buffer ); + retv[index + 1] = NULL; - if ( strcasecmp( retv[index], cmd ) == 0 ) { + if ( strcasecmp ( retv[index], cmd ) == 0 ) + { curr = index; } index++; } - fclose( fd ); + fclose ( fd ); } /** @@ -100,63 +107,73 @@ static pid_t exec_ssh( const char *cmd ) */ fd = fopen ( path, "w" ); - if ( fd ) { + if ( fd ) + { // Last one goes on top! - fputs( cmd, fd ); - fputc( '\n', fd ); + fputs ( cmd, fd ); + fputc ( '\n', fd ); - for ( int i = 0; i < ( int )index && i < 20; i++ ) { - if ( i != curr ) { - fputs( retv[i], fd ); - fputc( '\n', fd ); + for ( int i = 0; i < ( int ) index && i < 20; i++ ) + { + if ( i != curr ) + { + fputs ( retv[i], fd ); + fputc ( '\n', fd ); } } - fclose( fd ); + fclose ( fd ); } - for ( int i=0; retv != NULL && retv[i] != NULL; i++ ) { - free( retv[i] ); + for ( int i = 0; retv != NULL && retv[i] != NULL; i++ ) + { + free ( retv[i] ); } - free( retv ); + free ( retv ); - free( path ); + free ( path ); return pid; } -static void delete_ssh( const char *cmd ) +static void delete_ssh ( const char *cmd ) { - if ( !cmd || !cmd[0] ) return ; + if ( !cmd || !cmd[0] ) + { + return; + } - int curr = -1; - unsigned int index = 0; - char **retv = NULL; + int curr = -1; + unsigned int index = 0; + char **retv = NULL; /** * This happens in non-critical time (After launching app) * It is allowed to be a bit slower. */ - char *path = allocate( strlen( cache_dir ) + strlen( SSH_CACHE_FILE )+3 ); - sprintf( path, "%s/%s", cache_dir, SSH_CACHE_FILE ); + char *path = allocate ( strlen ( cache_dir ) + strlen ( SSH_CACHE_FILE ) + 3 ); + sprintf ( path, "%s/%s", cache_dir, SSH_CACHE_FILE ); FILE *fd = fopen ( path, "r" ); - if ( fd != NULL ) { + if ( fd != NULL ) + { char buffer[1024]; - while ( fgets( buffer,1024,fd ) != NULL ) { - retv = reallocate( retv, ( index+2 )*sizeof( char* ) ); - buffer[strlen( buffer )-1] = '\0'; - retv[index] = strdup( buffer ); - retv[index+1] = NULL; + while ( fgets ( buffer, 1024, fd ) != NULL ) + { + retv = reallocate ( retv, ( index + 2 ) * sizeof ( char* ) ); + buffer[strlen ( buffer ) - 1] = '\0'; + retv[index] = strdup ( buffer ); + retv[index + 1] = NULL; - if ( strcasecmp( retv[index], cmd ) == 0 ) { + if ( strcasecmp ( retv[index], cmd ) == 0 ) + { curr = index; } index++; } - fclose( fd ); + fclose ( fd ); } /** @@ -164,118 +181,146 @@ static void delete_ssh( const char *cmd ) */ fd = fopen ( path, "w" ); - if ( fd ) { - - for ( int i = 0; i < ( int )index && i < 20; i++ ) { - if ( i != curr ) { - fputs( retv[i], fd ); - fputc( '\n', fd ); + if ( fd ) + { + for ( int i = 0; i < ( int ) index && i < 20; i++ ) + { + if ( i != curr ) + { + fputs ( retv[i], fd ); + fputc ( '\n', fd ); } } - fclose( fd ); + fclose ( fd ); } - for ( int i=0; retv != NULL && retv[i] != NULL; i++ ) { - free( retv[i] ); + for ( int i = 0; retv != NULL && retv[i] != NULL; i++ ) + { + free ( retv[i] ); } - free( retv ); - - free( path ); + free ( retv ); + free ( path ); } static int sort_func ( const void *a, const void *b ) { - const char *astr = *( const char * const * )a; - const char *bstr = *( const char * const * )b; - return strcasecmp( astr,bstr ); + const char *astr = *( const char * const * ) a; + const char *bstr = *( const char * const * ) b; + return strcasecmp ( astr, bstr ); } static char ** get_ssh ( ) { - unsigned int num_favorites = 0; - unsigned int index = 0; - char *path; - char **retv = NULL; + unsigned int num_favorites = 0; + unsigned int index = 0; + char *path; + char **retv = NULL; #ifdef TIMING struct timespec start, stop; - clock_gettime( CLOCK_REALTIME, &start ); + clock_gettime ( CLOCK_REALTIME, &start ); #endif - if ( getenv( "HOME" ) == NULL ) return NULL; + if ( getenv ( "HOME" ) == NULL ) + { + return NULL; + } - path = allocate( strlen( cache_dir ) + strlen( "/"SSH_CACHE_FILE )+2 ); - sprintf( path, "%s/%s", cache_dir, SSH_CACHE_FILE ); + path = allocate ( strlen ( cache_dir ) + strlen ( "/"SSH_CACHE_FILE ) + 2 ); + sprintf ( path, "%s/%s", cache_dir, SSH_CACHE_FILE ); FILE *fd = fopen ( path, "r" ); char buffer[1024]; - if ( fd != NULL ) { - while ( fgets( buffer,1024,fd ) != NULL ) { - retv = reallocate( retv, ( index+2 )*sizeof( char* ) ); - buffer[strlen( buffer )-1] = '\0'; - retv[index] = strdup( buffer ); - retv[index+1] = NULL; + if ( fd != NULL ) + { + while ( fgets ( buffer, 1024, fd ) != NULL ) + { + retv = reallocate ( retv, ( index + 2 ) * sizeof ( char* ) ); + buffer[strlen ( buffer ) - 1] = '\0'; + retv[index] = strdup ( buffer ); + retv[index + 1] = NULL; index++; num_favorites++; } - fclose( fd ); + fclose ( fd ); } - free( path ); - const char *hd = getenv( "HOME" ); - path = allocate( strlen( hd ) + strlen( ".ssh/config" )+3 ); - sprintf( path, "%s/%s", hd, ".ssh/config" ); + free ( path ); + const char *hd = getenv ( "HOME" ); + path = allocate ( strlen ( hd ) + strlen ( ".ssh/config" ) + 3 ); + sprintf ( path, "%s/%s", hd, ".ssh/config" ); fd = fopen ( path, "r" ); - if ( fd != NULL ) { - while ( fgets( buffer,1024,fd ) != NULL ) { - if ( strncasecmp( buffer, "Host", 4 ) == 0 ) { - int start = 0, stop=0; - buffer[strlen( buffer )-1] = '\0'; + if ( fd != NULL ) + { + while ( fgets ( buffer, 1024, fd ) != NULL ) + { + if ( strncasecmp ( buffer, "Host", 4 ) == 0 ) + { + int start = 0, stop = 0; + buffer[strlen ( buffer ) - 1] = '\0'; - for ( start=4; isspace( buffer[start] ); start++ ); + for ( start = 4; isspace ( buffer[start] ); start++ ) + { + ; + } - for ( stop=start; isalnum( buffer[stop] ) || + for ( stop = start; isalnum ( buffer[stop] ) || buffer[stop] == '_' || - buffer[stop] == '.' ; stop++ ); + buffer[stop] == '.'; stop++ ) + { + ; + } int found = 0; - if ( start == stop ) continue; + if ( start == stop ) + { + continue; + } // This is a nice little penalty, but doable? time will tell. // given num_favorites is max 25. - for ( unsigned int j = 0; found == 0 && j < num_favorites; j++ ) { - if ( strncasecmp( &buffer[start], retv[j],stop-start ) == 0 ) found = 1; + for ( unsigned int j = 0; found == 0 && j < num_favorites; j++ ) + { + if ( strncasecmp ( &buffer[start], retv[j], stop - start ) == 0 ) + { + found = 1; + } } - if ( found == 1 ) continue; + if ( found == 1 ) + { + continue; + } - retv = reallocate( retv, ( index+2 )*sizeof( char* ) ); - retv[index] = strndup( &buffer[start], stop-start ); - retv[index+1] = NULL; + retv = reallocate ( retv, ( index + 2 ) * sizeof ( char* ) ); + retv[index] = strndup ( &buffer[start], stop - start ); + retv[index + 1] = NULL; index++; } } - fclose( fd ); + fclose ( fd ); } // TODO: check this is still fast enough. (takes 1ms on laptop.) - if(index > num_favorites) { - qsort( &retv[num_favorites],index-num_favorites, sizeof( char* ), sort_func ); + if ( index > num_favorites ) + { + qsort ( &retv[num_favorites], index - num_favorites, sizeof ( char* ), sort_func ); } - free( path ); + free ( path ); #ifdef TIMING - clock_gettime( CLOCK_REALTIME, &stop ); + clock_gettime ( CLOCK_REALTIME, &stop ); - if ( stop.tv_sec != start.tv_sec ) { - stop.tv_nsec += ( stop.tv_sec-start.tv_sec )*1e9; + if ( stop.tv_sec != start.tv_sec ) + { + stop.tv_nsec += ( stop.tv_sec - start.tv_sec ) * 1e9; } - long diff = stop.tv_nsec-start.tv_nsec; - printf( "Time elapsed: %ld us\n", diff/1000 ); + long diff = stop.tv_nsec - start.tv_nsec; + printf ( "Time elapsed: %ld us\n", diff / 1000 ); #endif return retv; } @@ -284,35 +329,47 @@ SwitcherMode ssh_switcher_dialog ( char **input ) { SwitcherMode retv = MODE_EXIT; // act as a launcher - char **cmd_list = get_ssh( ); + char **cmd_list = get_ssh ( ); - if ( cmd_list == NULL ) { - cmd_list = allocate( 2*sizeof( char * ) ); - cmd_list[0] = strdup( "No ssh hosts found" ); + if ( cmd_list == NULL ) + { + cmd_list = allocate ( 2 * sizeof ( char * ) ); + cmd_list[0] = strdup ( "No ssh hosts found" ); cmd_list[1] = NULL; } - int shift=0; + int shift = 0; int selected_line = 0; - int mretv = menu( cmd_list, input, "ssh", NULL, &shift,token_match, NULL , &selected_line ); + int mretv = menu ( cmd_list, input, "ssh", NULL, &shift, token_match, NULL, &selected_line ); - if ( mretv == MENU_NEXT ) { + if ( mretv == MENU_NEXT ) + { retv = NEXT_DIALOG; - } else if ( mretv == MENU_OK && cmd_list[selected_line] != NULL ) { - exec_ssh( cmd_list[selected_line] ); - } else if ( mretv == MENU_CUSTOM_INPUT && *input != NULL && *input[0] != '\0' ) { - exec_ssh( *input ); - } else if ( mretv == MENU_ENTRY_DELETE && cmd_list[selected_line] ) { + } + else if ( mretv == MENU_OK && cmd_list[selected_line] != NULL ) + { + exec_ssh ( cmd_list[selected_line] ); + } + else if ( mretv == MENU_CUSTOM_INPUT && *input != NULL && *input[0] != '\0' ) + { + exec_ssh ( *input ); + } + else if ( mretv == MENU_ENTRY_DELETE && cmd_list[selected_line] ) + { delete_ssh ( cmd_list[selected_line] ); // Stay retv = SSH_DIALOG; } - for ( int i=0; cmd_list[i] != NULL; i++ ) { - free( cmd_list[i] ); + for ( int i = 0; cmd_list[i] != NULL; i++ ) + { + free ( cmd_list[i] ); } - if ( cmd_list != NULL ) free( cmd_list ); + if ( cmd_list != NULL ) + { + free ( cmd_list ); + } return retv; } diff --git a/source/textbox.c b/source/textbox.c index 343572c1..0e1e7c7d 100644 --- a/source/textbox.c +++ b/source/textbox.c @@ -1,29 +1,29 @@ /* -MIT/X11 License -Copyright (c) 2012 Sean Pringle -Modified (c) 2013-2014 Qball Cow + MIT/X11 License + Copyright (c) 2012 Sean Pringle + Modified (c) 2013-2014 Qball Cow -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ + */ #define _GNU_SOURCE #include @@ -39,297 +39,342 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "rofi.h" #include "textbox.h" -#define SIDE_MARGIN 3 +#define SIDE_MARGIN 3 extern Display *display; -void textbox_moveresize( textbox *tb, int x, int y, int w, int h ); +void textbox_moveresize ( textbox *tb, int x, int y, int w, int h ); // Xft text box, optionally editable -textbox* textbox_create( Window parent, - TextboxFlags flags, - short x, short y, short w, short h, - char *font, char *fg, char *bg, - char *text, char *prompt ) +textbox* textbox_create ( Window parent, + TextboxFlags flags, + short x, short y, short w, short h, + char *font, char *fg, char *bg, + char *text, char *prompt ) { - textbox *tb = calloc( 1, sizeof( textbox ) ); + textbox *tb = calloc ( 1, sizeof ( textbox ) ); - tb->flags = flags; + tb->flags = flags; tb->parent = parent; tb->x = x; tb->y = y; - tb->w = MAX( 1, w ); - tb->h = MAX( 1, h ); + tb->w = MAX ( 1, w ); + tb->h = MAX ( 1, h ); - XColor color; - Colormap map = DefaultColormap( display, DefaultScreen( display ) ); - unsigned int cp = XAllocNamedColor( display, map, bg, &color, &color ) ? color.pixel: None; + XColor color; + Colormap map = DefaultColormap ( display, DefaultScreen ( display ) ); + unsigned int cp = XAllocNamedColor ( display, map, bg, &color, &color ) ? color.pixel : None; - tb->window = XCreateSimpleWindow( display, tb->parent, tb->x, tb->y, tb->w, tb->h, 0, None, cp ); + tb->window = XCreateSimpleWindow ( display, tb->parent, tb->x, tb->y, tb->w, tb->h, 0, None, cp ); // need to preload the font to calc line height - textbox_font( tb, font, fg, bg ); + textbox_font ( tb, font, fg, bg ); - tb->prompt = strdup( prompt ? prompt: "" ); - textbox_text( tb, text ? text: "" ); - textbox_cursor_end( tb ); + tb->prompt = strdup ( prompt ? prompt : "" ); + textbox_text ( tb, text ? text : "" ); + textbox_cursor_end ( tb ); // auto height/width modes get handled here - textbox_moveresize( tb, tb->x, tb->y, tb->w, tb->h ); + textbox_moveresize ( tb, tb->x, tb->y, tb->w, tb->h ); // edit mode controls - if ( tb->flags & TB_EDITABLE ) { - tb->xim = XOpenIM( display, NULL, NULL, NULL ); - tb->xic = XCreateIC( tb->xim, XNInputStyle, XIMPreeditNothing | XIMStatusNothing, XNClientWindow, tb->window, XNFocusWindow, tb->window, NULL ); + if ( tb->flags & TB_EDITABLE ) + { + tb->xim = XOpenIM ( display, NULL, NULL, NULL ); + tb->xic = XCreateIC ( tb->xim, XNInputStyle, XIMPreeditNothing | XIMStatusNothing, XNClientWindow, tb->window, XNFocusWindow, tb->window, NULL ); } return tb; } // set an Xft font by name -void textbox_font( textbox *tb, char *font, char *fg, char *bg ) +void textbox_font ( textbox *tb, char *font, char *fg, char *bg ) { - if ( tb->font ) { + if ( tb->font ) + { XftColorFree ( display, - DefaultVisual( display, DefaultScreen( display ) ), - DefaultColormap( display, DefaultScreen( display ) ), + DefaultVisual ( display, DefaultScreen ( display ) ), + DefaultColormap ( display, DefaultScreen ( display ) ), &tb->color_fg ); XftColorFree ( display, - DefaultVisual( display, DefaultScreen( display ) ), - DefaultColormap( display, DefaultScreen( display ) ), + DefaultVisual ( display, DefaultScreen ( display ) ), + DefaultColormap ( display, DefaultScreen ( display ) ), &tb->color_bg ); - XftFontClose( display, tb->font ); + XftFontClose ( display, tb->font ); } - tb->font = XftFontOpenName( display, DefaultScreen( display ), font ); + tb->font = XftFontOpenName ( display, DefaultScreen ( display ), font ); - XftColorAllocName( display, DefaultVisual( display, DefaultScreen( display ) ), DefaultColormap( display, DefaultScreen( display ) ), fg, &tb->color_fg ); - XftColorAllocName( display, DefaultVisual( display, DefaultScreen( display ) ), DefaultColormap( display, DefaultScreen( display ) ), bg, &tb->color_bg ); + XftColorAllocName ( display, DefaultVisual ( display, DefaultScreen ( display ) ), DefaultColormap ( display, DefaultScreen ( display ) ), fg, &tb->color_fg ); + XftColorAllocName ( display, DefaultVisual ( display, DefaultScreen ( display ) ), DefaultColormap ( display, DefaultScreen ( display ) ), bg, &tb->color_bg ); } // outer code may need line height, width, etc -void textbox_extents( textbox *tb ) +void textbox_extents ( textbox *tb ) { - int length = strlen( tb->text ) + strlen( tb->prompt ) +1; + int length = strlen ( tb->text ) + strlen ( tb->prompt ) + 1; char line[length + 1 ]; - sprintf( line, "%s %s", tb->prompt, tb->text ); - XftTextExtentsUtf8( display, tb->font, ( unsigned char* )line, length, &tb->extents ); + sprintf ( line, "%s %s", tb->prompt, tb->text ); + XftTextExtentsUtf8 ( display, tb->font, ( unsigned char * ) line, length, &tb->extents ); } // set the default text to display -void textbox_text( textbox *tb, char *text ) +void textbox_text ( textbox *tb, char *text ) { - if ( tb->text ) free( tb->text ); + if ( tb->text ) + { + free ( tb->text ); + } - tb->text = strdup( text ); - tb->cursor = MAX( 0,MIN( ( int )strlen( text ), tb->cursor ) ); - textbox_extents( tb ); + tb->text = strdup ( text ); + tb->cursor = MAX ( 0, MIN ( ( int ) strlen ( text ), tb->cursor ) ); + textbox_extents ( tb ); } // within the parent. handled auto width/height modes -void textbox_moveresize( textbox *tb, int x, int y, int w, int h ) +void textbox_moveresize ( textbox *tb, int x, int y, int w, int h ) { if ( tb->flags & TB_AUTOHEIGHT ) + { h = tb->font->ascent + tb->font->descent; + } if ( tb->flags & TB_AUTOWIDTH ) + { w = tb->extents.width; + } - if ( x != tb->x || y != tb->y || w != tb->w || h != tb->h ) { + if ( x != tb->x || y != tb->y || w != tb->w || h != tb->h ) + { tb->x = x; tb->y = y; - tb->w = MAX( 1, w ); - tb->h = MAX( 1, h ); - XMoveResizeWindow( display, tb->window, tb->x, tb->y, tb->w, tb->h ); + tb->w = MAX ( 1, w ); + tb->h = MAX ( 1, h ); + XMoveResizeWindow ( display, tb->window, tb->x, tb->y, tb->w, tb->h ); } } -void textbox_show( textbox *tb ) +void textbox_show ( textbox *tb ) { - XMapWindow( display, tb->window ); + XMapWindow ( display, tb->window ); } // will also unmap the window if still displayed -void textbox_free( textbox *tb ) +void textbox_free ( textbox *tb ) { - if ( tb->flags & TB_EDITABLE ) { - XDestroyIC( tb->xic ); - XCloseIM( tb->xim ); + if ( tb->flags & TB_EDITABLE ) + { + XDestroyIC ( tb->xic ); + XCloseIM ( tb->xim ); } - if ( tb->text ) free( tb->text ); + if ( tb->text ) + { + free ( tb->text ); + } - if ( tb->prompt ) free( tb->prompt ); + if ( tb->prompt ) + { + free ( tb->prompt ); + } - if ( tb->font ) { + if ( tb->font ) + { XftColorFree ( display, - DefaultVisual( display, DefaultScreen( display ) ), - DefaultColormap( display, DefaultScreen( display ) ), + DefaultVisual ( display, DefaultScreen ( display ) ), + DefaultColormap ( display, DefaultScreen ( display ) ), &tb->color_fg ); XftColorFree ( display, - DefaultVisual( display, DefaultScreen( display ) ), - DefaultColormap( display, DefaultScreen( display ) ), + DefaultVisual ( display, DefaultScreen ( display ) ), + DefaultColormap ( display, DefaultScreen ( display ) ), &tb->color_bg ); - XftFontClose( display, tb->font ); + XftFontClose ( display, tb->font ); } - XDestroyWindow( display, tb->window ); - free( tb ); + XDestroyWindow ( display, tb->window ); + free ( tb ); } -void textbox_draw( textbox *tb ) +void textbox_draw ( textbox *tb ) { XGlyphInfo extents; - GC context = XCreateGC( display, tb->window, 0, 0 ); - Pixmap canvas = XCreatePixmap( display, tb->window, tb->w, tb->h, DefaultDepth( display, DefaultScreen( display ) ) ); - XftDraw *draw = XftDrawCreate( display, canvas, DefaultVisual( display, DefaultScreen( display ) ), DefaultColormap( display, DefaultScreen( display ) ) ); + GC context = XCreateGC ( display, tb->window, 0, 0 ); + Pixmap canvas = XCreatePixmap ( display, tb->window, tb->w, tb->h, DefaultDepth ( display, DefaultScreen ( display ) ) ); + XftDraw *draw = XftDrawCreate ( display, canvas, DefaultVisual ( display, DefaultScreen ( display ) ), DefaultColormap ( display, DefaultScreen ( display ) ) ); // clear canvas - XftDrawRect( draw, &tb->color_bg, 0, 0, tb->w, tb->h ); + XftDrawRect ( draw, &tb->color_bg, 0, 0, tb->w, tb->h ); - char *line = tb->text, - *text = tb->text ? tb->text: "", - *prompt = tb->prompt ? tb->prompt: ""; + char *line = tb->text, + *text = tb->text ? tb->text : "", + *prompt = tb->prompt ? tb->prompt : ""; - int text_len = strlen( text ); + int text_len = strlen ( text ); int length = text_len; int line_height = tb->font->ascent + tb->font->descent; int line_width = 0; - int cursor_x = 0; - int cursor_width = MAX( 2, line_height/10 ); + int cursor_x = 0; + int cursor_width = MAX ( 2, line_height / 10 ); - if ( tb->flags & TB_EDITABLE ) { + if ( tb->flags & TB_EDITABLE ) + { int cursor_offset = 0; - int prompt_len = strlen( prompt ) +1; - length = text_len + prompt_len; - cursor_offset = MIN( tb->cursor + prompt_len, length ); + int prompt_len = strlen ( prompt ) + 1; + length = text_len + prompt_len; + cursor_offset = MIN ( tb->cursor + prompt_len, length ); - line = alloca( length + 10 ); - sprintf( line, "%s %s", prompt, text ); + line = alloca ( length + 10 ); + sprintf ( line, "%s %s", prompt, text ); // replace spaces so XftTextExtents8 includes their width - for ( int i = 0; i < length; i++ ) if ( isspace( line[i] ) ) line[i] = '_'; + for ( int i = 0; i < length; i++ ) + { + if ( isspace ( line[i] ) ) + { + line[i] = '_'; + } + } // calc cursor position - XftTextExtentsUtf8( display, tb->font, ( unsigned char* )line, cursor_offset, &extents ); + XftTextExtentsUtf8 ( display, tb->font, ( unsigned char * ) line, cursor_offset, &extents ); cursor_x = extents.width; // restore correct text string with spaces - sprintf( line, "%s %s", prompt, text ); + sprintf ( line, "%s %s", prompt, text ); } // calc full input text width // Calculate the right size, so no characters are cut off. // TODO: Check performance of this. - while ( 1 ) { - XftTextExtentsUtf8( display, tb->font, ( unsigned char* )line, length, &extents ); + while ( 1 ) + { + XftTextExtentsUtf8 ( display, tb->font, ( unsigned char * ) line, length, &extents ); line_width = extents.width; - if ( line_width < ( tb->w-2*SIDE_MARGIN ) ) break; + if ( line_width < ( tb->w - 2 * SIDE_MARGIN ) ) + { + break; + } - for(length-=1; length > 0 && (line[length]&0xc0) == 0x80; length -=1); + for ( length -= 1; length > 0 && ( line[length] & 0xc0 ) == 0x80; length -= 1 ) + { + ; + } } int x = SIDE_MARGIN, y = tb->font->ascent; - if ( tb->flags & TB_RIGHT ) x = tb->w - line_width; + if ( tb->flags & TB_RIGHT ) + { + x = tb->w - line_width; + } - if ( tb->flags & TB_CENTER ) x = ( tb->w - line_width ) / 2; + if ( tb->flags & TB_CENTER ) + { + x = ( tb->w - line_width ) / 2; + } // draw the text, including any prompt in edit mode - XftDrawStringUtf8( draw, &tb->color_fg, tb->font, x, y, ( unsigned char* )line, length ); + XftDrawStringUtf8 ( draw, &tb->color_fg, tb->font, x, y, ( unsigned char * ) line, length ); // draw the cursor if ( tb->flags & TB_EDITABLE ) - XftDrawRect( draw, &tb->color_fg, cursor_x+SIDE_MARGIN, 2, cursor_width, line_height-4 ); + { + XftDrawRect ( draw, &tb->color_fg, cursor_x + SIDE_MARGIN, 2, cursor_width, line_height - 4 ); + } - XftDrawRect( draw, &tb->color_bg, tb->w-SIDE_MARGIN, 0, SIDE_MARGIN, tb->h ); + XftDrawRect ( draw, &tb->color_bg, tb->w - SIDE_MARGIN, 0, SIDE_MARGIN, tb->h ); // flip canvas to window - XCopyArea( display, canvas, tb->window, context, 0, 0, tb->w, tb->h, 0, 0 ); + XCopyArea ( display, canvas, tb->window, context, 0, 0, tb->w, tb->h, 0, 0 ); - XFreeGC( display, context ); - XftDrawDestroy( draw ); - XFreePixmap( display, canvas ); + XFreeGC ( display, context ); + XftDrawDestroy ( draw ); + XFreePixmap ( display, canvas ); } -static size_t nextrune(textbox *tb, int inc) { +static size_t nextrune ( textbox *tb, int inc ) +{ ssize_t n; /* return location of next utf8 rune in the given direction (+1 or -1) */ - for(n = tb->cursor + inc; n + inc >= 0 && (tb->text[n] & 0xc0) == 0x80; n += inc); + for ( n = tb->cursor + inc; n + inc >= 0 && ( tb->text[n] & 0xc0 ) == 0x80; n += inc ) + { + ; + } return n; } // cursor handling for edit mode -void textbox_cursor( textbox *tb, int pos ) +void textbox_cursor ( textbox *tb, int pos ) { - tb->cursor = MAX( 0, MIN( ( int )strlen( tb->text ), pos ) ); + tb->cursor = MAX ( 0, MIN ( ( int ) strlen ( tb->text ), pos ) ); } // move right -void textbox_cursor_inc( textbox *tb ) +void textbox_cursor_inc ( textbox *tb ) { - textbox_cursor( tb, nextrune(tb, 1) ); + textbox_cursor ( tb, nextrune ( tb, 1 ) ); } // move left -void textbox_cursor_dec( textbox *tb ) +void textbox_cursor_dec ( textbox *tb ) { - textbox_cursor( tb, nextrune(tb,-1) ); + textbox_cursor ( tb, nextrune ( tb, -1 ) ); } // end of line -void textbox_cursor_end( textbox *tb ) +void textbox_cursor_end ( textbox *tb ) { - tb->cursor = ( int )strlen( tb->text ); + tb->cursor = ( int ) strlen ( tb->text ); } // insert text -void textbox_insert( textbox *tb, int pos, char *str ) +void textbox_insert ( textbox *tb, int pos, char *str ) { - int len = ( int )strlen( tb->text ), slen = ( int )strlen( str ); - pos = MAX( 0, MIN( len, pos ) ); + int len = ( int ) strlen ( tb->text ), slen = ( int ) strlen ( str ); + pos = MAX ( 0, MIN ( len, pos ) ); // expand buffer - tb->text = realloc( tb->text, len + slen + 1 ); + tb->text = realloc ( tb->text, len + slen + 1 ); // move everything after cursor upward char *at = tb->text + pos; - memmove( at + slen, at, len - pos + 1 ); + memmove ( at + slen, at, len - pos + 1 ); // insert new str - memmove( at, str, slen ); - textbox_extents( tb ); + memmove ( at, str, slen ); + textbox_extents ( tb ); } // remove text -void textbox_delete( textbox *tb, int pos, int dlen ) +void textbox_delete ( textbox *tb, int pos, int dlen ) { - int len = strlen( tb->text ); - pos = MAX( 0, MIN( len, pos ) ); + int len = strlen ( tb->text ); + pos = MAX ( 0, MIN ( len, pos ) ); // move everything after pos+dlen down char *at = tb->text + pos; - memmove( at, at + dlen, len - pos ); - textbox_extents( tb ); + memmove ( at, at + dlen, len - pos ); + textbox_extents ( tb ); } // delete on character -void textbox_cursor_del( textbox *tb ) +void textbox_cursor_del ( textbox *tb ) { - int del_r = nextrune(tb, 1); - textbox_delete( tb, tb->cursor, del_r-tb->cursor ); + int del_r = nextrune ( tb, 1 ); + textbox_delete ( tb, tb->cursor, del_r - tb->cursor ); } // back up and delete one character -void textbox_cursor_bkspc( textbox *tb ) +void textbox_cursor_bkspc ( textbox *tb ) { - if ( tb->cursor > 0 ) { - textbox_cursor_dec( tb ); - textbox_cursor_del( tb ); + if ( tb->cursor > 0 ) + { + textbox_cursor_dec ( tb ); + textbox_cursor_del ( tb ); } } @@ -337,42 +382,56 @@ void textbox_cursor_bkspc( textbox *tb ) // 0 = unhandled // 1 = handled // -1 = handled and return pressed (finished) -int textbox_keypress( textbox *tb, XEvent *ev ) +int textbox_keypress ( textbox *tb, XEvent *ev ) { KeySym key; Status stat; - char pad[32]; - int len; + char pad[32]; + int len; - if ( !( tb->flags & TB_EDITABLE ) ) return 0; + if ( !( tb->flags & TB_EDITABLE ) ) + { + return 0; + } - len = Xutf8LookupString( tb->xic, &ev->xkey, pad, sizeof( pad ), &key, &stat ); + len = Xutf8LookupString ( tb->xic, &ev->xkey, pad, sizeof ( pad ), &key, &stat ); pad[len] = 0; - if ( key == XK_Left ) { - textbox_cursor_dec( tb ); + if ( key == XK_Left ) + { + textbox_cursor_dec ( tb ); return 1; - } else if ( key == XK_Right ) { - textbox_cursor_inc( tb ); + } + else if ( key == XK_Right ) + { + textbox_cursor_inc ( tb ); return 1; } /*else if ( key == XK_Home ) { - textbox_cursor_home( tb ); + textbox_cursor_home( tb ); + return 1; + } else if ( key == XK_End ) { + textbox_cursor_end( tb ); + return 1; + } */ + else if ( key == XK_Delete ) + { + textbox_cursor_del ( tb ); return 1; - } else if ( key == XK_End ) { - textbox_cursor_end( tb ); + } + else if ( key == XK_BackSpace ) + { + textbox_cursor_bkspc ( tb ); return 1; - } */else if ( key == XK_Delete ) { - textbox_cursor_del( tb ); - return 1; - } else if ( key == XK_BackSpace ) { - textbox_cursor_bkspc( tb ); - return 1; - } else if ( key == XK_Return ) { + } + else if ( key == XK_Return ) + { return -1; - } else if ( !iscntrl( *pad ) ) { - textbox_insert( tb, tb->cursor, pad ); - textbox_cursor_inc( tb ); + } + else if ( !iscntrl ( *pad ) ) + { + textbox_insert ( tb, tb->cursor, pad ); + textbox_cursor_inc ( tb ); return 1; } diff --git a/source/xrmoptions.c b/source/xrmoptions.c index 19162bfb..b0214337 100644 --- a/source/xrmoptions.c +++ b/source/xrmoptions.c @@ -34,64 +34,72 @@ // Big thanks to Sean Pringle for this code. // This maps xresource options to config structure. -typedef enum { +typedef enum +{ xrm_String = 0, xrm_Number = 1 } XrmOptionType; -typedef struct { - int type; - char * name ; - union { +typedef struct +{ + int type; + char * name; + union + { unsigned int * num; - char ** str; + char ** str; }; } XrmOption; XrmOption xrmOptions[] = { - { xrm_Number, "opacity", { .num = &config.window_opacity } }, - { xrm_Number, "width", { .num = &config.menu_width } }, - { xrm_Number, "lines", { .num = &config.menu_lines } }, - { xrm_String, "font", { .str = &config.menu_font } }, - { xrm_String, "foreground", { .str = &config.menu_fg } }, - { xrm_String, "background", { .str = &config.menu_bg } }, - { xrm_String, "highlightfg", { .str = &config.menu_hlfg } }, - { xrm_String, "highlightbg", { .str = &config.menu_hlbg } }, - { xrm_String, "bordercolor", { .str = &config.menu_bc } }, - { xrm_Number, "padding", { .num = &config.padding } }, - { xrm_Number, "borderwidth", { .num = &config.menu_bw} }, + { xrm_Number, "opacity", { .num = &config.window_opacity } }, + { xrm_Number, "width", { .num = &config.menu_width } }, + { xrm_Number, "lines", { .num = &config.menu_lines } }, + { xrm_String, "font", { .str = &config.menu_font } }, + { xrm_String, "foreground", { .str = &config.menu_fg } }, + { xrm_String, "background", { .str = &config.menu_bg } }, + { xrm_String, "highlightfg", { .str = &config.menu_hlfg } }, + { xrm_String, "highlightbg", { .str = &config.menu_hlbg } }, + { xrm_String, "bordercolor", { .str = &config.menu_bc } }, + { xrm_Number, "padding", { .num = &config.padding } }, + { xrm_Number, "borderwidth", { .num = &config.menu_bw } }, { xrm_String, "terminal", { .str = &config.terminal_emulator } }, }; -void parse_xresource_options( Display *display ) +void parse_xresource_options ( Display *display ) { // Map Xresource entries to simpleswitcher config options. - XrmInitialize(); + XrmInitialize (); char * xRMS = XResourceManagerString ( display ); - if ( xRMS != NULL ) { + if ( xRMS != NULL ) + { XrmDatabase xDB = XrmGetStringDatabase ( xRMS ); - char * xrmType; - XrmValue xrmValue; + char * xrmType; + XrmValue xrmValue; // TODO: update when we have new name. - const char * namePrefix = "rofi"; - const char * classPrefix = "Simpleswitcher"; + const char * namePrefix = "rofi"; + const char * classPrefix = "Simpleswitcher"; - for ( unsigned int i = 0; i < sizeof ( xrmOptions ) / sizeof ( *xrmOptions ); ++i ) { - char *name = ( char* ) allocate( ( strlen ( namePrefix ) + 1 + strlen ( xrmOptions[i].name ) ) * - sizeof ( char ) + 1 ); - char *class = ( char* ) allocate( ( strlen ( classPrefix ) + 1 + strlen ( xrmOptions[i].name ) ) * - sizeof ( char ) + 1 ); + for ( unsigned int i = 0; i < sizeof ( xrmOptions ) / sizeof ( *xrmOptions ); ++i ) + { + char *name = ( char * ) allocate ( ( strlen ( namePrefix ) + 1 + strlen ( xrmOptions[i].name ) ) * + sizeof ( char ) + 1 ); + char *class = ( char * ) allocate ( ( strlen ( classPrefix ) + 1 + strlen ( xrmOptions[i].name ) ) * + sizeof ( char ) + 1 ); sprintf ( name, "%s.%s", namePrefix, xrmOptions[i].name ); sprintf ( class, "%s.%s", classPrefix, xrmOptions[i].name ); - if ( XrmGetResource ( xDB, name, class, &xrmType, &xrmValue ) ) { - - if ( xrmOptions[i].type == xrm_String ) { + if ( XrmGetResource ( xDB, name, class, &xrmType, &xrmValue ) ) + { + if ( xrmOptions[i].type == xrm_String ) + { *xrmOptions[i].str = ( char * ) allocate ( xrmValue.size * sizeof ( char ) ); strncpy ( *xrmOptions[i].str, xrmValue.addr, xrmValue.size ); - } else if ( xrmOptions[i].type == xrm_Number ) { + } + else if ( xrmOptions[i].type == xrm_Number ) + { *xrmOptions[i].num = strtol ( xrmValue.addr, NULL, 10 ); } } @@ -100,5 +108,4 @@ void parse_xresource_options( Display *display ) free ( class ); } } - }