summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile.am9
-rw-r--r--include/mode-private.h79
-rw-r--r--include/mode.h87
-rw-r--r--include/rofi.h142
-rw-r--r--include/textbox.h16
-rw-r--r--source/dialogs/combi.c35
-rw-r--r--source/dialogs/dmenu.c33
-rw-r--r--source/dialogs/drun.c30
-rw-r--r--source/dialogs/run.c29
-rw-r--r--source/dialogs/script.c23
-rw-r--r--source/dialogs/ssh.c29
-rw-r--r--source/dialogs/window.c57
-rw-r--r--source/mode.c39
-rw-r--r--source/rofi.c12
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 );