diff options
author | Jeff <jdost@users.noreply.github.com> | 2020-02-01 04:49:11 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-01 13:49:11 +0100 |
commit | 83c2e467d5b34f9e74e2c55b1e9df2b715be175e (patch) | |
tree | 714ca7b869018ae516bdc5aefdc535aa0e84a630 | |
parent | a422b33e9974e05ff9836a7ebcf1c938c20e4a37 (diff) |
Add support for additional field on script entries `meta` (#1052)
* Add test for hidden meta data in script mode
The purpose of this is to provide support for "hidden" fields on a
script item that work for search but don't get displayed. This is
mostly to provide something similar to the optional display (but still
matchable) fields in drun like "categories" or "keywords". This also
enables the choice to display unicode icons but still allow for
searching for the keywords without needing to print them.
* Ignore the output file from test runs
* Add support for the "meta" field on script entries
This fields provides a matchable but unprinted string for entries in a
script mode list match. This means you can use one thing but provide
multiple options that can match that item without polluting the list
view or make confusing output.
* Add new test to test suite file
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | include/dialogs/dmenuscriptshared.h | 2 | ||||
-rw-r--r-- | source/dialogs/dmenu.c | 2 | ||||
-rw-r--r-- | source/dialogs/script.c | 23 | ||||
-rwxr-xr-x | test/run_all_tests.sh | 1 | ||||
-rwxr-xr-x | test/run_script_meta_test.sh | 26 | ||||
-rwxr-xr-x | test/test_script.sh | 2 |
7 files changed, 55 insertions, 2 deletions
@@ -34,6 +34,7 @@ /doc/*.html /doc/*.doxy /gitconfig.h +test/output.txt # I want to ignore log files *.log diff --git a/include/dialogs/dmenuscriptshared.h b/include/dialogs/dmenuscriptshared.h index 16400e0a..31e8aae5 100644 --- a/include/dialogs/dmenuscriptshared.h +++ b/include/dialogs/dmenuscriptshared.h @@ -8,6 +8,8 @@ typedef struct { char *icon_name; /** Async icon fetch handler. */ uint32_t icon_fetch_uid; + /** Hidden meta keywords. */ + char *meta; } DmenuScriptEntry; /** * @param sw Unused diff --git a/source/dialogs/dmenu.c b/source/dialogs/dmenu.c index fee6e5d4..96eddf57 100644 --- a/source/dialogs/dmenu.c +++ b/source/dialogs/dmenu.c @@ -122,6 +122,7 @@ static void read_add ( DmenuModePrivateData * pd, char *data, gsize len ) // Init. pd->cmd_list[pd->cmd_list_length].icon_fetch_uid = 0; pd->cmd_list[pd->cmd_list_length].icon_name = NULL; + pd->cmd_list[pd->cmd_list_length].meta = NULL; char *end = strchr(data, '\0'); if ( end != NULL ) { data_len = end-data; @@ -309,6 +310,7 @@ static void dmenu_mode_free ( Mode *sw ) if ( pd->cmd_list[i].entry ) { g_free ( pd->cmd_list[i].entry ); g_free ( pd->cmd_list[i].icon_name ); + g_free ( pd->cmd_list[i].meta ); } } g_free ( pd->cmd_list ); diff --git a/source/dialogs/script.c b/source/dialogs/script.c index d52df371..514e43ba 100644 --- a/source/dialogs/script.c +++ b/source/dialogs/script.c @@ -87,6 +87,9 @@ void dmenuscript_parse_entry_extras ( G_GNUC_UNUSED Mode *sw, DmenuScriptEntry * if ( strcasecmp(buffer, "icon" ) == 0 ) { entry->icon_name = g_strdup(value); } + if ( strcasecmp(buffer, "meta" ) == 0 ) { + entry->meta = g_strdup(value); + } } } @@ -171,6 +174,7 @@ static DmenuScriptEntry *get_script_output ( Mode *sw, char *command, char *arg, size_t buf_length = strlen(buffer)+1; retv[( *length )].entry = g_memdup ( buffer, buf_length); retv[( *length )].icon_name = NULL; + retv[( *length )].meta = NULL; retv[(*length)].icon_fetch_uid = 0; if ( buf_length > 0 && (read_length > (ssize_t)buf_length) ) { dmenuscript_parse_entry_extras ( sw, &(retv[(*length)]), buffer+buf_length, read_length-buf_length); @@ -264,6 +268,7 @@ static ModeMode script_mode_result ( Mode *sw, int mretv, char **input, unsigned for ( unsigned int i = 0; i < rmpd->cmd_list_length; i++ ){ g_free ( rmpd->cmd_list[i].entry ); g_free ( rmpd->cmd_list[i].icon_name ); + g_free ( rmpd->cmd_list[i].meta ); } g_free ( rmpd->cmd_list ); @@ -281,6 +286,7 @@ static void script_mode_destroy ( Mode *sw ) for ( unsigned int i = 0; i < rmpd->cmd_list_length; i++ ){ g_free ( rmpd->cmd_list[i].entry ); g_free ( rmpd->cmd_list[i].icon_name ); + g_free ( rmpd->cmd_list[i].meta ); } g_free ( rmpd->cmd_list ); g_free ( rmpd->message ); @@ -324,7 +330,22 @@ static char *_get_display_value ( const Mode *sw, unsigned int selected_line, G_ static int script_token_match ( const Mode *sw, rofi_int_matcher **tokens, unsigned int index ) { ScriptModePrivateData *rmpd = sw->private_data; - return helper_token_match ( tokens, rmpd->cmd_list[index].entry ); + int match = 1; + if ( tokens ) { + for ( int j = 0; match && tokens != NULL && tokens[j] != NULL; j++ ) { + rofi_int_matcher *ftokens[2] = { tokens[j], NULL }; + int test = 0; + test = helper_token_match ( ftokens, rmpd->cmd_list[index].entry ); + if ( test == tokens[j]->invert && rmpd->cmd_list[index].meta ) { + test = helper_token_match ( ftokens, rmpd->cmd_list[index].meta); + } + + if ( test == 0 ) { + match = 0; + } + } + } + return match; } static char *script_get_message ( const Mode *sw ) { diff --git a/test/run_all_tests.sh b/test/run_all_tests.sh index 94427e9f..8d619ab0 100755 --- a/test/run_all_tests.sh +++ b/test/run_all_tests.sh @@ -7,6 +7,7 @@ tests=( run_dmenu_custom_test run_run_test run_script_test + run_script_meta_test run_issue_256 run_issue_275 run_dmenu_empty diff --git a/test/run_script_meta_test.sh b/test/run_script_meta_test.sh new file mode 100755 index 00000000..cb570dae --- /dev/null +++ b/test/run_script_meta_test.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash + +SP=$(readlink -f "$0") +DIR=$(dirname "$SP") +echo "$DIR/test_script.sh" +# wait till it is up, run rofi with error message +sleep 1; +rofi -modi "custom:$DIR/test_script.sh" -show custom & +RPID=$! + +# send enter. +sleep 5; +xdotool key 'z' +sleep 0.4 +xdotool key Return + +# Get result, kill xvfb +wait ${RPID} +RETV=$? +OUTPUT=$( tr '\n' ' ' < output.txt ) +echo ${OUTPUT} +if [ "${OUTPUT}" != 'mies ' ] +then + exit 1 +fi +exit ${RETV} diff --git a/test/test_script.sh b/test/test_script.sh index c4021380..4aab2db8 100755 --- a/test/test_script.sh +++ b/test/test_script.sh @@ -4,7 +4,7 @@ if [ -z "$1" ] then echo "aap" echo "noot" - echo "mies" + echo -ne "mies\0meta\x1fzoom\n" else echo $1 > output.txt fi |