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 ) {