From 0b43aa3cc7b385da8ca32d5965a0f90c669cc325 Mon Sep 17 00:00:00 2001 From: Joakim Verona Date: Sun, 8 Feb 2015 18:39:04 +0100 Subject: [PATCH] simplify --- src/xwidget.c | 671 ++---------------------------------- test/xwidget-test-manual.el | 212 ------------ 2 files changed, 37 insertions(+), 846 deletions(-) delete mode 100644 test/xwidget-test-manual.el diff --git a/src/xwidget.c b/src/xwidget.c index b68d3cb70ff..aff5687d523 100644 --- a/src/xwidget.c +++ b/src/xwidget.c @@ -96,14 +96,6 @@ #include #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 1c9b181467a..00000000000 --- 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 ) -(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) -- 2.39.5