diff options
| author | Joakim Verona | 2013-07-25 14:16:20 -0700 |
|---|---|---|
| committer | Joakim Verona | 2013-07-25 14:16:20 -0700 |
| commit | 2427b15992fe47646a2bf2b55891f1e482dedaa0 (patch) | |
| tree | a44d448d10a071c95e81c410a76580ae63480ca1 /src/xwidget.c | |
| parent | 5558a52357ad7871aa2f66901032f6abb18485a5 (diff) | |
| parent | 45219ddc2111f8a49c78472cbe80e1ed01e84dc2 (diff) | |
| download | emacs-2427b15992fe47646a2bf2b55891f1e482dedaa0.tar.gz emacs-2427b15992fe47646a2bf2b55891f1e482dedaa0.zip | |
Merge pull request #14 from daimrod/offscreen_forward_events
Offscreen forward events
Diffstat (limited to 'src/xwidget.c')
| -rw-r--r-- | src/xwidget.c | 258 |
1 files changed, 81 insertions, 177 deletions
diff --git a/src/xwidget.c b/src/xwidget.c index 80cfd8355df..f7f47606ea9 100644 --- a/src/xwidget.c +++ b/src/xwidget.c | |||
| @@ -132,8 +132,7 @@ extern Lisp_Object QCwidth, QCheight; | |||
| 132 | 132 | ||
| 133 | struct xwidget_view* xwidget_view_lookup(struct xwidget* xw, struct window *w); | 133 | struct xwidget_view* xwidget_view_lookup(struct xwidget* xw, struct window *w); |
| 134 | Lisp_Object xwidget_spec_value ( Lisp_Object spec, Lisp_Object key, int *found); | 134 | Lisp_Object xwidget_spec_value ( Lisp_Object spec, Lisp_Object key, int *found); |
| 135 | gboolean xwidget_osr_damage_event_callback (GtkWidget *widget, GdkEventExpose *event, gpointer data) ; | 135 | gboolean offscreen_damage_event (GtkWidget *widget, GdkEvent *event, gpointer data); |
| 136 | gboolean webkit_osr_key_event_callback (GtkWidget *widget, GdkEventKey *event, gpointer data) ; | ||
| 137 | void webkit_osr_document_load_finished_callback (WebKitWebView *webkitwebview, | 136 | void webkit_osr_document_load_finished_callback (WebKitWebView *webkitwebview, |
| 138 | WebKitWebFrame *arg1, | 137 | WebKitWebFrame *arg1, |
| 139 | gpointer user_data); | 138 | gpointer user_data); |
| @@ -163,11 +162,6 @@ gboolean webkit_osr_navigation_policy_decision_requested_callback(WebKitWebView | |||
| 163 | WebKitWebPolicyDecision *policy_decision, | 162 | WebKitWebPolicyDecision *policy_decision, |
| 164 | gpointer user_data); | 163 | gpointer user_data); |
| 165 | 164 | ||
| 166 | gboolean | ||
| 167 | xwgir_event_callback (GtkWidget *widget, | ||
| 168 | GdkEvent *event, | ||
| 169 | gpointer user_data); | ||
| 170 | |||
| 171 | GtkWidget* xwgir_create(char* class, char* namespace); | 165 | GtkWidget* xwgir_create(char* class, char* namespace); |
| 172 | static void | 166 | static void |
| 173 | send_xembed_ready_event (struct xwidget* xw, int xembedid); | 167 | send_xembed_ready_event (struct xwidget* xw, int xembedid); |
| @@ -224,9 +218,8 @@ TYPE is a symbol which can take one of the following values: | |||
| 224 | if (EQ(xw->type, Qwebkit_osr)|| | 218 | if (EQ(xw->type, Qwebkit_osr)|| |
| 225 | EQ(xw->type, Qsocket_osr)|| | 219 | EQ(xw->type, Qsocket_osr)|| |
| 226 | (!NILP (Fget(xw->type, QCxwgir_class)))) { | 220 | (!NILP (Fget(xw->type, QCxwgir_class)))) { |
| 227 | printf("init osr widget\n"); | ||
| 228 | block_input(); | 221 | block_input(); |
| 229 | xw->widgetwindow_osr = GTK_CONTAINER (gtk_offscreen_window_new ()); | 222 | xw->widgetwindow_osr = gtk_offscreen_window_new (); |
| 230 | gtk_window_resize(GTK_WINDOW(xw->widgetwindow_osr), xw->width, xw->height); | 223 | gtk_window_resize(GTK_WINDOW(xw->widgetwindow_osr), xw->width, xw->height); |
| 231 | 224 | ||
| 232 | if (EQ(xw->type, Qwebkit_osr)) | 225 | if (EQ(xw->type, Qwebkit_osr)) |
| @@ -238,18 +231,16 @@ TYPE is a symbol which can take one of the following values: | |||
| 238 | SDATA(Fcar(Fget(xw->type, QCxwgir_class)))); | 231 | SDATA(Fcar(Fget(xw->type, QCxwgir_class)))); |
| 239 | 232 | ||
| 240 | gtk_widget_set_size_request (GTK_WIDGET (xw->widget_osr), xw->width, xw->height); | 233 | gtk_widget_set_size_request (GTK_WIDGET (xw->widget_osr), xw->width, xw->height); |
| 241 | gtk_container_add (xw->widgetwindow_osr, xw->widget_osr); | 234 | gtk_container_add (GTK_CONTAINER (xw->widgetwindow_osr), xw->widget_osr); |
| 242 | 235 | ||
| 243 | gtk_widget_show_all (GTK_WIDGET (xw->widgetwindow_osr)); | 236 | gtk_widget_show (xw->widget_osr); |
| 237 | gtk_widget_show (xw->widgetwindow_osr); | ||
| 244 | 238 | ||
| 245 | /* store some xwidget data in the gtk widgets for convenient retrieval in the event handlers. */ | 239 | /* store some xwidget data in the gtk widgets for convenient retrieval in the event handlers. */ |
| 246 | g_object_set_data (G_OBJECT (xw->widget_osr), XG_XWIDGET, (gpointer) (xw)); | 240 | g_object_set_data (G_OBJECT (xw->widget_osr), XG_XWIDGET, (gpointer) (xw)); |
| 247 | g_object_set_data (G_OBJECT (xw->widgetwindow_osr), XG_XWIDGET, (gpointer) (xw)); | 241 | g_object_set_data (G_OBJECT (xw->widgetwindow_osr), XG_XWIDGET, (gpointer) (xw)); |
| 248 | 242 | ||
| 249 | /* signals */ | 243 | /* signals */ |
| 250 | g_signal_connect (G_OBJECT (xw->widgetwindow_osr), "damage-event", | ||
| 251 | G_CALLBACK (xwidget_osr_damage_event_callback), NULL); | ||
| 252 | |||
| 253 | if (EQ(xw->type, Qwebkit_osr)) { | 244 | if (EQ(xw->type, Qwebkit_osr)) { |
| 254 | g_signal_connect (G_OBJECT (xw->widget_osr), | 245 | g_signal_connect (G_OBJECT (xw->widget_osr), |
| 255 | "document-load-finished", | 246 | "document-load-finished", |
| @@ -275,15 +266,9 @@ TYPE is a symbol which can take one of the following values: | |||
| 275 | "navigation-policy-decision-requested", | 266 | "navigation-policy-decision-requested", |
| 276 | G_CALLBACK (webkit_osr_navigation_policy_decision_requested_callback), | 267 | G_CALLBACK (webkit_osr_navigation_policy_decision_requested_callback), |
| 277 | xw); | 268 | xw); |
| 278 | //webkit_web_view_load_uri(WEBKIT_WEB_VIEW(xw->widget_osr), "http://www.fsf.org"); | ||
| 279 | |||
| 280 | } | 269 | } |
| 281 | 270 | ||
| 282 | if (EQ(xw->type, Qsocket_osr)) { | 271 | if (EQ(xw->type, Qsocket_osr)) { |
| 283 | printf ("xwid:%d socket id:%x %d\n", | ||
| 284 | xw, | ||
| 285 | gtk_socket_get_id (GTK_SOCKET (xw->widget_osr)), | ||
| 286 | gtk_socket_get_id (GTK_SOCKET (xw->widget_osr))); | ||
| 287 | send_xembed_ready_event (xw, gtk_socket_get_id (GTK_SOCKET (xw->widget_osr))); | 272 | send_xembed_ready_event (xw, gtk_socket_get_id (GTK_SOCKET (xw->widget_osr))); |
| 288 | //gtk_widget_realize(xw->widget); | 273 | //gtk_widget_realize(xw->widget); |
| 289 | } | 274 | } |
| @@ -377,8 +362,8 @@ void | |||
| 377 | xwidget_show_view (struct xwidget_view *xv) | 362 | xwidget_show_view (struct xwidget_view *xv) |
| 378 | { | 363 | { |
| 379 | xv->hidden = 0; | 364 | xv->hidden = 0; |
| 380 | gtk_widget_show(GTK_WIDGET(xv->widgetwindow)); | 365 | gtk_widget_show(xv->widgetwindow); |
| 381 | gtk_fixed_move (GTK_FIXED (xv->emacswindow), GTK_WIDGET (xv->widgetwindow), xv->x + xv->clip_left, xv->y + xv->clip_top); //TODO refactor | 366 | gtk_fixed_move (GTK_FIXED (xv->emacswindow), xv->widgetwindow, xv->x + xv->clip_left, xv->y + xv->clip_top); //TODO refactor |
| 382 | } | 367 | } |
| 383 | 368 | ||
| 384 | 369 | ||
| @@ -387,8 +372,8 @@ void | |||
| 387 | xwidget_hide_view (struct xwidget_view *xv) | 372 | xwidget_hide_view (struct xwidget_view *xv) |
| 388 | { | 373 | { |
| 389 | xv->hidden = 1; | 374 | xv->hidden = 1; |
| 390 | //gtk_widget_hide(GTK_WIDGET(xw->widgetwindow)); | 375 | //gtk_widget_hide(xw->widgetwindow); |
| 391 | gtk_fixed_move (GTK_FIXED (xv->emacswindow), GTK_WIDGET (xv->widgetwindow), | 376 | gtk_fixed_move (GTK_FIXED (xv->emacswindow), xv->widgetwindow, |
| 392 | 10000, 10000); | 377 | 10000, 10000); |
| 393 | } | 378 | } |
| 394 | 379 | ||
| @@ -450,38 +435,13 @@ xwidget_slider_changed (GtkRange *range, | |||
| 450 | /* when the off-screen webkit master view changes this signal is called. | 435 | /* when the off-screen webkit master view changes this signal is called. |
| 451 | it copies the bitmap from the off-screen webkit instance */ | 436 | it copies the bitmap from the off-screen webkit instance */ |
| 452 | gboolean | 437 | gboolean |
| 453 | xwidget_osr_damage_event_callback (GtkWidget *widget, GdkEventExpose *event, gpointer data) | 438 | offscreen_damage_event (GtkWidget *widget, GdkEvent *event, gpointer data) |
| 454 | { | 439 | { |
| 455 | //TODO this is wrong! should just queu a redraw of onscreen widget | 440 | //TODO this is wrong! should just queu a redraw of onscreen widget |
| 456 | struct xwidget* xw = (struct xwidget*) g_object_get_data (G_OBJECT (widget), XG_XWIDGET); | 441 | gtk_widget_queue_draw (GTK_WIDGET (data)); |
| 457 | struct xwidget_view* xv; | ||
| 458 | //webkit_osr_redraw_child(xw, widget); | ||
| 459 | printf ("damage\n"); | ||
| 460 | |||
| 461 | for (Lisp_Object tail = Vxwidget_view_list; CONSP (tail); tail = XCDR (tail)) | ||
| 462 | { | ||
| 463 | if (XWIDGET_VIEW_P (XCAR (tail))) { | ||
| 464 | xv = XXWIDGET_VIEW (XCAR (tail)); | ||
| 465 | if (XXWIDGET (xv->model) == xw) | ||
| 466 | gtk_widget_queue_draw (xv->widget); //redraw all views, the master has changed | ||
| 467 | } | ||
| 468 | } | ||
| 469 | |||
| 470 | return FALSE; | 442 | return FALSE; |
| 471 | } | 443 | } |
| 472 | 444 | ||
| 473 | |||
| 474 | |||
| 475 | gboolean | ||
| 476 | webkit_osr_key_event_callback (GtkWidget *widget, GdkEventKey *event, gpointer data) | ||
| 477 | { | ||
| 478 | printf("terminating a webkit osr keypress\n"); | ||
| 479 | //TRUE terminate the event here. no paren handlers will be called. but webkit then doesng get the event and it still crashes | ||
| 480 | //FALSE paren handlers will be called. webkit then gets the event and it still crashes | ||
| 481 | return TRUE; | ||
| 482 | } | ||
| 483 | |||
| 484 | |||
| 485 | void | 445 | void |
| 486 | store_xwidget_event_string(struct xwidget* xw, char* eventname, const char* eventstr) | 446 | store_xwidget_event_string(struct xwidget* xw, char* eventname, const char* eventstr) |
| 487 | { | 447 | { |
| @@ -595,14 +555,10 @@ xwidget_osr_draw_callback (GtkWidget *widget, cairo_t *cr, gpointer data) | |||
| 595 | struct xwidget* xw = (struct xwidget*) g_object_get_data (G_OBJECT (widget), XG_XWIDGET); | 555 | struct xwidget* xw = (struct xwidget*) g_object_get_data (G_OBJECT (widget), XG_XWIDGET); |
| 596 | struct xwidget_view* xv = (struct xwidget_view*) g_object_get_data (G_OBJECT (widget), XG_XWIDGET_VIEW); | 556 | struct xwidget_view* xv = (struct xwidget_view*) g_object_get_data (G_OBJECT (widget), XG_XWIDGET_VIEW); |
| 597 | 557 | ||
| 598 | printf("xwidget_osr_draw_callback gtk3 xw.id:%d xw.type:%d window:%d vis:%d\n", | ||
| 599 | xw,xw->type, gtk_widget_get_window (widget), gtk_widget_get_visible (xw->widget_osr)); | ||
| 600 | |||
| 601 | cairo_rectangle(cr, 0,0, xv->clip_right, xv->clip_bottom);//xw->width, xw->height); | 558 | cairo_rectangle(cr, 0,0, xv->clip_right, xv->clip_bottom);//xw->width, xw->height); |
| 602 | cairo_clip(cr); | 559 | cairo_clip(cr); |
| 603 | 560 | ||
| 604 | gtk_widget_draw (xw->widget_osr, cr); | 561 | gtk_widget_draw (xw->widget_osr, cr); |
| 605 | |||
| 606 | 562 | ||
| 607 | return FALSE; | 563 | return FALSE; |
| 608 | } | 564 | } |
| @@ -649,20 +605,6 @@ xwidget_osr_event_forward (GtkWidget *widget, | |||
| 649 | //return FALSE; //dont propagate this event furter | 605 | //return FALSE; //dont propagate this event furter |
| 650 | } | 606 | } |
| 651 | 607 | ||
| 652 | gboolean | ||
| 653 | xwgir_event_callback (GtkWidget *widget, | ||
| 654 | GdkEvent *event, | ||
| 655 | gpointer user_data) | ||
| 656 | { | ||
| 657 | //debugging | ||
| 658 | //perhaps delete copied events here | ||
| 659 | struct xwidget* xw = (struct xwidget*) g_object_get_data (G_OBJECT (widget), XG_XWIDGET); | ||
| 660 | printf("xwgir_event_callback\n"); | ||
| 661 | return FALSE; | ||
| 662 | } | ||
| 663 | |||
| 664 | |||
| 665 | |||
| 666 | GIRepository *girepository ; | 608 | GIRepository *girepository ; |
| 667 | DEFUN( "xwgir-require-namespace",Fxwgir_require_namespace, Sxwgir_require_namespace, 2,2,0, | 609 | DEFUN( "xwgir-require-namespace",Fxwgir_require_namespace, Sxwgir_require_namespace, 2,2,0, |
| 668 | doc: /*require a namespace. must be done for all namespaces we want to use, before using other xwgir functions.*/) | 610 | doc: /*require a namespace. must be done for all namespaces we want to use, before using other xwgir functions.*/) |
| @@ -887,67 +829,53 @@ to_child (GtkWidget *bin, | |||
| 887 | } | 829 | } |
| 888 | 830 | ||
| 889 | 831 | ||
| 890 | void | 832 | GdkWindow * |
| 891 | offscreen_window_from_parent (GdkWindow *window, | 833 | offscreen_pick_embedded_child (GdkWindow *window, |
| 892 | double parent_x, | 834 | double x, |
| 893 | double parent_y, | 835 | double y, |
| 894 | double *offscreen_x, | 836 | gpointer *data) |
| 895 | double *offscreen_y, | ||
| 896 | GtkWidget *bin) | ||
| 897 | { | ||
| 898 | /* printf("offscreen_window_from_parent %d %f,%f %f,%f\n", */ | ||
| 899 | /* window, */ | ||
| 900 | /* parent_x, */ | ||
| 901 | /* parent_y, */ | ||
| 902 | /* offscreen_x, */ | ||
| 903 | /* offscreen_y ); */ | ||
| 904 | to_child (bin, parent_x, parent_y, offscreen_x, offscreen_y); | ||
| 905 | } | ||
| 906 | |||
| 907 | GdkWindow * | ||
| 908 | pick_offscreen_child (GdkWindow *offscreen_window, | ||
| 909 | double widget_x, | ||
| 910 | double widget_y, | ||
| 911 | GdkWindow *bin) | ||
| 912 | { | 837 | { |
| 913 | //in this simple case we assume the window contains a single widget. easy. | 838 | //in this simple case we assume the window contains a single widget. easy. |
| 914 | //but then we get the problem that the widget cant be embedded in several windows | 839 | //but then we get the problem that the widget cant be embedded in several windows |
| 915 | printf("pick_offscreen_child %d %f %f %d\n", | 840 | return gtk_widget_get_window (GTK_WIDGET (data)); |
| 916 | offscreen_window, | ||
| 917 | widget_x, | ||
| 918 | widget_y, | ||
| 919 | bin ); | ||
| 920 | return bin; | ||
| 921 | } | 841 | } |
| 922 | 842 | ||
| 923 | |||
| 924 | void | 843 | void |
| 925 | xwidget_set_embedder_view(struct xwidget* xww, | 844 | offscreen_to_embedder (GdkWindow *window, |
| 926 | struct xwidget_view* xv){ | 845 | gdouble offscreen_x, |
| 927 | printf("gdk_offscreen_window_set_embedder %d %d\n", | 846 | gdouble offscreen_y, |
| 928 | GDK_IS_WINDOW(gtk_widget_get_window (xww->widget_osr)), | 847 | gpointer embedder_x, |
| 929 | GDK_IS_WINDOW(gtk_widget_get_window (GTK_WIDGET (xv->widget)))); | 848 | gpointer embedder_y, |
| 930 | //set_embedder needs to be called after xv->widget realization | 849 | gpointer data) |
| 931 | gdk_offscreen_window_set_embedder ( gtk_widget_get_window (xww->widget_osr), | 850 | { |
| 932 | gtk_widget_get_window (GTK_WIDGET (xv->widget)) | 851 | * (gdouble *) embedder_x = offscreen_x; |
| 933 | 852 | * (gdouble *) embedder_y = offscreen_y; | |
| 853 | } | ||
| 934 | 854 | ||
| 935 | ); | 855 | void |
| 936 | //this signal doesnt seem completely necessary | 856 | offscreen_from_embedder (GdkWindow *window, |
| 937 | /* g_signal_connect (gtk_widget_get_window (xww->widget_osr), "from-embedder", */ | 857 | gdouble embedder_x, |
| 938 | /* G_CALLBACK (offscreen_window_from_parent), gtk_widget_get_window (GTK_WIDGET (xv->widget))); */ | 858 | gdouble embedder_y, |
| 939 | //but this one is | 859 | gpointer offscreen_x, |
| 940 | g_signal_connect (gtk_widget_get_window (xv->widget), "pick-embedded-child", | 860 | gpointer offscreen_y, |
| 941 | G_CALLBACK (pick_offscreen_child), gtk_widget_get_window (xww->widget_osr)); | 861 | gpointer user_data) |
| 862 | { | ||
| 863 | * (gdouble *) offscreen_x = embedder_x; | ||
| 864 | * (gdouble *) offscreen_y = embedder_y; | ||
| 942 | } | 865 | } |
| 943 | 866 | ||
| 944 | gboolean | 867 | gboolean |
| 945 | xwidget_osr_event_set_embedder (GtkWidget *widget, | 868 | xwidget_osr_event_set_embedder (GtkWidget *widget, |
| 946 | GdkEvent *event, | 869 | GdkEvent *event, |
| 947 | gpointer xv) | 870 | gpointer data) |
| 948 | { | 871 | { |
| 949 | xwidget_set_embedder_view(XXWIDGET (((struct xwidget_view*) xv)->model), | 872 | struct xwidget_view *xv = (struct xwidget_view *) data; |
| 950 | (struct xwidget_view*) xv); | 873 | struct xwidget *xww = XXWIDGET (xv->model); |
| 874 | printf("gdk_offscreen_window_set_embedder %d %d\n", | ||
| 875 | GDK_IS_WINDOW(gtk_widget_get_window (xww->widget_osr)), | ||
| 876 | GDK_IS_WINDOW(gtk_widget_get_window (GTK_WIDGET (xv->widget)))); | ||
| 877 | gdk_offscreen_window_set_embedder (gtk_widget_get_window (xww->widgetwindow_osr), | ||
| 878 | gtk_widget_get_window (xv->widget)); | ||
| 951 | } | 879 | } |
| 952 | 880 | ||
| 953 | 881 | ||
| @@ -1000,16 +928,15 @@ xwidget_init_view (struct xwidget *xww, | |||
| 1000 | } else if (EQ(xww->type, Qwebkit_osr)|| | 928 | } else if (EQ(xww->type, Qwebkit_osr)|| |
| 1001 | EQ(xww->type, Qsocket_osr)|| | 929 | EQ(xww->type, Qsocket_osr)|| |
| 1002 | (!NILP (Fget(xww->type, QCxwgir_class))))//xwgir widgets are OSR | 930 | (!NILP (Fget(xww->type, QCxwgir_class))))//xwgir widgets are OSR |
| 1003 | { | 931 | { |
| 1004 | #ifdef HAVE_WEBKIT_OSR //TODO the ifdef isnt really relevant anymore, we always have osr | 932 | printf("osr init:%s\n",SDATA(SYMBOL_NAME(xww->type))); |
| 1005 | printf("osr init:%s\n",SDATA(SYMBOL_NAME(xww->type))); | ||
| 1006 | xv->widget = gtk_drawing_area_new(); | 933 | xv->widget = gtk_drawing_area_new(); |
| 1007 | gtk_widget_set_app_paintable ( xv->widget, TRUE); //because expose event handling | 934 | gtk_widget_set_app_paintable ( xv->widget, TRUE); //because expose event handling |
| 1008 | gtk_widget_add_events(xv->widget, | 935 | gtk_widget_add_events(xv->widget, GDK_ALL_EVENTS_MASK); |
| 1009 | GDK_BUTTON_PRESS_MASK | ||
| 1010 | | GDK_BUTTON_RELEASE_MASK | ||
| 1011 | | GDK_POINTER_MOTION_MASK); | ||
| 1012 | 936 | ||
| 937 | /* Draw the view on damage-event */ | ||
| 938 | g_signal_connect (G_OBJECT (xww->widgetwindow_osr), "damage-event", | ||
| 939 | G_CALLBACK (offscreen_damage_event), xv->widget); | ||
| 1013 | 940 | ||
| 1014 | if (EQ(xww->type, Qwebkit_osr)){ | 941 | if (EQ(xww->type, Qwebkit_osr)){ |
| 1015 | /* ///xwgir debug */ | 942 | /* ///xwgir debug */ |
| @@ -1022,37 +949,26 @@ xwidget_init_view (struct xwidget *xww, | |||
| 1022 | G_CALLBACK (xwidget_osr_event_forward), NULL); | 949 | G_CALLBACK (xwidget_osr_event_forward), NULL); |
| 1023 | }else{ | 950 | }else{ |
| 1024 | //xwgir debug , orthogonal to forwarding | 951 | //xwgir debug , orthogonal to forwarding |
| 1025 | g_signal_connect (G_OBJECT ( xv->widget), "motion-notify-event", | 952 | g_signal_connect (G_OBJECT (xv->widget), "enter-notify-event", |
| 1026 | G_CALLBACK (xwidget_osr_event_set_embedder), xv); | 953 | G_CALLBACK (xwidget_osr_event_set_embedder), xv); |
| 1027 | } | 954 | } |
| 1028 | 955 | ||
| 1029 | //draw | 956 | //draw |
| 1030 | g_signal_connect (G_OBJECT ( xv->widget), "draw", | 957 | g_signal_connect (G_OBJECT (xv->widget), "draw", |
| 1031 | G_CALLBACK (xwidget_osr_draw_callback), NULL); | 958 | G_CALLBACK (xwidget_osr_draw_callback), NULL); |
| 1032 | 959 | ||
| 1033 | |||
| 1034 | |||
| 1035 | |||
| 1036 | /* g_signal_connect (G_OBJECT ( xv->widget), "key-press-event", */ | ||
| 1037 | /* G_CALLBACK (xwidget_osr_event_forward), NULL); */ | ||
| 1038 | /* g_signal_connect (G_OBJECT ( xv->widget), "key-release-event", */ | ||
| 1039 | /* G_CALLBACK (xwidget_osr_event_forward), NULL); */ | ||
| 1040 | |||
| 1041 | #endif /* HAVE_WEBKIT_OSR */ | ||
| 1042 | |||
| 1043 | |||
| 1044 | } | 960 | } |
| 1045 | //else return NULL; | 961 | //else return NULL; |
| 1046 | 962 | ||
| 1047 | //widget realization | 963 | //widget realization |
| 1048 | //make container widget 1st, and put the actual widget inside the container | 964 | //make container widget 1st, and put the actual widget inside the container |
| 1049 | //later, drawing should crop container window if necessary to handle case where xwidget | 965 | //later, drawing should crop container window if necessary to handle case where xwidget |
| 1050 | //is partially obscured by other emacs windows | 966 | //is partially obscured by other emacs windows |
| 1051 | //other containers than gtk_fixed where explored, but gtk_fixed had the most predictable behaviour so far. | 967 | //other containers than gtk_fixed where explored, but gtk_fixed had the most predictable behaviour so far. |
| 1052 | xv->emacswindow = GTK_CONTAINER (FRAME_GTK_WIDGET (s->f)); | 968 | xv->emacswindow = FRAME_GTK_WIDGET (s->f); |
| 1053 | xv->widgetwindow = GTK_CONTAINER (gtk_fixed_new ()); | 969 | xv->widgetwindow = gtk_fixed_new (); |
| 1054 | gtk_widget_set_has_window(GTK_WIDGET ( xv->widgetwindow), TRUE); | 970 | gtk_widget_set_has_window(xv->widgetwindow, TRUE); |
| 1055 | gtk_container_add (xv->widgetwindow, xv->widget); | 971 | gtk_container_add (GTK_CONTAINER (xv->widgetwindow), xv->widget); |
| 1056 | 972 | ||
| 1057 | //store some xwidget data in the gtk widgets | 973 | //store some xwidget data in the gtk widgets |
| 1058 | g_object_set_data (G_OBJECT (xv->widget), XG_FRAME_DATA, (gpointer) (s->f)); //the emacs frame | 974 | g_object_set_data (G_OBJECT (xv->widget), XG_FRAME_DATA, (gpointer) (s->f)); //the emacs frame |
| @@ -1063,10 +979,10 @@ xwidget_init_view (struct xwidget *xww, | |||
| 1063 | 979 | ||
| 1064 | 980 | ||
| 1065 | gtk_widget_set_size_request (GTK_WIDGET (xv->widget), xww->width, xww->height); | 981 | gtk_widget_set_size_request (GTK_WIDGET (xv->widget), xww->width, xww->height); |
| 1066 | gtk_widget_set_size_request (GTK_WIDGET (xv->widgetwindow), xww->width, xww->height); | 982 | gtk_widget_set_size_request (xv->widgetwindow, xww->width, xww->height); |
| 1067 | gtk_fixed_put (GTK_FIXED (FRAME_GTK_WIDGET (s->f)), GTK_WIDGET (xv->widgetwindow), x, y); | 983 | gtk_fixed_put (GTK_FIXED (FRAME_GTK_WIDGET (s->f)), xv->widgetwindow, x, y); |
| 1068 | xv->x = x; xv->y = y; | 984 | xv->x = x; xv->y = y; |
| 1069 | gtk_widget_show_all (GTK_WIDGET (xv->widgetwindow)); | 985 | gtk_widget_show_all (xv->widgetwindow); |
| 1070 | 986 | ||
| 1071 | 987 | ||
| 1072 | 988 | ||
| @@ -1082,24 +998,24 @@ xwidget_init_view (struct xwidget *xww, | |||
| 1082 | } | 998 | } |
| 1083 | 999 | ||
| 1084 | ////////////////////////////////////////////////////////////// | 1000 | ////////////////////////////////////////////////////////////// |
| 1085 | //xwgir debug | 1001 | // xwgir debug |
| 1086 | if (//EQ(xww->type, Qwebkit_osr)|| //TODO should be able to choose compile time which method to use with webkit | 1002 | if (//EQ(xww->type, Qwebkit_osr)|| //TODO should be able to choose compile time which method to use with webkit |
| 1087 | EQ(xww->type, Qsocket_osr)|| | 1003 | EQ(xww->type, Qsocket_osr)|| |
| 1088 | (!NILP (Fget(xww->type, QCxwgir_class))))//xwgir widgets are OSR | 1004 | (!NILP (Fget(xww->type, QCxwgir_class))))//xwgir widgets are OSR |
| 1089 | { | 1005 | { |
| 1090 | //xwidget_set_embedder_view(xww,xv); | ||
| 1091 | printf("gdk_offscreen_window_set_embedder %d %d\n", | 1006 | printf("gdk_offscreen_window_set_embedder %d %d\n", |
| 1092 | GDK_IS_WINDOW(gtk_widget_get_window (xww->widget_osr)), | 1007 | GDK_IS_WINDOW(gtk_widget_get_window (xww->widget_osr)), |
| 1093 | GDK_IS_WINDOW(gtk_widget_get_window (GTK_WIDGET (xv->widget)))); | 1008 | GDK_IS_WINDOW(gtk_widget_get_window (GTK_WIDGET (xv->widget)))); |
| 1094 | //set_embedder needs to be called after xv->widget realization | 1009 | // set_embedder needs to be called after xv->widget realization |
| 1095 | gdk_offscreen_window_set_embedder ( gtk_widget_get_window (xww->widget_osr), | 1010 | gdk_offscreen_window_set_embedder (gtk_widget_get_window (xww->widgetwindow_osr), |
| 1096 | gtk_widget_get_window (GTK_WIDGET (xv->widget)) | 1011 | gtk_widget_get_window (xv->widget)); |
| 1097 | |||
| 1098 | ); | ||
| 1099 | /* g_signal_connect (gtk_widget_get_window (xww->widget_osr), "from-embedder", */ | ||
| 1100 | /* G_CALLBACK (offscreen_window_from_parent), gtk_widget_get_window (GTK_WIDGET (xv->widget))); */ | ||
| 1101 | g_signal_connect (gtk_widget_get_window (xv->widget), "pick-embedded-child", | 1012 | g_signal_connect (gtk_widget_get_window (xv->widget), "pick-embedded-child", |
| 1102 | G_CALLBACK (pick_offscreen_child), gtk_widget_get_window (xww->widget_osr)); | 1013 | G_CALLBACK (offscreen_pick_embedded_child), xww->widgetwindow_osr); |
| 1014 | |||
| 1015 | g_signal_connect (gtk_widget_get_window (xww->widgetwindow_osr), "from-embedder", | ||
| 1016 | G_CALLBACK (offscreen_from_embedder), NULL); | ||
| 1017 | g_signal_connect (gtk_widget_get_window (xww->widgetwindow_osr), "to-embedder", | ||
| 1018 | G_CALLBACK (offscreen_to_embedder), NULL); | ||
| 1103 | } | 1019 | } |
| 1104 | //////////////////////////////////////// | 1020 | //////////////////////////////////////// |
| 1105 | 1021 | ||
| @@ -1158,7 +1074,7 @@ x_draw_xwidget_glyph_string (struct glyph_string *s) | |||
| 1158 | { | 1074 | { |
| 1159 | //TODO should be possible to use xwidget_show_view here | 1075 | //TODO should be possible to use xwidget_show_view here |
| 1160 | gtk_fixed_move (GTK_FIXED (FRAME_GTK_WIDGET (s->f)), | 1076 | gtk_fixed_move (GTK_FIXED (FRAME_GTK_WIDGET (s->f)), |
| 1161 | GTK_WIDGET (xv->widgetwindow), | 1077 | xv->widgetwindow, |
| 1162 | x + clip_left, y + clip_top); | 1078 | x + clip_left, y + clip_top); |
| 1163 | } | 1079 | } |
| 1164 | } | 1080 | } |
| @@ -1169,7 +1085,7 @@ x_draw_xwidget_glyph_string (struct glyph_string *s) | |||
| 1169 | || (xv->clip_bottom != clip_bottom) | 1085 | || (xv->clip_bottom != clip_bottom) |
| 1170 | || (xv->clip_top != clip_top) | 1086 | || (xv->clip_top != clip_top) |
| 1171 | || (xv->clip_left != clip_left)){ | 1087 | || (xv->clip_left != clip_left)){ |
| 1172 | gtk_widget_set_size_request (GTK_WIDGET (xv->widgetwindow), clip_right + clip_left, clip_bottom + clip_top); | 1088 | gtk_widget_set_size_request (xv->widgetwindow, clip_right + clip_left, clip_bottom + clip_top); |
| 1173 | gtk_fixed_move(GTK_FIXED(xv->widgetwindow), xv->widget, -clip_left, -clip_top); | 1089 | gtk_fixed_move(GTK_FIXED(xv->widgetwindow), xv->widget, -clip_left, -clip_top); |
| 1174 | printf("reclip %d %d -> %d %d clip_top:%d clip_left:%d\n",xv->clip_right, xv->clip_bottom, clip_right, clip_bottom, clip_top , clip_left); | 1090 | printf("reclip %d %d -> %d %d clip_top:%d clip_left:%d\n",xv->clip_right, xv->clip_bottom, clip_right, clip_bottom, clip_top , clip_left); |
| 1175 | 1091 | ||
| @@ -1180,7 +1096,7 @@ x_draw_xwidget_glyph_string (struct glyph_string *s) | |||
| 1180 | //TODO it seems its possible to get out of sync with emacs redraws so emacs bg sometimes shows up instead of xwidget | 1096 | //TODO it seems its possible to get out of sync with emacs redraws so emacs bg sometimes shows up instead of xwidget |
| 1181 | //its just a visual glitch though | 1097 | //its just a visual glitch though |
| 1182 | if (!xwidget_hidden(xv)){ | 1098 | if (!xwidget_hidden(xv)){ |
| 1183 | gtk_widget_queue_draw (GTK_WIDGET(xv->widgetwindow)); | 1099 | gtk_widget_queue_draw (xv->widgetwindow); |
| 1184 | gtk_widget_queue_draw (xv->widget); | 1100 | gtk_widget_queue_draw (xv->widget); |
| 1185 | } | 1101 | } |
| 1186 | } | 1102 | } |
| @@ -1255,18 +1171,6 @@ DEFUN("xwidget-disable-plugin-for-mime", Fxwidget_disable_plugin_for_mime , Sxwi | |||
| 1255 | } | 1171 | } |
| 1256 | 1172 | ||
| 1257 | 1173 | ||
| 1258 | //attempting a workaround for a webkit offscreen bug | ||
| 1259 | //TODO verify its still needed | ||
| 1260 | void | ||
| 1261 | gtk_window_get_position (GtkWindow *window, | ||
| 1262 | gint *root_x, | ||
| 1263 | gint *root_y) | ||
| 1264 | { | ||
| 1265 | printf("my getsize\n"); | ||
| 1266 | *root_x = 0; | ||
| 1267 | *root_y = 0; | ||
| 1268 | } | ||
| 1269 | |||
| 1270 | void | 1174 | void |
| 1271 | xwidget_webkit_dom_dump(WebKitDOMNode* parent) | 1175 | xwidget_webkit_dom_dump(WebKitDOMNode* parent) |
| 1272 | { | 1176 | { |
| @@ -1354,7 +1258,7 @@ DEFUN ("xwidget-resize", Fxwidget_resize, Sxwidget_resize, 3, 3, 0, doc: | |||
| 1354 | //gtk_window_resize( GTK_WINDOW(xw->widget_osr), xw->width, xw->height); | 1258 | //gtk_window_resize( GTK_WINDOW(xw->widget_osr), xw->width, xw->height); |
| 1355 | gtk_window_resize( GTK_WINDOW(xw->widgetwindow_osr), xw->width, xw->height); | 1259 | gtk_window_resize( GTK_WINDOW(xw->widgetwindow_osr), xw->width, xw->height); |
| 1356 | //gtk_container_resize_children ( GTK_WINDOW(xw->widgetwindow_osr)); | 1260 | //gtk_container_resize_children ( GTK_WINDOW(xw->widgetwindow_osr)); |
| 1357 | gtk_container_resize_children ( GTK_CONTAINER(xw->widgetwindow_osr)); | 1261 | gtk_container_resize_children (GTK_CONTAINER(xw->widgetwindow_osr)); |
| 1358 | 1262 | ||
| 1359 | } | 1263 | } |
| 1360 | 1264 | ||
| @@ -1526,7 +1430,7 @@ DEFUN ("delete-xwidget-view", Fdelete_xwidget_view, Sdelete_xwidget_view, | |||
| 1526 | { | 1430 | { |
| 1527 | CHECK_XWIDGET_VIEW (xwidget_view); | 1431 | CHECK_XWIDGET_VIEW (xwidget_view); |
| 1528 | struct xwidget_view *xv = XXWIDGET_VIEW (xwidget_view); | 1432 | struct xwidget_view *xv = XXWIDGET_VIEW (xwidget_view); |
| 1529 | gtk_widget_destroy(GTK_WIDGET (xv->widgetwindow)); | 1433 | gtk_widget_destroy(xv->widgetwindow); |
| 1530 | Vxwidget_view_list = Fdelq (xwidget_view, Vxwidget_view_list); | 1434 | Vxwidget_view_list = Fdelq (xwidget_view, Vxwidget_view_list); |
| 1531 | } | 1435 | } |
| 1532 | 1436 | ||
| @@ -1760,7 +1664,7 @@ xwidget_view_delete_all_in_window (struct window *w) | |||
| 1760 | if (XWIDGET_VIEW_P (XCAR (tail))) { | 1664 | if (XWIDGET_VIEW_P (XCAR (tail))) { |
| 1761 | xv = XXWIDGET_VIEW (XCAR (tail)); | 1665 | xv = XXWIDGET_VIEW (XCAR (tail)); |
| 1762 | if(XWINDOW (xv->w) == w) { | 1666 | if(XWINDOW (xv->w) == w) { |
| 1763 | gtk_widget_destroy(GTK_WIDGET(xv->widgetwindow)); | 1667 | gtk_widget_destroy(xv->widgetwindow); |
| 1764 | Vxwidget_view_list = Fdelq (XCAR (tail), Vxwidget_view_list); | 1668 | Vxwidget_view_list = Fdelq (XCAR (tail), Vxwidget_view_list); |
| 1765 | } | 1669 | } |
| 1766 | } | 1670 | } |
| @@ -1917,8 +1821,8 @@ kill_buffer_xwidgets (Lisp_Object buffer) | |||
| 1917 | struct xwidget *xw = XXWIDGET (xwidget); | 1821 | struct xwidget *xw = XXWIDGET (xwidget); |
| 1918 | if (xw->widget_osr && xw->widgetwindow_osr) | 1822 | if (xw->widget_osr && xw->widgetwindow_osr) |
| 1919 | { | 1823 | { |
| 1920 | gtk_widget_destroy(GTK_WIDGET (xw->widget_osr)); | 1824 | gtk_widget_destroy(xw->widget_osr); |
| 1921 | gtk_widget_destroy(GTK_WIDGET (xw->widgetwindow_osr)); | 1825 | gtk_widget_destroy(xw->widgetwindow_osr); |
| 1922 | } | 1826 | } |
| 1923 | } | 1827 | } |
| 1924 | } | 1828 | } |