diff options
| author | Joakim Verona | 2011-07-18 01:26:27 +0200 |
|---|---|---|
| committer | Joakim Verona | 2011-07-18 01:26:27 +0200 |
| commit | e9e9f8a3ff2ed8851e8ef1997d3a3911dbecd00d (patch) | |
| tree | e86f8c262138738eee7172e27e4cbf6bcb3273e8 /src/xwidget.c | |
| parent | b0ec5b0839c3f2687b4dddc385ae22b72f96db99 (diff) | |
| download | emacs-e9e9f8a3ff2ed8851e8ef1997d3a3911dbecd00d.tar.gz emacs-e9e9f8a3ff2ed8851e8ef1997d3a3911dbecd00d.zip | |
cleanups
Diffstat (limited to 'src/xwidget.c')
| -rw-r--r-- | src/xwidget.c | 147 |
1 files changed, 72 insertions, 75 deletions
diff --git a/src/xwidget.c b/src/xwidget.c index 44e1d327729..6a0d3ee4340 100644 --- a/src/xwidget.c +++ b/src/xwidget.c | |||
| @@ -102,7 +102,7 @@ | |||
| 102 | //would need to be hashtables or something | 102 | //would need to be hashtables or something |
| 103 | 103 | ||
| 104 | #define MAX_XWIDGETS 100 | 104 | #define MAX_XWIDGETS 100 |
| 105 | struct xwidget_view xwidget_views[MAX_XWIDGETS]; | 105 | struct xwidget_view xwidget_views[MAX_XWIDGETS]; |
| 106 | 106 | ||
| 107 | //TODO embryo of lisp allocators for xwidgets | 107 | //TODO embryo of lisp allocators for xwidgets |
| 108 | //TODO xwidget* should be Lisp_xwidget* | 108 | //TODO xwidget* should be Lisp_xwidget* |
| @@ -129,12 +129,12 @@ Lisp_Object Qxwidget_info; | |||
| 129 | Lisp_Object Qxwidget_resize; | 129 | Lisp_Object Qxwidget_resize; |
| 130 | Lisp_Object Qxwidget_send_keyboard_event; | 130 | Lisp_Object Qxwidget_send_keyboard_event; |
| 131 | 131 | ||
| 132 | Lisp_Object Qbutton, Qtoggle, Qslider, Qsocket, Qcairo, | 132 | Lisp_Object Qbutton, Qtoggle, Qslider, Qsocket, Qcairo, |
| 133 | Qwebkit_osr, QCplist; | 133 | Qwebkit_osr, QCplist; |
| 134 | 134 | ||
| 135 | 135 | ||
| 136 | extern Lisp_Object QCtype; | 136 | extern Lisp_Object QCtype; |
| 137 | extern Lisp_Object QCwidth, QCheight; | 137 | extern Lisp_Object QCwidth, QCheight; |
| 138 | 138 | ||
| 139 | struct xwidget_view* xwidget_view_lookup(struct xwidget* xw, struct window *w); | 139 | struct xwidget_view* xwidget_view_lookup(struct xwidget* xw, struct window *w); |
| 140 | Lisp_Object xwidget_spec_value ( Lisp_Object spec, Lisp_Object key, int *found); | 140 | Lisp_Object xwidget_spec_value ( Lisp_Object spec, Lisp_Object key, int *found); |
| @@ -145,7 +145,7 @@ DEFUN ("make-xwidget", Fmake_xwidget, Smake_xwidget, 7, 7, 0, | |||
| 145 | ) | 145 | ) |
| 146 | (Lisp_Object beg, Lisp_Object end, | 146 | (Lisp_Object beg, Lisp_Object end, |
| 147 | Lisp_Object type, | 147 | Lisp_Object type, |
| 148 | Lisp_Object title, | 148 | Lisp_Object title, |
| 149 | Lisp_Object width, Lisp_Object height, | 149 | Lisp_Object width, Lisp_Object height, |
| 150 | Lisp_Object data) | 150 | Lisp_Object data) |
| 151 | { | 151 | { |
| @@ -158,7 +158,7 @@ DEFUN ("make-xwidget", Fmake_xwidget, Smake_xwidget, 7, 7, 0, | |||
| 158 | struct gcpro gcpro1; | 158 | struct gcpro gcpro1; |
| 159 | GCPRO1(xw); | 159 | GCPRO1(xw); |
| 160 | XSETSYMBOL(xw->type, type); | 160 | XSETSYMBOL(xw->type, type); |
| 161 | XSETSTRING(xw->title, title); | 161 | XSETSTRING(xw->title, title); |
| 162 | XSETBUFFER(xw->buffer, Fcurrent_buffer()); // conservatively gcpro xw since we call lisp | 162 | XSETBUFFER(xw->buffer, Fcurrent_buffer()); // conservatively gcpro xw since we call lisp |
| 163 | xw->height = XFASTINT(height); | 163 | xw->height = XFASTINT(height); |
| 164 | xw->width = XFASTINT(width); | 164 | xw->width = XFASTINT(width); |
| @@ -180,21 +180,21 @@ DEFUN ("make-xwidget", Fmake_xwidget, Smake_xwidget, 7, 7, 0, | |||
| 180 | gtk_window_resize( GTK_WINDOW(xw->widgetwindow_osr), xw->width, xw->height); | 180 | gtk_window_resize( GTK_WINDOW(xw->widgetwindow_osr), xw->width, xw->height); |
| 181 | xw->widget_osr = webkit_web_view_new(); | 181 | xw->widget_osr = webkit_web_view_new(); |
| 182 | 182 | ||
| 183 | gtk_widget_set_size_request (GTK_WIDGET (xw->widget_osr), xw->width, xw->height); | 183 | gtk_widget_set_size_request (GTK_WIDGET (xw->widget_osr), xw->width, xw->height); |
| 184 | gtk_container_add (xw->widgetwindow_osr, xw->widget_osr); | 184 | gtk_container_add (xw->widgetwindow_osr, xw->widget_osr); |
| 185 | 185 | ||
| 186 | gtk_widget_show_all (GTK_WIDGET (xw->widgetwindow_osr)); | 186 | gtk_widget_show_all (GTK_WIDGET (xw->widgetwindow_osr)); |
| 187 | 187 | ||
| 188 | /* store some xwidget data in the gtk widgets for convenient retrieval in the event handlers. */ | 188 | /* store some xwidget data in the gtk widgets for convenient retrieval in the event handlers. */ |
| 189 | g_object_set_data (G_OBJECT (xw->widget_osr), XG_XWIDGET, (gpointer) (xw)); | 189 | g_object_set_data (G_OBJECT (xw->widget_osr), XG_XWIDGET, (gpointer) (xw)); |
| 190 | g_object_set_data (G_OBJECT (xw->widgetwindow_osr), XG_XWIDGET, (gpointer) (xw)); | 190 | g_object_set_data (G_OBJECT (xw->widgetwindow_osr), XG_XWIDGET, (gpointer) (xw)); |
| 191 | g_signal_connect (G_OBJECT ( xw->widgetwindow_osr), "damage-event", G_CALLBACK (webkit_osr_damage_event_callback), NULL); | 191 | g_signal_connect (G_OBJECT ( xw->widgetwindow_osr), "damage-event", G_CALLBACK (webkit_osr_damage_event_callback), NULL); |
| 192 | 192 | ||
| 193 | webkit_web_view_load_uri(WEBKIT_WEB_VIEW(xw->widget_osr), "http://www.fsf.org"); | 193 | webkit_web_view_load_uri(WEBKIT_WEB_VIEW(xw->widget_osr), "http://www.fsf.org"); |
| 194 | UNBLOCK_INPUT; | 194 | UNBLOCK_INPUT; |
| 195 | 195 | ||
| 196 | } | 196 | } |
| 197 | #endif | 197 | #endif |
| 198 | 198 | ||
| 199 | 199 | ||
| 200 | UNGCPRO; | 200 | UNGCPRO; |
| @@ -246,7 +246,7 @@ send_xembed_ready_event (struct xwidget* xw, int xembedid) | |||
| 246 | event.arg = Qnil; | 246 | event.arg = Qnil; |
| 247 | event.arg = Fcons (make_number (xembedid), event.arg); | 247 | event.arg = Fcons (make_number (xembedid), event.arg); |
| 248 | event.arg = Fcons (intern ("xembed-ready"), event.arg); | 248 | event.arg = Fcons (intern ("xembed-ready"), event.arg); |
| 249 | event.arg = Fcons (xw, event.arg); //TODO | 249 | event.arg = Fcons (xw, event.arg); //TODO |
| 250 | 250 | ||
| 251 | 251 | ||
| 252 | kbd_buffer_store_event (&event); | 252 | kbd_buffer_store_event (&event); |
| @@ -268,7 +268,7 @@ xwidget_show_view (struct xwidget_view *xv) | |||
| 268 | //printf("xwidget %d shown\n",xw->id); | 268 | //printf("xwidget %d shown\n",xw->id); |
| 269 | xv->hidden = 0; | 269 | xv->hidden = 0; |
| 270 | gtk_widget_show(GTK_WIDGET(xv->widgetwindow)); | 270 | gtk_widget_show(GTK_WIDGET(xv->widgetwindow)); |
| 271 | gtk_fixed_move (GTK_FIXED (xv->emacswindow), GTK_WIDGET (xv->widgetwindow), xv->x + xv->clip_left, xv->y + xv->clip_top); //TODO refactor | 271 | gtk_fixed_move (GTK_FIXED (xv->emacswindow), GTK_WIDGET (xv->widgetwindow), xv->x + xv->clip_left, xv->y + xv->clip_top); //TODO refactor |
| 272 | } | 272 | } |
| 273 | 273 | ||
| 274 | 274 | ||
| @@ -318,7 +318,7 @@ void xwidget_slider_changed (GtkRange *range, | |||
| 318 | 318 | ||
| 319 | printf("slider changed val:%f\n", v); | 319 | printf("slider changed val:%f\n", v); |
| 320 | 320 | ||
| 321 | 321 | ||
| 322 | //block sibling views signal handlers | 322 | //block sibling views signal handlers |
| 323 | for (int i = 0; i < MAX_XWIDGETS; i++) | 323 | for (int i = 0; i < MAX_XWIDGETS; i++) |
| 324 | { | 324 | { |
| @@ -342,7 +342,7 @@ void xwidget_slider_changed (GtkRange *range, | |||
| 342 | 342 | ||
| 343 | /* when the off-screen webkit master view changes this signal is called. | 343 | /* when the off-screen webkit master view changes this signal is called. |
| 344 | it copies the bitmap from the off-screen webkit instance */ | 344 | it copies the bitmap from the off-screen webkit instance */ |
| 345 | gboolean webkit_osr_damage_event_callback (GtkWidget *widget, GdkEventExpose *event, gpointer data) | 345 | gboolean webkit_osr_damage_event_callback (GtkWidget *widget, GdkEventExpose *event, gpointer data) |
| 346 | { | 346 | { |
| 347 | //TODO this is wrong! should just oueu a redraw of onscreen widget | 347 | //TODO this is wrong! should just oueu a redraw of onscreen widget |
| 348 | struct xwidget* xw = (struct xwidget*) g_object_get_data (G_OBJECT (widget), XG_XWIDGET); | 348 | struct xwidget* xw = (struct xwidget*) g_object_get_data (G_OBJECT (widget), XG_XWIDGET); |
| @@ -358,7 +358,7 @@ gboolean webkit_osr_damage_event_callback (GtkWidget *widget, GdkEventExpose *ev | |||
| 358 | } | 358 | } |
| 359 | 359 | ||
| 360 | return FALSE; | 360 | return FALSE; |
| 361 | } | 361 | } |
| 362 | 362 | ||
| 363 | 363 | ||
| 364 | //for gtk3 webkit_osr | 364 | //for gtk3 webkit_osr |
| @@ -366,8 +366,8 @@ gboolean | |||
| 366 | xwidget_osr_draw_callback (GtkWidget *widget, cairo_t *cr, gpointer data) | 366 | xwidget_osr_draw_callback (GtkWidget *widget, cairo_t *cr, gpointer data) |
| 367 | { | 367 | { |
| 368 | struct xwidget* xw = (struct xwidget*) g_object_get_data (G_OBJECT (widget), XG_XWIDGET); | 368 | struct xwidget* xw = (struct xwidget*) g_object_get_data (G_OBJECT (widget), XG_XWIDGET); |
| 369 | struct xwidget_view* xv = (struct xwidget_view*) g_object_get_data (G_OBJECT (widget), XG_XWIDGET_VIEW); | 369 | struct xwidget_view* xv = (struct xwidget_view*) g_object_get_data (G_OBJECT (widget), XG_XWIDGET_VIEW); |
| 370 | 370 | ||
| 371 | // printf("xwidget_osr_draw_callback gtk3 xw.id:%d xw.type:%d window:%d vis:%d\n", | 371 | // printf("xwidget_osr_draw_callback gtk3 xw.id:%d xw.type:%d window:%d vis:%d\n", |
| 372 | // xw,xw->type, gtk_widget_get_window (widget), gtk_widget_get_visible (xw->widget_osr)); | 372 | // xw,xw->type, gtk_widget_get_window (widget), gtk_widget_get_visible (xw->widget_osr)); |
| 373 | 373 | ||
| @@ -376,7 +376,7 @@ xwidget_osr_draw_callback (GtkWidget *widget, cairo_t *cr, gpointer data) | |||
| 376 | 376 | ||
| 377 | gtk_widget_draw (xw->widget_osr, cr); | 377 | gtk_widget_draw (xw->widget_osr, cr); |
| 378 | 378 | ||
| 379 | 379 | ||
| 380 | return FALSE; | 380 | return FALSE; |
| 381 | } | 381 | } |
| 382 | 382 | ||
| @@ -386,9 +386,9 @@ xwidget_osr_button_callback ( GtkWidget *widget, | |||
| 386 | GdkEvent *event, | 386 | GdkEvent *event, |
| 387 | gpointer user_data) | 387 | gpointer user_data) |
| 388 | { | 388 | { |
| 389 | struct xwidget* xw = (struct xwidget*) g_object_get_data (G_OBJECT (widget), XG_XWIDGET); | 389 | struct xwidget* xw = (struct xwidget*) g_object_get_data (G_OBJECT (widget), XG_XWIDGET); |
| 390 | GdkEvent* eventcopy = gdk_event_copy(event); | 390 | GdkEvent* eventcopy = gdk_event_copy(event); |
| 391 | 391 | ||
| 392 | ((GdkEventButton*)eventcopy)->window = gtk_widget_get_window(xw->widget_osr); | 392 | ((GdkEventButton*)eventcopy)->window = gtk_widget_get_window(xw->widget_osr); |
| 393 | gtk_main_do_event(eventcopy); //TODO this will leak events. they should be deallocated later | 393 | gtk_main_do_event(eventcopy); //TODO this will leak events. they should be deallocated later |
| 394 | } | 394 | } |
| @@ -397,7 +397,7 @@ int xwidget_view_index=0; | |||
| 397 | 397 | ||
| 398 | /* initializes and does initial placement of an xwidget view on screen */ | 398 | /* initializes and does initial placement of an xwidget view on screen */ |
| 399 | struct xwidget_view* | 399 | struct xwidget_view* |
| 400 | xwidget_init_view ( | 400 | xwidget_init_view ( |
| 401 | struct xwidget *xww, | 401 | struct xwidget *xww, |
| 402 | struct glyph_string *s, | 402 | struct glyph_string *s, |
| 403 | int x, int y) | 403 | int x, int y) |
| @@ -414,11 +414,11 @@ xwidget_init_view ( | |||
| 414 | 414 | ||
| 415 | xv = &xwidget_views[xwidget_view_index]; | 415 | xv = &xwidget_views[xwidget_view_index]; |
| 416 | }while( xv->initialized == 1); //TODO yeah this can infloop if there are MAX_WIDGETS on-screen | 416 | }while( xv->initialized == 1); //TODO yeah this can infloop if there are MAX_WIDGETS on-screen |
| 417 | 417 | ||
| 418 | xv->initialized = 1; | 418 | xv->initialized = 1; |
| 419 | xv->w = s->w; | 419 | xv->w = s->w; |
| 420 | xv->model = xww; | 420 | xv->model = xww; |
| 421 | 421 | ||
| 422 | //widget creation | 422 | //widget creation |
| 423 | if(EQ(xww->type, Qbutton)) | 423 | if(EQ(xww->type, Qbutton)) |
| 424 | { | 424 | { |
| @@ -434,7 +434,7 @@ xwidget_init_view ( | |||
| 434 | //gdk_color_parse("blue",&color); //the blue color never seems to show up. something else draws a grey bg | 434 | //gdk_color_parse("blue",&color); //the blue color never seems to show up. something else draws a grey bg |
| 435 | //gtk_widget_modify_bg(xv->widget, GTK_STATE_NORMAL, &color); | 435 | //gtk_widget_modify_bg(xv->widget, GTK_STATE_NORMAL, &color); |
| 436 | g_signal_connect_after(xv->widget, "plug-added", G_CALLBACK(xwidget_plug_added), "plug added"); | 436 | g_signal_connect_after(xv->widget, "plug-added", G_CALLBACK(xwidget_plug_added), "plug added"); |
| 437 | g_signal_connect_after(xv->widget, "plug-removed", G_CALLBACK(xwidget_plug_removed), "plug removed"); | 437 | g_signal_connect_after(xv->widget, "plug-removed", G_CALLBACK(xwidget_plug_removed), "plug removed"); |
| 438 | } else if (EQ(xww->type, Qslider)) { | 438 | } else if (EQ(xww->type, Qslider)) { |
| 439 | xv->widget = | 439 | xv->widget = |
| 440 | //gtk_hscale_new (GTK_ADJUSTMENT(gtk_adjustment_new (0.0, 0.0, 100.0, 1.0, 10.0, 10.0))); | 440 | //gtk_hscale_new (GTK_ADJUSTMENT(gtk_adjustment_new (0.0, 0.0, 100.0, 1.0, 10.0, 10.0))); |
| @@ -443,7 +443,7 @@ xwidget_init_view ( | |||
| 443 | xv->handler_id = g_signal_connect_after(xv->widget, "value-changed", G_CALLBACK(xwidget_slider_changed), "slider changed"); | 443 | xv->handler_id = g_signal_connect_after(xv->widget, "value-changed", G_CALLBACK(xwidget_slider_changed), "slider changed"); |
| 444 | } else if (EQ(xww->type, Qcairo)) { | 444 | } else if (EQ(xww->type, Qcairo)) { |
| 445 | //Cairo view | 445 | //Cairo view |
| 446 | //uhm cairo is differentish in gtk 3. | 446 | //uhm cairo is differentish in gtk 3. |
| 447 | //gdk_cairo_create (gtk_widget_get_window (f->gwfixed)); | 447 | //gdk_cairo_create (gtk_widget_get_window (f->gwfixed)); |
| 448 | #ifdef HAVE_GOOCANVAS | 448 | #ifdef HAVE_GOOCANVAS |
| 449 | xv->widget = goo_canvas_new(); | 449 | xv->widget = goo_canvas_new(); |
| @@ -463,7 +463,7 @@ xwidget_init_view ( | |||
| 463 | "font", "Sans 24", | 463 | "font", "Sans 24", |
| 464 | NULL); | 464 | NULL); |
| 465 | goo_canvas_item_rotate (text_item, 45, 300, 300); | 465 | goo_canvas_item_rotate (text_item, 45, 300, 300); |
| 466 | 466 | ||
| 467 | #endif | 467 | #endif |
| 468 | #ifdef HAVE_CLUTTER | 468 | #ifdef HAVE_CLUTTER |
| 469 | xv->widget = gtk_clutter_embed_new ();; | 469 | xv->widget = gtk_clutter_embed_new ();; |
| @@ -483,13 +483,13 @@ xwidget_init_view ( | |||
| 483 | /* draw on the context */ | 483 | /* draw on the context */ |
| 484 | RsvgHandle *h = rsvg_handle_new_from_file ("/tmp/tst.svg", | 484 | RsvgHandle *h = rsvg_handle_new_from_file ("/tmp/tst.svg", |
| 485 | NULL); | 485 | NULL); |
| 486 | 486 | ||
| 487 | rsvg_handle_render_cairo(h, cr); | 487 | rsvg_handle_render_cairo(h, cr); |
| 488 | cairo_destroy (cr); | 488 | cairo_destroy (cr); |
| 489 | 489 | ||
| 490 | /* Show the stage: */ | 490 | /* Show the stage: */ |
| 491 | clutter_actor_show (stage); | 491 | clutter_actor_show (stage); |
| 492 | #endif | 492 | #endif |
| 493 | } else if (EQ(xww->type, Qwebkit_osr)) { | 493 | } else if (EQ(xww->type, Qwebkit_osr)) { |
| 494 | #ifdef HAVE_WEBKIT_OSR | 494 | #ifdef HAVE_WEBKIT_OSR |
| 495 | xv->widget = gtk_drawing_area_new(); | 495 | xv->widget = gtk_drawing_area_new(); |
| @@ -498,19 +498,19 @@ xwidget_init_view ( | |||
| 498 | GDK_BUTTON_PRESS_MASK | 498 | GDK_BUTTON_PRESS_MASK |
| 499 | | GDK_BUTTON_RELEASE_MASK | 499 | | GDK_BUTTON_RELEASE_MASK |
| 500 | | GDK_POINTER_MOTION_MASK); | 500 | | GDK_POINTER_MOTION_MASK); |
| 501 | g_signal_connect (G_OBJECT ( xv->widget), "draw", | 501 | g_signal_connect (G_OBJECT ( xv->widget), "draw", |
| 502 | G_CALLBACK (xwidget_osr_draw_callback), NULL); | 502 | G_CALLBACK (xwidget_osr_draw_callback), NULL); |
| 503 | g_signal_connect (G_OBJECT ( xv->widget), "button-press-event", | 503 | g_signal_connect (G_OBJECT ( xv->widget), "button-press-event", |
| 504 | G_CALLBACK (xwidget_osr_button_callback), NULL); | 504 | G_CALLBACK (xwidget_osr_button_callback), NULL); |
| 505 | g_signal_connect (G_OBJECT ( xv->widget), "button-release-event", | 505 | g_signal_connect (G_OBJECT ( xv->widget), "button-release-event", |
| 506 | G_CALLBACK (xwidget_osr_button_callback), NULL); | 506 | G_CALLBACK (xwidget_osr_button_callback), NULL); |
| 507 | g_signal_connect (G_OBJECT ( xv->widget), "motion-notify-event", | 507 | g_signal_connect (G_OBJECT ( xv->widget), "motion-notify-event", |
| 508 | G_CALLBACK (xwidget_osr_button_callback), NULL); | 508 | G_CALLBACK (xwidget_osr_button_callback), NULL); |
| 509 | #endif | 509 | #endif |
| 510 | 510 | ||
| 511 | 511 | ||
| 512 | } else return NULL; | 512 | } else return NULL; |
| 513 | 513 | ||
| 514 | //widget realization | 514 | //widget realization |
| 515 | //make container widget 1st, and put the actual widget inside the container | 515 | //make container widget 1st, and put the actual widget inside the container |
| 516 | //later, drawing should crop container window if necessary to handle case where xwidget | 516 | //later, drawing should crop container window if necessary to handle case where xwidget |
| @@ -523,7 +523,7 @@ xwidget_init_view ( | |||
| 523 | //xv->widgetwindow = GTK_CONTAINER (gtk_event_box_new ()); //doesnt help clipping gtk3 | 523 | //xv->widgetwindow = GTK_CONTAINER (gtk_event_box_new ()); //doesnt help clipping gtk3 |
| 524 | //xv->widgetwindow = GTK_CONTAINER (gtk_scrolled_window_new (NULL, NULL)); //clips in gtk3 | 524 | //xv->widgetwindow = GTK_CONTAINER (gtk_scrolled_window_new (NULL, NULL)); //clips in gtk3 |
| 525 | //xv->widgetwindow = GTK_CONTAINER (gtk_viewport_new (NULL, NULL)); | 525 | //xv->widgetwindow = GTK_CONTAINER (gtk_viewport_new (NULL, NULL)); |
| 526 | 526 | ||
| 527 | 527 | ||
| 528 | /* GtkAllocation a; */ | 528 | /* GtkAllocation a; */ |
| 529 | /* a.x=0; a.y=0; a.width=xww->width; a.height=xww->height; */ | 529 | /* a.x=0; a.y=0; a.width=xww->width; a.height=xww->height; */ |
| @@ -546,29 +546,29 @@ xwidget_init_view ( | |||
| 546 | g_object_set_data (G_OBJECT (xv->widget), XG_FRAME_DATA, (gpointer) (s->f)); //the emacs frame | 546 | g_object_set_data (G_OBJECT (xv->widget), XG_FRAME_DATA, (gpointer) (s->f)); //the emacs frame |
| 547 | g_object_set_data (G_OBJECT (xv->widget), XG_XWIDGET, (gpointer) (xww)); //the xwidget | 547 | g_object_set_data (G_OBJECT (xv->widget), XG_XWIDGET, (gpointer) (xww)); //the xwidget |
| 548 | g_object_set_data (G_OBJECT (xv->widget), XG_XWIDGET_VIEW, (gpointer) (xv)); //the xwidget | 548 | g_object_set_data (G_OBJECT (xv->widget), XG_XWIDGET_VIEW, (gpointer) (xv)); //the xwidget |
| 549 | g_object_set_data (G_OBJECT (xv->widgetwindow), XG_XWIDGET, (gpointer) (xww)); //the xwidget | 549 | g_object_set_data (G_OBJECT (xv->widgetwindow), XG_XWIDGET, (gpointer) (xww)); //the xwidget |
| 550 | g_object_set_data (G_OBJECT (xv->widgetwindow), XG_XWIDGET_VIEW, (gpointer) (xv)); //the xwidget | 550 | g_object_set_data (G_OBJECT (xv->widgetwindow), XG_XWIDGET_VIEW, (gpointer) (xv)); //the xwidget |
| 551 | 551 | ||
| 552 | 552 | ||
| 553 | gtk_widget_set_size_request (GTK_WIDGET (xv->widget), xww->width, xww->height); | 553 | gtk_widget_set_size_request (GTK_WIDGET (xv->widget), xww->width, xww->height); |
| 554 | gtk_widget_set_size_request (GTK_WIDGET (xv->widgetwindow), xww->width, xww->height); | 554 | gtk_widget_set_size_request (GTK_WIDGET (xv->widgetwindow), xww->width, xww->height); |
| 555 | gtk_fixed_put (GTK_FIXED (s->f->gwfixed), GTK_WIDGET (xv->widgetwindow), x, y); | 555 | gtk_fixed_put (GTK_FIXED (s->f->gwfixed), GTK_WIDGET (xv->widgetwindow), x, y); |
| 556 | xv->x = x; xv->y = y; | 556 | xv->x = x; xv->y = y; |
| 557 | gtk_widget_show_all (GTK_WIDGET (xv->widgetwindow)); | 557 | gtk_widget_show_all (GTK_WIDGET (xv->widgetwindow)); |
| 558 | 558 | ||
| 559 | 559 | ||
| 560 | //this seems to enable xcomposition. later we need to paint ourselves somehow, | 560 | //this seems to enable xcomposition. later we need to paint ourselves somehow, |
| 561 | //since the widget is no longer responsible for painting itself | 561 | //since the widget is no longer responsible for painting itself |
| 562 | //if(xw->type!=3) //im having trouble with compositing and sockets. hmmm. | 562 | //if(xw->type!=3) //im having trouble with compositing and sockets. hmmm. |
| 563 | //gdk_window_set_composited (xw->widget->window, TRUE); | 563 | //gdk_window_set_composited (xw->widget->window, TRUE); |
| 564 | //gdk_window_set_composited (GTK_LAYOUT (xw->widgetwindow)->bin_window, TRUE); | 564 | //gdk_window_set_composited (GTK_LAYOUT (xw->widgetwindow)->bin_window, TRUE); |
| 565 | // gtk_widget_set_double_buffered (xw->widget,FALSE); | 565 | // gtk_widget_set_double_buffered (xw->widget,FALSE); |
| 566 | // gtk_widget_set_double_buffered (xw->widgetwindow,FALSE); | 566 | // gtk_widget_set_double_buffered (xw->widgetwindow,FALSE); |
| 567 | //gdk_window_set_composited (xw->widgetwindow, TRUE); | 567 | //gdk_window_set_composited (xw->widgetwindow, TRUE); |
| 568 | //g_signal_connect_after(xw->widget, "expose-event", G_CALLBACK(xwidget_composite_draw), "widget exposed"); | 568 | //g_signal_connect_after(xw->widget, "expose-event", G_CALLBACK(xwidget_composite_draw), "widget exposed"); |
| 569 | //g_signal_connect_after(xw->widgetwindow, "expose-event", G_CALLBACK(xwidget_composite_draw_widgetwindow), "widgetwindow exposed"); | 569 | //g_signal_connect_after(xw->widgetwindow, "expose-event", G_CALLBACK(xwidget_composite_draw_widgetwindow), "widgetwindow exposed"); |
| 570 | // g_signal_connect_after(xw->widget, "damage-event", G_CALLBACK(xwidget_composite_draw), "damaged"); | 570 | // g_signal_connect_after(xw->widget, "damage-event", G_CALLBACK(xwidget_composite_draw), "damaged"); |
| 571 | 571 | ||
| 572 | //widgettype specific initialization only possible after realization | 572 | //widgettype specific initialization only possible after realization |
| 573 | if (EQ(xww->type, Qsocket)) { | 573 | if (EQ(xww->type, Qsocket)) { |
| 574 | printf ("xwid:%d socket id:%x %d\n", | 574 | printf ("xwid:%d socket id:%x %d\n", |
| @@ -608,16 +608,16 @@ x_draw_xwidget_glyph_string (struct glyph_string *s) | |||
| 608 | window placement etc. | 608 | window placement etc. |
| 609 | */ | 609 | */ |
| 610 | printf ("xv init for xw %d\n", xww); | 610 | printf ("xv init for xw %d\n", xww); |
| 611 | xv = xwidget_init_view (xww, s, x, y); | 611 | xv = xwidget_init_view (xww, s, x, y); |
| 612 | } | 612 | } |
| 613 | 613 | ||
| 614 | //calculate clipping, which is used for all manner of onscreen xwidget views | 614 | //calculate clipping, which is used for all manner of onscreen xwidget views |
| 615 | //each widget border can get clipped by other emacs objects so there are four clipping variables | 615 | //each widget border can get clipped by other emacs objects so there are four clipping variables |
| 616 | clip_right = min (xww->width, WINDOW_RIGHT_EDGE_X (s->w) - x - WINDOW_RIGHT_SCROLL_BAR_AREA_WIDTH(s->w) - WINDOW_RIGHT_FRINGE_WIDTH(s->w)); | 616 | clip_right = min (xww->width, WINDOW_RIGHT_EDGE_X (s->w) - x - WINDOW_RIGHT_SCROLL_BAR_AREA_WIDTH(s->w) - WINDOW_RIGHT_FRINGE_WIDTH(s->w)); |
| 617 | clip_left = max (0, WINDOW_LEFT_EDGE_X (s->w) - x + WINDOW_LEFT_SCROLL_BAR_AREA_WIDTH(s->w) + WINDOW_LEFT_FRINGE_WIDTH(s->w)); | 617 | clip_left = max (0, WINDOW_LEFT_EDGE_X (s->w) - x + WINDOW_LEFT_SCROLL_BAR_AREA_WIDTH(s->w) + WINDOW_LEFT_FRINGE_WIDTH(s->w)); |
| 618 | 618 | ||
| 619 | clip_bottom = min (xww->height, WINDOW_BOTTOM_EDGE_Y (s->w) - WINDOW_MODE_LINE_HEIGHT (s->w) - y); | 619 | clip_bottom = min (xww->height, WINDOW_BOTTOM_EDGE_Y (s->w) - WINDOW_MODE_LINE_HEIGHT (s->w) - y); |
| 620 | clip_top = max(0, WINDOW_TOP_EDGE_Y(s->w) -y ); | 620 | clip_top = max(0, WINDOW_TOP_EDGE_Y(s->w) -y ); |
| 621 | 621 | ||
| 622 | //we are conserned with movement of the onscreen area. the area might sit still when the widget actually moves | 622 | //we are conserned with movement of the onscreen area. the area might sit still when the widget actually moves |
| 623 | //this happens when an emacs window border moves across a widget winow | 623 | //this happens when an emacs window border moves across a widget winow |
| @@ -647,7 +647,7 @@ x_draw_xwidget_glyph_string (struct glyph_string *s) | |||
| 647 | gtk_fixed_move(GTK_FIXED(xv->widgetwindow), xv->widget, -clip_left, -clip_top); | 647 | gtk_fixed_move(GTK_FIXED(xv->widgetwindow), xv->widget, -clip_left, -clip_top); |
| 648 | 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); | 648 | 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); |
| 649 | 649 | ||
| 650 | 650 | ||
| 651 | xv->clip_right = clip_right; xv->clip_bottom = clip_bottom; xv->clip_top = clip_top;xv->clip_left = clip_left; | 651 | xv->clip_right = clip_right; xv->clip_bottom = clip_bottom; xv->clip_top = clip_top;xv->clip_left = clip_left; |
| 652 | } | 652 | } |
| 653 | //if emacs wants to repaint the area where the widget lives, queue a redraw | 653 | //if emacs wants to repaint the area where the widget lives, queue a redraw |
| @@ -692,7 +692,7 @@ DEFUN ("xwidget-webkit-get-title", Fxwidget_webkit_get_title, Sxwidget_webkit_g | |||
| 692 | 692 | ||
| 693 | 693 | ||
| 694 | 694 | ||
| 695 | #endif | 695 | #endif |
| 696 | 696 | ||
| 697 | 697 | ||
| 698 | 698 | ||
| @@ -710,7 +710,7 @@ DEFUN ("xwidget-resize", Fxwidget_resize, Sxwidget_resize, 3, 3, 0, doc: | |||
| 710 | CHECK_NUMBER (new_height); | 710 | CHECK_NUMBER (new_height); |
| 711 | w = XFASTINT (new_width); | 711 | w = XFASTINT (new_width); |
| 712 | h = XFASTINT (new_height); | 712 | h = XFASTINT (new_height); |
| 713 | 713 | ||
| 714 | 714 | ||
| 715 | printf("resize xwidget %d (%d,%d)->(%d,%d)",xw, xw->width,xw->height,w,h); | 715 | printf("resize xwidget %d (%d,%d)->(%d,%d)",xw, xw->width,xw->height,w,h); |
| 716 | xw->width=w; | 716 | xw->width=w; |
| @@ -763,13 +763,13 @@ DEFUN("xwidget-info", Fxwidget_info , Sxwidget_info, 1,1,0, doc: /* get xwidget | |||
| 763 | return info; | 763 | return info; |
| 764 | } | 764 | } |
| 765 | 765 | ||
| 766 | 766 | ||
| 767 | DEFUN("xwidget-view-info", Fxwidget_view_info , Sxwidget_view_info, 2,2,0, doc: /* get xwidget view props */) | 767 | DEFUN("xwidget-view-info", Fxwidget_view_info , Sxwidget_view_info, 2,2,0, doc: /* get xwidget view props */) |
| 768 | (Lisp_Object xwidget, Lisp_Object window) | 768 | (Lisp_Object xwidget, Lisp_Object window) |
| 769 | { | 769 | { |
| 770 | struct xwidget* xw = XXWIDGET(xwidget); | 770 | struct xwidget* xw = XXWIDGET(xwidget); |
| 771 | struct xwidget_view* xv = xwidget_view_lookup(xw, XWINDOW(window)); | 771 | struct xwidget_view* xv = xwidget_view_lookup(xw, XWINDOW(window)); |
| 772 | 772 | ||
| 773 | Lisp_Object info; | 773 | Lisp_Object info; |
| 774 | 774 | ||
| 775 | info = Fmake_vector (make_number (6), Qnil); | 775 | info = Fmake_vector (make_number (6), Qnil); |
| @@ -801,7 +801,7 @@ DEFUN("xwidget-delete-zombies", Fxwidget_delete_zombies , Sxwidget_delete_zombie | |||
| 801 | xv = &xwidget_views[i]; | 801 | xv = &xwidget_views[i]; |
| 802 | XSETWINDOW(w, xv->w); | 802 | XSETWINDOW(w, xv->w); |
| 803 | if(xv->initialized && (! (WINDOW_LIVE_P(w)))){ | 803 | if(xv->initialized && (! (WINDOW_LIVE_P(w)))){ |
| 804 | 804 | ||
| 805 | gtk_widget_destroy(GTK_WIDGET(xv->widgetwindow)); | 805 | gtk_widget_destroy(GTK_WIDGET(xv->widgetwindow)); |
| 806 | xv->initialized = 0; | 806 | xv->initialized = 0; |
| 807 | } | 807 | } |
| @@ -832,19 +832,19 @@ syms_of_xwidget (void) | |||
| 832 | DEFSYM (Qcxwidget ,":xwidget"); | 832 | DEFSYM (Qcxwidget ,":xwidget"); |
| 833 | DEFSYM (Qtitle ,":title"); | 833 | DEFSYM (Qtitle ,":title"); |
| 834 | 834 | ||
| 835 | DEFSYM (Qbutton, "button"); | 835 | DEFSYM (Qbutton, "button"); |
| 836 | DEFSYM (Qtoggle, "toggle"); | 836 | DEFSYM (Qtoggle, "toggle"); |
| 837 | DEFSYM (Qslider, "slider"); | 837 | DEFSYM (Qslider, "slider"); |
| 838 | DEFSYM (Qsocket, "socket"); | 838 | DEFSYM (Qsocket, "socket"); |
| 839 | DEFSYM (Qcairo, "cairo"); | 839 | DEFSYM (Qcairo, "cairo"); |
| 840 | DEFSYM (Qwebkit_osr ,"webkit-osr"); | 840 | DEFSYM (Qwebkit_osr ,"webkit-osr"); |
| 841 | DEFSYM (QCplist, ":plist"); | 841 | DEFSYM (QCplist, ":plist"); |
| 842 | 842 | ||
| 843 | DEFVAR_LISP ("xwidget-alist", Vxwidget_alist, doc: /*xwidgets list*/); | 843 | DEFVAR_LISP ("xwidget-alist", Vxwidget_alist, doc: /*xwidgets list*/); |
| 844 | Vxwidget_alist = Qnil; | 844 | Vxwidget_alist = Qnil; |
| 845 | DEFVAR_LISP ("xwidget-view-alist", Vxwidget_view_alist, doc: /*xwidget views list*/); | 845 | DEFVAR_LISP ("xwidget-view-alist", Vxwidget_view_alist, doc: /*xwidget views list*/); |
| 846 | Vxwidget_alist = Qnil; | 846 | Vxwidget_alist = Qnil; |
| 847 | 847 | ||
| 848 | Fprovide (intern ("xwidget-internal"), Qnil); | 848 | Fprovide (intern ("xwidget-internal"), Qnil); |
| 849 | 849 | ||
| 850 | // for (i = 0; i < MAX_XWIDGETS; i++) | 850 | // for (i = 0; i < MAX_XWIDGETS; i++) |
| @@ -937,7 +937,7 @@ struct xwidget_view* xwidget_view_lookup(struct xwidget* xw, struct window * | |||
| 937 | for (int i = 0; i < MAX_XWIDGETS; i++) | 937 | for (int i = 0; i < MAX_XWIDGETS; i++) |
| 938 | if ((xwidget_views[i].model == xw) && (xwidget_views[i].w == w)) | 938 | if ((xwidget_views[i].model == xw) && (xwidget_views[i].w == w)) |
| 939 | xv = &xwidget_views[i]; | 939 | xv = &xwidget_views[i]; |
| 940 | 940 | ||
| 941 | return xv; | 941 | return xv; |
| 942 | } | 942 | } |
| 943 | 943 | ||
| @@ -950,7 +950,7 @@ void gtk_window_get_position (GtkWindow *window, | |||
| 950 | *root_y = 0; | 950 | *root_y = 0; |
| 951 | } | 951 | } |
| 952 | 952 | ||
| 953 | 953 | ||
| 954 | 954 | ||
| 955 | struct xwidget* | 955 | struct xwidget* |
| 956 | lookup_xwidget (Lisp_Object spec) | 956 | lookup_xwidget (Lisp_Object spec) |
| @@ -960,7 +960,7 @@ lookup_xwidget (Lisp_Object spec) | |||
| 960 | So, take special care of one-shot events | 960 | So, take special care of one-shot events |
| 961 | 961 | ||
| 962 | TODO remove xwidget init from display spec. simply store an xwidget reference only and set | 962 | TODO remove xwidget init from display spec. simply store an xwidget reference only and set |
| 963 | size etc when creating the xwidget, which should happen before insertion into buffer | 963 | size etc when creating the xwidget, which should happen before insertion into buffer |
| 964 | */ | 964 | */ |
| 965 | int found = 0, found1 = 0, found2 = 0; | 965 | int found = 0, found1 = 0, found2 = 0; |
| 966 | Lisp_Object value; | 966 | Lisp_Object value; |
| @@ -1000,23 +1000,23 @@ xwidget_start_redisplay (void) | |||
| 1000 | 1000 | ||
| 1001 | /* the xwidget was touched during redisplay, so it isnt a candidate for hiding*/ | 1001 | /* the xwidget was touched during redisplay, so it isnt a candidate for hiding*/ |
| 1002 | void | 1002 | void |
| 1003 | xwidget_touch (struct xwidget_view *xw) | 1003 | xwidget_touch (struct xwidget_view *xv) |
| 1004 | { | 1004 | { |
| 1005 | xw->redisplayed = 1; | 1005 | xv->redisplayed = 1; |
| 1006 | } | 1006 | } |
| 1007 | 1007 | ||
| 1008 | int | 1008 | int |
| 1009 | xwidget_touched (struct xwidget_view *xw) | 1009 | xwidget_touched (struct xwidget_view *xv) |
| 1010 | { | 1010 | { |
| 1011 | return xw->redisplayed; | 1011 | return xv->redisplayed; |
| 1012 | } | 1012 | } |
| 1013 | 1013 | ||
| 1014 | /* redisplay has ended, now we should hide untouched xwidgets | 1014 | /* redisplay has ended, now we should hide untouched xwidgets |
| 1015 | */ | 1015 | */ |
| 1016 | void | 1016 | void |
| 1017 | xwidget_end_redisplay (struct glyph_matrix *matrix) | 1017 | xwidget_end_redisplay (struct window *w, struct glyph_matrix *matrix) |
| 1018 | { | 1018 | { |
| 1019 | 1019 | ||
| 1020 | int i; | 1020 | int i; |
| 1021 | struct xwidget *xw; | 1021 | struct xwidget *xw; |
| 1022 | int area; | 1022 | int area; |
| @@ -1045,12 +1045,11 @@ xwidget_end_redisplay (struct glyph_matrix *matrix) | |||
| 1045 | if (glyph->type == XWIDGET_GLYPH) | 1045 | if (glyph->type == XWIDGET_GLYPH) |
| 1046 | { | 1046 | { |
| 1047 | /* | 1047 | /* |
| 1048 | the only call to xwidget_end_redisplay is in dispnew and looks like: | 1048 | the only call to xwidget_end_redisplay is in dispnew |
| 1049 | if ((XWINDOW(FRAME_SELECTED_WINDOW (SELECTED_FRAME()))) == (w)) | ||
| 1050 | xwidget_end_redisplay(w->current_matrix); | 1049 | xwidget_end_redisplay(w->current_matrix); |
| 1051 | */ | 1050 | */ |
| 1052 | xwidget_touch (xwidget_view_lookup(glyph->u.xwidget, | 1051 | xwidget_touch (xwidget_view_lookup(glyph->u.xwidget, |
| 1053 | (XWINDOW(FRAME_SELECTED_WINDOW (SELECTED_FRAME()))))); | 1052 | w)); |
| 1054 | } | 1053 | } |
| 1055 | } | 1054 | } |
| 1056 | } | 1055 | } |
| @@ -1062,7 +1061,7 @@ xwidget_end_redisplay (struct glyph_matrix *matrix) | |||
| 1062 | struct xwidget_view* xv = &xwidget_views[i]; | 1061 | struct xwidget_view* xv = &xwidget_views[i]; |
| 1063 | 1062 | ||
| 1064 | //"touched" is only meaningful for the "live" window, so disregard other views | 1063 | //"touched" is only meaningful for the "live" window, so disregard other views |
| 1065 | if (xv->initialized && ( xv->w == (XWINDOW(FRAME_SELECTED_WINDOW (SELECTED_FRAME()))))) | 1064 | if (xv->initialized && ( xv->w == w)) |
| 1066 | { | 1065 | { |
| 1067 | if (xwidget_touched(xv)) | 1066 | if (xwidget_touched(xv)) |
| 1068 | xwidget_show_view (xv); | 1067 | xwidget_show_view (xv); |
| @@ -1071,5 +1070,3 @@ xwidget_end_redisplay (struct glyph_matrix *matrix) | |||
| 1071 | } | 1070 | } |
| 1072 | } | 1071 | } |
| 1073 | } | 1072 | } |
| 1074 | |||
| 1075 | |||