From 212b92f66e278c6a7f3f92c0c729265718e00929 Mon Sep 17 00:00:00 2001 From: Rob Kendrick Date: Tue, 6 Mar 2007 21:29:51 +0000 Subject: Reformat and apply Darren Salt's scrollwheel and keyboard scrolling patch, although I still can't get the keyboard scrolling to work. svn path=/trunk/netsurf/; revision=3199 --- gtk/gtk_scaffolding.c | 33 ++++++++++++++++-- gtk/gtk_window.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 121 insertions(+), 4 deletions(-) diff --git a/gtk/gtk_scaffolding.c b/gtk/gtk_scaffolding.c index f52397394..cb5d1d1a8 100644 --- a/gtk/gtk_scaffolding.c +++ b/gtk/gtk_scaffolding.c @@ -511,20 +511,47 @@ gboolean nsgtk_history_button_press_event(GtkWidget *widget, #define GET_WIDGET(x) glade_xml_get_widget(g->xml, (x)) +static gboolean do_scroll_event(GtkWidget *widget, GdkEventScroll *ev, + gpointer data) +{ + switch (ev->direction) + { + case GDK_SCROLL_UP: + case GDK_SCROLL_DOWN: + gtk_widget_event(g_object_get_data( + G_OBJECT(widget), "vScroll"), ev); + break; + default: + gtk_widget_event(g_object_get_data( + G_OBJECT(widget), "hScroll"), ev); + } + + return TRUE; +} + void nsgtk_attach_toplevel_viewport(nsgtk_scaffolding *g, GtkViewport *vp) { + GtkWidget *scrollbar; + /* Insert the viewport into the right part of our table */ GtkTable *table = GTK_TABLE(GET_WIDGET("centreTable")); LOG(("Attaching viewport to scaffolding %p", g)); gtk_table_attach_defaults(table, GTK_WIDGET(vp), 0, 1, 0, 1); /* connect our scrollbars to the viewport */ + scrollbar = GET_WIDGET("coreScrollHorizontal"); gtk_viewport_set_hadjustment(vp, - gtk_range_get_adjustment(GTK_RANGE(GET_WIDGET("coreScrollHorizontal")))); + gtk_range_get_adjustment(GTK_RANGE(scrollbar))); + g_object_set_data(G_OBJECT(vp), "hScroll", scrollbar); + scrollbar = GET_WIDGET("coreScrollVertical"); gtk_viewport_set_vadjustment(vp, - gtk_range_get_adjustment(GTK_RANGE(GET_WIDGET("coreScrollVertical")))); - + gtk_range_get_adjustment(GTK_RANGE(scrollbar))); + g_object_set_data(G_OBJECT(vp), "vScroll", scrollbar); + g_signal_connect(G_OBJECT(vp), "scroll_event", do_scroll_event, NULL); + + gdk_window_set_accept_focus (GTK_WIDGET(vp)->window, TRUE); + /* And set the size-request to zero to cause it to get its act together */ gtk_widget_set_size_request(GTK_WIDGET(vp), 0, 0); diff --git a/gtk/gtk_window.c b/gtk/gtk_window.c index 1841290a3..a09ae8931 100644 --- a/gtk/gtk_window.c +++ b/gtk/gtk_window.c @@ -360,7 +360,97 @@ gboolean nsgtk_window_keypress_event(GtkWidget *widget, GdkEventKey *event, struct gui_window *g = data; wchar_t nskey = gdkkey_to_nskey(event); - browser_window_key_press(g->bw, nskey); + if (browser_window_key_press(g->bw, nskey)) + return TRUE; + + if (event->state == 0) { + double value; + GtkAdjustment *vscroll = gtk_range_get_adjustment( + g_object_get_data(G_OBJECT(g->viewport), "vScroll")); + + GtkAdjustment *hscroll = gtk_range_get_adjustment( + g_object_get_data(G_OBJECT(g->viewport), "hScroll")); + + GtkAdjustment *scroll; + + const GtkAllocation *const alloc = + >K_WIDGET(g->viewport)->allocation; + + switch (event->keyval) { + default: + return TRUE; + + case GDK_Home: + case GDK_KP_Home: + scroll = vscroll; + value = scroll->lower; + break; + + case GDK_End: + case GDK_KP_End: + scroll = vscroll; + value = scroll->upper - alloc->height; + if (value < scroll->lower) + value = scroll->lower; + break; + + case GDK_Left: + case GDK_KP_Left: + scroll = hscroll; + value = gtk_adjustment_get_value(scroll) - + scroll->step_increment; + if (value < scroll->lower) + value = scroll->lower; + break; + + case GDK_Up: + case GDK_KP_Up: + scroll = vscroll; + value = gtk_adjustment_get_value(scroll) - + scroll->step_increment; + if (value < scroll->lower) + value = scroll->lower; + break; + + case GDK_Right: + case GDK_KP_Right: + scroll = hscroll; + value = gtk_adjustment_get_value(scroll) + + scroll->step_increment; + if (value > scroll->upper - alloc->width) + value = scroll->upper - alloc->width; + break; + + case GDK_Down: + case GDK_KP_Down: + scroll = vscroll; + value = gtk_adjustment_get_value(scroll) + + scroll->step_increment; + if (value > scroll->upper - alloc->height) + value = scroll->upper - alloc->height; + break; + + case GDK_Page_Up: + case GDK_KP_Page_Up: + scroll = vscroll; + value = gtk_adjustment_get_value(scroll) - + scroll->page_increment; + if (value < scroll->lower) + value = scroll->lower; + break; + + case GDK_Page_Down: + case GDK_KP_Page_Down: + scroll = vscroll; + value = gtk_adjustment_get_value(scroll) + + scroll->page_increment; + if (value > scroll->upper - alloc->height) + value = scroll->upper - alloc->height; + break; + } + + gtk_adjustment_set_value(scroll, value); + } return TRUE; } -- cgit v1.2.3