aboutsummaryrefslogtreecommitdiffstats
path: root/src/xwidget.c
diff options
context:
space:
mode:
authorJoakim Verona2011-08-17 12:18:26 +0200
committerJoakim Verona2011-08-17 12:18:26 +0200
commit66a5c19422ef1290b0ead02d408751a3ab4dd20c (patch)
tree41336e64105466eec5ad3cda756428830024c68d /src/xwidget.c
parentfc04ef54a8ae05bdb91fd1018ac780d6eec5c23a (diff)
downloademacs-66a5c19422ef1290b0ead02d408751a3ab4dd20c.tar.gz
emacs-66a5c19422ef1290b0ead02d408751a3ab4dd20c.zip
some keyboard event code but it still crashes
Diffstat (limited to 'src/xwidget.c')
-rw-r--r--src/xwidget.c55
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
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");