aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoakim Verona2011-08-17 12:18:26 +0200
committerJoakim Verona2011-08-17 12:18:26 +0200
commit66a5c19422ef1290b0ead02d408751a3ab4dd20c (patch)
tree41336e64105466eec5ad3cda756428830024c68d
parentfc04ef54a8ae05bdb91fd1018ac780d6eec5c23a (diff)
downloademacs-66a5c19422ef1290b0ead02d408751a3ab4dd20c.tar.gz
emacs-66a5c19422ef1290b0ead02d408751a3ab4dd20c.zip
some keyboard event code but it still crashes
-rw-r--r--README.xwidget1
-rw-r--r--lisp/xwidget.el12
-rw-r--r--src/xwidget.c55
3 files changed, 54 insertions, 14 deletions
diff --git a/README.xwidget b/README.xwidget
index b143f5e108c..598ef229353 100644
--- a/README.xwidget
+++ b/README.xwidget
@@ -389,6 +389,7 @@ but, oh no, that didn't work for some reason.
389the widgets seems to receive the event but then the embedded widgets 389the widgets seems to receive the event but then the embedded widgets
390hangs. 390hangs.
391 391
392http://kegel.com/gtk/button.c
392 393
393*** TODO examine some library to synthesise events 394*** TODO examine some library to synthesise events
394xdotool 395xdotool
diff --git a/lisp/xwidget.el b/lisp/xwidget.el
index 643306085e8..1700a37b500 100644
--- a/lisp/xwidget.el
+++ b/lisp/xwidget.el
@@ -150,10 +150,14 @@ defaults to the string looking like a url around the cursor position."
150 (funcall xwidget-callback xwidget xwidget-event-type))) 150 (funcall xwidget-callback xwidget xwidget-event-type)))
151 151
152(defun xwidget-webkit-callback (xwidget xwidget-event-type) 152(defun xwidget-webkit-callback (xwidget xwidget-event-type)
153 (cond ((eq xwidget-event-type 'document-load-finished) 153 (save-excursion
154 (message "webkit finished loading %s" xwidget) 154 (set-buffer (xwidget-buffer xwidget))
155 (xwidget-adjust-size-to-content xwidget)) 155 (cond ((eq xwidget-event-type 'document-load-finished)
156 )) 156 (message "webkit finished loading %s" xwidget)
157 (xwidget-adjust-size-to-content xwidget)
158 (rename-buffer (format "*xwidget webkit: %s *" (xwidget-webkit-get-title xwidget)))
159 )
160 )))
157 161
158(define-derived-mode xwidget-webkit-mode 162(define-derived-mode xwidget-webkit-mode
159 special-mode "xwidget-webkit" "xwidget webkit view mode" 163 special-mode "xwidget-webkit" "xwidget webkit view mode"
diff --git a/src/xwidget.c b/src/xwidget.c
index 5e460f64dff..b3fe4026879 100644
--- a/src/xwidget.c
+++ b/src/xwidget.c
@@ -165,6 +165,7 @@ DEFUN ("make-xwidget", Fmake_xwidget, Smake_xwidget, 7, 7, 0,
165 GCPRO1(xw); 165 GCPRO1(xw);
166 XSETSYMBOL(xw->type, type); 166 XSETSYMBOL(xw->type, type);
167 XSETSTRING(xw->title, title); 167 XSETSTRING(xw->title, title);
168 //TODO buffer should be an optional argument not just assumed to be the current buffer
168 XSETBUFFER(xw->buffer, Fcurrent_buffer()); // conservatively gcpro xw since we call lisp 169 XSETBUFFER(xw->buffer, Fcurrent_buffer()); // conservatively gcpro xw since we call lisp
169 xw->height = XFASTINT(height); 170 xw->height = XFASTINT(height);
170 xw->width = XFASTINT(width); 171 xw->width = XFASTINT(width);
@@ -883,25 +884,49 @@ DEFUN ("xwidget-send-keyboard-event", Fxwidget_send_keyboard_event, Sxwidget_sen
883 ) 884 )
884 (Lisp_Object xwidget, Lisp_Object keydescriptor) 885 (Lisp_Object xwidget, Lisp_Object keydescriptor)
885{ 886{
886 //TODO this code crashes and ive tried many different strategies 887 //TODO this code crashes for offscreen widgets and ive tried many different strategies
887 int keyval = 0x058; //X 888 int keyval = 0x058; //X
888 char *keystring = ""; 889 char *keystring = "";
889 890 GdkKeymapKey* keys;
891 gint n_keys;
892 gdk_keymap_get_entries_for_keyval(gdk_keymap_get_default(), keyval, &keys, &n_keys);
893
890 struct xwidget *xw = XXWIDGET(xwidget); 894 struct xwidget *xw = XXWIDGET(xwidget);
891 895
892 GdkEventKey* ev = (GdkEventKey*)gdk_event_new(GDK_KEY_PRESS); 896 GdkEventKey* ev = (GdkEventKey*)gdk_event_new(GDK_KEY_PRESS);
893 ev->window = gtk_widget_get_window(xw->widget_osr); 897
898
899 //todo what about windowless widgets?
900 Lisp_Object window;
901 window = FRAME_SELECTED_WINDOW (SELECTED_FRAME ());
902 GtkWidget* widget;
903
904 if(xw->widget_osr)
905 widget = xw->widget_osr;
906 else
907 widget = xwidget_view_lookup(xw, XWINDOW(window))->widget;
908
909 ev->window = gtk_widget_get_window(widget);
910 gtk_widget_grab_focus(widget);
911 ev->send_event = FALSE;
912
913 ev->hardware_keycode = keys[0].keycode;
914 ev->group = keys[0].group;
915
894 ev->keyval = keyval; 916 ev->keyval = keyval;
895 ev->time = 0; 917 ev->time = GDK_CURRENT_TIME;
918
919 //ev->device = gdk_device_get_core_pointer();
896 GdkDeviceManager* manager = gdk_display_get_device_manager(gdk_window_get_display(ev->window)); 920 GdkDeviceManager* manager = gdk_display_get_device_manager(gdk_window_get_display(ev->window));
897 gdk_event_set_device (ev, gdk_device_manager_get_client_pointer(manager)); 921 gdk_event_set_device ((GdkEvent*)ev, gdk_device_manager_get_client_pointer(manager));
898 //gdk_event_put((GdkEvent*)ev); 922 gdk_event_put((GdkEvent*)ev);
899 g_signal_emit_by_name(ev->window,"key-press-event", ev); 923 //g_signal_emit_by_name(ev->window,"key-press-event", ev);
924
900 ev->type = GDK_KEY_RELEASE; 925 ev->type = GDK_KEY_RELEASE;
901 //gdk_event_put((GdkEvent*)ev); 926 gdk_event_put((GdkEvent*)ev);
902 g_signal_emit_by_name(ev->window,"key-release-event", ev); 927 //g_signal_emit_by_name(ev->window,"key-release-event", ev);
903 //gtk_main_do_event(ev); 928 //gtk_main_do_event(ev);
904 //gdk_event_free((GdkEvent*)ev); 929 gdk_event_free((GdkEvent*)ev);
905 930
906 return Qnil; 931 return Qnil;
907} 932}
@@ -942,6 +967,15 @@ DEFUN ("xwidget-plist", Fxwidget_plist, Sxwidget_plist,
942 return XXWIDGET (xwidget)->plist; 967 return XXWIDGET (xwidget)->plist;
943} 968}
944 969
970DEFUN ("xwidget-buffer", Fxwidget_buffer, Sxwidget_buffer,
971 1, 1, 0,
972 doc: /* Return the buffer of XWIDGET. */)
973 (register Lisp_Object xwidget)
974{
975 //CHECK_XWIDGET (xwidget); //todo
976 return XXWIDGET (xwidget)->buffer;
977}
978
945DEFUN ("set-xwidget-plist", Fset_xwidget_plist, Sset_xwidget_plist, 979DEFUN ("set-xwidget-plist", Fset_xwidget_plist, Sset_xwidget_plist,
946 2, 2, 0, 980 2, 2, 0,
947 doc: /* Replace the plist of XWIDGET with PLIST. Returns PLIST. */) 981 doc: /* Replace the plist of XWIDGET with PLIST. Returns PLIST. */)
@@ -981,6 +1015,7 @@ syms_of_xwidget (void)
981 defsubr (&Sxwidget_send_keyboard_event); 1015 defsubr (&Sxwidget_send_keyboard_event);
982 defsubr (&Sxwidget_webkit_dom_dump); 1016 defsubr (&Sxwidget_webkit_dom_dump);
983 defsubr (&Sxwidget_plist); 1017 defsubr (&Sxwidget_plist);
1018 defsubr (&Sxwidget_buffer);
984 defsubr (&Sset_xwidget_plist); 1019 defsubr (&Sset_xwidget_plist);
985 1020
986 DEFSYM (Qxwidget ,"xwidget"); 1021 DEFSYM (Qxwidget ,"xwidget");