1
0
Fork 0
mirror of https://github.com/davatorium/rofi.git synced 2024-11-25 13:55:34 -05:00

Add experimental 'password' mode. (#315)

This commit is contained in:
Dave Davenport 2016-01-10 13:10:44 +01:00
parent c6a9de8c4a
commit 13810d5911
5 changed files with 50 additions and 10 deletions

View file

@ -26,6 +26,12 @@ extern const char *cache_dir;
*/ */
void error_dialog ( const char *msg, int markup ); void error_dialog ( const char *msg, int markup );
typedef enum
{
MENU_NORMAL = 0,
MENU_PASSWORD = 1
} MenuFlags;
/** /**
* @param sw the Mode to show. * @param sw the Mode to show.
* @param lines An array of strings to display. * @param lines An array of strings to display.
@ -37,12 +43,17 @@ void error_dialog ( const char *msg, int markup );
* @param mmc_data data to pass to mmc. * @param mmc_data data to pass to mmc.
* @param selected_line pointer to integer holding the selected line. * @param selected_line pointer to integer holding the selected line.
* @param message Extra message to display. * @param message Extra message to display.
* @param flags Flags indicating state of the menu.
* *
* Main menu callback. * Main menu callback.
* *
* @returns The command issued (see MenuReturn) * @returns The command issued (see MenuReturn)
*/ */
MenuReturn menu ( Mode *sw, char **input, char *prompt, unsigned int *selected_line, unsigned int *next_pos, const char *message ) MenuReturn menu ( Mode *sw,
char **input, char *prompt,
unsigned int *selected_line,
unsigned int *next_pos,
const char *message, MenuFlags flags )
__attribute__ ( ( nonnull ( 1, 2, 3, 4 ) ) ); __attribute__ ( ( nonnull ( 1, 2, 3, 4 ) ) );
/** Reset terminal */ /** Reset terminal */

View file

@ -48,6 +48,7 @@ typedef enum
TB_EDITABLE = 1 << 19, TB_EDITABLE = 1 << 19,
TB_MARKUP = 1 << 20, TB_MARKUP = 1 << 20,
TB_WRAP = 1 << 21, TB_WRAP = 1 << 21,
TB_PASSWORD = 1 << 22,
} TextboxFlags; } TextboxFlags;
typedef enum typedef enum

View file

