1
0
Fork 0
mirror of https://github.com/davatorium/rofi.git synced 2024-11-18 13:54:36 -05:00

Allow modes to set message box, instead of view creation argument.

This commit is contained in:
Dave Davenport 2017-03-01 09:57:54 +01:00
parent 8aac855fe0
commit 45c70cbecf
7 changed files with 59 additions and 10 deletions

View file

@ -1,7 +1,7 @@
#ifndef ROFI_MODE_PRIVATE_H #ifndef ROFI_MODE_PRIVATE_H
#define ROFI_MODE_PRIVATE_H #define ROFI_MODE_PRIVATE_H
#define ABI_VERSION 0x00000001 #define ABI_VERSION 0x00000002
/** /**
* @param data Pointer to #Mode object. * @param data Pointer to #Mode object.
@ -93,6 +93,15 @@ typedef ModeMode ( *_mode_result )( Mode *sw, int menu_retv, char **input, unsig
*/ */
typedef char* ( *_mode_preprocess_input )( Mode *sw, const char *input ); typedef char* ( *_mode_preprocess_input )( Mode *sw, const char *input );
/**
* @param sw The #Mode pointer
*
* Message to show in the message bar.
*
* @returns the (valid pango markup) message to display.
*/
typedef char * (*_mode_get_message )( const Mode *sw );
/** /**
* Structure defining a switcher. * Structure defining a switcher.
* It consists of a name, callback and if enabled * It consists of a name, callback and if enabled
@ -127,6 +136,8 @@ struct rofi_mode
_mode_preprocess_input _preprocess_input; _mode_preprocess_input _preprocess_input;
_mode_get_message _get_message;
/** Pointer to private data. */ /** Pointer to private data. */
void *private_data; void *private_data;

View file

@ -185,5 +185,14 @@ void mode_set_config ( Mode *mode );
* @returns a newly allocated string * @returns a newly allocated string
*/ */
char * mode_preprocess_input ( Mode *mode, const char *input ); char * mode_preprocess_input ( Mode *mode, const char *input );
/**
* @param mode The mode to query
*
* Query the mode for a user display.
*
* @return a new allocated (valid pango markup) message to display (user should free).
*/
char *mode_get_message ( const Mode *mode );
/*@}*/ /*@}*/
#endif #endif

View file

@ -33,7 +33,6 @@ typedef enum
/** /**
* @param sw the Mode to show. * @param sw the Mode to show.
* @param input A pointer to a string where the inputted data is placed. * @param input A pointer to a string where the inputted data is placed.
* @param message Extra message to display.
* @param flags Flags indicating state of the menu. * @param flags Flags indicating state of the menu.
* @param finalize the finailze callback * @param finalize the finailze callback
* *
@ -41,7 +40,7 @@ typedef enum
* *
* @returns The command issued (see MenuReturn) * @returns The command issued (see MenuReturn)
*/ */
RofiViewState *rofi_view_create ( Mode *sw, const char *input, const char *message, MenuFlags flags, void ( *finalize )( RofiViewState * ) ); RofiViewState *rofi_view_create ( Mode *sw, const char *input, MenuFlags flags, void ( *finalize )( RofiViewState * ) );
/** /**
* @param state The Menu Handle * @param state The Menu Handle

View file

@ -470,6 +470,14 @@ static int dmenu_token_match ( const Mode *sw, GRegex **tokens, unsigned int ind
DmenuModePrivateData *rmpd = (DmenuModePrivateData *) mode_get_private_data ( sw ); DmenuModePrivateData *rmpd = (DmenuModePrivateData *) mode_get_private_data ( sw );
return helper_token_match ( tokens, rmpd->cmd_list[index] ); return helper_token_match ( tokens, rmpd->cmd_list[index] );
} }
static char *dmenu_get_message ( const Mode *sw )
{
DmenuModePrivateData *pd = (DmenuModePrivateData *) mode_get_private_data ( sw );
if ( pd->message ){
return g_strdup ( pd->message );
}
return NULL;
}
#include "mode-private.h" #include "mode-private.h"
/** dmenu Mode object. */ /** dmenu Mode object. */
@ -485,6 +493,7 @@ Mode dmenu_mode =
._get_display_value = get_display_data, ._get_display_value = get_display_data,
._get_completion = NULL, ._get_completion = NULL,
._preprocess_input = NULL, ._preprocess_input = NULL,
._get_message = dmenu_get_message,
.private_data = NULL, .private_data = NULL,
.free = NULL, .free = NULL,
.display_name = "dmenu:" .display_name = "dmenu:"
@ -697,7 +706,7 @@ int dmenu_switcher_dialog ( void )
return TRUE; return TRUE;
} }
find_arg_str ( "-p", &( dmenu_mode.display_name ) ); find_arg_str ( "-p", &( dmenu_mode.display_name ) );
RofiViewState *state = rofi_view_create ( &dmenu_mode, input, pd->message, menu_flags, dmenu_finalize ); RofiViewState *state = rofi_view_create ( &dmenu_mode, input, menu_flags, dmenu_finalize );
// @TODO we should do this better. // @TODO we should do this better.
if ( async ) { if ( async ) {
rofi_view_set_overlay ( state, "Loading.. " ); rofi_view_set_overlay ( state, "Loading.. " );

View file

@ -124,4 +124,11 @@ char * mode_preprocess_input ( Mode *mode, const char *input )
} }
return g_strdup ( input ); return g_strdup ( input );
} }
char *mode_get_message ( const Mode *mode )
{
if ( mode->_get_message ) {
return mode->_get_message ( mode );
}
return NULL;
}
/*@}*/ /*@}*/

