diff options
| author | Joakim Verona | 2013-04-02 08:22:38 +0200 |
|---|---|---|
| committer | Joakim Verona | 2013-04-02 08:22:38 +0200 |
| commit | 86dc02fe08b1a2d26d380ba67d6a165ead70bc79 (patch) | |
| tree | db3ea8c2bbc727417b1fca6cfb24bd7119f48b23 /src | |
| parent | dea4006fb3bbaa32c68e17e3a7385d1063d6fabc (diff) | |
| download | emacs-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
Diffstat (limited to 'src')
| -rw-r--r-- | src/xwidget.c | 267 |
1 files changed, 162 insertions, 105 deletions
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 | ||
| 150 | struct xwidget_view* xwidget_view_lookup(struct xwidget* xw, struct window *w); | 150 | struct xwidget_view* xwidget_view_lookup(struct xwidget* xw, struct window *w); |
| 151 | Lisp_Object xwidget_spec_value ( Lisp_Object spec, Lisp_Object key, int *found); | 151 | Lisp_Object xwidget_spec_value ( Lisp_Object spec, Lisp_Object key, int *found); |
| 152 | gboolean webkit_osr_damage_event_callback (GtkWidget *widget, GdkEventExpose *event, gpointer data) ; | 152 | gboolean xwidget_osr_damage_event_callback (GtkWidget *widget, GdkEventExpose *event, gpointer data) ; |
| 153 | gboolean webkit_osr_key_event_callback (GtkWidget *widget, GdkEventKey *event, gpointer data) ; | 153 | gboolean webkit_osr_key_event_callback (GtkWidget *widget, GdkEventKey *event, gpointer data) ; |
| 154 | void webkit_osr_document_load_finished_callback (WebKitWebView *webkitwebview, | 154 | void 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 | |||
| 183 | gboolean | ||
| 184 | xwgir_event_callback (GtkWidget *widget, | ||
| 185 | GdkEvent *event, | ||
| 186 | gpointer user_data); | ||
| 187 | |||
| 182 | GtkWidget* xwgir_create(char* class, char* namespace); | 188 | GtkWidget* xwgir_create(char* class, char* namespace); |
| 183 | 189 | ||
| 184 | DEFUN ("make-xwidget", Fmake_xwidget, Smake_xwidget, 7, 7, 0, | 190 | DEFUN ("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 */ |
| 480 | gboolean | 508 | gboolean |
| 481 | webkit_osr_damage_event_callback (GtkWidget *widget, GdkEventExpose *event, gpointer data) | 509 | xwidget_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 | ||
| 664 | GtkWidget* xwgir_create_debug; | ||
| 636 | 665 | ||
| 637 | gboolean | 666 | gboolean |
| 638 | xwidget_osr_button_callback (GtkWidget *widget, | 667 | xwidget_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 | |||
| 693 | gboolean | ||
| 694 | xwgir_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 | |||
| 651 | GIRepository *girepository ; | 707 | GIRepository *girepository ; |
| 652 | DEFUN( "xwgir-require-namespace",Fxwgir_require_namespace, Sxwgir_require_namespace, 2,2,0, | 708 | DEFUN( "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 | ||