aboutsummaryrefslogtreecommitdiffstats
path: root/src/xwidget.c
diff options
context:
space:
mode:
authorJoakim Verona2013-07-25 14:16:20 -0700
committerJoakim Verona2013-07-25 14:16:20 -0700
commit2427b15992fe47646a2bf2b55891f1e482dedaa0 (patch)
treea44d448d10a071c95e81c410a76580ae63480ca1 /src/xwidget.c
parent5558a52357ad7871aa2f66901032f6abb18485a5 (diff)
parent45219ddc2111f8a49c78472cbe80e1ed01e84dc2 (diff)
downloademacs-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.c258
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
133struct xwidget_view* xwidget_view_lookup(struct xwidget* xw, struct window *w); 133struct xwidget_view* xwidget_view_lookup(struct xwidget* xw, struct window *w);
134Lisp_Object xwidget_spec_value ( Lisp_Object spec, Lisp_Object key, int *found); 134Lisp_Object xwidget_spec_value ( Lisp_Object spec, Lisp_Object key, int *found);
135gboolean xwidget_osr_damage_event_callback (GtkWidget *widget, GdkEventExpose *event, gpointer data) ; 135gboolean offscreen_damage_event (GtkWidget *widget, GdkEvent *event, gpointer data);
136gboolean webkit_osr_key_event_callback (GtkWidget *widget, GdkEventKey *event, gpointer data) ;
137void webkit_osr_document_load_finished_callback (WebKitWebView *webkitwebview, 136void 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
166gboolean
167xwgir_event_callback (GtkWidget *widget,
168 GdkEvent *event,
169 gpointer user_data);
170
171GtkWidget* xwgir_create(char* class, char* namespace); 165GtkWidget* xwgir_create(char* class, char* namespace);
172static void 166static void
173send_xembed_ready_event (struct xwidget* xw, int xembedid); 167send_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
377xwidget_show_view (struct xwidget_view *xv) 362xwidget_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
387xwidget_hide_view (struct xwidget_view *xv) 372xwidget_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 */
452gboolean 437gboolean
453xwidget_osr_damage_event_callback (GtkWidget *widget, GdkEventExpose *event, gpointer data) 438offscreen_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
475gboolean
476webkit_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
485void 445void
486store_xwidget_event_string(struct xwidget* xw, char* eventname, const char* eventstr) 446store_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
652gboolean
653xwgir_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
666GIRepository *girepository ; 608GIRepository *girepository ;
667DEFUN( "xwgir-require-namespace",Fxwgir_require_namespace, Sxwgir_require_namespace, 2,2,0, 609DEFUN( "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
890void 832GdkWindow *
891offscreen_window_from_parent (GdkWindow *window, 833offscreen_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 *
908pick_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));
916offscreen_window,
917 widget_x,
918 widget_y,
919 bin );
920 return bin;
921} 841}
922 842
923
924void 843void
925xwidget_set_embedder_view(struct xwidget* xww, 844offscreen_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 ); 855void
936 //this signal doesnt seem completely necessary 856offscreen_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
944gboolean 867gboolean
945xwidget_osr_event_set_embedder (GtkWidget *widget, 868xwidget_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
1260void
1261gtk_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
1270void 1174void
1271xwidget_webkit_dom_dump(WebKitDOMNode* parent) 1175xwidget_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 }