Author: rjek
Date: Tue Mar 6 21:29:51 2007
New Revision: 3199
URL:
http://svn.semichrome.net?rev=3199&view=rev
Log:
Reformat and apply Darren Salt's scrollwheel and keyboard scrolling patch, although I
still can't get the keyboard scrolling to work.
Modified:
trunk/netsurf/gtk/gtk_scaffolding.c
trunk/netsurf/gtk/gtk_window.c
Modified: trunk/netsurf/gtk/gtk_scaffolding.c
URL:
http://svn.semichrome.net/trunk/netsurf/gtk/gtk_scaffolding.c?rev=3199&am...
==============================================================================
--- trunk/netsurf/gtk/gtk_scaffolding.c (original)
+++ trunk/netsurf/gtk/gtk_scaffolding.c Tue Mar 6 21:29:51 2007
@@ -511,20 +511,47 @@
#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);
Modified: trunk/netsurf/gtk/gtk_window.c
URL:
http://svn.semichrome.net/trunk/netsurf/gtk/gtk_window.c?rev=3199&r1=...
==============================================================================
--- trunk/netsurf/gtk/gtk_window.c (original)
+++ trunk/netsurf/gtk/gtk_window.c Tue Mar 6 21:29:51 2007
@@ -360,7 +360,97 @@
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;
}