| 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, >k_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 >k_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); |