pidgin/gtkwhiteboard.c

changeset 37422
07dcc28b6039
parent 37111
efe4b7c5218a
child 37992
0185eb26ac7d
equal deleted inserted replaced
37421:ee3bd4532a33 37422:07dcc28b6039
85 85
86 static gboolean pidgin_whiteboard_configure_event(GtkWidget *widget, GdkEventConfigure *event, gpointer data); 86 static gboolean pidgin_whiteboard_configure_event(GtkWidget *widget, GdkEventConfigure *event, gpointer data);
87 static gboolean 87 static gboolean
88 pidgin_whiteboard_draw_event(GtkWidget *widget, cairo_t *cr, 88 pidgin_whiteboard_draw_event(GtkWidget *widget, cairo_t *cr,
89 gpointer _gtkwb); 89 gpointer _gtkwb);
90 #if !GTK_CHECK_VERSION(3,0,0)
91 static gboolean
92 pidgin_whiteboard_expose_event(GtkWidget *widget, GdkEventExpose *event,
93 gpointer _gtkwb);
94 #endif
95 90
96 static gboolean pidgin_whiteboard_brush_down(GtkWidget *widget, GdkEventButton *event, gpointer data); 91 static gboolean pidgin_whiteboard_brush_down(GtkWidget *widget, GdkEventButton *event, gpointer data);
97 static gboolean pidgin_whiteboard_brush_motion(GtkWidget *widget, GdkEventMotion *event, gpointer data); 92 static gboolean pidgin_whiteboard_brush_motion(GtkWidget *widget, GdkEventMotion *event, gpointer data);
98 static gboolean pidgin_whiteboard_brush_up(GtkWidget *widget, GdkEventButton *event, gpointer data); 93 static gboolean pidgin_whiteboard_brush_up(GtkWidget *widget, GdkEventButton *event, gpointer data);
99 94
217 gtk_box_pack_start(GTK_BOX(hbox_canvas_and_controls), drawing_area, TRUE, TRUE, PIDGIN_HIG_BOX_SPACE); 212 gtk_box_pack_start(GTK_BOX(hbox_canvas_and_controls), drawing_area, TRUE, TRUE, PIDGIN_HIG_BOX_SPACE);
218 213
219 gtk_widget_show(drawing_area); 214 gtk_widget_show(drawing_area);
220 215
221 /* Signals used to handle backing pixmap */ 216 /* Signals used to handle backing pixmap */
222 #if GTK_CHECK_VERSION(3,0,0)
223 g_signal_connect(G_OBJECT(drawing_area), "draw", 217 g_signal_connect(G_OBJECT(drawing_area), "draw",
224 G_CALLBACK(pidgin_whiteboard_draw_event), gtkwb); 218 G_CALLBACK(pidgin_whiteboard_draw_event), gtkwb);
225 219
226 g_signal_connect(G_OBJECT(drawing_area), "configure-event", 220 g_signal_connect(G_OBJECT(drawing_area), "configure-event",
227 G_CALLBACK(pidgin_whiteboard_configure_event), gtkwb); 221 G_CALLBACK(pidgin_whiteboard_configure_event), gtkwb);
228 #else
229 g_signal_connect(G_OBJECT(drawing_area), "expose_event",
230 G_CALLBACK(pidgin_whiteboard_expose_event), gtkwb);
231
232 g_signal_connect(G_OBJECT(drawing_area), "configure_event",
233 G_CALLBACK(pidgin_whiteboard_configure_event), gtkwb);
234 #endif
235 222
236 /* Event signals */ 223 /* Event signals */
237 g_signal_connect(G_OBJECT(drawing_area), "button_press_event", 224 g_signal_connect(G_OBJECT(drawing_area), "button_press_event",
238 G_CALLBACK(pidgin_whiteboard_brush_down), gtkwb); 225 G_CALLBACK(pidgin_whiteboard_brush_down), gtkwb);
239 226
387 static gboolean pidgin_whiteboard_configure_event(GtkWidget *widget, GdkEventConfigure *event, gpointer data) 374 static gboolean pidgin_whiteboard_configure_event(GtkWidget *widget, GdkEventConfigure *event, gpointer data)
388 { 375 {
389 PidginWhiteboard *gtkwb = (PidginWhiteboard*)data; 376 PidginWhiteboard *gtkwb = (PidginWhiteboard*)data;
390 cairo_t *cr; 377 cairo_t *cr;
391 GtkAllocation allocation; 378 GtkAllocation allocation;
392 #if GTK_CHECK_VERSION(3,0,0)
393 GdkRGBA white = {1.0, 1.0, 1.0, 1.0}; 379 GdkRGBA white = {1.0, 1.0, 1.0, 1.0};
394 #endif
395 380
396 if (gtkwb->priv->cr) 381 if (gtkwb->priv->cr)
397 cairo_destroy(gtkwb->priv->cr); 382 cairo_destroy(gtkwb->priv->cr);
398 if (gtkwb->priv->surface) 383 if (gtkwb->priv->surface)
399 cairo_surface_destroy(gtkwb->priv->surface); 384 cairo_surface_destroy(gtkwb->priv->surface);
401 gtk_widget_get_allocation(widget, &allocation); 386 gtk_widget_get_allocation(widget, &allocation);
402 387
403 gtkwb->priv->surface = cairo_image_surface_create(CAIRO_FORMAT_RGB24, 388 gtkwb->priv->surface = cairo_image_surface_create(CAIRO_FORMAT_RGB24,
404 allocation.width, allocation.height); 389 allocation.width, allocation.height);
405 gtkwb->priv->cr = cr = cairo_create(gtkwb->priv->surface); 390 gtkwb->priv->cr = cr = cairo_create(gtkwb->priv->surface);
406 #if GTK_CHECK_VERSION(3,0,0)
407 gdk_cairo_set_source_rgba(cr, &white); 391 gdk_cairo_set_source_rgba(cr, &white);
408 #else
409 gdk_cairo_set_source_color(cr, &gtk_widget_get_style(widget)->white);
410 #endif
411 cairo_rectangle(cr, 0, 0, allocation.width, allocation.height); 392 cairo_rectangle(cr, 0, 0, allocation.width, allocation.height);
412 cairo_fill(cr); 393 cairo_fill(cr);
413 394
414 return TRUE; 395 return TRUE;
415 } 396 }
423 cairo_set_source_surface(cr, gtkwb->priv->surface, 0, 0); 404 cairo_set_source_surface(cr, gtkwb->priv->surface, 0, 0);
424 cairo_paint(cr); 405 cairo_paint(cr);
425 406
426 return FALSE; 407 return FALSE;
427 } 408 }
428
429 #if !GTK_CHECK_VERSION(3,0,0)
430 static gboolean
431 pidgin_whiteboard_expose_event(GtkWidget *widget, GdkEventExpose *event,
432 gpointer _gtkwb)
433 {
434 cairo_t *cr;
435
436 cr = gdk_cairo_create(GDK_DRAWABLE(widget->window));
437
438 pidgin_whiteboard_draw_event(widget, cr, _gtkwb);
439
440 cairo_destroy(cr);
441
442 return FALSE;
443 }
444 #endif
445 409
446 static gboolean pidgin_whiteboard_brush_down(GtkWidget *widget, GdkEventButton *event, gpointer data) 410 static gboolean pidgin_whiteboard_brush_down(GtkWidget *widget, GdkEventButton *event, gpointer data)
447 { 411 {
448 PidginWhiteboard *gtkwb = (PidginWhiteboard*)data; 412 PidginWhiteboard *gtkwb = (PidginWhiteboard*)data;
449 413
500 464
501 PurpleWhiteboard *wb = gtkwb->wb; 465 PurpleWhiteboard *wb = gtkwb->wb;
502 GList *draw_list = purple_whiteboard_get_draw_list(wb); 466 GList *draw_list = purple_whiteboard_get_draw_list(wb);
503 467
504 if(event->is_hint) 468 if(event->is_hint)
505 #if GTK_CHECK_VERSION(3,0,0)
506 gdk_window_get_device_position(event->window, event->device, &x, &y, 469 gdk_window_get_device_position(event->window, event->device, &x, &y,
507 &state); 470 &state);
508 #else
509 gdk_window_get_pointer(event->window, &x, &y, &state);
510 #endif
511 else 471 else
512 { 472 {
513 x = event->x; 473 x = event->x;
514 y = event->y; 474 y = event->y;
515 state = event->state; 475 state = event->state;
643 { 603 {
644 PidginWhiteboard *gtkwb = purple_whiteboard_get_ui_data(wb); 604 PidginWhiteboard *gtkwb = purple_whiteboard_get_ui_data(wb);
645 GtkWidget *widget = gtkwb->drawing_area; 605 GtkWidget *widget = gtkwb->drawing_area;
646 cairo_t *gfx_con = gtkwb->priv->cr; 606 cairo_t *gfx_con = gtkwb->priv->cr;
647 GdkColor col; 607 GdkColor col;
648 #if GTK_CHECK_VERSION(3,0,0)
649 GdkRGBA rgba; 608 GdkRGBA rgba;
650 #endif
651 609
652 /* Interpret and convert color */ 610 /* Interpret and convert color */
653 pidgin_whiteboard_rgb24_to_rgb48(color, &col); 611 pidgin_whiteboard_rgb24_to_rgb48(color, &col);
654 612
655 #if GTK_CHECK_VERSION(3,0,0)
656 rgba.red = col.red / 0xffff; 613 rgba.red = col.red / 0xffff;
657 rgba.green = col.green / 0xffff; 614 rgba.green = col.green / 0xffff;
658 rgba.blue = col.blue / 0xffff; 615 rgba.blue = col.blue / 0xffff;
659 rgba.alpha = 1.0; 616 rgba.alpha = 1.0;
660 gdk_cairo_set_source_rgba(gfx_con, &rgba); 617 gdk_cairo_set_source_rgba(gfx_con, &rgba);
661 #else
662 gdk_cairo_set_source_color(gfx_con, &col);
663 #endif
664 618
665 /* Draw a circle */ 619 /* Draw a circle */
666 cairo_arc(gfx_con, 620 cairo_arc(gfx_con,
667 x, y, 621 x, y,
668 size / 2.0, 622 size / 2.0,
761 { 715 {
762 PidginWhiteboard *gtkwb = purple_whiteboard_get_ui_data(wb); 716 PidginWhiteboard *gtkwb = purple_whiteboard_get_ui_data(wb);
763 GtkWidget *drawing_area = gtkwb->drawing_area; 717 GtkWidget *drawing_area = gtkwb->drawing_area;
764 cairo_t *cr = gtkwb->priv->cr; 718 cairo_t *cr = gtkwb->priv->cr;
765 GtkAllocation allocation; 719 GtkAllocation allocation;
766 #if GTK_CHECK_VERSION(3,0,0)
767 GdkRGBA white = {1.0, 1.0, 1.0, 1.0}; 720 GdkRGBA white = {1.0, 1.0, 1.0, 1.0};
768 #endif
769 721
770 gtk_widget_get_allocation(drawing_area, &allocation); 722 gtk_widget_get_allocation(drawing_area, &allocation);
771 723
772 #if GTK_CHECK_VERSION(3,0,0)
773 gdk_cairo_set_source_rgba(cr, &white); 724 gdk_cairo_set_source_rgba(cr, &white);
774 #else
775 gdk_cairo_set_source_color(cr,
776 &gtk_widget_get_style(drawing_area)->white);
777 #endif
778 cairo_rectangle(cr, 0, 0, allocation.width, allocation.height); 725 cairo_rectangle(cr, 0, 0, allocation.width, allocation.height);
779 cairo_fill(cr); 726 cairo_fill(cr);
780 727
781 gtk_widget_queue_draw_area(drawing_area, 0, 0, 728 gtk_widget_queue_draw_area(drawing_area, 0, 0,
782 allocation.width, allocation.height); 729 allocation.width, allocation.height);

mercurial