diff --git a/Changelog b/Changelog index 5873554d..23f08fe1 100644 --- a/Changelog +++ b/Changelog @@ -3,8 +3,11 @@ - Number mode for dmenu. allows user to get index back instead of content. - Combi mode. Combine multiple views into one. - Highlight current window. + - Highlight urgent and active row in window view. + - DMenu allow rows to be highlighted. Bug fixes: - On a single item in list disable auto-select. + - Fix cursor position (#140) Improvements: - Add Ctrl(Shift)Tab to switch modi's. - Auto size number of columns based on available columns. diff --git a/doc/rofi-manpage.markdown b/doc/rofi-manpage.markdown index c1077a8e..39d1fb7e 100644 --- a/doc/rofi-manpage.markdown +++ b/doc/rofi-manpage.markdown @@ -400,10 +400,18 @@ daemon listening to specific key-combinations. `-a` *X* Active row, mark row X as active. (starting at 0) + You can specify single element: -a 3 + A range: -a 3-8 + or a set of rows: -a 0,2 + Or any combination: -a 0,2-3,9 `-u` *X* Urgent row, mark row X as urgent. (starting at 0) + You can specify single element: -u 3 + A range: -u 3-8 + or a set of rows: -u 0,2 + Or any combination: -u 0,2-3,9 ### Message dialog diff --git a/doc/rofi.1 b/doc/rofi.1 index 53fd18c4..fbc2e1e2 100644 --- a/doc/rofi.1 +++ b/doc/rofi.1 @@ -503,6 +503,10 @@ Number mode, return the index of the selected row. (starting at 0) .RS .nf Active row, mark row X as active. (starting at 0) +You can specify single element: \-a 3 +A range: \-a 3\-8 +or a set of rows: \-a 0,2 +Or any combination: \-a 0,2\-3,9 .fi .RE .PP @@ -511,6 +515,10 @@ Active row, mark row X as active. (starting at 0) .RS .nf Urgent row, mark row X as urgent. (starting at 0) +You can specify single element: \-u 3 +A range: \-u 3\-8 +or a set of rows: \-u 0,2 +Or any combination: \-u 0,2\-3,9 .fi .RE .SS Message dialog diff --git a/source/dialogs/dmenu.c b/source/dialogs/dmenu.c index b9e94564..5f72ebc3 100644 --- a/source/dialogs/dmenu.c +++ b/source/dialogs/dmenu.c @@ -64,18 +64,65 @@ static char **get_dmenu ( int *length ) return retv; } +struct range_pair +{ + unsigned int start; + unsigned int stop; +}; -static unsigned int row_urgent = 0xFFFFFFFF; -static unsigned int row_active = 0xFFFFFFFF; +struct range_pair * urgent_list = NULL; +unsigned int num_urgent_list = 0; +struct range_pair * active_list = NULL; +unsigned int num_active_list = 0; + +static void parse_pair ( char *input, struct range_pair *item ) +{ + int index = 0; + for ( char *token = strsep ( &input, "-" ); + token != NULL; + token = strsep ( &input, "-" ) ) { + if ( index == 0 ) { + item->start = item->stop = (unsigned int) strtoul ( token, NULL, 10 ); + index++; + } + else { + if ( token[0] == '\0' ) { + item->stop = 0xFFFFFFFF; + } + else{ + item->stop = (unsigned int) strtoul ( token, NULL, 10 ); + } + } + } +} + +static void parse_ranges ( char *input, struct range_pair **list, unsigned int *length ) +{ + char *endp; + for ( char *token = strtok_r ( input, ",", &endp ); + token != NULL; + token = strtok_r ( NULL, ",", &endp ) ) { + // Make space. + *list = g_realloc ( ( *list ), ( ( *length ) + 1 ) * sizeof ( struct range_pair ) ); + // Parse a single pair. + parse_pair ( token, &( ( *list )[*length] ) ); + + ( *length )++; + } +} static const char *get_display_data ( unsigned int index, void *data, G_GNUC_UNUSED int *state ) { char **retv = (char * *) data; - if ( index == row_urgent ) { - *state |= URGENT; + for ( unsigned int i = 0; i < num_active_list; i++ ) { + if ( index >= active_list[i].start && index <= active_list[i].stop ) { + *state |= ACTIVE; + } } - if ( index == row_active ) { - *state |= ACTIVE; + for ( unsigned int i = 0; i < num_urgent_list; i++ ) { + if ( index >= urgent_list[i].start && index <= urgent_list[i].stop ) { + *state |= URGENT; + } } return retv[index]; } @@ -97,8 +144,18 @@ int dmenu_switcher_dialog ( char **input ) // Check prompt find_arg_str ( "-p", &dmenu_prompt ); find_arg_int ( "-l", &selected_line ); - find_arg_uint ( "-u", &row_urgent ); - find_arg_uint ( "-a", &row_active ); + // Urgent. + char *str = NULL; + find_arg_str ( "-u", &str ); + if ( str != NULL ) { + parse_ranges ( str, &urgent_list, &num_urgent_list ); + } + // Active + str = NULL; + find_arg_str ( "-a", &str ); + if ( str != NULL ) { + parse_ranges ( str, &active_list, &num_active_list ); + } do { int mretv = menu ( list, length, input, dmenu_prompt, @@ -138,6 +195,8 @@ int dmenu_switcher_dialog ( char **input ) } while ( restart ); g_strfreev ( list ); + g_free ( urgent_list ); + g_free ( active_list ); return retv; } diff --git a/source/textbox.c b/source/textbox.c index 8a352104..5ca23533 100644 --- a/source/textbox.c +++ b/source/textbox.c @@ -147,18 +147,20 @@ void textbox_font ( textbox *tb, TextBoxFontType tbft ) } if ( ( tbft & FMOD_MASK ) ) { if ( ( tbft & ACTIVE ) ) { - if(tbft&HIGHLIGHT) { + if ( tbft & HIGHLIGHT ) { tb->color_fg = color_hlfg; tb->color_bg = color_fg_active; - }else { + } + else { tb->color_fg = color_fg_active; } } else if ( ( tbft & URGENT ) ) { - if(tbft&HIGHLIGHT) { + if ( tbft & HIGHLIGHT ) { tb->color_fg = color_hlfg; tb->color_bg = color_fg_urgent; - }else { + } + else { tb->color_fg = color_fg_urgent; } } @@ -318,8 +320,8 @@ void textbox_draw ( textbox *tb ) // draw the cursor if ( tb->flags & TB_EDITABLE ) { XftDrawRect ( draw, &tb->color_fg, - x / PANGO_SCALE + cursor_x, y/PANGO_SCALE, // Align with font - cursor_width, font_height ); + x / PANGO_SCALE + cursor_x, y / PANGO_SCALE, // Align with font + cursor_width, font_height ); } // flip canvas to window