[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
master 1cc19d0 23/35: Add support for cursors in xwidget views
From: |
Lars Ingebrigtsen |
Subject: |
master 1cc19d0 23/35: Add support for cursors in xwidget views |
Date: |
Sat, 6 Nov 2021 22:01:59 -0400 (EDT) |
branch: master
commit 1cc19d0437a712a1589c0adaaa65d7c12decd8c1
Author: Po Lu <luangruo@yahoo.com>
Commit: Lars Ingebrigtsen <larsi@gnus.org>
Add support for cursors in xwidget views
* src/xwidget.c (mouse_target_changed): New function.
(Fmake_xwidget): Attach mouse target changed signal.
(cursor_for_hit, define_cursors, mouse_target_changed): New functions.
(xwidget_init_view): Set default cursor to nontext cursor.
(x_draw_xwidget_glyph_string): Define cursor.
* src/xwidget.h (struct xwidget_view): Add cursor field.
---
src/xwidget.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
src/xwidget.h | 2 ++
2 files changed, 60 insertions(+)
diff --git a/src/xwidget.c b/src/xwidget.c
index 5f0dd26..1f93cd3 100644
--- a/src/xwidget.c
+++ b/src/xwidget.c
@@ -94,6 +94,8 @@ struct widget_search_data
};
static void find_widget (GtkWidget *t, struct widget_search_data *);
+static void mouse_target_changed (WebKitWebView *, WebKitHitTestResult *,
guint,
+ gpointer);
#endif
@@ -212,6 +214,11 @@ Returns the newly constructed xwidget, or nil if
construction fails. */)
G_CALLBACK
(webkit_decide_policy_cb),
xw);
+
+ g_signal_connect (G_OBJECT (xw->widget_osr),
+ "mouse-target-changed",
+ G_CALLBACK (mouse_target_changed),
+ xw);
}
g_signal_connect (G_OBJECT (xw->widgetwindow_osr), "damage-event",
@@ -572,6 +579,55 @@ find_widget_at_pos (GtkWidget *w, int x, int y,
return NULL;
}
+static Emacs_Cursor
+cursor_for_hit (WebKitHitTestResult *result,
+ struct frame *frame)
+{
+ Emacs_Cursor cursor = FRAME_OUTPUT_DATA (frame)->nontext_cursor;
+
+ if (webkit_hit_test_result_context_is_editable (result)
+ || webkit_hit_test_result_context_is_selection (result)
+ || (webkit_hit_test_result_get_context (result)
+ & WEBKIT_HIT_TEST_RESULT_CONTEXT_DOCUMENT))
+ cursor = FRAME_X_OUTPUT (frame)->text_cursor;
+
+ if (webkit_hit_test_result_context_is_scrollbar (result))
+ cursor = FRAME_X_OUTPUT (frame)->vertical_drag_cursor;
+
+ if (webkit_hit_test_result_context_is_link (result))
+ cursor = FRAME_X_OUTPUT (frame)->hand_cursor;
+
+ return cursor;
+}
+
+static void
+define_cursors (struct xwidget *xw, WebKitHitTestResult *res)
+{
+ struct xwidget_view *xvw;
+
+ for (Lisp_Object tem = Vxwidget_view_list; CONSP (tem);
+ tem = XCDR (tem))
+ {
+ xvw = XXWIDGET_VIEW (XCAR (tem));
+
+ if (XXWIDGET (xvw->model) == xw)
+ {
+ xvw->cursor = cursor_for_hit (res, xvw->frame);
+ if (xvw->wdesc != None)
+ XDefineCursor (xvw->dpy, xvw->wdesc, xvw->cursor);
+ }
+ }
+}
+
+static void
+mouse_target_changed (WebKitWebView *webview,
+ WebKitHitTestResult *hitresult,
+ guint modifiers, gpointer xw)
+{
+ define_cursors (xw, hitresult);
+}
+
+
static void
xwidget_button_1 (struct xwidget_view *view,
bool down_p, int x, int y, int button,
@@ -1092,6 +1148,7 @@ xwidget_init_view (struct xwidget *xww,
xv->wdesc = None;
xv->frame = s->f;
+ xv->cursor = FRAME_X_OUTPUT (s->f)->nontext_cursor;
#elif defined NS_IMPL_COCOA
nsxwidget_init_view (xv, xww, s, x, y);
nsxwidget_resize_view(xv, xww->width, xww->height);
@@ -1204,6 +1261,7 @@ x_draw_xwidget_glyph_string (struct glyph_string *s)
clip_bottom - clip_top, 0,
CopyFromParent, CopyFromParent,
CopyFromParent, CWEventMask, &a);
+ XDefineCursor (xv->dpy, xv->wdesc, xv->cursor);
xv->cr_surface = cairo_xlib_surface_create (xv->dpy,
xv->wdesc,
FRAME_DISPLAY_INFO
(s->f)->visual,
diff --git a/src/xwidget.h b/src/xwidget.h
index 50d8271..e625027 100644
--- a/src/xwidget.h
+++ b/src/xwidget.h
@@ -33,6 +33,7 @@ struct window;
#if defined (USE_GTK)
#include <gtk/gtk.h>
#include <X11/Xlib.h>
+#include "xterm.h"
#elif defined (NS_IMPL_COCOA) && defined (__OBJC__)
#import <AppKit/NSView.h>
#import "nsxwidget.h"
@@ -102,6 +103,7 @@ struct xwidget_view
#if defined (USE_GTK)
Display *dpy;
Window wdesc;
+ Emacs_Cursor cursor;
struct frame *frame;
cairo_surface_t *cr_surface;
- master e111a5f 08/35: Draw offscreen surface, (continued)
- master e111a5f 08/35: Draw offscreen surface, Lars Ingebrigtsen, 2021/11/06
- master 3e64039 09/35: Handle crossing events on xwidget windows correctly, Lars Ingebrigtsen, 2021/11/06
- master 650e5e8 14/35: Fix xwidget scrolling, Lars Ingebrigtsen, 2021/11/06
- master 49ed706 15/35: Select window when clicking on an xwidget view, Lars Ingebrigtsen, 2021/11/06
- master d97718c 17/35: Add a menu to xwidget-webkit, Lars Ingebrigtsen, 2021/11/06
- master f1fbf87 20/35: Make the WebKit inspector available, Lars Ingebrigtsen, 2021/11/06
- master 7269bdd 21/35: Improve detail of load-changed xwidget events, Lars Ingebrigtsen, 2021/11/06
- master 32ec485 16/35: Redisplay xwidget view windows instead of just setting their size, Lars Ingebrigtsen, 2021/11/06
- master cd7158e 18/35: Add new tool-bar items to xwidget-webkit, Lars Ingebrigtsen, 2021/11/06
- master 8729ae2 19/35: Add xwidget-webkit-copy-selection-as-kill to the menu bar, Lars Ingebrigtsen, 2021/11/06
- master 1cc19d0 23/35: Add support for cursors in xwidget views,
Lars Ingebrigtsen <=
- master cb45114 26/35: Make it safe to have non-xwidget views in xwidget-view-list, Lars Ingebrigtsen, 2021/11/06
- master 286467a 27/35: Add functions for performing searches on xwidgets, Lars Ingebrigtsen, 2021/11/06
- master 0be966f 30/35: Make "open in new window" from an xwidget's context menu work, Lars Ingebrigtsen, 2021/11/06
- master 686ce50 31/35: Rationalize creation decisions, Lars Ingebrigtsen, 2021/11/06
- master 3e04f1f 33/35: Fix web inspector, Lars Ingebrigtsen, 2021/11/06
- master 969ce9d 34/35: Improve xwidget isearch visuals, Lars Ingebrigtsen, 2021/11/06
- master cd1f02e 25/35: Make xwidgets print nicer, Lars Ingebrigtsen, 2021/11/06
- master eabd735 32/35: Default to creating new related sessions, Lars Ingebrigtsen, 2021/11/06
- master 5b7ab89 35/35: Fix build on nextstep, Lars Ingebrigtsen, 2021/11/06