about summary refs log tree commit diff stats
path: root/src/ui/core.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/core.c')
-rw-r--r--src/ui/core.c40
1 files changed, 34 insertions, 6 deletions
diff --git a/src/ui/core.c b/src/ui/core.c
index 6cac05b9..935c242c 100644
--- a/src/ui/core.c
+++ b/src/ui/core.c
@@ -80,7 +80,7 @@ static Display *display;
 static GTimer *ui_idle_time;
 
 static void _win_handle_switch(const wint_t * const ch);
-static void _win_handle_page(const wint_t * const ch);
+static void _win_handle_page(const wint_t * const ch, const int result);
 static void _win_show_history(WINDOW *win, int win_index,
     const char * const contact);
 static void _ui_draw_term_title(void);
@@ -175,9 +175,9 @@ _ui_close(void)
 }
 
 static wint_t
-_ui_get_char(char *input, int *size)
+_ui_get_char(char *input, int *size, int *result)
 {
-    wint_t ch = inp_get_char(input, size);
+    wint_t ch = inp_get_char(input, size, result);
     if (ch != ERR) {
         ui_reset_idle_time();
     }
@@ -585,11 +585,11 @@ _ui_disconnected(void)
 }
 
 static void
-_ui_handle_special_keys(const wint_t * const ch, const char * const inp,
+_ui_handle_special_keys(const wint_t * const ch, const int result, const char * const inp,
     const int size)
 {
     _win_handle_switch(ch);
-    _win_handle_page(ch);
+    _win_handle_page(ch, result);
     if (*ch == KEY_RESIZE) {
         ui_resize(*ch, inp, size);
     }
@@ -2806,11 +2806,12 @@ _win_handle_switch(const wint_t * const ch)
 }
 
 static void
-_win_handle_page(const wint_t * const ch)
+_win_handle_page(const wint_t * const ch, const int result)
 {
     ProfWin *current = wins_get_current();
     int rows = getmaxy(stdscr);
     int y = getcury(current->win);
+    int sub_y = getcury(current->subwin);
 
     int page_space = rows - 4;
     int *page_start = &(current->y_pos);
@@ -2883,6 +2884,33 @@ _win_handle_page(const wint_t * const ch)
     if ((y) - *page_start == page_space) {
         current->paged = 0;
     }
+
+    if (current->type == WIN_MUC) {
+        // alt up arrow
+        if ((result == KEY_CODE_YES) && (*ch == 565)) {
+            current->sub_y_pos -= page_space;
+
+            // went past beginning, show first page
+            if (current->sub_y_pos < 0)
+                current->sub_y_pos = 0;
+
+            win_update_virtual(current);
+
+        // alt down arrow
+        } else if ((result == KEY_CODE_YES) && (*ch == 524)) {
+            current->sub_y_pos += page_space;
+
+            // only got half a screen, show full screen
+            if ((sub_y- (current->sub_y_pos)) < page_space)
+                current->sub_y_pos = sub_y - page_space;
+
+            // went past end, show full screen
+            else if (current->sub_y_pos >= sub_y)
+                current->sub_y_pos = sub_y - page_space - 1;
+
+            win_update_virtual(current);
+        }
+    }
 }
 
 static void