aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoakim Verona2013-04-02 08:22:38 +0200
committerJoakim Verona2013-04-02 08:22:38 +0200
commit86dc02fe08b1a2d26d380ba67d6a165ead70bc79 (patch)
treedb3ea8c2bbc727417b1fca6cfb24bd7119f48b23
parentdea4006fb3bbaa32c68e17e3a7385d1063d6fabc (diff)
downloademacs-86dc02fe08b1a2d26d380ba67d6a165ead70bc79.tar.gz
emacs-86dc02fe08b1a2d26d380ba67d6a165ead70bc79.zip
some improvements to the xwgir system. you can now create webkit with xwgir. OTOH, event propagation still only works for webkit, not for simpler things like buttons
-rw-r--r--lisp/xwidget-test.el23
-rw-r--r--src/xwidget.c267
2 files changed, 180 insertions, 110 deletions
diff --git a/lisp/xwidget-test.el b/lisp/xwidget-test.el
index 7045b72a3ac..a8c280352ad 100644
--- a/lisp/xwidget-test.el
+++ b/lisp/xwidget-test.el
@@ -86,10 +86,24 @@
86 (xwgir-require-namespace "Gtk" "3.0") 86 (xwgir-require-namespace "Gtk" "3.0")
87 (put 'xwgirButton :xwgir-class '("Gtk" "Button")) 87 (put 'xwgirButton :xwgir-class '("Gtk" "Button"))
88 88
89 (xwidget-insert (point-min) 'xwgirButton "xwgir label didnt work..." 200 100) 89 (xwidget-insert (point-min) 'xwgirButton "xwgir label didnt work..." 700 700)
90 (xwgir-call-method (xwidget-at 1) "set_label" '( "xwgir label worked!")) 90 (xwgir-call-method (xwidget-at 1) "set_label" '( "xwgir label worked!"))
91 (define-key (current-local-map) [xwidget-event] 'xwidget-handler-demo-basic)) 91 (define-key (current-local-map) [xwidget-event] 'xwidget-handler-demo-basic))
92 92
93(xwidget-demo "a-xwgir-check-button"
94 (xwgir-require-namespace "Gtk" "3.0")
95 (put 'xwgirCheckButton :xwgir-class '("Gtk" "CheckButton"))
96
97 (xwidget-insert (point-min) 'xwgirCheckButton "xwgir label didnt work..." 700 700)
98 (define-key (current-local-map) [xwidget-event] 'xwidget-handler-demo-basic))
99
100(xwidget-demo "a-xwgir-webkit"
101 (xwgir-require-namespace "WebKit" "3.0")
102 (put 'xwgirWebkit :xwgir-class '("WebKit" "WebView"))
103
104 (xwidget-insert (point-min) 'xwgirWebkit "xwgir webkit..." 700 700)
105 (define-key (current-local-map) [xwidget-event] 'xwidget-handler-demo-basic))
106
93 107
94 108
95;; tentative testcase: 109;; tentative testcase:
@@ -132,13 +146,12 @@
132;try the openvrml: 146;try the openvrml:
133;/usr/libexec/openvrml-xembed 0 ~/Desktop/HelloWorld.wrl 147;/usr/libexec/openvrml-xembed 0 ~/Desktop/HelloWorld.wrl
134 148
135
136(defun xwidget-handler-demo-basic () 149(defun xwidget-handler-demo-basic ()
137 (interactive) 150 (interactive)
138 (message "stuff happened to xwidget %S" last-input-event) 151 (message "stuff happened to xwidget %S" last-input-event)
139 (let* 152 (let*
140 ((xwidget-event-type (nth 2 last-input-event)) 153 ((xwidget-event-type (nth 1 last-input-event))
141 (xwidget (nth 1 last-input-event))) 154 (xwidget (nth 2 last-input-event)))
142 (cond ( (eq xwidget-event-type 'xembed-ready) 155 (cond ( (eq xwidget-event-type 'xembed-ready)
143 (let* 156 (let*
144 ((xembed-id (nth 3 last-input-event))) 157 ((xembed-id (nth 3 last-input-event)))
@@ -146,7 +159,7 @@
146 ;;will start emacs/uzbl in a xembed socket when its ready 159 ;;will start emacs/uzbl in a xembed socket when its ready
147 (cond 160 (cond
148 (t;;(eq 3 xwidget) 161 (t;;(eq 3 xwidget)
149 (start-process "xembed" "*xembed*" (format "%s/src/emacs" default-directory) "-q" "--parent-id" (number-to-string xembed-id) ) ) 162 (start-process "xembed" "*xembed*" "/var/lib/jenkins/jobs/emacs-xwidgets-automerge/workspace/src/emacs" "-q" "--parent-id" (number-to-string xembed-id) ) )
150;; ((eq 5 xwidget-id) 163;; ((eq 5 xwidget-id)
151;; (start-process "xembed2" "*xembed2*" "uzbl-core" "-s" (number-to-string xembed-id) "http://www.fsf.org" ) 164;; (start-process "xembed2" "*xembed2*" "uzbl-core" "-s" (number-to-string xembed-id) "http://www.fsf.org" )
152 ) 165 )
diff --git a/src/xwidget.c b/src/xwidget.c
index b432823fbca..f3394cd7f11 100644
--- a/src/xwidget.c
+++ b/src/xwidget.c
@@ -149,7 +149,7 @@ extern Lisp_Object QCwidth, QCheight;
149 149
150struct xwidget_view* xwidget_view_lookup(struct xwidget* xw, struct window *w); 150struct xwidget_view* xwidget_view_lookup(struct xwidget* xw, struct window *w);
151Lisp_Object xwidget_spec_value ( Lisp_Object spec, Lisp_Object key, int *found); 151Lisp_Object xwidget_spec_value ( Lisp_Object spec, Lisp_Object key, int *found);
152gboolean webkit_osr_damage_event_callback (GtkWidget *widget, GdkEventExpose *event, gpointer data) ; 152gboolean xwidget_osr_damage_event_callback (GtkWidget *widget, GdkEventExpose *event, gpointer data) ;
153gboolean webkit_osr_key_event_callback (GtkWidget *widget, GdkEventKey *event, gpointer data) ; 153gboolean webkit_osr_key_event_callback (GtkWidget *widget, GdkEventKey *event, gpointer data) ;
154void webkit_osr_document_load_finished_callback (WebKitWebView *webkitwebview, 154void webkit_osr_document_load_finished_callback (WebKitWebView *webkitwebview,
155 WebKitWebFrame *arg1, 155 WebKitWebFrame *arg1,
@@ -179,6 +179,12 @@ gboolean webkit_osr_navigation_policy_decision_requested_callback(WebKitWebView
179 WebKitWebNavigationAction *navigation_action, 179 WebKitWebNavigationAction *navigation_action,
180 WebKitWebPolicyDecision *policy_decision, 180 WebKitWebPolicyDecision *policy_decision,
181 gpointer user_data); 181 gpointer user_data);
182
183gboolean
184xwgir_event_callback (GtkWidget *widget,
185 GdkEvent *event,
186 gpointer user_data);
187
182GtkWidget* xwgir_create(char* class, char* namespace); 188GtkWidget* xwgir_create(char* class, char* namespace);
183 189
184DEFUN ("make-xwidget", Fmake_xwidget, Smake_xwidget, 7, 7, 0, 190DEFUN ("make-xwidget", Fmake_xwidget, Smake_xwidget, 7, 7, 0,
@@ -215,13 +221,23 @@ DEFUN ("make-xwidget", Fmake_xwidget, Smake_xwidget, 7, 7, 0,
215 /* DIY mvc. widget is rendered offscreen, 221 /* DIY mvc. widget is rendered offscreen,
216 later bitmap copied to the views. 222 later bitmap copied to the views.
217 */ 223 */
218 if (EQ(xw->type, Qwebkit_osr)){ 224 if (EQ(xw->type, Qwebkit_osr)||
219 printf("init webkit osr\n"); 225 EQ(xw->type, Qsocket_osr)||
226 (Fget(xw->type, Qcxwgir_class) != Qnil)){
227 printf("init osr widget\n");
220 block_input(); 228 block_input();
221 xw->widgetwindow_osr = GTK_CONTAINER (gtk_offscreen_window_new ()); 229 xw->widgetwindow_osr = GTK_CONTAINER (gtk_offscreen_window_new ());
222 gtk_window_resize( GTK_WINDOW(xw->widgetwindow_osr), xw->width, xw->height); 230 gtk_window_resize( GTK_WINDOW(xw->widgetwindow_osr), xw->width, xw->height);
223 xw->widget_osr = webkit_web_view_new();
224 231
232 if (EQ(xw->type, Qwebkit_osr))
233 xw->widget_osr = webkit_web_view_new();
234 if(EQ(xw->type, Qsocket_osr))
235 xw->widget_osr = gtk_socket_new();
236 if(Fget(xw->type, Qcxwgir_class) != Qnil)
237 xw->widget_osr = xwgir_create( SDATA(Fcar(Fcdr(Fget(xw->type, Qcxwgir_class)))),
238 SDATA(Fcar(Fget(xw->type, Qcxwgir_class))));
239
240
225 gtk_widget_set_size_request (GTK_WIDGET (xw->widget_osr), xw->width, xw->height); 241 gtk_widget_set_size_request (GTK_WIDGET (xw->widget_osr), xw->width, xw->height);
226 gtk_container_add (xw->widgetwindow_osr, xw->widget_osr); 242 gtk_container_add (xw->widgetwindow_osr, xw->widget_osr);
227 243
@@ -231,110 +247,122 @@ DEFUN ("make-xwidget", Fmake_xwidget, Smake_xwidget, 7, 7, 0,
231 g_object_set_data (G_OBJECT (xw->widget_osr), XG_XWIDGET, (gpointer) (xw)); 247 g_object_set_data (G_OBJECT (xw->widget_osr), XG_XWIDGET, (gpointer) (xw));
232 g_object_set_data (G_OBJECT (xw->widgetwindow_osr), XG_XWIDGET, (gpointer) (xw)); 248 g_object_set_data (G_OBJECT (xw->widgetwindow_osr), XG_XWIDGET, (gpointer) (xw));
233 /* signals */ 249 /* signals */
234 g_signal_connect (G_OBJECT ( xw->widgetwindow_osr), "damage-event", G_CALLBACK (webkit_osr_damage_event_callback), NULL); 250 g_signal_connect (G_OBJECT ( xw->widgetwindow_osr), "damage-event", G_CALLBACK (xwidget_osr_damage_event_callback), NULL);
235 251
236 //TODO these were just a test hack 252 //TODO these were just a test hack
237 /* g_signal_connect (G_OBJECT ( xw->widget_osr), "key-press-event", G_CALLBACK (webkit_osr_key_event_callback), NULL); */ 253 /* g_signal_connect (G_OBJECT ( xw->widget_osr), "key-press-event", G_CALLBACK (webkit_osr_key_event_callback), NULL); */
238 /* g_signal_connect (G_OBJECT ( xw->widget_osr), "key-release-event", G_CALLBACK (webkit_osr_key_event_callback), NULL); */ 254 /* g_signal_connect (G_OBJECT ( xw->widget_osr), "key-release-event", G_CALLBACK (webkit_osr_key_event_callback), NULL); */
239 255
240 g_signal_connect (G_OBJECT ( xw->widget_osr), 256 if (EQ(xw->type, Qwebkit_osr)){
241 "document-load-finished", 257 g_signal_connect (G_OBJECT ( xw->widget_osr),
242 G_CALLBACK (webkit_osr_document_load_finished_callback), 258 "document-load-finished",
243 xw); 259 G_CALLBACK (webkit_osr_document_load_finished_callback),
244 260 xw);
245 g_signal_connect (G_OBJECT ( xw->widget_osr), 261
246 "download-requested", 262 g_signal_connect (G_OBJECT ( xw->widget_osr),
247 G_CALLBACK (webkit_osr_download_callback), 263 "download-requested",
248 xw); 264 G_CALLBACK (webkit_osr_download_callback),
249 265 xw);
250 g_signal_connect (G_OBJECT ( xw->widget_osr), 266
251 "mime-type-policy-decision-requested", 267 g_signal_connect (G_OBJECT ( xw->widget_osr),
252 G_CALLBACK (webkit_osr_mime_type_policy_typedecision_requested_callback), 268 "mime-type-policy-decision-requested",
253 xw); 269 G_CALLBACK (webkit_osr_mime_type_policy_typedecision_requested_callback),
254 270 xw);
255 g_signal_connect (G_OBJECT ( xw->widget_osr), 271
256 "new-window-policy-decision-requested", 272 g_signal_connect (G_OBJECT ( xw->widget_osr),
257 G_CALLBACK (webkit_osr_new_window_policy_decision_requested_callback), 273 "new-window-policy-decision-requested",
258 xw); 274 G_CALLBACK (webkit_osr_new_window_policy_decision_requested_callback),
275 xw);
276
277 g_signal_connect (G_OBJECT ( xw->widget_osr),
278 "navigation-policy-decision-requested",
279 G_CALLBACK (webkit_osr_navigation_policy_decision_requested_callback),
280 xw);
281 //webkit_web_view_load_uri(WEBKIT_WEB_VIEW(xw->widget_osr), "http://www.fsf.org");
259 282
260 g_signal_connect (G_OBJECT ( xw->widget_osr), 283 }
261 "navigation-policy-decision-requested",
262 G_CALLBACK (webkit_osr_navigation_policy_decision_requested_callback),
263 xw);
264 284
265 285
266 webkit_web_view_load_uri(WEBKIT_WEB_VIEW(xw->widget_osr), "http://www.fsf.org");
267 unblock_input(); 286 unblock_input();
268 287
269 } 288 }
270#endif 289#endif
271 290
272 if (EQ(xw->type, Qsocket_osr)){ 291 /* if (EQ(xw->type, Qsocket_osr)){ */
273 printf("init socket osr\n"); 292 /* printf("init socket osr\n"); */
274 block_input(); 293 /* block_input(); */
275 xw->widgetwindow_osr = GTK_CONTAINER (gtk_offscreen_window_new ()); 294 /* xw->widgetwindow_osr = GTK_CONTAINER (gtk_offscreen_window_new ()); */
276 gtk_window_resize( GTK_WINDOW(xw->widgetwindow_osr), xw->width, xw->height); 295 /* gtk_window_resize( GTK_WINDOW(xw->widgetwindow_osr), xw->width, xw->height); */
277 296
278 //////////////////// 297 /* //////////////////// */
279 //xw->widget_osr = webkit_web_view_new(); 298 /* //xw->widget_osr = webkit_web_view_new(); */
280 xw->widget_osr = gtk_socket_new(); 299 /* xw->widget_osr = gtk_socket_new(); */
281 //g_signal_connect_after(xv->widget, "plug-added", G_CALLBACK(xwidget_plug_added), "plug added"); 300 /* //g_signal_connect_after(xv->widget, "plug-added", G_CALLBACK(xwidget_plug_added), "plug added"); */
282 //g_signal_connect_after(xv->widget, "plug-removed", G_CALLBACK(xwidget_plug_removed), "plug removed"); 301 /* //g_signal_connect_after(xv->widget, "plug-removed", G_CALLBACK(xwidget_plug_removed), "plug removed"); */
283 /////////////////// 302 /* /////////////////// */
284
285 gtk_widget_set_size_request (GTK_WIDGET (xw->widget_osr), xw->width, xw->height);
286 gtk_container_add (xw->widgetwindow_osr, xw->widget_osr);
287
288 gtk_widget_show_all (GTK_WIDGET (xw->widgetwindow_osr));
289
290 /* store some xwidget data in the gtk widgets for convenient retrieval in the event handlers. */
291 g_object_set_data (G_OBJECT (xw->widget_osr), XG_XWIDGET, (gpointer) (xw));
292 g_object_set_data (G_OBJECT (xw->widgetwindow_osr), XG_XWIDGET, (gpointer) (xw));
293 g_signal_connect (G_OBJECT ( xw->widgetwindow_osr), "damage-event", G_CALLBACK (webkit_osr_damage_event_callback), NULL);
294
295 //webkit_web_view_load_uri(WEBKIT_WEB_VIEW(xw->widget_osr), "http://www.fsf.org");
296 unblock_input();
297
298 }
299
300
301 ////////////////////////////////////////////////////////
302 if(Fget(xw->type, Qcxwgir_class) != Qnil){
303 //here we have run out of hard coded symbols, we will now attempt to create
304 //a widget dynamically
305 //TODO
306 // - support OSR
307 // - support constructor args
308 // - support signals
309 // - check that the argument widget type actually exists
310 printf("init xwgir osr\n");
311 block_input();
312 xw->widgetwindow_osr = GTK_CONTAINER (gtk_offscreen_window_new ());
313 gtk_window_resize( GTK_WINDOW(xw->widgetwindow_osr), xw->width, xw->height);
314 303
315 printf("xwgir symbol %s %s %s:\n", 304 /* gtk_widget_set_size_request (GTK_WIDGET (xw->widget_osr), xw->width, xw->height); */
316 SDATA(SYMBOL_NAME(xw->type)), 305 /* gtk_container_add (xw->widgetwindow_osr, xw->widget_osr); */
317 SDATA(Fcar(Fcdr(Fget(xw->type, Qcxwgir_class)))), 306
318 SDATA(Fcar(Fget(xw->type, Qcxwgir_class)))); 307 /* gtk_widget_show_all (GTK_WIDGET (xw->widgetwindow_osr)); */
319 //xv->widget = xwgir_create ("Button"); 308
320 Fcar(Fget(xw->type, Qcxwgir_class)); 309 /* /\* store some xwidget data in the gtk widgets for convenient retrieval in the event handlers. *\/ */
321 xw->widget_osr = xwgir_create( SDATA(Fcar(Fcdr(Fget(xw->type, Qcxwgir_class)))), 310 /* g_object_set_data (G_OBJECT (xw->widget_osr), XG_XWIDGET, (gpointer) (xw)); */
322 SDATA(Fcar(Fget(xw->type, Qcxwgir_class)))); 311 /* g_object_set_data (G_OBJECT (xw->widgetwindow_osr), XG_XWIDGET, (gpointer) (xw)); */
312 /* g_signal_connect (G_OBJECT ( xw->widgetwindow_osr), "damage-event", G_CALLBACK (xwidget_osr_damage_event_callback), NULL); */
313
314 /* //webkit_web_view_load_uri(WEBKIT_WEB_VIEW(xw->widget_osr), "http://www.fsf.org"); */
315 /* unblock_input(); */
316
317 /* } */
318
319
320 /* //////////////////////////////////////////////////////// */
321 /* if(Fget(xw->type, Qcxwgir_class) != Qnil){ */
322 /* //here we have run out of hard coded symbols, we will now attempt to create */
323 /* //a widget dynamically */
324 /* //TODO */
325 /* // - support OSR */
326 /* // - support constructor args */
327 /* // - support signals */
328 /* // - check that the argument widget type actually exists */
329
330 /* //mostly the same as for webkit, so TODO refactor */
331 /* printf("init xwgir osr\n"); */
332 /* block_input(); */
333 /* xw->widgetwindow_osr = GTK_CONTAINER (gtk_offscreen_window_new ()); */
334 /* gtk_window_resize( GTK_WINDOW(xw->widgetwindow_osr), xw->width, xw->height); */
335 /* ////////////////////////////// */
336 /* //create the xwgir widget */
337 /* printf("xwgir symbol %s %s %s:\n", */
338 /* SDATA(SYMBOL_NAME(xw->type)), */
339 /* SDATA(Fcar(Fcdr(Fget(xw->type, Qcxwgir_class)))), */
340 /* SDATA(Fcar(Fget(xw->type, Qcxwgir_class)))); */
341 /* //xv->widget = xwgir_create ("Button"); */
342 /* Fcar(Fget(xw->type, Qcxwgir_class)); */
343 /* xw->widget_osr = xwgir_create( SDATA(Fcar(Fcdr(Fget(xw->type, Qcxwgir_class)))), */
344 /* SDATA(Fcar(Fget(xw->type, Qcxwgir_class)))); */
345 /* gtk_widget_add_events(xw->widget_osr, */
346 /* GDK_BUTTON_PRESS_MASK */
347 /* | GDK_BUTTON_RELEASE_MASK */
348 /* | GDK_POINTER_MOTION_MASK); */
349
350 /* ////////////////////////////// */
351 /* gtk_widget_set_size_request (GTK_WIDGET (xw->widget_osr), xw->width, xw->height); */
352 /* gtk_container_add (xw->widgetwindow_osr, xw->widget_osr); */
323 353
324 gtk_widget_set_size_request (GTK_WIDGET (xw->widget_osr), xw->width, xw->height); 354 /* gtk_widget_show_all (GTK_WIDGET (xw->widgetwindow_osr)); */
325 gtk_container_add (xw->widgetwindow_osr, xw->widget_osr);
326 355
327 gtk_widget_show_all (GTK_WIDGET (xw->widgetwindow_osr)); 356 /* /\* store some xwidget data in the gtk widgets for convenient retrieval in the event handlers. *\/ */
328 357 /* g_object_set_data (G_OBJECT (xw->widget_osr), XG_XWIDGET, (gpointer) (xw)); */
329 /* store some xwidget data in the gtk widgets for convenient retrieval in the event handlers. */ 358 /* g_object_set_data (G_OBJECT (xw->widgetwindow_osr), XG_XWIDGET, (gpointer) (xw)); */
330 g_object_set_data (G_OBJECT (xw->widget_osr), XG_XWIDGET, (gpointer) (xw)); 359 /* /\* signals *\/ */
331 g_object_set_data (G_OBJECT (xw->widgetwindow_osr), XG_XWIDGET, (gpointer) (xw)); 360 /* g_signal_connect (G_OBJECT ( xw->widgetwindow_osr), "damage-event", G_CALLBACK (xwidget_osr_damage_event_callback), NULL); */
332 /* signals */ 361 /* g_signal_connect (G_OBJECT ( xw->widget_osr), "button-press-event", G_CALLBACK (xwgir_event_callback), xw); */
333 g_signal_connect (G_OBJECT ( xw->widgetwindow_osr), "damage-event", G_CALLBACK (webkit_osr_damage_event_callback), NULL);
334 362
335 363
336 unblock_input(); 364 /* unblock_input(); */
337 } 365 /* } */
338 366
339 //////////////////////////////////////////////////////// 367 ////////////////////////////////////////////////////////
340 368
@@ -478,9 +506,9 @@ xwidget_slider_changed (GtkRange *range,
478/* when the off-screen webkit master view changes this signal is called. 506/* when the off-screen webkit master view changes this signal is called.
479 it copies the bitmap from the off-screen webkit instance */ 507 it copies the bitmap from the off-screen webkit instance */
480gboolean 508gboolean
481webkit_osr_damage_event_callback (GtkWidget *widget, GdkEventExpose *event, gpointer data) 509xwidget_osr_damage_event_callback (GtkWidget *widget, GdkEventExpose *event, gpointer data)
482{ 510{
483 //TODO this is wrong! should just oueu a redraw of onscreen widget 511 //TODO this is wrong! should just queu a redraw of onscreen widget
484 struct xwidget* xw = (struct xwidget*) g_object_get_data (G_OBJECT (widget), XG_XWIDGET); 512 struct xwidget* xw = (struct xwidget*) g_object_get_data (G_OBJECT (widget), XG_XWIDGET);
485 struct xwidget_view* xv; 513 struct xwidget_view* xv;
486 //webkit_osr_redraw_child(xw, widget); 514 //webkit_osr_redraw_child(xw, widget);
@@ -621,8 +649,8 @@ xwidget_osr_draw_callback (GtkWidget *widget, cairo_t *cr, gpointer data)
621 struct xwidget* xw = (struct xwidget*) g_object_get_data (G_OBJECT (widget), XG_XWIDGET); 649 struct xwidget* xw = (struct xwidget*) g_object_get_data (G_OBJECT (widget), XG_XWIDGET);
622 struct xwidget_view* xv = (struct xwidget_view*) g_object_get_data (G_OBJECT (widget), XG_XWIDGET_VIEW); 650 struct xwidget_view* xv = (struct xwidget_view*) g_object_get_data (G_OBJECT (widget), XG_XWIDGET_VIEW);
623 651
624 // printf("xwidget_osr_draw_callback gtk3 xw.id:%d xw.type:%d window:%d vis:%d\n", 652 printf("xwidget_osr_draw_callback gtk3 xw.id:%d xw.type:%d window:%d vis:%d\n",
625 // xw,xw->type, gtk_widget_get_window (widget), gtk_widget_get_visible (xw->widget_osr)); 653 xw,xw->type, gtk_widget_get_window (widget), gtk_widget_get_visible (xw->widget_osr));
626 654
627 cairo_rectangle(cr, 0,0, xv->clip_right, xv->clip_bottom);//xw->width, xw->height); 655 cairo_rectangle(cr, 0,0, xv->clip_right, xv->clip_bottom);//xw->width, xw->height);
628 cairo_clip(cr); 656 cairo_clip(cr);
@@ -633,21 +661,49 @@ xwidget_osr_draw_callback (GtkWidget *widget, cairo_t *cr, gpointer data)
633 return FALSE; 661 return FALSE;
634} 662}
635 663
664GtkWidget* xwgir_create_debug;
636 665
637gboolean 666gboolean
638xwidget_osr_button_callback (GtkWidget *widget, 667xwidget_osr_event_forward (GtkWidget *widget,
639 GdkEvent *event, 668 GdkEvent *event,
640 gpointer user_data) 669 gpointer user_data)
641{ 670{
671 /* copy events that arrive at the outer widget to the offscreen widget */
642 struct xwidget* xw = (struct xwidget*) g_object_get_data (G_OBJECT (widget), XG_XWIDGET); 672 struct xwidget* xw = (struct xwidget*) g_object_get_data (G_OBJECT (widget), XG_XWIDGET);
643 GdkEvent* eventcopy = gdk_event_copy(event); 673 GdkEvent* eventcopy = gdk_event_copy(event);
644 674
645 ((GdkEventButton*)eventcopy)->window = gtk_widget_get_window(xw->widget_osr); 675 //((GdkEventAny*)eventcopy)->window = gtk_widget_get_window(xw->widget_osr);
646 gtk_main_do_event(eventcopy); //TODO this will leak events. they should be deallocated later 676 //((GdkEventAny*)eventcopy)->window = xw->widgetwindow_osr;
677 //((GdkEventAny*)eventcopy)->window = gtk_widget_get_window(xwgir_create_debug);
678 eventcopy->any.window = gtk_widget_get_window(xw->widget_osr);//gtk_widget_get_window(xwgir_create_debug);
679 //eventcopy->send_event = TRUE;
680 printf("xwidget_osr_event_forward redirect event to window:%d\n", ((GdkEventAny*)eventcopy)->window);
681 printf("A type:%d x:%d y:%d \n", event->type, event->button.x, event->button.y);
682 printf("B type:%d x:%d y:%d \n", eventcopy->type, eventcopy->button.x, eventcopy->button.y);
683 //gtk_button_get_event_window(xwgir_create_debug);
684 gtk_main_do_event(eventcopy); //TODO this will leak events. they should be deallocated later, perhaps in xwgir_event_callback
685 //gdk_event_put(eventcopy);
686 //gdk_event_queue_append(eventcopy);
687 //gdk_event_free(eventcopy);
647 return TRUE; //dont propagate this event furter 688 return TRUE; //dont propagate this event furter
689 //return FALSE; //dont propagate this event furter
690}
691
692
693gboolean
694xwgir_event_callback (GtkWidget *widget,
695 GdkEvent *event,
696 gpointer user_data)
697{
698 //debugging
699 //perhaps delete copied events here
700 struct xwidget* xw = (struct xwidget*) g_object_get_data (G_OBJECT (widget), XG_XWIDGET);
701 printf("xwgir_event_callback\n");
702 return FALSE;
648} 703}
649 704
650 705
706
651GIRepository *girepository ; 707GIRepository *girepository ;
652DEFUN( "xwgir-require-namespace",Fxwgir_require_namespace, Sxwgir_require_namespace, 2,2,0, 708DEFUN( "xwgir-require-namespace",Fxwgir_require_namespace, Sxwgir_require_namespace, 2,2,0,
653 doc: /*require a namespace. must be done for all namespaces we want to use, before using other xwgir functions.*/) 709 doc: /*require a namespace. must be done for all namespaces we want to use, before using other xwgir functions.*/)
@@ -683,6 +739,7 @@ GtkWidget* xwgir_create(char* class, char* namespace){
683 NULL, 0, 739 NULL, 0,
684 &return_value, 740 &return_value,
685 NULL); 741 NULL);
742 xwgir_create_debug = return_value.v_pointer;
686 return return_value.v_pointer; 743 return return_value.v_pointer;
687 744
688} 745}
@@ -935,15 +992,15 @@ xwidget_init_view (struct xwidget *xww,
935 g_signal_connect (G_OBJECT ( xv->widget), "draw", 992 g_signal_connect (G_OBJECT ( xv->widget), "draw",
936 G_CALLBACK (xwidget_osr_draw_callback), NULL); 993 G_CALLBACK (xwidget_osr_draw_callback), NULL);
937 g_signal_connect (G_OBJECT ( xv->widget), "button-press-event", 994 g_signal_connect (G_OBJECT ( xv->widget), "button-press-event",
938 G_CALLBACK (xwidget_osr_button_callback), NULL); 995 G_CALLBACK (xwidget_osr_event_forward), NULL);
939 g_signal_connect (G_OBJECT ( xv->widget), "button-release-event", 996 g_signal_connect (G_OBJECT ( xv->widget), "button-release-event",
940 G_CALLBACK (xwidget_osr_button_callback), NULL); 997 G_CALLBACK (xwidget_osr_event_forward), NULL);
941 g_signal_connect (G_OBJECT ( xv->widget), "motion-notify-event", 998 g_signal_connect (G_OBJECT ( xv->widget), "motion-notify-event",
942 G_CALLBACK (xwidget_osr_button_callback), NULL); 999 G_CALLBACK (xwidget_osr_event_forward), NULL);
943 /* g_signal_connect (G_OBJECT ( xv->widget), "key-press-event", */ 1000 /* g_signal_connect (G_OBJECT ( xv->widget), "key-press-event", */
944 /* G_CALLBACK (xwidget_osr_button_callback), NULL); */ 1001 /* G_CALLBACK (xwidget_osr_event_forward), NULL); */
945 /* g_signal_connect (G_OBJECT ( xv->widget), "key-release-event", */ 1002 /* g_signal_connect (G_OBJECT ( xv->widget), "key-release-event", */
946 /* G_CALLBACK (xwidget_osr_button_callback), NULL); */ 1003 /* G_CALLBACK (xwidget_osr_event_forward), NULL); */
947 1004
948#endif 1005#endif
949 1006