From 7c1f66a94bf236a427606ef537b4629a48a1665b Mon Sep 17 00:00:00 2001 From: Joakim Verona Date: Tue, 19 Jan 2016 20:27:12 +0100 Subject: Support for the new Xwidget feature. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * configure.ac: (HAVE_XWIDGETS, WIDGET_OBJ, EMACS_CONFIG_FEATURES): * xterm.c (x_draw_glyph_string, x_draw_bar_cursor): * xdisp.c: (handle_display_spec, handle_single_display_spec, push_it) (pop_it, set_iterator_to_next, dump_glyph) (calc_pixel_width_or_height, fill_xwidget_glyph_string) (BUILD_XWIDGET_GLYPH_STRING, BUILD_GLYPH_STRINGS) (produce_xwidget_glyph, x_produce_glyphs) (get_window_cursor_type): * window.c (Fdelete_window_internal): * termhooks.h (e): * print.c (print_object): * lisp.h (ptrdiff_t): * keyboard.c (kbd_buffer_get_event, make_lispy_event) (syms_of_keyboard): * emacs.c (main): * dispnew.c (update_window, scrolling_window): * dispextern.h (g, i): * Makefile.in (XWIDGETS_OBJ, WEBKIT_CFLAGS, WEBKIT_LIBS) (GIR_LIBS, ALL_CFLAGS, base_obj, LIBES): * keyboard.c (kbd_buffer_get_event): * emacsgtkfixed.c (emacs_fixed_gtk_widget_size_allocate) (emacs_fixed_class_init): Add case for an xwidget view. * xwidget.c, xwidget.h, xwidget.el: New files for xwidgets Co-authored-by: Grégoire Jadi Various improvements to the Xwidget feature. * xwidgets.c: * emacsgtkfixed.c: * xwidget.el: --- src/emacsgtkfixed.c | 105 +++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 87 insertions(+), 18 deletions(-) (limited to 'src/emacsgtkfixed.c') diff --git a/src/emacsgtkfixed.c b/src/emacsgtkfixed.c index cdcaf803ba5..da1017df2ae 100644 --- a/src/emacsgtkfixed.c +++ b/src/emacsgtkfixed.c @@ -23,6 +23,9 @@ along with GNU Emacs. If not, see . */ #include "lisp.h" #include "frame.h" #include "xterm.h" +#ifdef HAVE_XWIDGETS +# include "xwidget.h" +#endif #include "emacsgtkfixed.h" /* Silence a bogus diagnostic; see GNOME bug 683906. */ @@ -31,27 +34,10 @@ along with GNU Emacs. If not, see . */ # pragma GCC diagnostic ignored "-Wunused-local-typedefs" #endif -#define EMACS_TYPE_FIXED emacs_fixed_get_type () -#define EMACS_FIXED(obj) \ - G_TYPE_CHECK_INSTANCE_CAST (obj, EMACS_TYPE_FIXED, EmacsFixed) - typedef struct _EmacsFixed EmacsFixed; typedef struct _EmacsFixedPrivate EmacsFixedPrivate; typedef struct _EmacsFixedClass EmacsFixedClass; -struct _EmacsFixed -{ - GtkFixed container; - - /*< private >*/ - EmacsFixedPrivate *priv; -}; - -struct _EmacsFixedClass -{ - GtkFixedClass parent_class; -}; - struct _EmacsFixedPrivate { struct frame *f; @@ -64,9 +50,87 @@ static void emacs_fixed_get_preferred_width (GtkWidget *widget, static void emacs_fixed_get_preferred_height (GtkWidget *widget, gint *minimum, gint *natural); -static GType emacs_fixed_get_type (void); G_DEFINE_TYPE (EmacsFixed, emacs_fixed, GTK_TYPE_FIXED) +#ifdef HAVE_XWIDGETS + +struct GtkFixedPrivateL +{ + GList *children; +}; + +static void emacs_fixed_gtk_widget_size_allocate (GtkWidget *widget, + GtkAllocation *allocation) +{ + // For xwidgets. + + // This basically re-implements the base class method and adds an + // additional case for an xwidget view. + + // It would be nicer if the bse class method could be called first, + // and the the xview modification only would remain here. It wasn't + // possible to solve it that way yet. + EmacsFixedClass *klass; + GtkWidgetClass *parent_class; + struct GtkFixedPrivateL* priv; + + klass = EMACS_FIXED_GET_CLASS (widget); + parent_class = g_type_class_peek_parent (klass); + parent_class->size_allocate (widget, allocation); + + priv = G_TYPE_INSTANCE_GET_PRIVATE (widget, + GTK_TYPE_FIXED, + struct GtkFixedPrivateL); + + gtk_widget_set_allocation (widget, allocation); + + if (gtk_widget_get_has_window (widget)) + { + if (gtk_widget_get_realized (widget)) + gdk_window_move_resize (gtk_widget_get_window (widget), + allocation->x, + allocation->y, + allocation->width, + allocation->height); + } + + for (GList *children = priv->children; children; children = children->next) + { + GtkFixedChild *child = children->data; + + if (!gtk_widget_get_visible (child->widget)) + continue; + + GtkRequisition child_requisition; + gtk_widget_get_preferred_size (child->widget, &child_requisition, NULL); + + GtkAllocation child_allocation; + child_allocation.x = child->x; + child_allocation.y = child->y; + + if (!gtk_widget_get_has_window (widget)) + { + child_allocation.x += allocation->x; + child_allocation.y += allocation->y; + } + + child_allocation.width = child_requisition.width; + child_allocation.height = child_requisition.height; + + struct xwidget_view *xv + = g_object_get_data (G_OBJECT (child->widget), XG_XWIDGET_VIEW); + if (xv) + { + child_allocation.width = xv->clip_right; + child_allocation.height = xv->clip_bottom - xv->clip_top; + } + + gtk_widget_size_allocate (child->widget, &child_allocation); + } +} + +#endif /* HAVE_XWIDGETS */ + static void emacs_fixed_class_init (EmacsFixedClass *klass) { @@ -74,11 +138,16 @@ emacs_fixed_class_init (EmacsFixedClass *klass) widget_class = (GtkWidgetClass*) klass; + widget_class->get_preferred_width = emacs_fixed_get_preferred_width; widget_class->get_preferred_height = emacs_fixed_get_preferred_height; +#ifdef HAVE_XWIDGETS + widget_class->size_allocate = emacs_fixed_gtk_widget_size_allocate; +#endif g_type_class_add_private (klass, sizeof (EmacsFixedPrivate)); } + static void emacs_fixed_init (EmacsFixed *fixed) { -- cgit v1.2.3 From 9d7265ba1a3f93e107a88c3fc4b76557e36192b5 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Wed, 20 Jan 2016 14:55:09 -0800 Subject: Don’t export C symbols not used elsewhere MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit These were recently added, mostly as part of xwidget code. * src/emacsgtkfixed.c (emacs_fixed_get_type): Now static. (EMACS_FIXED, EMACS_FIXED_GET_CLASS): Now static functions here, not macros in emacsgtkfixed.h. * src/emacsgtkfixed.h (EMACS_TYPE_FIXED): Remove. All uses replaced by definiens. (EMACS_FIXED, EMACS_FIXED_GET_CLASS): Remove; these are now static functions in emacsgtkfixed.c. (EMACS_FIXED_CLASS, EMACS_IS_FIXED, EMACS_IS_FIXED_CLASS): Remove; unused. (emacs_fixed_get_type): Remove decl; no longer extern. * src/xwidget.c (offscreen_damage_event) (webkit_mime_type_policy_typedecision_requested_cb) (webkit_new_window_policy_decision_requested_cb) (webkit_navigation_policy_decision_requested_cb) (xwidget_spec_value, xwidget_view_lookup) (xwidget_start_redisplay, xwidget_touch): Now static. * src/xwidget.h (xwidget_start_redisplay, xwidget_touch): Remove decls. --- src/emacsgtkfixed.c | 20 ++++++++++++++++++-- src/emacsgtkfixed.h | 8 -------- src/xwidget.c | 36 +++++++++++++++++------------------- src/xwidget.h | 3 --- 4 files changed, 35 insertions(+), 32 deletions(-) (limited to 'src/emacsgtkfixed.c') diff --git a/src/emacsgtkfixed.c b/src/emacsgtkfixed.c index da1017df2ae..08b840389c5 100644 --- a/src/emacsgtkfixed.c +++ b/src/emacsgtkfixed.c @@ -50,10 +50,26 @@ static void emacs_fixed_get_preferred_width (GtkWidget *widget, static void emacs_fixed_get_preferred_height (GtkWidget *widget, gint *minimum, gint *natural); + +static GType emacs_fixed_get_type (void); G_DEFINE_TYPE (EmacsFixed, emacs_fixed, GTK_TYPE_FIXED) +static EmacsFixed * +EMACS_FIXED (GtkWidget *widget) +{ + return G_TYPE_CHECK_INSTANCE_CAST (widget, emacs_fixed_get_type (), + EmacsFixed); +} + #ifdef HAVE_XWIDGETS +static EmacsFixedClass * +EMACS_FIXED_GET_CLASS (GtkWidget *widget) +{ + return G_TYPE_INSTANCE_GET_CLASS (widget, emacs_fixed_get_type (), + EmacsFixedClass); +} + struct GtkFixedPrivateL { GList *children; @@ -151,7 +167,7 @@ emacs_fixed_class_init (EmacsFixedClass *klass) static void emacs_fixed_init (EmacsFixed *fixed) { - fixed->priv = G_TYPE_INSTANCE_GET_PRIVATE (fixed, EMACS_TYPE_FIXED, + fixed->priv = G_TYPE_INSTANCE_GET_PRIVATE (fixed, emacs_fixed_get_type (), EmacsFixedPrivate); fixed->priv->f = 0; } @@ -166,7 +182,7 @@ emacs_fixed_init (EmacsFixed *fixed) GtkWidget* emacs_fixed_new (struct frame *f) { - EmacsFixed *fixed = g_object_new (EMACS_TYPE_FIXED, NULL); + EmacsFixed *fixed = g_object_new (emacs_fixed_get_type (), NULL); EmacsFixedPrivate *priv = fixed->priv; priv->f = f; return GTK_WIDGET (fixed); diff --git a/src/emacsgtkfixed.h b/src/emacsgtkfixed.h index 5b2fa566785..378bd2b828c 100644 --- a/src/emacsgtkfixed.h +++ b/src/emacsgtkfixed.h @@ -29,13 +29,6 @@ G_BEGIN_DECLS struct frame; -#define EMACS_TYPE_FIXED (emacs_fixed_get_type ()) -#define EMACS_FIXED(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EMACS_TYPE_FIXED, EmacsFixed)) -#define EMACS_FIXED_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EMACS_TYPE_FIXED, EmacsFixedClass)) -#define EMACS_IS_FIXED(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EMACS_TYPE_FIXED)) -#define EMACS_IS_FIXED_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EMACS_TYPE_FIXED)) -#define EMACS_FIXED_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EMACS_TYPE_FIXED, EmacsFixedClass)) - //typedef struct _EmacsFixed EmacsFixed; typedef struct _EmacsFixedPrivate EmacsFixedPrivate; typedef struct _EmacsFixedClass EmacsFixedClass; @@ -55,7 +48,6 @@ struct _EmacsFixedClass }; extern GtkWidget *emacs_fixed_new (struct frame *f); -extern GType emacs_fixed_get_type (void); G_END_DECLS diff --git a/src/xwidget.c b/src/xwidget.c index f8e13cd4522..ea5dea0f9fe 100644 --- a/src/xwidget.c +++ b/src/xwidget.c @@ -123,14 +123,13 @@ allocate_xwidget_view (void) #define XSETXWIDGET(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_XWIDGET)) #define XSETXWIDGET_VIEW(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_XWIDGET_VIEW)) -struct xwidget_view *xwidget_view_lookup (struct xwidget *, struct window *); -Lisp_Object xwidget_spec_value (Lisp_Object , Lisp_Object , int *); -gboolean offscreen_damage_event (GtkWidget * , GdkEvent * , gpointer ); -void webkit_document_load_finished_cb (WebKitWebView *, WebKitWebFrame *, - gpointer ); -gboolean webkit_download_cb (WebKitWebView *, WebKitDownload *, gpointer); +static struct xwidget_view *xwidget_view_lookup (struct xwidget *, + struct window *); +static void webkit_document_load_finished_cb (WebKitWebView *, WebKitWebFrame *, + gpointer); +static gboolean webkit_download_cb (WebKitWebView *, WebKitDownload *, gpointer); -gboolean +static gboolean webkit_mime_type_policy_typedecision_requested_cb (WebKitWebView *, WebKitWebFrame *, WebKitNetworkRequest *, @@ -138,7 +137,7 @@ webkit_mime_type_policy_typedecision_requested_cb (WebKitWebView *, WebKitWebPolicyDecision *, gpointer); -gboolean +static gboolean webkit_new_window_policy_decision_requested_cb (WebKitWebView *, WebKitWebFrame *, WebKitNetworkRequest *, @@ -146,7 +145,7 @@ webkit_new_window_policy_decision_requested_cb (WebKitWebView *, WebKitWebPolicyDecision *, gpointer); -gboolean +static gboolean webkit_navigation_policy_decision_requested_cb (WebKitWebView *, WebKitWebFrame *, WebKitNetworkRequest *, @@ -261,8 +260,7 @@ Returns the newly constructed xwidget, or nil if construction fails. */) { g_signal_connect (G_OBJECT (xw->widget_osr), "document-load-finished", - G_CALLBACK - (webkit_document_load_finished_cb), xw); + G_CALLBACK (webkit_document_load_finished_cb), xw); g_signal_connect (G_OBJECT (xw->widget_osr), "download-requested", @@ -352,7 +350,7 @@ xwidget_hide_view (struct xwidget_view *xv) /* When the off-screen webkit master view changes this signal is called. It copies the bitmap from the off-screen instance. */ -gboolean +static gboolean offscreen_damage_event (GtkWidget * widget, GdkEvent * event, gpointer xv_widget) { @@ -415,7 +413,7 @@ webkit_download_cb (WebKitWebView * webkitwebview, return FALSE; } -gboolean +static gboolean webkit_mime_type_policy_typedecision_requested_cb (WebKitWebView *webView, WebKitWebFrame *frame, WebKitNetworkRequest * request, @@ -438,7 +436,7 @@ webkit_mime_type_policy_typedecision_requested_cb (WebKitWebView *webView, } -gboolean +static gboolean webkit_new_window_policy_decision_requested_cb (WebKitWebView *webView, WebKitWebFrame *frame, WebKitNetworkRequest *request, @@ -456,7 +454,7 @@ webkit_new_window_policy_decision_requested_cb (WebKitWebView *webView, return FALSE; } -gboolean +static gboolean webkit_navigation_policy_decision_requested_cb (WebKitWebView *webView, WebKitWebFrame *frame, WebKitNetworkRequest *request, @@ -1138,7 +1136,7 @@ valid_xwidget_spec_p (Lisp_Object object) /* Find a value associated with key in spec. */ -Lisp_Object +static Lisp_Object xwidget_spec_value (Lisp_Object spec, Lisp_Object key, int *found) { Lisp_Object tail; @@ -1180,7 +1178,7 @@ xwidget_view_delete_all_in_window (struct window *w) } } -struct xwidget_view * +static struct xwidget_view * xwidget_view_lookup (struct xwidget *xw, struct window *w) { Lisp_Object xwidget, window, ret; @@ -1210,7 +1208,7 @@ lookup_xwidget (Lisp_Object spec) } /* Set up detection of touched xwidget */ -void +static void xwidget_start_redisplay (void) { for (Lisp_Object tail = Vxwidget_view_list; CONSP (tail); @@ -1223,7 +1221,7 @@ xwidget_start_redisplay (void) /* The xwidget was touched during redisplay, so it isn't a candidate for hiding. */ -void +static void xwidget_touch (struct xwidget_view *xv) { xv->redisplayed = 1; diff --git a/src/xwidget.h b/src/xwidget.h index 4dffaa4750d..fdcf40d8cbb 100644 --- a/src/xwidget.h +++ b/src/xwidget.h @@ -121,11 +121,8 @@ struct xwidget_type struct xwidget *xwidget_from_id (int id); -void xwidget_start_redisplay (void); void xwidget_end_redisplay (struct window *w, struct glyph_matrix *matrix); -void xwidget_touch (struct xwidget_view *xw); - struct xwidget *lookup_xwidget (Lisp_Object spec); #define XG_XWIDGET "emacs_xwidget" #define XG_XWIDGET_VIEW "emacs_xwidget_view" -- cgit v1.2.3