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 /src | |
| parent | fc04ef54a8ae05bdb91fd1018ac780d6eec5c23a (diff) | |
| download | emacs-66a5c19422ef1290b0ead02d408751a3ab4dd20c.tar.gz emacs-66a5c19422ef1290b0ead02d408751a3ab4dd20c.zip | |
some keyboard event code but it still crashes
Diffstat (limited to 'src')
| -rw-r--r-- | src/xwidget.c | 55 |
1 files changed, 45 insertions, 10 deletions
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"); |