@ -348,6 +348,7 @@ Mode dmenu_mode =
int dmenu_switcher_dialog ( void ) int dmenu_switcher_dialog ( void )
{ {
mode_init ( &dmenu_mode ); mode_init ( &dmenu_mode );
MenuFlags menu_flags = MENU_NORMAL;
DmenuModePrivateData *pd = (DmenuModePrivateData *) dmenu_mode.private_data; DmenuModePrivateData *pd = (DmenuModePrivateData *) dmenu_mode.private_data;
char *input = NULL; char *input = NULL;
int retv = FALSE; int retv = FALSE;
@ -362,6 +363,9 @@ int dmenu_switcher_dialog ( void )
return TRUE; return TRUE;
} }
} }
if ( find_arg ( "-password" ) >= 0 ) {
menu_flags |= MENU_PASSWORD;
}
/* copy filter string */ /* copy filter string */
input = g_strdup ( config.filter ); input = g_strdup ( config.filter );
@ -393,7 +397,7 @@ int dmenu_switcher_dialog ( void )
do { do {
retv = FALSE; retv = FALSE;
unsigned int next_pos = pd->selected_line; unsigned int next_pos = pd->selected_line;
int mretv = menu ( &dmenu_mode, &input, pd->prompt, &( pd->selected_line ), &next_pos, pd->message ); int mretv = menu ( &dmenu_mode, &input, pd->prompt, &( pd->selected_line ), &next_pos, pd->message, menu_flags );
// Special behavior. // Special behavior.
// TODO clean this up! // TODO clean this up!
if ( only_selected ) { if ( only_selected ) {
@ -489,4 +493,5 @@ void print_dmenu_options ( void )
print_help_msg ( "-only-match", "", "Force selection or custom entry", NULL, is_term ); print_help_msg ( "-only-match", "", "Force selection or custom entry", NULL, is_term );
print_help_msg ( "-no-custom", "", "Don't accept custom entry", NULL, is_term ); print_help_msg ( "-no-custom", "", "Don't accept custom entry", NULL, is_term );
print_help_msg ( "-select", "[string]", "Select the first row that matches", NULL, is_term ); print_help_msg ( "-select", "[string]", "Select the first row that matches", NULL, is_term );
print_help_msg ( "-password", "", "Do not show what the user inputs. Show '*' instead.", NULL, is_term );
} }

View file

@ -1208,7 +1208,13 @@ static void menu_setup_fake_transparency ( Display *display, MenuState *state )
} }
} }
MenuReturn menu ( Mode *sw, char **input, char *prompt, unsigned int *selected_line, unsigned int *next_pos, const char *message ) MenuReturn menu ( Mode *sw,
char **input,
char *prompt,
unsigned int *selected_line,
unsigned int *next_pos,
const char *message,
MenuFlags menu_flags )
{ {
TICK (); TICK ();
int shift = FALSE; int shift = FALSE;
@ -1327,7 +1333,9 @@ MenuReturn menu ( Mode *sw, char **input, char *prompt, unsigned int *selected_l
// Entry box // Entry box
int entrybox_width = state.w - ( 2 * ( state.border ) ) - textbox_get_width ( state.prompt_tb ) int entrybox_width = state.w - ( 2 * ( state.border ) ) - textbox_get_width ( state.prompt_tb )
- textbox_get_width ( state.case_indicator ); - textbox_get_width ( state.case_indicator );
state.text = textbox_create ( TB_EDITABLE, TextboxFlags tfl = TB_EDITABLE;
tfl |= ( ( menu_flags & MENU_PASSWORD ) == MENU_PASSWORD ) ? TB_PASSWORD : 0;
state.text = textbox_create ( tfl,
( state.border ) + textbox_get_width ( state.prompt_tb ), ( state.border ), ( state.border ) + textbox_get_width ( state.prompt_tb ), ( state.border ),
entrybox_width, state.line_height, NORMAL, *input ); entrybox_width, state.line_height, NORMAL, *input );
@ -2265,7 +2273,7 @@ ModeMode switcher_run ( char **input, Mode *sw )
{ {
char *prompt = g_strdup_printf ( "%s:", mode_get_name ( sw ) ); char *prompt = g_strdup_printf ( "%s:", mode_get_name ( sw ) );
unsigned int selected_line = UINT32_MAX; unsigned int selected_line = UINT32_MAX;
int mretv = menu ( sw, input, prompt, &selected_line, NULL, NULL ); int mretv = menu ( sw, input, prompt, &selected_line, NULL, NULL, MENU_NORMAL );
g_free ( prompt ); g_free ( prompt );
return mode_result ( sw, mretv, input, selected_line ); return mode_result ( sw, mretv, input, selected_line );
} }

View file

@ -143,8 +143,15 @@ void textbox_text ( textbox *tb, const char *text )
tb->text = g_strdup ( "Invalid UTF-8 string." ); tb->text = g_strdup ( "Invalid UTF-8 string." );
} }
} }
if ( ( tb->flags & TB_PASSWORD ) == TB_PASSWORD ) {
if ( tb->flags & TB_MARKUP || tb->tbft & MARKUP ) { size_t l = strlen ( tb->text );
char string [l + 1];
memset ( string, '*', l );
string[l] = '\0';
pango_layout_set_attributes ( tb->layout, NULL );
pango_layout_set_text ( tb->layout, string, l );
}
else if ( tb->flags & TB_MARKUP || tb->tbft & MARKUP ) {
pango_layout_set_markup ( tb->layout, tb->text, strlen ( tb->text ) ); pango_layout_set_markup ( tb->layout, tb->text, strlen ( tb->text ) );
} }
else { else {
@ -240,7 +247,15 @@ static void texbox_update ( textbox *tb )
int cursor_width = MAX ( 2, font_height / 10 ); int cursor_width = MAX ( 2, font_height / 10 );
if ( tb->changed ) { if ( tb->changed ) {
if ( tb->flags & TB_MARKUP ) { if ( ( tb->flags & TB_PASSWORD ) == TB_PASSWORD ) {
size_t l = strlen ( tb->text );
char string [l + 1];
memset ( string, '*', l );
string[l] = '\0';
pango_layout_set_attributes ( tb->layout, NULL );
pango_layout_set_text ( tb->layout, string, l );
}
else if ( tb->flags & TB_MARKUP ) {
pango_layout_set_markup ( tb->layout, text, text_len ); pango_layout_set_markup ( tb->layout, text, text_len );
} }
else{ else{