[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] xwidget_mvp 0b43aa3 1/2: simplify
From: |
Joakim Verona |
Subject: |
[Emacs-diffs] xwidget_mvp 0b43aa3 1/2: simplify |
Date: |
Sun, 08 Feb 2015 17:57:40 +0000 |
branch: xwidget_mvp
commit 0b43aa3cc7b385da8ca32d5965a0f90c669cc325
Author: Joakim Verona <address@hidden>
Commit: Joakim Verona <address@hidden>
simplify
---
src/xwidget.c | 671 +++----------------------------------------
test/xwidget-test-manual.el | 212 --------------
2 files changed, 37 insertions(+), 846 deletions(-)
diff --git a/src/xwidget.c b/src/xwidget.c
index b68d3cb..aff5687 100644
--- a/src/xwidget.c
+++ b/src/xwidget.c
@@ -96,14 +96,6 @@
#include <girepository.h>
#include "xwidget.h"
-/* Convert STRING, a string constant, to a type acceptable as glib data.
- Paul Eggert*/
-static char *
-gstr (char const *string)
-{
- return (char *) string;
-}
-
//TODO embryo of lisp allocators for xwidgets
//TODO xwidget* should be Lisp_xwidget*
@@ -178,11 +170,8 @@ webkit_osr_navigation_policy_decision_requested_callback
(WebKitWebView *
* policy_decision,
gpointer user_data);
-static GtkWidget *xwgir_create (char *, char *, char *, Lisp_Object);
-static void send_xembed_ready_event (struct xwidget *xw, int xembedid);
-
DEFUN ("make-xwidget",
Fmake_xwidget, Smake_xwidget,
7, 8, 0, doc: /* Make an xwidget from BEG to END of TYPE.
@@ -200,7 +189,6 @@ DEFUN ("make-xwidget",
- socket
- socket-osr
- ARGUMENTS are xwgir constructor args
*/
)(Lisp_Object beg, Lisp_Object end,
Lisp_Object type,
@@ -239,8 +227,7 @@ DEFUN ("make-xwidget",
/* DIY mvc. widget is rendered offscreen,
later bitmap copied to the views.
*/
- if (EQ (xw->type, Qwebkit_osr) ||
- EQ (xw->type, Qsocket_osr) || (!NILP (Fget (xw->type, QCxwgir_class))))
+ if (EQ (xw->type, Qwebkit_osr))
{
block_input ();
xw->widgetwindow_osr = gtk_offscreen_window_new ();
@@ -268,15 +255,6 @@ DEFUN ("make-xwidget",
gtk_container_add (GTK_CONTAINER (xw->widgetscrolledwindow_osr),
GTK_WIDGET (WEBKIT_WEB_VIEW (xw->widget_osr)));
}
- if (EQ (xw->type, Qsocket_osr))
- xw->widget_osr = gtk_socket_new ();
- if (!NILP (Fget (xw->type, QCxwgir_class)))
- xw->widget_osr =
- xwgir_create (SSDATA (Fcar (Fcdr (Fget (xw->type, QCxwgir_class)))),
//class
- SSDATA (Fcar (Fget (xw->type, QCxwgir_class))),
//namespace
- SSDATA (Fcar (Fcdr (Fcdr (Fget (xw->type,
QCxwgir_class))))), //constructor
- arguments
- );
gtk_widget_set_size_request (GTK_WIDGET (xw->widget_osr), xw->width,
xw->height);
@@ -333,15 +311,6 @@ DEFUN ("make-xwidget",
xw);
}
- if (EQ (xw->type, Qsocket_osr))
- {
- send_xembed_ready_event (xw,
- gtk_socket_get_id (GTK_SOCKET
- (xw->widget_osr)));
- //gtk_widget_realize(xw->widget);
- }
-
-
unblock_input ();
}
@@ -382,47 +351,6 @@ xwidget_hidden (struct xwidget_view *xv)
}
-static void
-buttonclick_handler (GtkWidget * widget, gpointer data)
-{
- Lisp_Object xwidget_view, xwidget;
- XSETXWIDGET_VIEW (xwidget_view, (struct xwidget_view *) data);
- xwidget = Fxwidget_view_model (xwidget_view);
-
- struct input_event event;
- Lisp_Object frame = Fwindow_frame (Fxwidget_view_window (xwidget_view));
- EVENT_INIT (event);
- event.kind = XWIDGET_EVENT;
-
- event.frame_or_window = frame;
-
- event.arg = Qnil;
- event.arg = Fcons (xwidget, event.arg);
- event.arg = Fcons (intern ("buttonclick"), event.arg);
-
- kbd_buffer_store_event (&event);
-}
-
-
-static void
-send_xembed_ready_event (struct xwidget *xw, int xembedid)
-{
- Lisp_Object xw_lo;
- XSETXWIDGET (xw_lo, xw);
- struct input_event event;
- EVENT_INIT (event);
- event.kind = XWIDGET_EVENT;
- event.frame_or_window = Qnil; //frame; //how to get the frame here?
//TODO i store it in the xwidget now
-
- event.arg = Qnil;
- event.arg = Fcons (make_number (xembedid), event.arg);
- event.arg = Fcons (xw_lo, event.arg);
- event.arg = Fcons (intern ("xembed-ready"), event.arg);
-
-
- kbd_buffer_store_event (&event);
-
-}
static void
xwidget_show_view (struct xwidget_view *xv)
@@ -444,60 +372,6 @@ xwidget_hide_view (struct xwidget_view *xv)
}
-static void
-xwidget_plug_added (GtkSocket * socket, gpointer user_data)
-{
- //hmm this doesnt seem to get called for foreign windows
- printf ("xwidget_plug_added\n");
-}
-
-static gboolean
-xwidget_plug_removed (GtkSocket * socket, gpointer user_data)
-{
- printf ("xwidget_plug_removed\n");
- return TRUE; /* dont run the default handler because that
kills the socket and we want to reuse it */
-}
-
-
-static void
-xwidget_slider_changed (GtkRange * range, gpointer user_data)
-{
- //slider value changed. change value of siblings
- //correspondingly. but remember that changing value will again
- //trigger signal
-
- //TODO MVC view storage wont be an array futureish so the loop needs to
change eventually
- //TODO MVC it would be nice if this code could be reusable but, alas, C is
not a functional language
- //issues are:
- // - the type of the controllers value (double, boolean etc)
- // - the getter and setter (but they can be func pointers)
- // a behemoth macro is always an option.
- double v = gtk_range_get_value (range);
- struct xwidget_view *xvp =
- g_object_get_data (G_OBJECT (range), XG_XWIDGET_VIEW);
- struct xwidget_view *xv;
-
- printf ("slider changed val:%f\n", v);
-
- for (Lisp_Object tail = Vxwidget_view_list; CONSP (tail);
- tail = XCDR (tail))
- {
- if (XWIDGET_VIEW_P (XCAR (tail)))
- {
- xv = XXWIDGET_VIEW (XCAR (tail));
- if (EQ (xvp->model, xv->model))
- {
- //block sibling views signal handlers
- g_signal_handler_block (xv->widget, xv->handler_id);
-
- //set values of sibling views and unblock
- gtk_range_set_value (GTK_RANGE (xv->widget), v);
- g_signal_handler_unblock (xv->widget, xv->handler_id);
- }
- }
- }
-}
-
/* when the off-screen webkit master view changes this signal is called.
it copies the bitmap from the off-screen webkit instance */
@@ -682,278 +556,8 @@ xwidget_osr_event_forward (GtkWidget * widget,
GIRepository *girepository;
-DEFUN ("xwgir-require-namespace", Fxwgir_require_namespace,
Sxwgir_require_namespace, 2, 2, 0, doc: /* Require a GObject Introspection
namespace.
-
This must be done for all namespaces we want to
use, before using other xwgir functions. */ )
- (Lisp_Object lnamespace, Lisp_Object lnamespace_version)
-{
- const gchar *namespace = SSDATA (lnamespace);
- const gchar *namespace_version = SSDATA (lnamespace_version);
- GError *error = NULL;
-
- girepository = g_irepository_get_default ();
- g_irepository_require (girepository, namespace, namespace_version, 0,
- &error);
- if (error)
- {
- g_error ("ERROR: %s\n", error->message);
- return Qnil;
- }
- return Qt;
-}
-
-
-static int
-xwgir_convert_lisp_to_gir_arg (GIArgument * giarg,
- GIArgInfo * arginfo, Lisp_Object lisparg)
-{
-
- GITypeTag tag;
- tag = g_type_info_get_tag (g_arg_info_get_type (arginfo));
-
- switch (tag)
- {
- case GI_TYPE_TAG_BOOLEAN:
- giarg->v_boolean = XFASTINT (lisparg);
- break;
- case GI_TYPE_TAG_INT8:
- giarg->v_int8 = XFASTINT (lisparg);
- break;
- case GI_TYPE_TAG_UINT8:
- giarg->v_uint8 = XFASTINT (lisparg);
- break;
- case GI_TYPE_TAG_INT16:
- giarg->v_int16 = XFASTINT (lisparg);
- break;
- case GI_TYPE_TAG_UINT16:
- giarg->v_uint16 = XFASTINT (lisparg);
- break;
- case GI_TYPE_TAG_INT32:
- giarg->v_int32 = XFASTINT (lisparg);
- break;
- case GI_TYPE_TAG_UINT32:
- giarg->v_uint32 = XFASTINT (lisparg);
- break;
-
- case GI_TYPE_TAG_INT64:
- giarg->v_int64 = XFASTINT (lisparg);
- break;
- case GI_TYPE_TAG_UINT64:
- giarg->v_uint64 = XFASTINT (lisparg);
- break;
-
-
- case GI_TYPE_TAG_FLOAT:
- giarg->v_float = XFLOAT_DATA (lisparg);
- break;
-
- case GI_TYPE_TAG_DOUBLE:
- giarg->v_double = XFLOAT_DATA (lisparg);
- break;
-
- case GI_TYPE_TAG_UTF8:
- case GI_TYPE_TAG_FILENAME:
- //giarg->v_string = SDATA(lisparg);
- giarg->v_pointer = SDATA (lisparg);
- break;
-
- case GI_TYPE_TAG_ARRAY:
- case GI_TYPE_TAG_GLIST:
- case GI_TYPE_TAG_GSLIST:
- case GI_TYPE_TAG_GHASH:
- case GI_TYPE_TAG_ERROR:
- case GI_TYPE_TAG_INTERFACE:
- case GI_TYPE_TAG_VOID:
- case GI_TYPE_TAG_UNICHAR:
- case GI_TYPE_TAG_GTYPE:
- //?? i dont know how to handle these yet TODO
- printf ("failed in my lisp to gir arg conversion duties. sob!\n");
- return -1;
- break;
- }
- return 0;
-}
-
-GtkWidget *
-xwgir_create (char *class, char *namespace, char *constructor,
- Lisp_Object arguments)
-{
- //TODO this is more or less the same as xwgir-call-method,
- //so should be refactored
- //create a gtk widget, given its name
- //find the constructor
- //call it
- //also figure out how to pass args
-
- GIArgument return_value;
-
- GIObjectInfo *obj_info =
- g_irepository_find_by_name (girepository, namespace, class);
- //some constructors are like "new_with_label etc
- GIFunctionInfo *f_info = g_object_info_find_method (obj_info, constructor);
- g_function_info_invoke (f_info, NULL, 0, NULL, 0, &return_value, NULL);
-
-
-
//////////////////////////////////////////////////////////////////////////////
- // refactorable
-
- //loop over args, convert from lisp to primitive type, given arg
- //introspection data TODO g_callable_info_get_n_args(f_info) should
- //match
- GError *error = NULL;
- GIArgument in_args[20];
-
- int argscount = XFASTINT (Flength (arguments));
- if (argscount != g_callable_info_get_n_args (f_info))
- {
- printf ("xwgir call method arg count doesn match! \n");
- return NULL;
- }
- int i;
- Lisp_Object n;
- for (i = 0; i < argscount ; ++i)
- {
- XSETFASTINT (n, i);
- xwgir_convert_lisp_to_gir_arg (&in_args[i],
- g_callable_info_get_arg (f_info, i),
- Fnth (n, arguments));
- }
-
- //in_args[0].v_pointer = widget;
- //g_function_info_invoke (f_info, NULL, 0, NULL, 0, &return_value, NULL);
- if (!g_function_info_invoke (f_info,
- in_args, argscount,
- NULL, 0, &return_value, &error))
- {
- //g_error("ERROR: %s\n", error->message);
- printf ("invokation error\n");
- return NULL;
- }
- ///////////////////////////////////////
-
-
-
- return return_value.v_pointer;
-
-}
-
-
-DEFUN ("xwgir-xwidget-call-method",
- Fxwgir_xwidget_call_method, Sxwgir_xwidget_call_method,
- 3, 3, 0, doc: /* Call Xwidget object method using GObject
- Introspection.
-
- XWIDGET is the xwidget instance to act
- upon.
-
- METHOD is the Gobject intrsopsection method
- name.
-
- ARGUMENTS is a list of arguments for the
- call. They will be converted to GObject
- types from Lisp types.
- */ )
- (Lisp_Object xwidget, Lisp_Object method, Lisp_Object arguments)
-{
- CHECK_XWIDGET (xwidget);
- GError *error = NULL;
- GIArgument return_value;
- GIArgument in_args[20];
-
-
- struct xwidget *xw;
- if (NILP (xwidget))
- {
- printf ("ERROR xwidget nil\n");
- return Qnil;
- };
- xw = XXWIDGET (xwidget);
- if (NULL == xw)
- printf ("ERROR xw is 0\n");
- char *namespace = SSDATA (Fcar (Fget (xw->type, QCxwgir_class)));
- //we need the concrete widget, which happens in 2 ways depending on
- //OSR or not TODO
- GtkWidget *widget = NULL;
- if (NULL == xw->widget_osr)
- {
- widget = xwidget_view_lookup (xw,
- XWINDOW (FRAME_SELECTED_WINDOW
- (SELECTED_FRAME ())))->widget;
- }
- else
- {
- widget = xw->widget_osr;
- }
-
-
- char *class = SSDATA (Fcar (Fcdr (Fget (xw->type, QCxwgir_class))));
-
//////////////////////////////////////////////////////////////////////////////
- // class, namespace, argumentss
- GIObjectInfo *obj_info =
- g_irepository_find_by_name (girepository, namespace, class);
- GIFunctionInfo *f_info =
- g_object_info_find_method (obj_info, SSDATA (method));
-
- //loop over args, convert from lisp to primitive type, given arg
- //introspection data TODO g_callable_info_get_n_args(f_info) should
- //match
- int argscount = XFASTINT (Flength (arguments));
- if (argscount != g_callable_info_get_n_args (f_info))
- {
- printf ("xwgir call method arg count doesn match! \n");
- return Qnil;
- }
- int i;
- Lisp_Object n;
- for (i = 1; i < argscount + 1; ++i)
- {
- XSETFASTINT (n, i - 1);
- xwgir_convert_lisp_to_gir_arg (&in_args[i],
- g_callable_info_get_arg (f_info, i - 1),
- Fnth (n, arguments));
- }
-
- in_args[0].v_pointer = widget;
- if (!g_function_info_invoke (f_info,
- in_args, argscount + 1,
- NULL, 0, &return_value, &error))
- {
- //g_error("ERROR: %s\n", error->message);
- printf ("invokation error\n");
- return Qnil;
- }
- return Qt;
-}
-
-static GdkWindow *
-offscreen_pick_embedded_child (GdkWindow * window,
- double x, double y, gpointer * data)
-{
- //in this simple case we assume the window contains a single widget. easy.
- //but then we get the problem that the widget cant be embedded in several
windows
- return gtk_widget_get_window (GTK_WIDGET (data));
-}
-static void
-offscreen_to_embedder (GdkWindow * window,
- gdouble offscreen_x,
- gdouble offscreen_y,
- gpointer embedder_x,
- gpointer embedder_y, gpointer data)
-{
- *(gdouble *) embedder_x = offscreen_x;
- *(gdouble *) embedder_y = offscreen_y;
-}
-static void
-offscreen_from_embedder (GdkWindow * window,
- gdouble embedder_x,
- gdouble embedder_y,
- gpointer offscreen_x,
- gpointer offscreen_y, gpointer user_data)
-{
- *(gdouble *) offscreen_x = embedder_x;
- *(gdouble *) offscreen_y = embedder_y;
-}
static gboolean
xwidget_osr_event_set_embedder (GtkWidget * widget,
@@ -984,42 +588,7 @@ xwidget_init_view (struct xwidget *xww, struct
glyph_string *s, int x, int y)
XSETWINDOW (xv->w, s->w);
XSETXWIDGET (xv->model, xww);
- //widget creation
- if (EQ (xww->type, Qbutton))
- {
- xv->widget = gtk_button_new_with_label (SSDATA (xww->title));
- g_signal_connect (G_OBJECT (xv->widget), "clicked", G_CALLBACK
(buttonclick_handler), xv); // the view rather than the model
- }
- else if (EQ (xww->type, Qtoggle))
- {
- xv->widget = gtk_toggle_button_new_with_label (SSDATA (xww->title));
- //xv->widget = gtk_entry_new ();//temp hack to experiment with key
propagation TODO entry widget is useful for testing
- }
- else if (EQ (xww->type, Qsocket))
- {
- xv->widget = gtk_socket_new ();
- g_signal_connect_after (xv->widget, "plug-added",
- G_CALLBACK (xwidget_plug_added),
- gstr ("plug added"));
- g_signal_connect_after (xv->widget, "plug-removed",
- G_CALLBACK (xwidget_plug_removed),
- gstr ("plug removed"));
- //TODO these doesnt help
- gtk_widget_add_events (xv->widget, GDK_KEY_PRESS);
- gtk_widget_add_events (xv->widget, GDK_KEY_RELEASE);
- }
- else if (EQ (xww->type, Qslider))
- {
- xv->widget =
- //gtk_hscale_new (GTK_ADJUSTMENT(gtk_adjustment_new (0.0, 0.0, 100.0,
1.0, 10.0, 10.0)));
- gtk_hscale_new_with_range (0.0, 100.0, 10.0);
- gtk_scale_set_draw_value (GTK_SCALE (xv->widget), FALSE); //i
think its emacs role to show text and stuff, so disable the widgets own text
- xv->handler_id =
- g_signal_connect_after (xv->widget, "value-changed",
- G_CALLBACK (xwidget_slider_changed),
- gstr ("slider changed"));
- }
- else if (EQ (xww->type, Qwebkit_osr) || EQ (xww->type, Qsocket_osr) ||
(!NILP (Fget (xww->type, QCxwgir_class)))) //xwgir widgets are OSR
+ if (EQ (xww->type, Qwebkit_osr))
{
printf ("osr init:%s\n", SDATA (SYMBOL_NAME (xww->type)));
xv->widget = gtk_drawing_area_new ();
@@ -1082,46 +651,6 @@ xwidget_init_view (struct xwidget *xww, struct
glyph_string *s, int x, int y)
gtk_widget_show_all (xv->widgetwindow);
-
- //widgettype specific initialization only possible after realization
- if (EQ (xww->type, Qsocket))
- {
- printf ("xwid:%p socket id:%p %p\n",
- (void *) xww,
- (void *) gtk_socket_get_id (GTK_SOCKET (xv->widget)),
- (void *) gtk_socket_get_id (GTK_SOCKET (xv->widget)));
- send_xembed_ready_event (xww,
- gtk_socket_get_id (GTK_SOCKET (xv->widget)));
- //gtk_widget_realize(xw->widget);
- }
-
- //////////////////////////////////////////////////////////////
- // xwgir debug
- if (
- EQ (xww->type, Qsocket_osr) || (!NILP (Fget (xww->type,
QCxwgir_class))))
- {
- printf ("gdk_offscreen_window_set_embedder %d %d\n",
- GDK_IS_WINDOW (gtk_widget_get_window (xww->widget_osr)),
- GDK_IS_WINDOW (gtk_widget_get_window
- (GTK_WIDGET (xv->widget))));
- // set_embedder needs to be called after xv->widget realization
- gdk_offscreen_window_set_embedder (gtk_widget_get_window
- (xww->widgetwindow_osr),
- gtk_widget_get_window (xv->widget));
- g_signal_connect (gtk_widget_get_window (xv->widget),
- "pick-embedded-child",
- G_CALLBACK (offscreen_pick_embedded_child),
- xww->widgetwindow_osr);
-
- g_signal_connect (gtk_widget_get_window (xww->widgetwindow_osr),
- "from-embedder", G_CALLBACK (offscreen_from_embedder),
- NULL);
- g_signal_connect (gtk_widget_get_window (xww->widgetwindow_osr),
- "to-embedder", G_CALLBACK (offscreen_to_embedder),
- NULL);
- }
- ////////////////////////////////////////
-
return xv;
}
@@ -1170,27 +699,32 @@ x_draw_xwidget_glyph_string (struct glyph_string *s)
WINDOW_BOTTOM_EDGE_Y (s->w) - WINDOW_MODE_LINE_HEIGHT (s->w) - y);
clip_top = max (0, WINDOW_TOP_EDGE_Y (s->w) - y);
- //we are conserned with movement of the onscreen area. the area might sit
still when the widget actually moves
- //this happens when an emacs window border moves across a widget window
- //so, if any corner of the outer widget clippng window moves, that counts as
movement here, even
- //if it looks like no movement happens because the widget sits still inside
the clipping area.
- //the widget can also move inside the clipping area, which happens later
+ //we are conserned with movement of the onscreen area. the area
+ //might sit still when the widget actually moves this happens when
+ //an emacs window border moves across a widget window so, if any
+ //corner of the outer widget clippng window moves, that counts as
+ //movement here, even if it looks like no movement happens because
+ //the widget sits still inside the clipping area. the widget can
+ //also move inside the clipping area, which happens later
moved = (xv->x + xv->clip_left != x + clip_left)
|| ((xv->y + xv->clip_top) != (y + clip_top));
xv->x = x;
xv->y = y;
if (moved) //has it moved?
{
- if (1) //!xwidget_hidden(xv)) //hidden equals not
being seen during redisplay
+ if (1)
+ //!xwidget_hidden(xv))
+ //hidden equals not being seen during redisplay
{
//TODO should be possible to use xwidget_show_view here
gtk_fixed_move (GTK_FIXED (FRAME_GTK_WIDGET (s->f)),
xv->widgetwindow, x + clip_left, y + clip_top);
}
}
- //clip the widget window if some parts happen to be outside drawable area
- //an emacs window is not a gtk window, a gtk window covers the entire frame
- //cliping might have changed even if we havent actualy moved, we try figure
out when we need to reclip for real
+ //clip the widget window if some parts happen to be outside drawable
+ //area an emacs window is not a gtk window, a gtk window covers the
+ //entire frame cliping might have changed even if we havent actualy
+ //moved, we try figure out when we need to reclip for real
if ((xv->clip_right != clip_right)
|| (xv->clip_bottom != clip_bottom)
|| (xv->clip_top != clip_top) || (xv->clip_left != clip_left))
@@ -1205,9 +739,10 @@ x_draw_xwidget_glyph_string (struct glyph_string *s)
xv->clip_top = clip_top;
xv->clip_left = clip_left;
}
- //if emacs wants to repaint the area where the widget lives, queue a redraw
- //TODO it seems its possible to get out of sync with emacs redraws so emacs
bg sometimes shows up instead of xwidget
- //its just a visual glitch though
+ //if emacs wants to repaint the area where the widget lives, queue a
+ //redraw TODO it seems its possible to get out of sync with emacs
+ //redraws so emacs bg sometimes shows up instead of xwidget its just
+ //a visual glitch though
if (!xwidget_hidden (xv))
{
gtk_widget_queue_draw (xv->widgetwindow);
@@ -1231,7 +766,10 @@ x_draw_xwidget_glyph_string (struct glyph_string *s)
};
-DEFUN ("xwidget-webkit-goto-uri", Fxwidget_webkit_goto_uri,
Sxwidget_webkit_goto_uri, 2, 2, 0, doc: /* Make the webkit instance
referenced by XWIDGET browse URI. */
+DEFUN ("xwidget-webkit-goto-uri",
+ Fxwidget_webkit_goto_uri, Sxwidget_webkit_goto_uri,
+ 2, 2, 0, doc: /* Make the webkit instance referenced by
+ XWIDGET browse URI. */
)
(Lisp_Object xwidget, Lisp_Object uri)
{
@@ -1242,7 +780,9 @@ DEFUN ("xwidget-webkit-goto-uri",
Fxwidget_webkit_goto_uri, Sxwidget_webkit_goto
}
-DEFUN ("xwidget-webkit-execute-script", Fxwidget_webkit_execute_script,
Sxwidget_webkit_execute_script, 2, 2, 0, doc: /* webkit exec js. */
+DEFUN ("xwidget-webkit-execute-script",
+ Fxwidget_webkit_execute_script, Sxwidget_webkit_execute_script,
+ 2, 2, 0, doc: /* webkit exec js. */
)
(Lisp_Object xwidget, Lisp_Object script)
{
@@ -1253,9 +793,11 @@ DEFUN ("xwidget-webkit-execute-script",
Fxwidget_webkit_execute_script, Sxwidget
return Qnil;
}
-DEFUN ("xwidget-webkit-get-title", Fxwidget_webkit_get_title,
Sxwidget_webkit_get_title, 1, 1, 0, doc: /* Get the title from the Webkit
instance in XWIDGET.
-
This can be used to work around the lack of a
return value from the exec method.
-
*/ )
+DEFUN ("xwidget-webkit-get-title",
+ Fxwidget_webkit_get_title, Sxwidget_webkit_get_title,
+ 1, 1, 0, doc: /* Get the title from the Webkit instance in
+XWIDGET. This can be used to work around the lack of a return value
+from the exec method. */ )
(Lisp_Object xwidget)
{
//TODO support multibyte strings
@@ -1265,7 +807,8 @@ DEFUN ("xwidget-webkit-get-title",
Fxwidget_webkit_get_title, Sxwidget_webkit_ge
//return make_string_from_bytes(str, wcslen((const wchar_t *)str),
strlen(str));
if (str == 0)
{
- //TODO maybe return Qnil instead. I suppose webkit returns nullpointer
when doc is not properly loaded or something
+ //TODO maybe return Qnil instead. I suppose webkit returns
+ //nullpointer when doc is not properly loaded or something
printf ("xwidget-webkit-get-title null webkit title\n");
return build_string ("");
}
@@ -1273,7 +816,9 @@ DEFUN ("xwidget-webkit-get-title",
Fxwidget_webkit_get_title, Sxwidget_webkit_ge
}
//TODO missnamed
-DEFUN ("xwidget-disable-plugin-for-mime", Fxwidget_disable_plugin_for_mime,
Sxwidget_disable_plugin_for_mime, 1, 1, 0, doc: /* */ )
+DEFUN ("xwidget-disable-plugin-for-mime",
+ Fxwidget_disable_plugin_for_mime, Sxwidget_disable_plugin_for_mime,
+ 1, 1, 0, doc: /* */ )
(Lisp_Object mime)
{
WebKitWebPlugin *wp = webkit_web_plugin_database_get_plugin_for_mimetype
@@ -1288,66 +833,6 @@ DEFUN ("xwidget-disable-plugin-for-mime",
Fxwidget_disable_plugin_for_mime, Sxwi
return Qnil;
}
-#ifdef HAVE_XLXW_DOMDUMP
-/* dom dumping is work in progress.
- 2 of the methods used from webkit are deprecated nowm and replacements
sought
- */
-static void
-xwidget_webkit_dom_dump (WebKitDOMNode * parent)
-{
- WebKitDOMNodeList *list;
- int length;
- WebKitDOMNode *attribute;
- WebKitDOMNamedNodeMap *attrs;
- WebKitDOMNode *child;
- printf ("node:%d type:%d name:%s content:%s\n", parent,
- webkit_dom_node_get_node_type (parent),
- //1 element 3 text 8 comment 2 attribute
- webkit_dom_node_get_local_name (parent),
- webkit_dom_node_get_text_content (parent));
-
- if (webkit_dom_node_has_attributes (parent))
- {
- attrs = webkit_dom_node_get_attributes (parent);
-
- length = webkit_dom_named_node_map_get_length (attrs);
- for (int i = 0; i < length; i++)
- {
- attribute = webkit_dom_named_node_map_item (attrs, i);
- printf (" attr node:%d type:%d name:%s content:%s\n",
- attribute, webkit_dom_node_get_node_type (attribute),
- //1 element 3 text 8 comment
- webkit_dom_node_get_local_name (attribute),
- webkit_dom_node_get_text_content (attribute));
- }
- }
- list = webkit_dom_node_get_child_nodes (parent);
- length = webkit_dom_node_list_get_length (list);
-
- for (int i = 0; i < length; i++)
- {
- child = webkit_dom_node_list_item (list, i);
- //if(webkit_dom_node_has_child_nodes(child))
- xwidget_webkit_dom_dump (child);
- }
-}
-
-
-DEFUN ("xwidget-webkit-dom-dump",
- Fxwidget_webkit_dom_dump, Sxwidget_webkit_dom_dump,
- 1, 1, 0, doc: /*Dump the DOM contained in the webkit
- instance in XWIDGET. */
- )
- (Lisp_Object xwidget)
-{
- WEBKIT_FN_INIT ();
- xwidget_webkit_dom_dump (WEBKIT_DOM_NODE
- (webkit_web_view_get_dom_document
- (WEBKIT_WEB_VIEW (xw->widget_osr))));
- return Qnil;
-}
-
-#endif /* HAVE_XLXW_DOMDUMP */
#endif /* HAVE_WEBKIT_OSR */
@@ -1564,75 +1049,6 @@ DEFUN ("xwidget-view-window",
return XXWIDGET_VIEW (xwidget_view)->w;
}
-DEFUN ("xwidget-send-keyboard-event",
- Fxwidget_send_keyboard_event, Sxwidget_send_keyboard_event,
- 2, 2, 0, doc: /* Synthesize a kbd event for XWIDGET. TODO
- crashes atm.. */
-)(Lisp_Object xwidget,
- Lisp_Object keydescriptor)
-{
- //TODO this code crashes for offscreen widgets and ive tried many
- //different strategies int keyval = 0x058; //X
- int keyval = XFASTINT (keydescriptor); //X
- GdkKeymapKey *keys;
- gint n_keys;
- GdkDeviceManager *manager;
- struct xwidget *xw;
- GtkWidget *widget;
- GdkEventKey *ev;
- Lisp_Object window;
- //popup_activated_flag = 1; //TODO just a hack
- gdk_keymap_get_entries_for_keyval (gdk_keymap_get_default (), keyval, &keys,
- &n_keys);
-
- xw = XXWIDGET (xwidget);
-
- ev = (GdkEventKey *) gdk_event_new (GDK_KEY_PRESS);
-
-
- //todo what about windowless widgets?
-
- window = FRAME_SELECTED_WINDOW (SELECTED_FRAME ());
-
-
- //TODO maybe we also need to special case sockets by picking up the
- //plug rather than the socket
- if (xw->widget_osr)
- widget = xw->widget_osr;
- else
- widget = xwidget_view_lookup (xw, XWINDOW (window))->widget;
-
- ev->window = gtk_widget_get_window (widget);
- gtk_widget_grab_focus (widget);
- ev->send_event = FALSE;
-
- ev->hardware_keycode = keys[0].keycode;
- ev->group = keys[0].group;
-
- ev->keyval = keyval;
- ev->time = GDK_CURRENT_TIME;
-
- //ev->device = gdk_device_get_core_pointer();
- manager =
- gdk_display_get_device_manager (gdk_window_get_display (ev->window));
- gdk_event_set_device ((GdkEvent *) ev,
- gdk_device_manager_get_client_pointer (manager));
- gdk_event_put ((GdkEvent *) ev);
- //g_signal_emit_by_name(ev->window,"key-press-event", ev);
-
- ev->type = GDK_KEY_RELEASE;
- gdk_event_put ((GdkEvent *) ev);
- //g_signal_emit_by_name(ev->window,"key-release-event", ev);
- //gtk_main_do_event(ev);
-
- //TODO
- //if I delete the event the receiving component eventually crashes.
- //it ough TDTRT since event_put is supposed to copy the event
- //so probably this leaks events now
- //gdk_event_free((GdkEvent*)ev);
-
- return Qnil;
-}
DEFUN ("delete-xwidget-view",
Fdelete_xwidget_view, Sdelete_xwidget_view,
@@ -1781,17 +1197,10 @@ syms_of_xwidget (void)
DEFSYM (Qwebkit_osr, "webkit-osr");
#endif
- defsubr (&Sxwgir_xwidget_call_method);
- defsubr (&Sxwgir_require_namespace);
defsubr (&Sxwidget_size_request);
defsubr (&Sdelete_xwidget_view);
defsubr (&Sxwidget_disable_plugin_for_mime);
- defsubr (&Sxwidget_send_keyboard_event);
-#ifdef HAVE_XLXW_DOMDUMP
- defsubr (&Sxwidget_webkit_dom_dump);
-#endif
-
defsubr (&Sxwidget_plist);
defsubr (&Sxwidget_buffer);
defsubr (&Sset_xwidget_plist);
@@ -1801,16 +1210,10 @@ syms_of_xwidget (void)
DEFSYM (Qxwidget, "xwidget");
DEFSYM (QCxwidget, ":xwidget");
- DEFSYM (QCxwgir_class, ":xwgir-class");
DEFSYM (QCtitle, ":title");
/* Do not forget to update the docstring of make-xwidget if you add
new types. */
- DEFSYM (Qbutton, "Button");
- DEFSYM (Qtoggle, "ToggleButton");
- DEFSYM (Qslider, "slider");
- DEFSYM (Qsocket, "socket");
- DEFSYM (Qsocket_osr, "socket-osr");
DEFSYM (Qvertical, "vertical");
DEFSYM (Qhorizontal, "horizontal");
diff --git a/test/xwidget-test-manual.el b/test/xwidget-test-manual.el
deleted file mode 100644
index 1c9b181..0000000
--- a/test/xwidget-test-manual.el
+++ /dev/null
@@ -1,212 +0,0 @@
-;;test like:
-;; cd /path/to/xwidgets-emacs-dir
-;; make all&& src/emacs -q --eval "(progn (load
\"`pwd`/lisp/xwidget-test.el\") (xwidget-demo-basic))"
-
-
-;; you should see:
-;; - a gtk button
-;; - a gtk toggle button
-;; - a gtk slider button
-;; - an xembed window(using gtk_socket) showing another emacs instance
-;; - an xembed window(using gtk_socket) showing an uzbl web browser if its
installed
-
-;;the widgets will move when you type in the buffer. good!
-
-;;there will be redrawing issues when widgets change rows, etc. bad!
-
-;;its currently difficult to give kbd focus to the xembedded emacs,
-;;but try evaling the following:
-
-;; (xwidget-set-keyboard-grab 3 1)
-
-
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; demo/test functions
-(require 'xwidget)
-
-(defmacro xwidget-demo (name &rest body)
- `(defun ,(intern (concat "xwidget-demo-" name)) ()
- (interactive)
- (switch-to-buffer ,(format "*xwidget-demo-%s*" name))
- (text-mode);;otherwise no local keymap
- (insert "Some random text for xwidgets to be inserted in for demo
purposes.\n")
- ,@body))
-
-(xwidget-demo "a-button"
- (xwidget-insert (point-min) 'Button "button" 60 50)
- (define-key (current-local-map) [xwidget-event]
'xwidget-handler-demo-basic))
-
-(xwidget-demo "a-button-bidi"
- (xwidget-insert (+ 5 (point-min)) 'Button "button" 60 50)
- (set (make-local-variable 'bidi-paragraph-direction)
'right-to-left)
- (define-key (current-local-map) [xwidget-event]
'xwidget-handler-demo-basic))
-
-
-(xwidget-demo "a-toggle-button"
- (xwidget-insert (point-min) 'ToggleButton "toggle" 60 50)
- (define-key (current-local-map) [xwidget-event]
'xwidget-handler-demo-basic))
-
-(xwidget-demo "a-big-button"
- (xwidget-insert (point-min) 'Button "button" 400 500)
- (define-key (current-local-map) [xwidget-event]
'xwidget-handler-demo-basic))
-
-(xwidget-demo "a-socket"
- (xwidget-insert (point-min) 'socket "socket" 500 500)
- (define-key (current-local-map) [xwidget-event]
'xwidget-handler-demo-basic))
-
-(xwidget-demo "a-socket-osr-broken"
- (xwidget-insert (point-min) 'socket-osr "socket-osr" 500 500)
- (define-key (current-local-map) [xwidget-event]
'xwidget-handler-demo-basic))
-
-
-(xwidget-demo "a-slider"
- (xwidget-insert (point-min) 'slider "slider" 500 100)
- (define-key (current-local-map) [xwidget-event]
'xwidget-handler-demo-basic))
-
-(xwidget-demo "a-canvas"
- (xwidget-insert (point-min) 'cairo "canvas" 1000 1000)
- (define-key (current-local-map) [xwidget-event]
'xwidget-handler-demo-basic))
-
-(xwidget-demo "a-webkit-broken"
- (xwidget-insert (point-min) 'webkit "webkit" 1000 1000)
- (define-key (current-local-map) [xwidget-event]
'xwidget-handler-demo-basic))
-
-(xwidget-demo "a-webkit-osr"
- (xwidget-insert (point-min) 'webkit-osr "webkit-osr" 1000 1000)
- (define-key (current-local-map) [xwidget-event]
'xwidget-handler-demo-basic)
- (xwidget-webkit-goto-uri (xwidget-at 1) "http://www.fsf.org"))
-
-(xwidget-demo "a-xwgir"
- (xwidget-insert (point-min) 'xwgir "xwgir" 1000 1000)
- (define-key (current-local-map) [xwidget-event]
'xwidget-handler-demo-basic))
-
-(xwidget-demo "a-xwgir-color-button"
- (xwgir-require-namespace "Gtk" "3.0")
- (put 'ColorButton :xwgir-class '("Gtk" "ColorSelection" "new"))
- (xwidget-insert (point-min) 'ColorButton "xwgir-color-button"
1000 1000)
- (define-key (current-local-map) [xwidget-event]
'xwidget-handler-demo-basic))
-
-(xwidget-demo "a-xwgir-button"
- (xwgir-require-namespace "Gtk" "3.0")
- (put 'xwgirButton :xwgir-class '("Gtk" "Button" "new"))
-
- (xwidget-insert (point-min) 'xwgirButton "xwgir label didnt
work..." 700 700)
- (xwgir-xwidget-call-method (xwidget-at 1) "set_label" '( "xwgir
label worked!"))
- (define-key (current-local-map) [xwidget-event]
'xwidget-handler-demo-basic))
-
-(xwidget-demo "a-xwgir-button-constructor"
- (xwgir-require-namespace "Gtk" "3.0")
- (put 'xwgirButtonLabel :xwgir-class '("Gtk" "Button"
"new_with_label"))
-
- (xwidget-insert (point-min) 'xwgirButtonLabel "xwgir label
didnt work..." 700 700 '("constructor label worked!"))
- (define-key (current-local-map) [xwidget-event]
'xwidget-handler-demo-basic))
-
-
-(xwidget-demo "a-xwgir-check-button"
- (xwgir-require-namespace "Gtk" "3.0")
- (put 'xwgirCheckButton :xwgir-class '("Gtk" "CheckButton" "new"))
-
- (xwidget-insert (point-min) 'xwgirCheckButton "xwgir label
didnt work..." 700 700)
- (define-key (current-local-map) [xwidget-event]
'xwidget-handler-demo-basic))
-
-(xwidget-demo "a-xwgir-hscale-broken"
- (xwgir-require-namespace "Gtk" "3.0")
- (put 'xwgirHScale :xwgir-class '("Gtk" "HScale" "new_with_range"
))
-
- (xwidget-insert (point-min) 'xwgirHScale "xwgir label didnt
work..." 700 700 '(0.0 100.0 1.0))
- (define-key (current-local-map) [xwidget-event]
'xwidget-handler-demo-basic))
-
-(xwidget-demo "a-xwgir-webkit"
- (xwgir-require-namespace "WebKit" "3.0")
- (put 'xwgirWebkit :xwgir-class '("WebKit" "WebView"))
-
- (xwidget-insert (point-min) 'xwgirWebkit "xwgir webkit..." 700
700)
- (define-key (current-local-map) [xwidget-event]
'xwidget-handler-demo-basic))
-
-
-
-;; tentative testcase:
-;; (xwgir-require-namespace "WebKit" "3.0")
-
-;; (put 'webkit-osr :xwgir-class '("WebKit" "WebView"))
-;; (xwgir-call-method (xwidget-at 1) "set_zoom_level" '(3.0))
-
-;; (xwgir-require-namespace "Gtk" "3.0")
-;; (put 'color-selection :xwgir-class '("Gtk" "ColorSelection"))
-
-
-(xwidget-demo "basic"
- (xwidget-insert (point-min) 'button "button" 40 50 )
- (xwidget-insert 15 'toggle "toggle" 60 30 )
- (xwidget-insert 30 'socket "emacs" 400 200 )
- (xwidget-insert 20 'slider "slider" 100 50 )
- (xwidget-insert 40 'socket "uzbl-core" 400 400 )
- (define-key (current-local-map) [xwidget-event] 'xwidget-handler-demo-basic)
-)
-
-
-;it doesnt seem gtk_socket_steal works very well. its deprecated.
-; xwininfo -int
-; then (xwidget-embed-steal 3 <winid>)
-(defun xwidget-demo-grab ()
- (interactive)
- (insert "0 <<< grabbed appp will appear here\n")
- (xwidget-insert 1 1 3 "1" 1000 )
- (define-key (current-local-map) [xwidget-event] 'xwidget-handler-demo-grab)
- )
-
-;ive basically found these xembeddable things:
-;openvrml
-;emacs
-;mplayer
-;surf
-;uzbl
-
-;try the openvrml:
-;/usr/libexec/openvrml-xembed 0 ~/Desktop/HelloWorld.wrl
-
-(defun xwidget-handler-demo-basic ()
- (interactive)
- (message "stuff happened to xwidget %S" last-input-event)
- (let*
- ((xwidget-event-type (nth 1 last-input-event))
- (xwidget (nth 2 last-input-event)))
- (cond ( (eq xwidget-event-type 'xembed-ready)
- (let*
- ((xembed-id (nth 3 last-input-event)))
- (message "xembed ready event: %S xw-id:%s" xembed-id xwidget)
- ;;will start emacs/uzbl in a xembed socket when its ready
- (cond
- (t;;(eq 3 xwidget)
- (start-process "xembed" "*xembed*"
"/var/lib/jenkins/jobs/emacs-xwidgets-automerge/workspace/src/emacs" "-q"
"--parent-id" (number-to-string xembed-id) ) )
-;; ((eq 5 xwidget-id)
-;; (start-process "xembed2" "*xembed2*" "uzbl-core" "-s"
(number-to-string xembed-id) "http://www.fsf.org" )
- )
-
- )
- ))))
-
-
-
-(defun xwidget-handler-demo-grab ()
- (interactive)
- (message "stuff happened to xwidget %S" last-input-event)
- (let*
- ((xwidget-event-type (nth 2 last-input-event)))
- (cond ( (eq xwidget-event-type 'xembed-ready)
- (let*
- ((xembed-id (nth 3 last-input-event)))
- (message "xembed ready %S" xembed-id)
- )
- ))))
-(defun xwidget-dummy-hook ()
- (message "xwidget dummy hook called"))
-
-; (xwidget-resize-hack 1 200 200)
-
-;(xwidget-demo-basic)
-
-(provide 'xwidget-test-manual)