diff options
author | Dave Davenport <qball@gmpclient.org> | 2016-01-07 19:47:37 +0100 |
---|---|---|
committer | Dave Davenport <qball@gmpclient.org> | 2016-01-07 19:47:37 +0100 |
commit | e8daff0f6ad49cd17b225622fa1875ee2960a70f (patch) | |
tree | 98573f33b525ffe0acbb378eb0367e8c658fc0cc | |
parent | 51b5511017b632129df78d2906882abafd92c38a (diff) |
First cleanup steps.
-rw-r--r-- | Makefile.am | 9 | ||||
-rw-r--r-- | include/mode-private.h | 79 | ||||
-rw-r--r-- | include/mode.h | 87 | ||||
-rw-r--r-- | include/rofi.h | 142 | ||||
-rw-r--r-- | include/textbox.h | 16 | ||||
-rw-r--r-- | source/dialogs/combi.c | 35 | ||||
-rw-r--r-- | source/dialogs/dmenu.c | 33 | ||||
-rw-r--r-- | source/dialogs/drun.c | 30 | ||||
-rw-r--r-- | source/dialogs/run.c | 29 | ||||
-rw-r--r-- | source/dialogs/script.c | 23 | ||||
-rw-r--r-- | source/dialogs/ssh.c | 29 | ||||
-rw-r--r-- | source/dialogs/window.c | 57 | ||||
-rw-r--r-- | source/mode.c | 39 | ||||
-rw-r--r-- | source/rofi.c | 12 |
14 files changed, 365 insertions, 255 deletions
diff --git a/Makefile.am b/Makefile.am index 363c830e..2aa6e36c 100644 --- a/Makefile.am +++ b/Makefile.am @@ -32,6 +32,7 @@ AM_CFLAGS=\ rofi_SOURCES=\ source/rofi.c\ + source/mode.c\ source/keyb.c\ config/config.c\ source/helper.c\ @@ -50,6 +51,8 @@ rofi_SOURCES=\ source/dialogs/window.c\ source/dialogs/script.c\ include/rofi.h\ + include/mode.h\ + include/mode-private.h\ include/settings.h\ include/keyb.h\ include/helper.h\ @@ -132,6 +135,8 @@ rofi_test_SOURCES=\ source/history.c\ config/config.c\ include/rofi.h\ + include/mode.h\ + include/mode-private.h\ include/settings.h\ include/history.h\ test/history-test.c @@ -145,6 +150,8 @@ textbox_test_SOURCES=\ source/helper.c\ include/keyb.h\ include/rofi.h\ + include/mode.h\ + include/mode-private.h\ include/settings.h\ include/textbox.h\ include/x11-helper.h\ @@ -155,6 +162,8 @@ textbox_test_SOURCES=\ helper_test_SOURCES=\ config/config.c\ include/rofi.h\ + include/mode.h\ + include/mode-private.h\ source/helper.c\ include/helper.h\ include/xrmoptions.h\ diff --git a/include/mode-private.h b/include/mode-private.h new file mode 100644 index 00000000..f8bf9879 --- /dev/null +++ b/include/mode-private.h @@ -0,0 +1,79 @@ +#ifndef ROFI_MODE_PRIVATE_H +#define ROFI_MODE_PRIVATE_H + +typedef void ( *switcher_free )( Mode *data ); + +typedef char * ( *switcher_get_display_value )( const Mode *sw, unsigned int selected_line, int *state, int get_entry ); + +typedef char * ( *switcher_get_completion )( const Mode *sw, unsigned int selected_line ); +/** + * @param tokens List of (input) tokens to match. + * @param input The entry to match against. + * @param case_sensitive Whether case is significant. + * @param index The current selected index. + * @param data User data. + * + * Function prototype for the matching algorithm. + * + * @returns 1 when it matches, 0 if not. + */ +typedef int ( *switcher_token_match )( const Mode *data, char **tokens, int not_ascii, int case_sensitive, unsigned int index ); + +typedef void ( *__mode_init )( Mode *sw ); + +typedef unsigned int ( *__mode_get_num_entries )( const Mode *sw ); + +typedef void ( *__mode_destroy )( Mode *sw ); + +typedef ModeMode ( *switcher_result )( Mode *sw, int menu_retv, char **input, unsigned int selected_line ); + +typedef int ( *switcher_is_not_ascii )( const Mode *sw, unsigned int index ); + +/** + * Structure defining a switcher. + * It consists of a name, callback and if enabled + * a textbox for the sidebar-mode. + */ +struct _Mode +{ + /** Name (max 31 char long) */ + char name[32]; + /** Keybindings (keysym and modmask) */ + char * keycfg; + char * keystr; + KeySym keysym; + unsigned int modmask; + + /** + * A switcher normally consists of the following parts: + */ + /** Initialize the Mode */ + __mode_init _init; + /** Destroy the switcher, e.g. free all its memory. */ + __mode_destroy _destroy; + /** Get number of entries to display. (unfiltered). */ + __mode_get_num_entries _get_num_entries; + /** Check if the element is ascii. */ + switcher_is_not_ascii is_not_ascii; + /** Process the result of the user selection. */ + switcher_result result; + /** Token match. */ + switcher_token_match token_match; + /** Get the string to display for the entry. */ + switcher_get_display_value mgrv; + /** Get the 'completed' entry. */ + switcher_get_completion get_completion; + + /** Pointer to private data. */ + void *private_data; + + /** + * Free SWitcher + * Only to be used when the switcher object itself is dynamic. + * And has data in `ed` + */ + switcher_free free; + /** Extra fields for script */ + void *ed; +}; +#endif // ROFI_MODE_PRIVATE_H diff --git a/include/mode.h b/include/mode.h new file mode 100644 index 00000000..8a8d62a6 --- /dev/null +++ b/include/mode.h @@ -0,0 +1,87 @@ +#ifndef ROFI_MODE_H +#define ROFI_MODE_H + +/** + * @defgroup MODE Mode + * + * The 'object' that makes a mode in rofi. + * @{ + */ +typedef struct _Mode Mode; + +/** + * Enum used to sum the possible states of ROFI. + */ +typedef enum +{ + /** Exit. */ + MODE_EXIT = 1000, + /** Skip to the next cycle-able dialog. */ + NEXT_DIALOG = 1001, + /** Reload current DIALOG */ + RELOAD_DIALOG = 1002, + /** Previous dialog */ + PREVIOUS_DIALOG = 1003 +} ModeMode; + +/** + * State returned by the rofi window. + */ +typedef enum +{ + /** Entry is selected. */ + MENU_OK = 0x00010000, + /** User canceled the operation. (e.g. pressed escape) */ + MENU_CANCEL = 0x00020000, + /** User requested a mode switch */ + MENU_NEXT = 0x00040000, + /** Custom (non-matched) input was entered. */ + MENU_CUSTOM_INPUT = 0x00080000, + /** User wanted to delete entry from history. */ + MENU_ENTRY_DELETE = 0x00100000, + /** User wants to jump to another switcher. */ + MENU_QUICK_SWITCH = 0x00200000, + /** Go to the previous menu. */ + MENU_PREVIOUS = 0x00400000, + /** Modifiers */ + MENU_SHIFT = 0x10000000, + /** Mask */ + MENU_LOWER_MASK = 0x0000FFFF +} MenuReturn; + +/** + * @param mode The mode to initialize + * + * Initialize mode + */ +void mode_init ( Mode *mode ); + +/** + * @param mode The mode to destroy + * + * Destroy the mode + */ +void mode_destroy ( Mode *mode ); + +/** + * @param mode The mode to query + * + * Get the number of entries in the mode. + * + * @returns an unsigned in with the number of entries. + */ +unsigned int mode_get_num_entries ( const Mode *sw ); + +/** + * @param mode The mode to query + * @param selected_line The entry to query + * @param state The state of the entry [out] + * @param get_entry If the should be returned. + * + * Returns the string as it should be displayed for the entry and the state of how it should be displayed. + * + * @returns allocated new string and state when get_entry is TRUE otherwise just the state. + */ +char * mode_get_display_value ( const Mode *mode, unsigned int selected_line, int *state, int get_entry ); +/*@}*/ +#endif diff --git a/include/rofi.h b/include/rofi.h index 86c37acc..e93eb635 100644 --- a/include/rofi.h +++ b/include/rofi.h @@ -9,6 +9,7 @@ #include <cairo-xlib.h> #include "timings.h" #include "keyb.h" +#include "mode.h" /** * @defgroup Widgets Widgets @@ -23,53 +24,13 @@ */ extern const char *cache_dir; -typedef struct _Mode Mode; /** - * Enum used to sum the possible states of ROFI. - */ -typedef enum -{ - /** Exit. */ - MODE_EXIT = 1000, - /** Skip to the next cycle-able dialog. */ - NEXT_DIALOG = 1001, - /** Reload current DIALOG */ - RELOAD_DIALOG = 1002, - /** Previous dialog */ - PREVIOUS_DIALOG = 1003 -} ModeMode; - -/** - * State returned by the rofi window. - */ -typedef enum -{ - /** Entry is selected. */ - MENU_OK = 0x00010000, - /** User canceled the operation. (e.g. pressed escape) */ - MENU_CANCEL = 0x00020000, - /** User requested a mode switch */ - MENU_NEXT = 0x00040000, - /** Custom (non-matched) input was entered. */ - MENU_CUSTOM_INPUT = 0x00080000, - /** User wanted to delete entry from history. */ - MENU_ENTRY_DELETE = 0x00100000, - /** User wants to jump to another switcher. */ - MENU_QUICK_SWITCH = 0x00200000, - /** Go to the previous menu. */ - MENU_PREVIOUS = 0x00400000, - /** Modifiers */ - MENU_SHIFT = 0x10000000, - /** Mask */ - MENU_LOWER_MASK = 0x0000FFFF -} MenuReturn; - -/** - * @param sig The caught signal + * @param msg The error message to show. + * @param markup The error message uses pango markup. * - * Catch the exit signal generated by X. + * The error message to show. */ -void catch_exit ( __attribute__( ( unused ) ) int sig ); +void error_dialog ( const char *msg, int markup ); /** * @param sw the Mode to show. @@ -90,90 +51,6 @@ void catch_exit ( __attribute__( ( unused ) ) int sig ); MenuReturn menu ( Mode *sw, char **input, char *prompt, unsigned int *selected_line, unsigned int *next_pos, const char *message ) __attribute__ ( ( nonnull ( 1, 2, 3, 4 ) ) ); -/** - * @param msg The error message to show. - * @param markup The error message uses pango markup. - * - * The error message to show. - */ -void error_dialog ( const char *msg, int markup ); - -typedef void ( *switcher_free )( Mode *data ); - -typedef char * ( *switcher_get_display_value )( const Mode *sw, unsigned int selected_line, int *state, int get_entry ); - -typedef char * ( *switcher_get_completion )( const Mode *sw, unsigned int selected_line ); -/** - * @param tokens List of (input) tokens to match. - * @param input The entry to match against. - * @param case_sensitive Whether case is significant. - * @param index The current selected index. - * @param data User data. - * - * Function prototype for the matching algorithm. - * - * @returns 1 when it matches, 0 if not. - */ -typedef int ( *switcher_token_match )( const Mode *data, char **tokens, int not_ascii, int case_sensitive, unsigned int index ); - -typedef void ( *switcher_init )( Mode *sw ); - -typedef unsigned int ( *switcher_get_num_entries )( const Mode *sw ); - -typedef void ( *switcher_destroy )( Mode *sw ); - -typedef ModeMode ( *switcher_result )( Mode *sw, int menu_retv, char **input, unsigned int selected_line ); - -typedef int ( *switcher_is_not_ascii )( const Mode *sw, unsigned int index ); - -/** - * Structure defining a switcher. - * It consists of a name, callback and if enabled - * a textbox for the sidebar-mode. - */ -struct _Mode -{ - /** Name (max 31 char long) */ - char name[32]; - /** Keybindings (keysym and modmask) */ - char * keycfg; - char * keystr; - KeySym keysym; - unsigned int modmask; - - /** - * A switcher normally consists of the following parts: - */ - /** Initialize the Mode */ - switcher_init init; - /** Destroy the switcher, e.g. free all its memory. */ - switcher_destroy destroy; - /** Get number of entries to display. (unfiltered). */ - switcher_get_num_entries get_num_entries; - /** Check if the element is ascii. */ - switcher_is_not_ascii is_not_ascii; - /** Process the result of the user selection. */ - switcher_result result; - /** Token match. */ - switcher_token_match token_match; - /** Get the string to display for the entry. */ - switcher_get_display_value mgrv; - /** Get the 'completed' entry. */ - switcher_get_completion get_completion; - - /** Pointer to private data. */ - void *private_data; - - /** - * Free SWitcher - * Only to be used when the switcher object itself is dynamic. - * And has data in `ed` - */ - switcher_free free; - /** Extra fields for script */ - void *ed; -}; - /** Reset terminal */ #define color_reset "\033[0m" /** Set terminal text bold */ @@ -182,6 +59,15 @@ struct _Mode #define color_italic "\033[2m" /** Set terminal foreground text green */ #define color_green "\033[0;32m" + +/** + * @param msg The error message to show. + * @param markup If the message contains pango markup. + * + * Create a dialog showing the msg. + * + * @returns EXIT_FAILURE if failed to create dialog, EXIT_SUCCESS if succesfull + */ int show_error_message ( const char *msg, int markup ); /*@}*/ #endif diff --git a/include/textbox.h b/include/textbox.h index cc8c6494..daa57aff 100644 --- a/include/textbox.h +++ b/include/textbox.h @@ -39,14 +39,14 @@ typedef struct typedef enum { - TB_AUTOHEIGHT = 1 << 0, - TB_AUTOWIDTH = 1 << 1, - TB_LEFT = 1 << 16, - TB_RIGHT = 1 << 17, - TB_CENTER = 1 << 18, - TB_EDITABLE = 1 << 19, - TB_MARKUP = 1 << 20, - TB_WRAP = 1 << 21, + TB_AUTOHEIGHT = 1 << 0, + TB_AUTOWIDTH = 1 << 1, + TB_LEFT = 1 << 16, + TB_RIGHT = 1 << 17, + TB_CENTER = 1 << 18, + TB_EDITABLE = 1 << 19, + TB_MARKUP = 1 << 20, + TB_WRAP = 1 << 21, } TextboxFlags; typedef enum diff --git a/source/dialogs/combi.c b/source/dialogs/combi.c index d74ce942..0ee4d9f4 100644 --- a/source/dialogs/combi.c +++ b/source/dialogs/combi.c @@ -32,6 +32,7 @@ #include <dialogs/dialogs.h> +#include "mode-private.h" /** * Combi Mode */ @@ -108,12 +109,12 @@ static void combi_mode_init ( Mode *sw ) pd->starts = g_malloc0 ( sizeof ( int ) * pd->num_switchers ); pd->lengths = g_malloc0 ( sizeof ( int ) * pd->num_switchers ); for ( unsigned int i = 0; i < pd->num_switchers; i++ ) { - pd->switchers[i]->init ( pd->switchers[i] ); + mode_init ( pd->switchers[i] ); } if ( pd->cmd_list_length == 0 ) { pd->cmd_list_length = 0; for ( unsigned int i = 0; i < pd->num_switchers; i++ ) { - unsigned int length = pd->switchers[i]->get_num_entries ( pd->switchers[i] );; + unsigned int length = mode_get_num_entries ( pd->switchers[i] ); pd->starts[i] = pd->cmd_list_length; pd->lengths[i] = length; pd->cmd_list_length += length; @@ -134,7 +135,7 @@ static void combi_mode_destroy ( Mode *sw ) g_free ( pd->lengths ); // Cleanup switchers. for ( unsigned int i = 0; i < pd->num_switchers; i++ ) { - pd->switchers[i]->destroy ( pd->switchers[i] ); + mode_destroy ( pd->switchers[i] ); } g_free ( pd->switchers ); g_free ( pd ); @@ -260,18 +261,18 @@ static char * combi_get_completion ( const Mode *sw, unsigned int index ) Mode combi_mode = { - .name = "combi", - .keycfg = NULL, - .keystr = NULL, - .modmask = AnyModifier, - .init = combi_mode_init, - .get_num_entries = combi_mode_get_num_entries, - .result = combi_mode_result, - .destroy = combi_mode_destroy, - .token_match = combi_mode_match, - .get_completion = combi_get_completion, - .mgrv = combi_mgrv, - .is_not_ascii = combi_is_not_ascii, - .private_data = NULL, - .free = NULL + .name = "combi", + .keycfg = NULL, + .keystr = NULL, + .modmask = AnyModifier, + ._init = combi_mode_init, + ._get_num_entries = combi_mode_get_num_entries, + .result = combi_mode_result, + ._destroy = combi_mode_destroy, + .token_match = combi_mode_match, + .get_completion = combi_get_completion, + .mgrv = combi_mgrv, + .is_not_ascii = combi_is_not_ascii, + .private_data = NULL, + .free = NULL }; diff --git a/source/dialogs/dmenu.c b/source/dialogs/dmenu.c index 3d14bfe3..a73c00cf 100644 --- a/source/dialogs/dmenu.c +++ b/source/dialogs/dmenu.c @@ -40,6 +40,7 @@ #include "helper.h" #include "xrmoptions.h" +#include "mode-private.h" // We limit at 1000000 rows for now. #define DMENU_MAX_ROWS 1000000 @@ -326,25 +327,25 @@ static int dmenu_is_not_ascii ( const Mode *sw, unsigned int index ) Mode dmenu_mode = { - .name = "dmenu", - .keycfg = NULL, - .keystr = NULL, - .modmask = AnyModifier, - .init = dmenu_mode_init, - .get_num_entries = dmenu_mode_get_num_entries, - .result = NULL, - .destroy = dmenu_mode_free, - .token_match = dmenu_token_match, - .mgrv = get_display_data, - .get_completion = NULL, - .is_not_ascii = dmenu_is_not_ascii, - .private_data = NULL, - .free = NULL + .name = "dmenu", + .keycfg = NULL, + .keystr = NULL, + .modmask = AnyModifier, + ._init = dmenu_mode_init, + ._get_num_entries = dmenu_mode_get_num_entries, + .result = NULL, + ._destroy = dmenu_mode_free, + .token_match = dmenu_token_match, + .mgrv = get_display_data, + .get_completion = NULL, + .is_not_ascii = dmenu_is_not_ascii, + .private_data = NULL, + .free = NULL }; int dmenu_switcher_dialog ( void ) { - dmenu_mode.init ( &dmenu_mode ); + mode_init ( &dmenu_mode ); DmenuModePrivateData *pd = (DmenuModePrivateData *) dmenu_mode.private_data; char *input = NULL; int retv = FALSE; @@ -468,7 +469,7 @@ int dmenu_switcher_dialog ( void ) } while ( restart ); g_free ( input ); - dmenu_mode.destroy ( &dmenu_mode ); + mode_destroy ( &dmenu_mode ); return retv; } diff --git a/source/dialogs/drun.c b/source/dialogs/drun.c index 45b033b0..93d3307e 100644 --- a/source/dialogs/drun.c +++ b/source/dialogs/drun.c @@ -43,6 +43,8 @@ #include "helper.h" #include "dialogs/drun.h" +#include "mode-private.h" + #define RUN_CACHE_FILE "rofi-2.runcache" static inline int execsh ( const char *cmd, int run_in_term ) @@ -359,18 +361,18 @@ static int drun_is_not_ascii ( const Mode *sw, unsigned int index ) Mode drun_mode = { - .name = "drun", - .keycfg = NULL, - .keystr = NULL, - .modmask = AnyModifier, - .init = drun_mode_init, - .get_num_entries = drun_mode_get_num_entries, - .result = drun_mode_result, - .destroy = drun_mode_destroy, - .token_match = drun_token_match, - .get_completion = drun_get_completion, - .mgrv = mgrv, - .is_not_ascii = drun_is_not_ascii, - .private_data = NULL, - .free = NULL + .name = "drun", + .keycfg = NULL, + .keystr = NULL, + .modmask = AnyModifier, + ._init = drun_mode_init, + ._get_num_entries = drun_mode_get_num_entries, + .result = drun_mode_result, + ._destroy = drun_mode_destroy, + .token_match = drun_token_match, + .get_completion = drun_get_completion, + .mgrv = mgrv, + .is_not_ascii = drun_is_not_ascii, + .private_data = NULL, + .free = NULL }; diff --git a/source/dialogs/run.c b/source/dialogs/run.c index b38061d5..7677f452 100644 --- a/source/dialogs/run.c +++ b/source/dialogs/run.c @@ -49,6 +49,7 @@ #include "history.h" #include "dialogs/run.h" +#include "mode-private.h" /** * Name of the history file where previously choosen commands are stored. */ @@ -380,19 +381,19 @@ static int run_is_not_ascii ( const Mode *sw, unsigned int index ) } Mode run_mode = { - .name = "run", - .keycfg = NULL, - .keystr = NULL, - .modmask = AnyModifier, - .init = run_mode_init, - .get_num_entries = run_mode_get_num_entries, - .result = run_mode_result, - .destroy = run_mode_destroy, - .token_match = run_token_match, - .mgrv = mgrv, - .get_completion = NULL, - .is_not_ascii = run_is_not_ascii, - .private_data = NULL, - .free = NULL + .name = "run", + .keycfg = NULL, + .keystr = NULL, + .modmask = AnyModifier, + ._init = run_mode_init, + ._get_num_entries = run_mode_get_num_entries, + .result = run_mode_result, + ._destroy = run_mode_destroy, + .token_match = run_token_match, + .mgrv = mgrv, + .get_completion = NULL, + .is_not_ascii = run_is_not_ascii, + .private_data = NULL, + .free = NULL }; /*@}*/ diff --git a/source/dialogs/script.c b/source/dialogs/script.c index 27e43b78..68147bf7 100644 --- a/source/dialogs/script.c +++ b/source/dialogs/script.c @@ -38,6 +38,7 @@ #include "dialogs/script.h" #include "helper.h" +#include "mode-private.h" static char **get_script_output ( const char *command, unsigned int *length ) { char **retv = NULL; @@ -191,17 +192,17 @@ Mode *script_switcher_parse_setup ( const char *str ) } g_free ( parse ); if ( index == 2 ) { - sw->free = script_switcher_free; - sw->keysym = None; - sw->modmask = AnyModifier; - sw->init = script_mode_init; - sw->get_num_entries = script_mode_get_num_entries; - sw->result = script_mode_result; - sw->destroy = script_mode_destroy; - sw->token_match = script_token_match; - sw->get_completion = NULL, - sw->mgrv = mgrv; - sw->is_not_ascii = script_is_not_ascii; + sw->free = script_switcher_free; + sw->keysym = None; + sw->modmask = AnyModifier; + sw->_init = script_mode_init; + sw->_get_num_entries = script_mode_get_num_entries; + sw->result = script_mode_result; + sw->_destroy = script_mode_destroy; + sw->token_match = script_token_match; + sw->get_completion = NULL, + sw->mgrv = mgrv; + sw->is_not_ascii = script_is_not_ascii; return sw; } diff --git a/source/dialogs/ssh.c b/source/dialogs/ssh.c index 19b3fc97..2c244f9b 100644 --- a/source/dialogs/ssh.c +++ b/source/dialogs/ssh.c @@ -48,6 +48,7 @@ #include "history.h" #include "dialogs/ssh.h" +#include "mode-private.h" /** * Name of the history file where previously choosen hosts are stored. */ @@ -489,19 +490,19 @@ static int ssh_is_not_ascii ( const Mode *sw, unsigned int index ) Mode ssh_mode = { - .name = "ssh", - .keycfg = NULL, - .keystr = NULL, - .modmask = AnyModifier, - .init = ssh_mode_init, - .get_num_entries = ssh_mode_get_num_entries, - .result = ssh_mode_result, - .destroy = ssh_mode_destroy, - .token_match = ssh_token_match, - .mgrv = mgrv, - .get_completion = NULL, - .is_not_ascii = ssh_is_not_ascii, - .private_data = NULL, - .free = NULL + .name = "ssh", + .keycfg = NULL, + .keystr = NULL, + .modmask = AnyModifier, + ._init = ssh_mode_init, + ._get_num_entries = ssh_mode_get_num_entries, + .result = ssh_mode_result, + ._destroy = ssh_mode_destroy, + .token_match = ssh_token_match, + .mgrv = mgrv, + .get_completion = NULL, + .is_not_ascii = ssh_is_not_ascii, + .private_data = NULL, + .free = NULL }; /*@}*/ diff --git a/source/dialogs/window.c b/source/dialogs/window.c index e8262f11..e1ee71d0 100644 --- a/source/dialogs/window.c +++ b/source/dialogs/window.c @@ -44,6 +44,7 @@ #include "x11-helper.h" #include "i3-support.h" #include "dialogs/window.h" +#include "mode-private.h" #define WINLIST 32 @@ -585,37 +586,37 @@ static int window_is_not_ascii ( const Mode *sw, unsigned int index ) Mode window_mode = { - .name = "window", - .keycfg = NULL, - .keystr = NULL, - .modmask = AnyModifier, - .init = window_mode_init, - .get_num_entries = window_mode_get_num_entries, - .result = window_mode_result, - .destroy = window_mode_destroy, - .token_match = window_match, - .mgrv = mgrv, - .get_completion = NULL, - .is_not_ascii = window_is_not_ascii, - .private_data = NULL, - .free = NULL + .name = "window", + .keycfg = NULL, + .keystr = NULL, + .modmask = AnyModifier, + ._init = window_mode_init, + ._get_num_entries = window_mode_get_num_entries, + .result = window_mode_result, + ._destroy = window_mode_destroy, + .token_match = window_match, + .mgrv = mgrv, + .get_completion = NULL, + .is_not_ascii = window_is_not_ascii, + .private_data = NULL, + .free = NULL }; Mode window_mode_cd = { - .name = "windowcd", - .keycfg = NULL, - .keystr = NULL, - .modmask = AnyModifier, - .init = window_mode_init_cd, - .get_num_entries = window_mode_get_num_entries, - .result = window_mode_result, - .destroy = window_mode_destroy, - .token_match = window_match, - .mgrv = mgrv, - .get_completion = NULL, - .is_not_ascii = window_is_not_ascii, - .private_data = NULL, - .free = NULL + .name = "windowcd", + .keycfg = NULL, + .keystr = NULL, + .modmask = AnyModifier, + ._init = window_mode_init_cd, + ._get_num_entries = window_mode_get_num_entries, + .result = window_mode_result, + ._destroy = window_mode_destroy, + .token_match = window_match, + .mgrv = mgrv, + .get_completion = NULL, + .is_not_ascii = window_is_not_ascii, + .private_data = NULL, + .free = NULL }; #endif // WINDOW_MODE diff --git a/source/mode.c b/source/mode.c new file mode 100644 index 00000000..7b8590d3 --- /dev/null +++ b/source/mode.c @@ -0,0 +1,39 @@ +#include "rofi.h" +#include "mode.h" + +// This one should only be in mode implementations. +#include "mode-private.h" +/** + * @ingroup MODE + * @{ + */ + +void mode_init ( Mode *mode ) +{ + g_assert ( mode != NULL ); + g_assert ( mode->_init != NULL ); + mode->_init ( mode ); +} + +void mode_destroy ( Mode *mode ) +{ + g_assert ( mode != NULL ); + g_assert ( mode->_destroy != NULL ); + mode->_destroy ( mode ); +} + +unsigned int mode_get_num_entries ( const Mode *mode ) +{ + g_assert ( mode != NULL ); + g_assert ( mode->_get_num_entries != NULL ); + return mode->_get_num_entries ( mode ); +} + +char * mode_get_display_value ( const Mode *mode, unsigned int selected_line, int *state, int get_entry ) +{ + g_assert ( mode != NULL ); + g_assert ( mode->mgrv != NULL ); + + return mode->mgrv ( mode, selected_line, state, get_entry ); +} +/*@}*/ diff --git a/source/rofi.c b/source/rofi.c index b2ea32a6..dbb2caa8 100644 --- a/source/rofi.c +++ b/source/rofi.c @@ -60,6 +60,8 @@ #include "xrmoptions.h" #include "dialogs/dialogs.h" +// This one should only be in mode implementations. +#include "mode-private.h" ModeMode switcher_run ( char **input, Mode *sw ); typedef enum _MainLoopEvent @@ -1018,7 +1020,7 @@ static void menu_draw ( MenuState *state, cairo_t *d ) { TextBoxFontType type = ( ( ( i % state->max_rows ) & 1 ) == 0 ) ? NORMAL : ALT; int fstate = 0; - char *text = state->sw->mgrv ( state->sw, state->line_map[i + offset], &fstate, TRUE ); + char *text = mode_get_display_value ( state->sw, state->line_map[i + offset], &fstate, TRUE ); TextBoxFontType tbft = fstate | ( ( i + offset ) == state->selected ? HIGHLIGHT : type ); textbox_font ( state->boxes[i], tbft ); textbox_text ( state->boxes[i], text ); @@ -1033,7 +1035,7 @@ static void menu_draw ( MenuState *state, cairo_t *d ) for ( i = 0; i < max_elements; i++ ) { TextBoxFontType type = ( ( ( i % state->max_rows ) & 1 ) == 0 ) ? NORMAL : ALT; int fstate = 0; - state->sw->mgrv ( state->sw, state->line_map[i + offset], &fstate, FALSE ); + mode_get_display_value ( state->sw, state->line_map[i + offset], &fstate, FALSE ); TextBoxFontType tbft = fstate | ( ( i + offset ) == state->selected ? HIGHLIGHT : type ); textbox_font ( state->boxes[i], tbft ); textbox_draw ( state->boxes[i], d ); @@ -1274,7 +1276,7 @@ MenuReturn menu ( Mode *sw, char **input, char *prompt, unsigned int *selected_l .border = config.padding + config.menu_bw }; // Request the lines to show. - state.num_lines = sw->get_num_entries ( sw ); + state.num_lines = mode_get_num_entries ( sw ); state.lines_not_ascii = g_malloc0_n ( state.num_lines, sizeof ( int ) ); // find out which lines contain non-ascii codepoints, so we can be faster in some cases. @@ -1887,7 +1889,7 @@ static void run_switcher ( ModeMode mode ) // Otherwise check if requested mode is enabled. char *input = g_strdup ( config.filter ); for ( unsigned int i = 0; i < num_modi; i++ ) { - modi[i].sw->init ( modi[i].sw ); + mode_init ( modi[i].sw ); } do { ModeMode retv; @@ -1918,7 +1920,7 @@ static void run_switcher ( ModeMode mode ) } while ( mode != MODE_EXIT ); g_free ( input ); for ( unsigned int i = 0; i < num_modi; i++ ) { - modi[i].sw->destroy ( modi[i].sw ); + mode_destroy ( modi[i].sw ); } // cleanup teardown ( pfd ); |