View file

@ -196,7 +196,7 @@ static void run_switcher ( ModeMode mode )
return; return;
} }
curr_switcher = mode; curr_switcher = mode;
RofiViewState * state = rofi_view_create ( modi[mode], config.filter, NULL, MENU_PROMPT_COLON, process_result ); RofiViewState * state = rofi_view_create ( modi[mode], config.filter, MENU_PROMPT_COLON, process_result );
if ( state ) { if ( state ) {
rofi_view_set_active ( state ); rofi_view_set_active ( state );
} }

View file

@ -374,6 +374,22 @@ static void rofi_view_window_update_size ( RofiViewState * state )
widget_resize ( WIDGET ( state->main_window ), state->width, state->height ); widget_resize ( WIDGET ( state->main_window ), state->width, state->height );
} }
static void rofi_view_reload_message_bar ( RofiViewState *state )
{
if ( state->mesg_box == NULL ){
return ;
}
char *msg = mode_get_message ( state->sw );
if ( msg ) {
textbox_text ( state->mesg_tb, msg );
widget_enable ( WIDGET (state->mesg_box ) );
g_free ( msg );
} else {
widget_disable ( WIDGET (state->mesg_box ) );
}
}
static gboolean rofi_view_reload_idle ( G_GNUC_UNUSED gpointer data ) static gboolean rofi_view_reload_idle ( G_GNUC_UNUSED gpointer data )
{ {
if ( current_active_menu ) { if ( current_active_menu ) {
@ -1002,6 +1018,7 @@ static void _rofi_view_reload_row ( RofiViewState *state )
state->line_map = g_malloc0_n ( state->num_lines, sizeof ( unsigned int ) ); state->line_map = g_malloc0_n ( state->num_lines, sizeof ( unsigned int ) );
state->distance = g_malloc0_n ( state->num_lines, sizeof ( int ) ); state->distance = g_malloc0_n ( state->num_lines, sizeof ( int ) );
listview_set_max_lines ( state->list_view, state->num_lines ); listview_set_max_lines ( state->list_view, state->num_lines );
rofi_view_reload_message_bar ( state );
} }
static void rofi_view_refilter ( RofiViewState *state ) static void rofi_view_refilter ( RofiViewState *state )
@ -1524,7 +1541,6 @@ static void rofi_view_listview_mouse_activated_cb ( listview *lv, xcb_button_pre
RofiViewState *rofi_view_create ( Mode *sw, RofiViewState *rofi_view_create ( Mode *sw,
const char *input, const char *input,
const char *message,
MenuFlags menu_flags, MenuFlags menu_flags,
void ( *finalize )( RofiViewState * ) ) void ( *finalize )( RofiViewState * ) )
{ {
@ -1593,11 +1609,9 @@ RofiViewState *rofi_view_create ( Mode *sw,
textbox_text ( state->case_indicator, get_matching_state () ); textbox_text ( state->case_indicator, get_matching_state () );
state->mesg_box = container_create ( "window.mainbox.message.box" ); state->mesg_box = container_create ( "window.mainbox.message.box" );
state->mesg_tb = textbox_create ( "window.mainbox.message.textbox", TB_AUTOHEIGHT | TB_MARKUP | TB_WRAP, NORMAL, message ); state->mesg_tb = textbox_create ( "window.mainbox.message.textbox", TB_AUTOHEIGHT | TB_MARKUP | TB_WRAP, NORMAL, NULL );
container_add ( state->mesg_box, WIDGET ( state->mesg_tb ) ); container_add ( state->mesg_box, WIDGET ( state->mesg_tb ) );
if ( message == NULL ) { rofi_view_reload_message_bar ( state );
widget_disable ( WIDGET( state->mesg_box ) );
}
box_add ( state->main_box, WIDGET ( state->mesg_box ), FALSE, end ? 8 : 2 ); box_add ( state->main_box, WIDGET ( state->mesg_box ), FALSE, end ? 8 : 2 );
state->overlay = textbox_create ( "window.overlay", TB_AUTOWIDTH | TB_AUTOHEIGHT, URGENT, "blaat" ); state->overlay = textbox_create ( "window.overlay", TB_AUTOWIDTH | TB_AUTOHEIGHT, URGENT, "blaat" );