diff options
| author | Joakim Verona | 2011-08-17 12:18:26 +0200 |
|---|---|---|
| committer | Joakim Verona | 2011-08-17 12:18:26 +0200 |
| commit | 66a5c19422ef1290b0ead02d408751a3ab4dd20c (patch) | |
| tree | 41336e64105466eec5ad3cda756428830024c68d | |
| parent | fc04ef54a8ae05bdb91fd1018ac780d6eec5c23a (diff) | |
| download | emacs-66a5c19422ef1290b0ead02d408751a3ab4dd20c.tar.gz emacs-66a5c19422ef1290b0ead02d408751a3ab4dd20c.zip | |
some keyboard event code but it still crashes
| -rw-r--r-- | README.xwidget | 1 | ||||
| -rw-r--r-- | lisp/xwidget.el | 12 | ||||
| -rw-r--r-- | src/xwidget.c | 55 |
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. | |||
| 389 | the widgets seems to receive the event but then the embedded widgets | 389 | the widgets seems to receive the event but then the embedded widgets |
| 390 | hangs. | 390 | hangs. |
| 391 | 391 | ||
| 392 | http://kegel.com/gtk/button.c | ||
| 392 | 393 | ||
| 393 | *** TODO examine some library to synthesise events | 394 | *** TODO examine some library to synthesise events |
| 394 | xdotool | 395 | xdotool |
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 | ||
| 970 | DEFUN ("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 | |||
| 945 | DEFUN ("set-xwidget-plist", Fset_xwidget_plist, Sset_xwidget_plist, | 979 | DEFUN ("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"); |