diff options
Diffstat (limited to 'frontends/gtk/corewindow.c')
-rw-r--r-- | frontends/gtk/corewindow.c | 53 |
1 files changed, 34 insertions, 19 deletions
diff --git a/frontends/gtk/corewindow.c b/frontends/gtk/corewindow.c index 70c3ad135..6ca5d228f 100644 --- a/frontends/gtk/corewindow.c +++ b/frontends/gtk/corewindow.c @@ -145,6 +145,7 @@ nsgtk_cw_button_release_event(GtkWidget *widget, { struct nsgtk_corewindow *nsgtk_cw = (struct nsgtk_corewindow *)g; struct nsgtk_corewindow_mouse *mouse = &nsgtk_cw->mouse_state; + bool was_drag = false; /* only button 1 clicks are considered double clicks. If the * mouse state is PRESS then we are waiting for a release to @@ -168,9 +169,11 @@ nsgtk_cw_button_release_event(GtkWidget *widget, } else if (mouse->state & BROWSER_MOUSE_HOLDING_1) { mouse->state ^= (BROWSER_MOUSE_HOLDING_1 | BROWSER_MOUSE_DRAG_ON); + was_drag = true; } else if (mouse->state & BROWSER_MOUSE_HOLDING_2) { mouse->state ^= (BROWSER_MOUSE_HOLDING_2 | BROWSER_MOUSE_DRAG_ON); + was_drag = true; } /* Handle modifiers being removed */ @@ -188,9 +191,10 @@ nsgtk_cw_button_release_event(GtkWidget *widget, } /* end drag with modifiers */ - if (mouse->state & (BROWSER_MOUSE_MOD_1 | - BROWSER_MOUSE_MOD_2 | - BROWSER_MOUSE_MOD_3)) { + if (was_drag && (mouse->state & ( + BROWSER_MOUSE_MOD_1 | + BROWSER_MOUSE_MOD_2 | + BROWSER_MOUSE_MOD_3))) { mouse->state = BROWSER_MOUSE_HOVER; } @@ -413,14 +417,14 @@ nsgtk_cw_keypress_event(GtkWidget *widget, GdkEventKey *event, gpointer g) if (res == NSERROR_OK) { return TRUE; } else if (res != NSERROR_NOT_IMPLEMENTED) { - LOG("%s", messages_get_errorcode(res)); + NSLOG(netsurf, INFO, "%s", messages_get_errorcode(res)); return FALSE; } /* deal with unprocessed keypress */ res = nsgtk_cw_key(nsgtk_cw, nskey); if (res != NSERROR_OK) { - LOG("%s", messages_get_errorcode(res)); + NSLOG(netsurf, INFO, "%s", messages_get_errorcode(res)); return FALSE; } return TRUE; @@ -496,7 +500,6 @@ nsgtk_cw_draw_event(GtkWidget *widget, cairo_t *cr, gpointer data) double y2; struct rect clip; - current_widget = widget; current_cr = cr; cairo_clip_extents(cr, &x1, &y1, &x2, &y2); @@ -508,8 +511,6 @@ nsgtk_cw_draw_event(GtkWidget *widget, cairo_t *cr, gpointer data) nsgtk_cw->draw(nsgtk_cw, &clip); - current_widget = NULL; - return FALSE; } @@ -537,12 +538,10 @@ nsgtk_cw_draw_event(GtkWidget *widget, clip.x1 = event->area.x + event->area.width; clip.y1 = event->area.y + event->area.height; - current_widget = widget; current_cr = gdk_cairo_create(nsgtk_widget_get_window(widget)); nsgtk_cw->draw(nsgtk_cw, &clip); - current_widget = NULL; cairo_destroy(current_cr); return FALSE; @@ -552,19 +551,33 @@ nsgtk_cw_draw_event(GtkWidget *widget, /** - * redraw window core window callback + * callback from core to request an invalidation of a GTK core window area. * - * \param cw core window handle. - * \param r rectangle that needs redrawing. + * The specified area of the window should now be considered + * out of date. If the area is NULL the entire window must be + * invalidated. + * + * \param[in] cw The core window to invalidate. + * \param[in] rect area to redraw or NULL for the entire window area. + * \return NSERROR_OK on success or appropriate error code. */ -static void -nsgtk_cw_redraw_request(struct core_window *cw, const struct rect *r) +static nserror +nsgtk_cw_invalidate_area(struct core_window *cw, const struct rect *rect) { struct nsgtk_corewindow *nsgtk_cw = (struct nsgtk_corewindow *)cw; + if (rect == NULL) { + gtk_widget_queue_draw(GTK_WIDGET(nsgtk_cw->drawing_area)); + return NSERROR_OK; + } + gtk_widget_queue_draw_area(GTK_WIDGET(nsgtk_cw->drawing_area), - r->x0, r->y0, - r->x1 - r->x0, r->y1 - r->y0); + rect->x0, + rect->y0, + rect->x1 - rect->x0, + rect->y1 - rect->y0); + + return NSERROR_OK; } @@ -653,7 +666,7 @@ static void nsgtk_cw_drag_status(struct core_window *cw, core_window_drag_status ds) { struct nsgtk_corewindow *nsgtk_cw = (struct nsgtk_corewindow *)cw; - nsgtk_cw->drag_staus = ds; + nsgtk_cw->drag_status = ds; } @@ -661,17 +674,19 @@ nsgtk_cw_drag_status(struct core_window *cw, core_window_drag_status ds) * core window callback table for nsgtk */ static struct core_window_callback_table nsgtk_cw_cb_table = { - .redraw_request = nsgtk_cw_redraw_request, + .invalidate = nsgtk_cw_invalidate_area, .update_size = nsgtk_cw_update_size, .scroll_visible = nsgtk_cw_scroll_visible, .get_window_dimensions = nsgtk_cw_get_window_dimensions, .drag_status = nsgtk_cw_drag_status }; + /* exported function documented gtk/corewindow.h */ nserror nsgtk_corewindow_init(struct nsgtk_corewindow *nsgtk_cw) { nsgtk_cw->cb_table = &nsgtk_cw_cb_table; + nsgtk_cw->drag_status = CORE_WINDOW_DRAG_NONE; /* input method setup */ nsgtk_cw->input_method = gtk_im_multicontext_new(); |