Fix issue #104: Scrolling action.

This commit is contained in:
QC 2015-01-14 22:14:15 +01:00
parent 3a4c1f1f3f
commit 2d18aea928
2 changed files with 65 additions and 30 deletions

View File

@ -1025,6 +1025,44 @@ static void menu_calculate_window_and_element_width ( MenuState *state, workarea
} }
} }
/**
* Nav helper functions, to avoid duplicate code.
*/
inline static void menu_nav_right ( MenuState *state )
{
state->selected += state->max_rows;
if ( state->selected >= state->filtered_lines ) {
state->selected = state->filtered_lines - 1;
}
state->update = TRUE;
}
inline static void menu_nav_left ( MenuState *state )
{
if ( state->selected < state->max_rows ) {
state->selected = 0;
}
else{
state->selected -= state->max_rows;
}
state->update = TRUE;
}
inline static void menu_nav_up ( MenuState *state )
{
if ( state->selected == 0 ) {
state->selected = state->filtered_lines;
}
if ( state->selected > 0 ) {
state->selected--;
}
state->update = TRUE;
}
inline static void menu_nav_down ( MenuState *state )
{
state->selected = state->selected < state->filtered_lines - 1 ? MIN (
state->filtered_lines - 1, state->selected + 1 ) : 0;
state->update = TRUE;
}
/** /**
* @param state Internal state of the menu. * @param state Internal state of the menu.
* @param key the Key being pressed. * @param key the Key being pressed.
@ -1046,14 +1084,7 @@ static void menu_keyboard_navigation ( MenuState *state, KeySym key, unsigned in
// Up, Ctrl-p or Shift-Tab // Up, Ctrl-p or Shift-Tab
else if ( key == XK_Up || ( key == XK_Tab && modstate & ShiftMask ) || else if ( key == XK_Up || ( key == XK_Tab && modstate & ShiftMask ) ||
( key == XK_p && modstate & ControlMask ) ) { ( key == XK_p && modstate & ControlMask ) ) {
if ( state->selected == 0 ) { menu_nav_up ( state );
state->selected = state->filtered_lines;
}
if ( state->selected > 0 ) {
state->selected--;
}
state->update = TRUE;
} }
else if ( key == XK_Tab ) { else if ( key == XK_Tab ) {
if ( state->filtered_lines == 1 ) { if ( state->filtered_lines == 1 ) {
@ -1084,25 +1115,13 @@ static void menu_keyboard_navigation ( MenuState *state, KeySym key, unsigned in
// Down, Ctrl-n // Down, Ctrl-n
else if ( key == XK_Down || else if ( key == XK_Down ||
( key == XK_n && ( modstate & ControlMask ) ) ) { ( key == XK_n && ( modstate & ControlMask ) ) ) {
state->selected = state->selected < state->filtered_lines - 1 ? MIN ( menu_nav_down ( state );
state->filtered_lines - 1, state->selected + 1 ) : 0;
state->update = TRUE;
} }
else if ( key == XK_Page_Up && ( modstate & ControlMask ) ) { else if ( key == XK_Page_Up && ( modstate & ControlMask ) ) {
if ( state->selected < state->max_rows ) { menu_nav_left ( state );
state->selected = 0;
}
else{
state->selected -= state->max_rows;
}
state->update = TRUE;
} }
else if ( key == XK_Page_Down && ( modstate & ControlMask ) ) { else if ( key == XK_Page_Down && ( modstate & ControlMask ) ) {
state->selected += state->max_rows; menu_nav_right ( state );
if ( state->selected >= state->filtered_lines ) {
state->selected = state->filtered_lines - 1;
}
state->update = TRUE;
} }
else if ( key == XK_Page_Up ) { else if ( key == XK_Page_Up ) {
if ( state->selected < state->max_elements ) { if ( state->selected < state->max_elements ) {
@ -1150,6 +1169,22 @@ static void menu_keyboard_navigation ( MenuState *state, KeySym key, unsigned in
*/ */
static void menu_mouse_navigation ( MenuState *state, XButtonEvent *xbe ) static void menu_mouse_navigation ( MenuState *state, XButtonEvent *xbe )
{ {
// Scroll event
if ( xbe->button > 3 ) {
if ( xbe->button == 4 ) {
menu_nav_up ( state );
}
else if ( xbe->button == 5 ) {
menu_nav_down ( state );
}
else if ( xbe->button == 6 ) {
menu_nav_left ( state );
}
else if ( xbe->button == 7 ) {
menu_nav_right ( state );
}
return;
}
if ( xbe->window == state->arrowbox_top->window ) { if ( xbe->window == state->arrowbox_top->window ) {
// Page up. // Page up.
if ( state->selected < state->max_rows ) { if ( state->selected < state->max_rows ) {

View File

@ -51,7 +51,7 @@
// Used in get_ssh() when splitting lines from the user's // Used in get_ssh() when splitting lines from the user's
// SSH config file into tokens. // SSH config file into tokens.
#define SSH_TOKEN_DELIM "= \t\r\n" #define SSH_TOKEN_DELIM "= \t\r\n"
static inline int execshssh ( const char *host ) static inline int execshssh ( const char *host )
{ {
@ -141,17 +141,17 @@ static char ** get_ssh ( unsigned int *length )
if ( fd != NULL ) { if ( fd != NULL ) {
char buffer[1024]; char buffer[1024];
while ( fgets ( buffer, sizeof( buffer ), fd ) ) { while ( fgets ( buffer, sizeof ( buffer ), fd ) ) {
// Each line is either empty, a comment line starting with a '#' // Each line is either empty, a comment line starting with a '#'
// character or of the form "keyword [=] arguments", where there may // character or of the form "keyword [=] arguments", where there may
// be multiple (possibly quoted) arguments separated by whitespace. // be multiple (possibly quoted) arguments separated by whitespace.
// The keyword is separated from its arguments by whitespace OR by // The keyword is separated from its arguments by whitespace OR by
// optional whitespace and a '=' character. // optional whitespace and a '=' character.
char *token = strtok( buffer, SSH_TOKEN_DELIM ); char *token = strtok ( buffer, SSH_TOKEN_DELIM );
// Skip empty lines and comment lines. Also skip lines where the // Skip empty lines and comment lines. Also skip lines where the
// keyword is not "Host". // keyword is not "Host".
if ( ! token || *token == '#' || g_ascii_strcasecmp( token, "Host" ) ) { if ( !token || *token == '#' || g_ascii_strcasecmp ( token, "Host" ) ) {
continue; continue;
} }
@ -160,9 +160,9 @@ static char ** get_ssh ( unsigned int *length )
// by whitespace; while host names may be quoted with double quotes // by whitespace; while host names may be quoted with double quotes
// to represent host names containing spaces, we don't support this // to represent host names containing spaces, we don't support this
// (how many host names contain spaces?). // (how many host names contain spaces?).
while ( ( token = strtok( NULL, SSH_TOKEN_DELIM ) ) ) { while ( ( token = strtok ( NULL, SSH_TOKEN_DELIM ) ) ) {
// We do not want to show wildcard entries, as you cannot ssh to them. // We do not want to show wildcard entries, as you cannot ssh to them.
if ( *token == '!' || strpbrk( token, "*?" ) ) { if ( *token == '!' || strpbrk ( token, "*?" ) ) {
continue; continue;
} }
@ -171,7 +171,7 @@ static char ** get_ssh ( unsigned int *length )
// given num_favorites is max 25. // given num_favorites is max 25.
int found = 0; int found = 0;
for ( unsigned int j = 0; j < num_favorites; j++ ) { for ( unsigned int j = 0; j < num_favorites; j++ ) {
if ( ! g_ascii_strcasecmp ( token, retv[j] ) ) { if ( !g_ascii_strcasecmp ( token, retv[j] ) ) {
found = 1; found = 1;
break; break;
} }