[gtk+/rendering-cleanup-next: 96/153] trayicon: Port to draw vfunc
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/rendering-cleanup-next: 96/153] trayicon: Port to draw vfunc
- Date: Sat, 11 Sep 2010 04:59:30 +0000 (UTC)
commit 8d12d26d2769d2ccf401a9695cbc9279644e1b4c
Author: Benjamin Otte <otte redhat com>
Date: Wed Sep 8 16:33:14 2010 +0200
trayicon: Port to draw vfunc
gtk/gtktrayicon-x11.c | 63 ++++++++++++++++++++++++++++---------------------
1 files changed, 36 insertions(+), 27 deletions(-)
---
diff --git a/gtk/gtktrayicon-x11.c b/gtk/gtktrayicon-x11.c
index eb22fd4..9d1de73 100644
--- a/gtk/gtktrayicon-x11.c
+++ b/gtk/gtktrayicon-x11.c
@@ -23,6 +23,7 @@
*/
#include "config.h"
+#include <math.h>
#include <string.h>
#include "gtkintl.h"
@@ -31,6 +32,7 @@
#include "x11/gdkx.h"
#include <X11/Xatom.h>
+#include <cairo-xlib.h>
#define SYSTEM_TRAY_REQUEST_DOCK 0
#define SYSTEM_TRAY_BEGIN_MESSAGE 1
@@ -85,8 +87,10 @@ static void gtk_tray_icon_style_set (GtkWidget *widget,
GtkStyle *previous_style);
static gboolean gtk_tray_icon_delete (GtkWidget *widget,
GdkEventAny *event);
-static gboolean gtk_tray_icon_expose (GtkWidget *widget,
- GdkEventExpose *event);
+static gboolean gtk_tray_icon_draw (GtkWidget *widget,
+ cairo_t *cr,
+ int width,
+ int height);
static void gtk_tray_icon_clear_manager_window (GtkTrayIcon *icon);
static void gtk_tray_icon_update_manager_window (GtkTrayIcon *icon);
@@ -112,7 +116,7 @@ gtk_tray_icon_class_init (GtkTrayIconClass *class)
widget_class->realize = gtk_tray_icon_realize;
widget_class->style_set = gtk_tray_icon_style_set;
widget_class->delete_event = gtk_tray_icon_delete;
- widget_class->expose_event = gtk_tray_icon_expose;
+ widget_class->draw = gtk_tray_icon_draw;
g_object_class_install_property (gobject_class,
PROP_ORIENTATION,
@@ -307,60 +311,65 @@ gtk_tray_icon_get_property (GObject *object,
}
static gboolean
-gtk_tray_icon_expose (GtkWidget *widget,
- GdkEventExpose *event)
+gtk_tray_icon_draw (GtkWidget *widget,
+ cairo_t *cr,
+ int width,
+ int height)
{
GtkTrayIcon *icon = GTK_TRAY_ICON (widget);
- GtkAllocation allocation;
GtkWidget *focus_child;
GdkWindow *window;
- gint border_width, x, y, width, height;
+ gint border_width;
gboolean retval = FALSE;
+ cairo_surface_t *target;
window = gtk_widget_get_window (widget);
+ target = cairo_get_group_target (cr);
- if (icon->priv->manager_visual_rgba)
+ if (icon->priv->manager_visual_rgba ||
+ cairo_surface_get_type (target) != CAIRO_SURFACE_TYPE_XLIB ||
+ cairo_xlib_surface_get_drawable (target) != GDK_WINDOW_XID (window))
{
/* Clear to transparent */
- cairo_t *cr = gdk_cairo_create (window);
cairo_set_source_rgba (cr, 0, 0, 0, 0);
cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
- gdk_cairo_region (cr, event->region);
- cairo_fill (cr);
- cairo_destroy (cr);
+ cairo_paint (cr);
}
else
{
+ double x1, y1, x2, y2;
+
+ cairo_clip_extents (cr, &x1, &x2, &y1, &y2);
/* Clear to parent-relative pixmap
* We need to use direct X access here because GDK doesn't know about
* the parent realtive pixmap. */
+ cairo_surface_flush (target);
+
XClearArea (GDK_WINDOW_XDISPLAY (window),
GDK_WINDOW_XID (window),
- event->area.x, event->area.y,
- event->area.width, event->area.height,
+ floor (x1), floor (y1),
+ ceil (x2) - floor (x1), ceil (y2) - floor (y1),
False);
+ cairo_surface_mark_dirty_rectangle (target,
+ floor (x1), floor (y1),
+ ceil (x2) - floor (x1),
+ ceil (y2) - floor (y1));
}
- if (GTK_WIDGET_CLASS (gtk_tray_icon_parent_class)->expose_event)
- retval = GTK_WIDGET_CLASS (gtk_tray_icon_parent_class)->expose_event (widget, event);
+ if (GTK_WIDGET_CLASS (gtk_tray_icon_parent_class)->draw)
+ retval = GTK_WIDGET_CLASS (gtk_tray_icon_parent_class)->draw (widget, cr, width, height);
focus_child = gtk_container_get_focus_child (GTK_CONTAINER (widget));
if (focus_child && gtk_widget_has_focus (focus_child))
{
- gtk_widget_get_allocation (widget, &allocation);
border_width = gtk_container_get_border_width (GTK_CONTAINER (widget));
- x = allocation.x + border_width;
- y = allocation.y + border_width;
-
- width = allocation.width - 2 * border_width;
- height = allocation.height - 2 * border_width;
-
- gtk_paint_focus (gtk_widget_get_style (widget),
- window,
+ gtk_cairo_paint_focus (gtk_widget_get_style (widget),
+ cr,
gtk_widget_get_state (widget),
- &event->area, widget, "tray_icon",
- x, y, width, height);
+ widget, "tray_icon",
+ border_width, border_width,
+ width - 2 * border_width, height - 2 * border_width);
}
return retval;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]