mirror of
https://github.com/lbonn/rofi
synced 2024-11-23 12:23:02 +00:00
[Script] Add environment variable to indicate state.
* ROFI_RETV shows the state rofi was in before calling rofi.
This commit is contained in:
parent
5879fd6099
commit
bacecf3044
4 changed files with 54 additions and 14 deletions
4
Examples/test_script_env.sh
Executable file
4
Examples/test_script_env.sh
Executable file
|
@ -0,0 +1,4 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
|
||||||
|
echo "${ROFI_RETV}"
|
|
@ -57,6 +57,22 @@ echo "quit"
|
||||||
.PP
|
.PP
|
||||||
This shows two entries, reload and quit. When the quit entry is selected, rofi closes.
|
This shows two entries, reload and quit. When the quit entry is selected, rofi closes.
|
||||||
|
|
||||||
|
.SH Environment
|
||||||
|
.PP
|
||||||
|
Rofi sets the following environment variable when executing the script:
|
||||||
|
|
||||||
|
.SS \fB\fCROFI\_RETV\fR
|
||||||
|
.PP
|
||||||
|
An integer number with the current state:
|
||||||
|
.IP \(bu 2
|
||||||
|
\fB0\fP: Initial call of script.
|
||||||
|
.IP \(bu 2
|
||||||
|
\fB1\fP: Selected an entry.
|
||||||
|
.IP \(bu 2
|
||||||
|
\fB2\fP: Selected a custom entry.
|
||||||
|
.IP \(bu 2
|
||||||
|
\fB10\-28\fP: Custom keybinding 1\-19
|
||||||
|
|
||||||
.SH Passing mode options
|
.SH Passing mode options
|
||||||
.PP
|
.PP
|
||||||
Extra options, like setting the prompt, can be set by the script.
|
Extra options, like setting the prompt, can be set by the script.
|
||||||
|
|
|
@ -46,6 +46,19 @@ echo "quit"
|
||||||
|
|
||||||
This shows two entries, reload and quit. When the quit entry is selected, rofi closes.
|
This shows two entries, reload and quit. When the quit entry is selected, rofi closes.
|
||||||
|
|
||||||
|
## Environment
|
||||||
|
|
||||||
|
Rofi sets the following environment variable when executing the script:
|
||||||
|
|
||||||
|
### `ROFI_RETV`
|
||||||
|
|
||||||
|
An integer number with the current state:
|
||||||
|
|
||||||
|
* **0**: Initial call of script.
|
||||||
|
* **1**: Selected an entry.
|
||||||
|
* **2**: Selected a custom entry.
|
||||||
|
* **10-28**: Custom keybinding 1-19
|
||||||
|
|
||||||
## Passing mode options
|
## Passing mode options
|
||||||
|
|
||||||
Extra options, like setting the prompt, can be set by the script.
|
Extra options, like setting the prompt, can be set by the script.
|
||||||
|
|
|
@ -134,7 +134,7 @@ static void parse_header_entry ( Mode *sw, char *line, ssize_t length )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static DmenuScriptEntry *get_script_output ( Mode *sw, char *command, char *arg, unsigned int *length )
|
static DmenuScriptEntry *execute_executor ( Mode *sw, char *arg, unsigned int *length, int value )
|
||||||
{
|
{
|
||||||
ScriptModePrivateData *pd = (ScriptModePrivateData *) sw->private_data;
|
ScriptModePrivateData *pd = (ScriptModePrivateData *) sw->private_data;
|
||||||
int fd = -1;
|
int fd = -1;
|
||||||
|
@ -143,14 +143,25 @@ static DmenuScriptEntry *get_script_output ( Mode *sw, char *command, char *arg,
|
||||||
char **argv = NULL;
|
char **argv = NULL;
|
||||||
int argc = 0;
|
int argc = 0;
|
||||||
*length = 0;
|
*length = 0;
|
||||||
if ( g_shell_parse_argv ( command, &argc, &argv, &error ) ) {
|
|
||||||
|
|
||||||
|
// Environment
|
||||||
|
char ** env = g_get_environ ();
|
||||||
|
|
||||||
|
char *str_value = g_strdup_printf("%d", value);
|
||||||
|
env = g_environ_setenv ( env, "ROFI_RETV", str_value, TRUE);
|
||||||
|
g_free ( str_value );
|
||||||
|
|
||||||
|
|
||||||
|
if ( g_shell_parse_argv ( sw->ed, &argc, &argv, &error ) ) {
|
||||||
argv = g_realloc ( argv, ( argc + 2 ) * sizeof ( char* ) );
|
argv = g_realloc ( argv, ( argc + 2 ) * sizeof ( char* ) );
|
||||||
argv[argc] = g_strdup ( arg );
|
argv[argc] = g_strdup ( arg );
|
||||||
argv[argc + 1] = NULL;
|
argv[argc + 1] = NULL;
|
||||||
g_spawn_async_with_pipes ( NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, NULL, &fd, NULL, &error );
|
g_spawn_async_with_pipes ( NULL, argv, env, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, NULL, &fd, NULL, &error );
|
||||||
}
|
}
|
||||||
|
g_strfreev ( env );
|
||||||
if ( error != NULL ) {
|
if ( error != NULL ) {
|
||||||
char *msg = g_strdup_printf ( "Failed to execute: '%s'\nError: '%s'", command, error->message );
|
char *msg = g_strdup_printf ( "Failed to execute: '%s'\nError: '%s'", (char*)sw->ed, error->message );
|
||||||
rofi_view_error_dialog ( msg, FALSE );
|
rofi_view_error_dialog ( msg, FALSE );
|
||||||
g_free ( msg );
|
g_free ( msg );
|
||||||
// print error.
|
// print error.
|
||||||
|
@ -203,12 +214,6 @@ static DmenuScriptEntry *get_script_output ( Mode *sw, char *command, char *arg,
|
||||||
return retv;
|
return retv;
|
||||||
}
|
}
|
||||||
|
|
||||||
static DmenuScriptEntry *execute_executor ( Mode *sw, char *result, unsigned int *length )
|
|
||||||
{
|
|
||||||
DmenuScriptEntry *retv = get_script_output ( sw, sw->ed, result, length );
|
|
||||||
return retv;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void script_switcher_free ( Mode *sw )
|
static void script_switcher_free ( Mode *sw )
|
||||||
{
|
{
|
||||||
if ( sw == NULL ) {
|
if ( sw == NULL ) {
|
||||||
|
@ -225,7 +230,7 @@ static int script_mode_init ( Mode *sw )
|
||||||
ScriptModePrivateData *pd = g_malloc0 ( sizeof ( *pd ) );
|
ScriptModePrivateData *pd = g_malloc0 ( sizeof ( *pd ) );
|
||||||
pd->delim = '\n';
|
pd->delim = '\n';
|
||||||
sw->private_data = (void *) pd;
|
sw->private_data = (void *) pd;
|
||||||
pd->cmd_list = get_script_output ( sw, (char *) sw->ed, NULL, &( pd->cmd_list_length ) );
|
pd->cmd_list = execute_executor ( sw, NULL, &( pd->cmd_list_length ), 0 );
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -261,18 +266,20 @@ static ModeMode script_mode_result ( Mode *sw, int mretv, char **input, unsigned
|
||||||
retv = PREVIOUS_DIALOG;
|
retv = PREVIOUS_DIALOG;
|
||||||
}
|
}
|
||||||
else if ( ( mretv & MENU_QUICK_SWITCH ) ) {
|
else if ( ( mretv & MENU_QUICK_SWITCH ) ) {
|
||||||
retv = ( mretv & MENU_LOWER_MASK );
|
//retv = 1+( mretv & MENU_LOWER_MASK );
|
||||||
|
script_mode_reset_highlight ( sw );
|
||||||
|
new_list = execute_executor ( sw, rmpd->cmd_list[selected_line].entry, &new_length,10+( mretv & MENU_LOWER_MASK ) );
|
||||||
}
|
}
|
||||||
else if ( ( mretv & MENU_OK ) && rmpd->cmd_list[selected_line].entry != NULL ) {
|
else if ( ( mretv & MENU_OK ) && rmpd->cmd_list[selected_line].entry != NULL ) {
|
||||||
if ( rmpd->cmd_list[selected_line].nonselectable ) {
|
if ( rmpd->cmd_list[selected_line].nonselectable ) {
|
||||||
return RELOAD_DIALOG;
|
return RELOAD_DIALOG;
|
||||||
}
|
}
|
||||||
script_mode_reset_highlight ( sw );
|
script_mode_reset_highlight ( sw );
|
||||||
new_list = execute_executor ( sw, rmpd->cmd_list[selected_line].entry, &new_length );
|
new_list = execute_executor ( sw, rmpd->cmd_list[selected_line].entry, &new_length, 1 );
|
||||||
}
|
}
|
||||||
else if ( ( mretv & MENU_CUSTOM_INPUT ) && *input != NULL && *input[0] != '\0' ) {
|
else if ( ( mretv & MENU_CUSTOM_INPUT ) && *input != NULL && *input[0] != '\0' ) {
|
||||||
script_mode_reset_highlight ( sw );
|
script_mode_reset_highlight ( sw );
|
||||||
new_list = execute_executor ( sw, *input, &new_length );
|
new_list = execute_executor ( sw, *input, &new_length, 2 );
|
||||||
}
|
}
|
||||||
|
|
||||||
// If a new list was generated, use that an loop around.
|
// If a new list was generated, use that an loop around.
|
||||||
|
|
Loading…
Reference in a new issue