mirror of
https://github.com/davatorium/rofi.git
synced 2024-11-18 13:54:36 -05:00
issue 1187: If error on launching application, show error message and return to list` (#1193)
* Show error message, then possibly pop back to main window. Fix drun/run dialog to use this for command execution. Issue #1187 * [Combi] When no line selected, handle using the first entry. * [Window] Add execute on invalid input to window dialog. * Update view.h doxygen docu * Update manpage with running application changes.
This commit is contained in:
parent
3ffc810468
commit
011908e1ff
9 changed files with 86 additions and 12 deletions
|
@ -1518,6 +1518,9 @@ Pressing the \fB\fCdelete\-entry\fR binding (\fB\fCshift\-delete\fR) will kill t
|
|||
Pressing the \fB\fCaccept\-custom\fR binding (\fB\fCcontrol\-enter\fR or \fB\fCshift\-enter\fR) will run a command on the window.
|
||||
(See option \fB\fCwindow\-command\fR );
|
||||
|
||||
.PP
|
||||
If there is no match, it will try to launch the input.
|
||||
|
||||
.SS run
|
||||
.PP
|
||||
Shows a list of executables in \fB\fC$PATH\fR and can launch them (optional in a terminal).
|
||||
|
@ -1529,6 +1532,7 @@ Pressing the \fB\fCaccept\-custom\fR binding (\fB\fCcontrol\-enter\fR or \fB\fCs
|
|||
Same as the \fBrun\fP launches, but the list is created from the installed desktop files. It automatically launches them
|
||||
in a terminal if specified in the Desktop File.
|
||||
Pressing the \fB\fCdelete\-entry\fR binding (\fB\fCshift\-delete\fR) will remove this entry from the run history.
|
||||
Pressing the \fB\fCaccept\-custom\fR binding (\fB\fCcontrol\-enter\fR or \fB\fCshift\-enter\fR) will run the command in a terminal.
|
||||
|
||||
.SS ssh
|
||||
.PP
|
||||
|
@ -1553,6 +1557,9 @@ For example, say you have specified \fB\fC\-combi\-modi run,window,windowcd\fR\&
|
|||
query begins with the bang \fB\fC!w\fR, only results from the \fB\fCwindow\fR and \fB\fCwindowcd\fR
|
||||
modi are shown, even if the rest of the input text would match results from \fB\fCrun\fR\&.
|
||||
|
||||
.PP
|
||||
If no match, the input is handled by the first combined modi.
|
||||
|
||||
.SH FAQ
|
||||
.SS The text in the window switcher is not nicely aligned.
|
||||
.PP
|
||||
|
|
|
@ -921,6 +921,8 @@ Pressing the `delete-entry` binding (`shift-delete`) will kill the window.
|
|||
Pressing the `accept-custom` binding (`control-enter` or `shift-enter`) will run a command on the window.
|
||||
(See option `window-command` );
|
||||
|
||||
If there is no match, it will try to launch the input.
|
||||
|
||||
### run
|
||||
|
||||
Shows a list of executables in `$PATH` and can launch them (optional in a terminal).
|
||||
|
@ -932,6 +934,7 @@ Pressing the `accept-custom` binding (`control-enter` or `shift-enter`) will run
|
|||
Same as the **run** launches, but the list is created from the installed desktop files. It automatically launches them
|
||||
in a terminal if specified in the Desktop File.
|
||||
Pressing the `delete-entry` binding (`shift-delete`) will remove this entry from the run history.
|
||||
Pressing the `accept-custom` binding (`control-enter` or `shift-enter`) will run the command in a terminal.
|
||||
|
||||
### ssh
|
||||
|
||||
|
@ -955,6 +958,8 @@ For example, say you have specified `-combi-modi run,window,windowcd`. If your
|
|||
query begins with the bang `!w`, only results from the `window` and `windowcd`
|
||||
modi are shown, even if the rest of the input text would match results from `run`.
|
||||
|
||||
If no match, the input is handled by the first combined modi.
|
||||
|
||||
## FAQ
|
||||
|
||||
### The text in the window switcher is not nicely aligned.
|
||||
|
|
|
@ -187,13 +187,23 @@ void rofi_view_free ( RofiViewState *state );
|
|||
RofiViewState * rofi_view_get_active ( void );
|
||||
|
||||
/**
|
||||
* @param state the new active view handle, NULL to clear.
|
||||
* @param state the new active view handle.
|
||||
*
|
||||
* Set the current active view Handle.
|
||||
* Set the current active view Handle, If NULL passed a queued view is popped
|
||||
* from stack.
|
||||
*
|
||||
*/
|
||||
|
||||
void rofi_view_set_active ( RofiViewState *state );
|
||||
|
||||
/**
|
||||
* @param state remove view handle.
|
||||
*
|
||||
* remove state handle from queue, if current view, pop view from
|
||||
* stack.
|
||||
*
|
||||
*/
|
||||
void rofi_view_remove_active ( RofiViewState *state );
|
||||
/**
|
||||
* @param msg The error message to show.
|
||||
* @param markup The error message uses pango markup.
|
||||
|
@ -265,6 +275,7 @@ void rofi_view_clear_input ( RofiViewState *state );
|
|||
* TODO: Internal call to view exposed.
|
||||
*/
|
||||
void __create_window ( MenuFlags menu_flags );
|
||||
|
||||
/**
|
||||
* Get the handle of the main window.
|
||||
*
|
||||
|
|
|
@ -180,6 +180,9 @@ static ModeMode combi_mode_result ( Mode *sw, int mretv, char **input, unsigned
|
|||
return mode_result ( pd->switchers[i].mode, mretv, input, selected_line - pd->starts[i] );
|
||||
}
|
||||
}
|
||||
if ( ( mretv & MENU_CUSTOM_INPUT ) ) {
|
||||
return mode_result ( pd->switchers[0].mode, mretv, input, selected_line );
|
||||
}
|
||||
return MODE_EXIT;
|
||||
}
|
||||
static int combi_mode_match ( const Mode *sw, rofi_int_matcher **tokens, unsigned int index )
|
||||
|
|
|
@ -1041,8 +1041,13 @@ static ModeMode drun_mode_result ( Mode *sw, int mretv, char **input, unsigned i
|
|||
}
|
||||
}
|
||||
else if ( ( mretv & MENU_CUSTOM_INPUT ) && *input != NULL && *input[0] != '\0' ) {
|
||||
RofiHelperExecuteContext context = { .name = NULL };
|
||||
gboolean run_in_term = ( ( mretv & MENU_CUSTOM_ACTION ) == MENU_CUSTOM_ACTION );
|
||||
// FIXME: We assume startup notification in terminals, not in others
|
||||
if ( ! helper_execute_command ( NULL, *input, run_in_term, run_in_term ? &context : NULL ) ) {
|
||||
retv = RELOAD_DIALOG;
|
||||
}
|
||||
}
|
||||
else if ( ( mretv & MENU_ENTRY_DELETE ) && selected_line < rmpd->cmd_list_length ) {
|
||||
// Possitive sort index means it is in history.
|
||||
if ( rmpd->entry_list[selected_line].sort_index >= 0 ) {
|
||||
|
|
|
@ -78,18 +78,18 @@ typedef struct
|
|||
*
|
||||
* Execute command and add to history.
|
||||
*/
|
||||
static void exec_cmd ( const char *cmd, int run_in_term )
|
||||
static gboolean exec_cmd ( const char *cmd, int run_in_term )
|
||||
{
|
||||
GError *error = NULL;
|
||||
if ( !cmd || !cmd[0] ) {
|
||||
return;
|
||||
return FALSE;
|
||||
}
|
||||
gsize lf_cmd_size = 0;
|
||||
gchar *lf_cmd = g_locale_from_utf8 ( cmd, -1, NULL, &lf_cmd_size, &error );
|
||||
if ( error != NULL ) {
|
||||
g_warning ( "Failed to convert command to locale encoding: %s", error->message );
|
||||
g_error_free ( error );
|
||||
return;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
char *path = g_build_filename ( cache_dir, RUN_CACHE_FILE, NULL );
|
||||
|
@ -102,12 +102,16 @@ static void exec_cmd ( const char *cmd, int run_in_term )
|
|||
*/
|
||||
|
||||
history_set ( path, cmd );
|
||||
g_free ( path );
|
||||
g_free ( lf_cmd );
|
||||
return TRUE;
|
||||
}
|
||||
else {
|
||||
history_remove ( path, cmd );
|
||||
}
|
||||
g_free ( path );
|
||||
g_free ( lf_cmd );
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -371,10 +375,14 @@ static ModeMode run_mode_result ( Mode *sw, int mretv, char **input, unsigned in
|
|||
gboolean run_in_term = ( ( mretv & MENU_CUSTOM_ACTION ) == MENU_CUSTOM_ACTION );
|
||||
|
||||
if ( ( mretv & MENU_OK ) && rmpd->cmd_list[selected_line] != NULL ) {
|
||||
exec_cmd ( rmpd->cmd_list[selected_line], run_in_term );
|
||||
if ( !exec_cmd ( rmpd->cmd_list[selected_line], run_in_term ) ) {
|
||||
retv = RELOAD_DIALOG;
|
||||
}
|
||||
}
|
||||
else if ( ( mretv & MENU_CUSTOM_INPUT ) && *input != NULL && *input[0] != '\0' ) {
|
||||
exec_cmd ( *input, run_in_term );
|
||||
if ( !exec_cmd ( *input, run_in_term ) ) {
|
||||
retv = RELOAD_DIALOG;
|
||||
}
|
||||
}
|
||||
else if ( ( mretv & MENU_ENTRY_DELETE ) && rmpd->cmd_list[selected_line] ) {
|
||||
delete_entry ( rmpd->cmd_list[selected_line] );
|
||||
|
|
|
@ -697,6 +697,23 @@ static ModeMode window_mode_result ( Mode *sw, int mretv, G_GNUC_UNUSED char **i
|
|||
xcb_ewmh_request_close_window ( &( xcb->ewmh ), xcb->screen_nbr, rmpd->ids->array[selected_line], XCB_CURRENT_TIME, XCB_EWMH_CLIENT_SOURCE_TYPE_OTHER );
|
||||
xcb_flush ( xcb->connection );
|
||||
}
|
||||
else if ( ( mretv & MENU_CUSTOM_INPUT ) && *input != NULL && *input[0] != '\0' ) {
|
||||
GError *error = NULL;
|
||||
gboolean run_in_term = ( ( mretv & MENU_CUSTOM_ACTION ) == MENU_CUSTOM_ACTION );
|
||||
gsize lf_cmd_size = 0;
|
||||
gchar *lf_cmd = g_locale_from_utf8 ( *input, -1, NULL, &lf_cmd_size, &error );
|
||||
if ( error != NULL ) {
|
||||
g_warning ( "Failed to convert command to locale encoding: %s", error->message );
|
||||
g_error_free ( error );
|
||||
return RELOAD_DIALOG;
|
||||
}
|
||||
|
||||
RofiHelperExecuteContext context = { .name = NULL };
|
||||
if ( ! helper_execute_command ( NULL, lf_cmd, run_in_term, run_in_term ? &context : NULL ) ) {
|
||||
retv = RELOAD_DIALOG;
|
||||
}
|
||||
g_free ( lf_cmd );
|
||||
}
|
||||
return retv;
|
||||
}
|
||||
|
||||
|
|
|
@ -208,7 +208,7 @@ static void run_switcher ( ModeMode mode )
|
|||
void process_result ( RofiViewState *state )
|
||||
{
|
||||
Mode *sw = state->sw;
|
||||
rofi_view_set_active ( NULL );
|
||||
// rofi_view_set_active ( NULL );
|
||||
if ( sw != NULL ) {
|
||||
unsigned int selected_line = rofi_view_get_selected_line ( state );;
|
||||
MenuReturn mretv = rofi_view_get_return_value ( state );
|
||||
|
@ -246,11 +246,17 @@ void process_result ( RofiViewState *state )
|
|||
* Load in the new mode.
|
||||
*/
|
||||
rofi_view_switch_mode ( state, modi[mode] );
|
||||
rofi_view_set_active ( state );
|
||||
curr_switcher = mode;
|
||||
return;
|
||||
} else {
|
||||
// On exit, free current view, and pop to one above.
|
||||
rofi_view_remove_active ( state );
|
||||
rofi_view_free ( state );
|
||||
return;
|
||||
}
|
||||
}
|
||||
// rofi_view_set_active ( NULL );
|
||||
rofi_view_remove_active ( state );
|
||||
rofi_view_free ( state );
|
||||
}
|
||||
|
||||
|
|
|
@ -415,6 +415,9 @@ static void rofi_view_calculate_window_position ( RofiViewState *state )
|
|||
|
||||
static void rofi_view_window_update_size ( RofiViewState * state )
|
||||
{
|
||||
if ( state == NULL ) {
|
||||
return;
|
||||
}
|
||||
uint16_t mask = XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y | XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT;
|
||||
uint32_t vals[] = { state->x, state->y, state->width, state->height };
|
||||
|
||||
|
@ -490,6 +493,15 @@ RofiViewState * rofi_view_get_active ( void )
|
|||
return current_active_menu;
|
||||
}
|
||||
|
||||
void rofi_view_remove_active ( RofiViewState *state )
|
||||
{
|
||||
if ( state == current_active_menu ) {
|
||||
rofi_view_set_active ( NULL );
|
||||
}
|
||||
else if ( state ) {
|
||||
g_queue_remove ( &(CacheState.views ), state);
|
||||
}
|
||||
}
|
||||
void rofi_view_set_active ( RofiViewState *state )
|
||||
{
|
||||
if ( current_active_menu != NULL && state != NULL ) {
|
||||
|
|
Loading…
Reference in a new issue