From b2575d746a0398c79ed3d34b7f2126472bfb574e Mon Sep 17 00:00:00 2001 From: Tobias Kortkamp Date: Tue, 2 Feb 2016 09:36:39 +0100 Subject: [PATCH 1/5] Use correct namelen when connecting to i3 socket --- source/i3-support.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/source/i3-support.c b/source/i3-support.c index f8bd3ea0..278d5f72 100644 --- a/source/i3-support.c +++ b/source/i3-support.c @@ -50,7 +50,7 @@ char *i3_socket_path = NULL; void i3_support_focus_window ( Window id ) { i3_ipc_header_t head; - int s, len; + int s; ssize_t t; struct sockaddr_un remote; size_t upm = sizeof ( remote.sun_path ); @@ -68,9 +68,8 @@ void i3_support_focus_window ( Window id ) remote.sun_family = AF_UNIX; g_strlcpy ( remote.sun_path, i3_socket_path, upm ); - len = strlen ( remote.sun_path ) + sizeof ( remote.sun_family ); - if ( connect ( s, ( struct sockaddr * ) &remote, len ) == -1 ) { + if ( connect ( s, ( struct sockaddr * ) &remote, sizeof ( struct sockaddr_un ) ) == -1 ) { fprintf ( stderr, "Failed to connect to I3 (%s): %s\n", i3_socket_path, strerror ( errno ) ); close ( s ); return; From 68a913c3b73f61d8e988b5b3f5e1a533e7248116 Mon Sep 17 00:00:00 2001 From: Tobias Kortkamp Date: Tue, 2 Feb 2016 10:51:36 +0100 Subject: [PATCH 2/5] Use /usr/bin/env bash for rofi-sensible-terminal --- script/rofi-sensible-terminal | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/rofi-sensible-terminal b/script/rofi-sensible-terminal index ca86148d..c88e0c52 100755 --- a/script/rofi-sensible-terminal +++ b/script/rofi-sensible-terminal @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # # This code is released in public domain by Han Boetes # Updated by Dave Davenport From b557c4df6e51cf0dafa922b386470f2b3bb82c31 Mon Sep 17 00:00:00 2001 From: Dave Davenport Date: Wed, 3 Feb 2016 09:01:13 +0100 Subject: [PATCH 3/5] Issue: #333, Check if row is selected, don't assume selected_line is valid. --- Makefile.am | 2 ++ source/dialogs/dmenu.c | 26 +++++++++++++++----------- source/rofi.c | 2 ++ test/run_issue333_test.sh | 33 +++++++++++++++++++++++++++++++++ 4 files changed, 52 insertions(+), 11 deletions(-) create mode 100755 test/run_issue333_test.sh diff --git a/Makefile.am b/Makefile.am index 63798985..6f18190b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -222,6 +222,8 @@ test-x: ${bin_PROGRAMS} $(top_srcdir)/test/run_test.sh 217 $(top_srcdir)/test/run_fuzzy_test.sh $(top_builddir) echo "Test config dump" $(top_srcdir)/test/run_test.sh 218 $(top_srcdir)/test/xr_config_test.sh $(top_builddir) $(top_srcdir) + echo "Test issue 333" + $(top_srcdir)/test/run_test.sh 221 $(top_srcdir)/test/run_ssue_333.sh $(top_builddir) test-x1: ${bin_PROGRAMS} echo "Test dmenu-normal-window" diff --git a/source/dialogs/dmenu.c b/source/dialogs/dmenu.c index 37749b67..46c87753 100644 --- a/source/dialogs/dmenu.c +++ b/source/dialogs/dmenu.c @@ -426,25 +426,29 @@ int dmenu_switcher_dialog ( void ) * Select item mode. */ restart = 1; - if ( ( mretv & ( MENU_OK | MENU_QUICK_SWITCH ) ) && cmd_list[pd->selected_line] != NULL ) { - dmenu_output_formatted_line ( pd->format, cmd_list[pd->selected_line], pd->selected_line, input ); - retv = TRUE; - if ( ( mretv & MENU_QUICK_SWITCH ) ) { - retv = 10 + ( mretv & MENU_LOWER_MASK ); - } - return retv; - } - else if ( ( mretv & MENU_CANCEL ) == MENU_CANCEL ) { + // Skip if no valid item is selected. + if ( ( mretv & MENU_CANCEL ) == MENU_CANCEL ) { // In no custom mode we allow canceling. restart = ( find_arg ( "-only-match" ) >= 0 ); } - pd->selected_line = next_pos - 1; + else if ( pd->selected_line != UINT32_MAX ){ + + if ( ( mretv & ( MENU_OK | MENU_QUICK_SWITCH ) ) && cmd_list[pd->selected_line] != NULL ) { + dmenu_output_formatted_line ( pd->format, cmd_list[pd->selected_line], pd->selected_line, input ); + retv = TRUE; + if ( ( mretv & MENU_QUICK_SWITCH ) ) { + retv = 10 + ( mretv & MENU_LOWER_MASK ); + } + return retv; + } + pd->selected_line = next_pos - 1; + } continue; } // We normally do not want to restart the loop. restart = FALSE; // Normal mode - if ( ( mretv & MENU_OK ) && cmd_list[pd->selected_line] != NULL ) { + if ( ( mretv & MENU_OK ) && pd->selected_line != UINT32_MAX && cmd_list[pd->selected_line] != NULL ) { dmenu_output_formatted_line ( pd->format, cmd_list[pd->selected_line], pd->selected_line, input ); if ( ( mretv & MENU_SHIFT ) ) { restart = TRUE; diff --git a/source/rofi.c b/source/rofi.c index 172f9826..749be43c 100644 --- a/source/rofi.c +++ b/source/rofi.c @@ -1379,6 +1379,7 @@ static void menu_mainloop_iter ( MenuState *state, XEvent *ev ) } for ( unsigned int a = CUSTOM_1; a <= CUSTOM_19; a++ ) { if ( abe_test_action ( a, ev->xkey.state, key ) ) { + state->selected_line = UINT32_MAX; if ( state->selected < state->filtered_lines ) { ( state->selected_line ) = state->line_map[state->selected]; } @@ -1403,6 +1404,7 @@ static void menu_mainloop_iter ( MenuState *state, XEvent *ev ) int shift = ( ( ev->xkey.state & ShiftMask ) == ShiftMask ); // If a valid item is selected, return that.. + state->selected_line = UINT32_MAX; if ( state->selected < state->filtered_lines ) { ( state->selected_line ) = state->line_map[state->selected]; if ( strlen ( state->text->text ) > 0 && rc == -2 ) { diff --git a/test/run_issue333_test.sh b/test/run_issue333_test.sh new file mode 100755 index 00000000..1fb98548 --- /dev/null +++ b/test/run_issue333_test.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash + +# wait till it is up, run rofi with error message +rm -f output.txt +sleep 1; +echo -e -n "aap\nnoot\nmies" | rofi -dmenu -no-custom -kb-custom-1 F5 -kb-custom-2 "Control+a" > output.txt & +RPID=$! + +# send enter. +sleep 5; +xdotool key 'q' +sleep 0.4 +xdotool key Return +sleep 0.4 +xdotool key F5 +sleep 0.4 +xdotool key "Control+a" +sleep 0.4 +xdotool key Escape + +# Get result, kill xvfb +wait ${RPID} +RETV=$? +OUTPUT=$(cat output.txt | tr '\n' ' ') +if [ "${OUTPUT}" != '' ] +then + echo "Got: '${OUTPUT}' expected nothing" + exit 1 +fi +if [ ${RETV} != 1 ] +then + exit 1 +fi From bb6ae77ba5ed9493bb9164f498c5889413572820 Mon Sep 17 00:00:00 2001 From: Dave Davenport Date: Wed, 3 Feb 2016 18:28:58 +0100 Subject: [PATCH 4/5] Fix error dialog no longer closing on keypress --- source/rofi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/rofi.c b/source/rofi.c index 749be43c..bd04b1ce 100644 --- a/source/rofi.c +++ b/source/rofi.c @@ -1730,8 +1730,8 @@ void error_dialog ( const char *msg, int markup ) state->quit = TRUE; } } - release_keyboard ( display ); menu_state_free ( state ); + release_keyboard ( display ); } /** From 69b88caac5dc1dcac5227850c6aa6893a0eac449 Mon Sep 17 00:00:00 2001 From: Dave Davenport Date: Thu, 4 Feb 2016 09:20:10 +0100 Subject: [PATCH 5/5] Allow user to open an disabled modi. --- source/dialogs/dmenu.c | 3 +- source/rofi.c | 116 +++++++++++++++++++++++------------------ 2 files changed, 67 insertions(+), 52 deletions(-) diff --git a/source/dialogs/dmenu.c b/source/dialogs/dmenu.c index 46c87753..9d6cdc3e 100644 --- a/source/dialogs/dmenu.c +++ b/source/dialogs/dmenu.c @@ -431,8 +431,7 @@ int dmenu_switcher_dialog ( void ) // In no custom mode we allow canceling. restart = ( find_arg ( "-only-match" ) >= 0 ); } - else if ( pd->selected_line != UINT32_MAX ){ - + else if ( pd->selected_line != UINT32_MAX ) { if ( ( mretv & ( MENU_OK | MENU_QUICK_SWITCH ) ) && cmd_list[pd->selected_line] != NULL ) { dmenu_output_formatted_line ( pd->format, cmd_list[pd->selected_line], pd->selected_line, input ); retv = TRUE; diff --git a/source/rofi.c b/source/rofi.c index bd04b1ce..45389f0a 100644 --- a/source/rofi.c +++ b/source/rofi.c @@ -1968,6 +1968,60 @@ static void cleanup () * First the three build-in modi are checked: window, run, ssh * if that fails, a script-switcher is created. */ +static int add_mode ( const char * token ) +{ + unsigned int index = num_modi; + // Resize and add entry. + modi = (ModeHolder *) g_realloc ( modi, sizeof ( ModeHolder ) * ( num_modi + 1 ) ); + modi[num_modi].tb = NULL; + + // Window switcher. +#ifdef WINDOW_MODE + if ( strcasecmp ( token, "window" ) == 0 ) { + modi[num_modi].sw = &window_mode; + num_modi++; + } + else if ( strcasecmp ( token, "windowcd" ) == 0 ) { + modi[num_modi].sw = &window_mode_cd; + num_modi++; + } + else +#endif // WINDOW_MODE + // SSh dialog + if ( strcasecmp ( token, "ssh" ) == 0 ) { + modi[num_modi].sw = &ssh_mode; + num_modi++; + } + // Run dialog + else if ( strcasecmp ( token, "run" ) == 0 ) { + modi[num_modi].sw = &run_mode; + num_modi++; + } + else if ( strcasecmp ( token, "drun" ) == 0 ) { + modi[num_modi].sw = &drun_mode; + num_modi++; + } + // combi dialog + else if ( strcasecmp ( token, "combi" ) == 0 ) { + modi[num_modi].sw = &combi_mode; + num_modi++; + } + else { + // If not build in, use custom modi. + Mode *sw = script_switcher_parse_setup ( token ); + if ( sw != NULL ) { + modi[num_modi].sw = sw; + mode_set_config ( sw ); + num_modi++; + } + else{ + // Report error, don't continue. + fprintf ( stderr, "Invalid script switcher: %s\n", token ); + token = NULL; + } + } + return ( index == num_modi ) ? -1 : (int) index; +} static void setup_modi ( void ) { char *savept = NULL; @@ -1975,56 +2029,7 @@ static void setup_modi ( void ) char *switcher_str = g_strdup ( config.modi ); // Split token on ','. This modifies switcher_str. for ( char *token = strtok_r ( switcher_str, ",", &savept ); token != NULL; token = strtok_r ( NULL, ",", &savept ) ) { - // Resize and add entry. - modi = (ModeHolder *) g_realloc ( modi, sizeof ( ModeHolder ) * ( num_modi + 1 ) ); - modi[num_modi].tb = NULL; - - // Window switcher. - #ifdef WINDOW_MODE - if ( strcasecmp ( token, "window" ) == 0 ) { - modi[num_modi].sw = &window_mode; - num_modi++; - } - else if ( strcasecmp ( token, "windowcd" ) == 0 ) { - modi[num_modi].sw = &window_mode_cd; - num_modi++; - } - else - #endif // WINDOW_MODE - // SSh dialog - if ( strcasecmp ( token, "ssh" ) == 0 ) { - modi[num_modi].sw = &ssh_mode; - num_modi++; - } - // Run dialog - else if ( strcasecmp ( token, "run" ) == 0 ) { - modi[num_modi].sw = &run_mode; - num_modi++; - } - else if ( strcasecmp ( token, "drun" ) == 0 ) { - modi[num_modi].sw = &drun_mode; - num_modi++; - } - // combi dialog - else if ( strcasecmp ( token, "combi" ) == 0 ) { - modi[num_modi].sw = &combi_mode; - num_modi++; - } - else { - // If not build in, use custom modi. - Mode *sw = script_switcher_parse_setup ( token ); - if ( sw != NULL ) { - modi[num_modi].sw = sw; - mode_set_config ( sw ); - num_modi++; - } - else{ - // Report error, don't continue. - fprintf ( stderr, "Invalid script switcher: %s\n", token ); - token = NULL; - } - } - // Keybinding. + add_mode ( token ); } // Free string that was modified by strtok_r g_free ( switcher_str ); @@ -2481,6 +2486,17 @@ int main ( int argc, char *argv[] ) char *sname = NULL; if ( find_arg_str ( "-show", &sname ) == TRUE ) { int index = switcher_get ( sname ); + if ( index < 0 ) { + // Add it to the list + index = add_mode ( sname ); + // Complain + if ( index >= 0 ) { + fprintf ( stdout, "Mode %s not enabled. Please add it to the list of enabled modi: %s\n", + sname, config.modi ); + fprintf ( stdout, "Adding mode: %s\n", sname ); + } + // Run it anyway if found. + } if ( index >= 0 ) { run_switcher ( index ); }