regedit: handle pgup/pgdn/home/end keys on lists
authorChris Davis <cd.rattan@gmail.com>
Mon, 11 Aug 2014 01:26:14 +0000 (18:26 -0700)
committerMichael Adam <obnox@samba.org>
Wed, 1 Oct 2014 12:32:10 +0000 (14:32 +0200)
Signed-off-by: Chris Davis <cd.rattan@gmail.com>
Reviewed-by: Andreas Schneider <asn@samba.org>
Reviewed-by: Michael Adam <obnox@samba.org>
source3/utils/regedit.c
source3/utils/regedit_list.c
source3/utils/regedit_list.h

index 34a63d74fd273f8e1939bc71912b8ed82f1647d4..9cb4fca34052540a11872dbaf940b578cde51ecc 100644 (file)
@@ -378,6 +378,22 @@ static void handle_tree_input(struct regedit *regedit, int c)
                tree_view_driver(regedit->keys, ML_CURSOR_UP);
                load_values(regedit);
                break;
+       case KEY_NPAGE:
+               tree_view_driver(regedit->keys, ML_CURSOR_PGDN);
+               load_values(regedit);
+               break;
+       case KEY_PPAGE:
+               tree_view_driver(regedit->keys, ML_CURSOR_PGUP);
+               load_values(regedit);
+               break;
+       case KEY_HOME:
+               tree_view_driver(regedit->keys, ML_CURSOR_HOME);
+               load_values(regedit);
+               break;
+       case KEY_END:
+               tree_view_driver(regedit->keys, ML_CURSOR_END);
+               load_values(regedit);
+               break;
        case '\n':
        case KEY_ENTER:
        case KEY_RIGHT:
@@ -476,6 +492,18 @@ static void handle_value_input(struct regedit *regedit, int c)
        case KEY_UP:
                value_list_driver(regedit->vl, ML_CURSOR_UP);
                break;
+       case KEY_NPAGE:
+               value_list_driver(regedit->vl, ML_CURSOR_PGDN);
+               break;
+       case KEY_PPAGE:
+               value_list_driver(regedit->vl, ML_CURSOR_PGUP);
+               break;
+       case KEY_HOME:
+               value_list_driver(regedit->vl, ML_CURSOR_HOME);
+               break;
+       case KEY_END:
+               value_list_driver(regedit->vl, ML_CURSOR_END);
+               break;
        case 'b':
        case 'B':
                binmode = true;
index ac4e24091c92715359bd43f2d347726c61ed6f17..c2b370528483604d50274b907f90b72031b10fe7 100644 (file)
@@ -405,21 +405,33 @@ WERROR multilist_set_data(struct multilist *list, const void *data)
        return WERR_OK;
 }
 
-static void fix_start_row(struct multilist *list)
+static int get_window_height(struct multilist *list)
 {
        int height;
 
-       /* adjust start_row so that the cursor appears on the screen */
-
        height = list->window_height;
        if (list->cb->get_column_header) {
                height--;
        }
+
+       return height;
+}
+
+static void fix_start_row(struct multilist *list)
+{
+       int height;
+
+       /* adjust start_row so that the cursor appears on the screen */
+
+       height = get_window_height(list);
        if (list->cursor_row < list->start_row) {
                list->start_row = list->cursor_row;
        } else if (list->cursor_row >= list->start_row + height) {
                list->start_row = list->cursor_row - height + 1;
        }
+       if (list->nrows > height && list->nrows - list->start_row < height) {
+               list->start_row = list->nrows - height;
+       }
 }
 
 WERROR multilist_set_window(struct multilist *list, WINDOW *window)
@@ -457,6 +469,10 @@ void multilist_refresh(struct multilist *list)
 {
        int window_start_row, height;
 
+       if (list->nrows == 0) {
+               return;
+       }
+
        /* copy from pad, starting at start_row, to the window, accounting
           for the column header (if present). */
        height = MIN(list->window_height, list->nrows);
@@ -474,6 +490,7 @@ void multilist_refresh(struct multilist *list)
 
 void multilist_driver(struct multilist *list, int c)
 {
+       unsigned page;
        const void *tmp;
 
        if (list->nrows == 0) {
@@ -497,6 +514,50 @@ void multilist_driver(struct multilist *list, int c)
                list->cursor_row++;
                tmp = data_get_next_row(list, list->current_row);
                break;
+       case ML_CURSOR_PGUP:
+               if (list->cursor_row == 0) {
+                       return;
+               }
+               unhighlight_current_row(list);
+               page = get_window_height(list);
+               if (page > list->cursor_row) {
+                       list->cursor_row = 0;
+               } else {
+                       list->cursor_row -= page;
+                       list->start_row -= page;
+               }
+               tmp = data_get_row_n(list, list->cursor_row);
+               break;
+       case ML_CURSOR_PGDN:
+               if (list->cursor_row == list->nrows - 1) {
+                       return;
+               }
+               unhighlight_current_row(list);
+               page = get_window_height(list);
+               if (page > list->nrows - list->cursor_row - 1) {
+                       list->cursor_row = list->nrows - 1;
+               } else {
+                       list->cursor_row += page;
+                       list->start_row += page;
+               }
+               tmp = data_get_row_n(list, list->cursor_row);
+               break;
+       case ML_CURSOR_HOME:
+               if (list->cursor_row == 0) {
+                       return;
+               }
+               unhighlight_current_row(list);
+               list->cursor_row = 0;
+               tmp = data_get_row_n(list, list->cursor_row);
+               break;
+       case ML_CURSOR_END:
+               if (list->cursor_row == list->nrows - 1) {
+                       return;
+               }
+               unhighlight_current_row(list);
+               list->cursor_row = list->nrows - 1;
+               tmp = data_get_row_n(list, list->cursor_row);
+               break;
        }
 
        SMB_ASSERT(tmp);
index 4b1840adfad1f5e7adddf063649ac99edd9edd90..abd6ffd23e6f13bb230692695d5dd72783080f33 100644 (file)
@@ -69,7 +69,11 @@ void multilist_refresh(struct multilist *list);
 
 enum {
        ML_CURSOR_UP,
-       ML_CURSOR_DOWN
+       ML_CURSOR_DOWN,
+       ML_CURSOR_PGUP,
+       ML_CURSOR_PGDN,
+       ML_CURSOR_HOME,
+       ML_CURSOR_END
 };
 void multilist_driver(struct multilist *list, int c);
 const void *multilist_get_current_row(struct multilist *list);