aboutsummaryrefslogtreecommitdiffstats
path: root/src/xwidget.c
diff options
context:
space:
mode:
authorJoakim Verona2011-07-18 01:26:27 +0200
committerJoakim Verona2011-07-18 01:26:27 +0200
commite9e9f8a3ff2ed8851e8ef1997d3a3911dbecd00d (patch)
treee86f8c262138738eee7172e27e4cbf6bcb3273e8 /src/xwidget.c
parentb0ec5b0839c3f2687b4dddc385ae22b72f96db99 (diff)
downloademacs-e9e9f8a3ff2ed8851e8ef1997d3a3911dbecd00d.tar.gz
emacs-e9e9f8a3ff2ed8851e8ef1997d3a3911dbecd00d.zip
cleanups
Diffstat (limited to 'src/xwidget.c')
-rw-r--r--src/xwidget.c147
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
105struct xwidget_view xwidget_views[MAX_XWIDGETS]; 105struct 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;
129Lisp_Object Qxwidget_resize; 129Lisp_Object Qxwidget_resize;
130Lisp_Object Qxwidget_send_keyboard_event; 130Lisp_Object Qxwidget_send_keyboard_event;
131 131
132Lisp_Object Qbutton, Qtoggle, Qslider, Qsocket, Qcairo, 132Lisp_Object Qbutton, Qtoggle, Qslider, Qsocket, Qcairo,
133 Qwebkit_osr, QCplist; 133 Qwebkit_osr, QCplist;
134 134
135 135
136extern Lisp_Object QCtype; 136extern Lisp_Object QCtype;
137extern Lisp_Object QCwidth, QCheight; 137extern Lisp_Object QCwidth, QCheight;
138 138
139struct xwidget_view* xwidget_view_lookup(struct xwidget* xw, struct window *w); 139struct xwidget_view* xwidget_view_lookup(struct xwidget* xw, struct window *w);
140Lisp_Object xwidget_spec_value ( Lisp_Object spec, Lisp_Object key, int *found); 140Lisp_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 */
345gboolean webkit_osr_damage_event_callback (GtkWidget *widget, GdkEventExpose *event, gpointer data) 345gboolean 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
366xwidget_osr_draw_callback (GtkWidget *widget, cairo_t *cr, gpointer data) 366xwidget_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 */
399struct xwidget_view* 399struct xwidget_view*
400xwidget_init_view ( 400xwidget_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
767DEFUN("xwidget-view-info", Fxwidget_view_info , Sxwidget_view_info, 2,2,0, doc: /* get xwidget view props */) 767DEFUN("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
955struct xwidget* 955struct xwidget*
956lookup_xwidget (Lisp_Object spec) 956lookup_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*/
1002void 1002void
1003xwidget_touch (struct xwidget_view *xw) 1003xwidget_touch (struct xwidget_view *xv)
1004{ 1004{
1005 xw->redisplayed = 1; 1005 xv->redisplayed = 1;
1006} 1006}
1007 1007
1008int 1008int
1009xwidget_touched (struct xwidget_view *xw) 1009xwidget_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*/
1016void 1016void
1017xwidget_end_redisplay (struct glyph_matrix *matrix) 1017xwidget_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