[network-manager-applet/menu-rework] menu: fix expose-event clipping and remove unused code
- From: Dan Williams <dcbw src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [network-manager-applet/menu-rework] menu: fix expose-event clipping and remove unused code
- Date: Mon, 28 Sep 2009 19:11:39 +0000 (UTC)
commit b73bd197b8485f5b40dfc14c4e81df426cb39172
Author: Dan Williams <dcbw redhat com>
Date: Mon Sep 28 12:11:00 2009 -0700
menu: fix expose-event clipping and remove unused code
src/applet.c | 128 ++++++++++++++++++++++++---------------------------------
1 files changed, 54 insertions(+), 74 deletions(-)
---
diff --git a/src/applet.c b/src/applet.c
index d990cfa..7ea2df0 100644
--- a/src/applet.c
+++ b/src/applet.c
@@ -509,68 +509,68 @@ applet_menu_add_items_top_and_fold_sorted_helper (GtkMenu *menu,
g_list_free(clone_folded);
}
+#define TITLE_TEXT_R ((double) 0x5e / 255.0 )
+#define TITLE_TEXT_G ((double) 0x5e / 255.0 )
+#define TITLE_TEXT_B ((double) 0x5e / 255.0 )
+
static gboolean
-menu_title_item_expose (GtkWidget *widget,
- GdkEventExpose *event)
-{
- #define TITLE_TEXT_R ((double) 0x5e / 255.0 )
- #define TITLE_TEXT_G ((double) 0x5e / 255.0 )
- #define TITLE_TEXT_B ((double) 0x5e / 255.0 )
-/* #define TITLE_TEXT_R ((double) style->text[GTK_STATE_NORMAL].red / 65535.0)
- #define TITLE_TEXT_G ((double) style->text[GTK_STATE_NORMAL].green / 65535.0)
- #define TITLE_TEXT_B ((double) style->text[GTK_STATE_NORMAL].blue / 65535.0) */
-
- GtkStyle *style = gtk_widget_get_style (widget);
- GtkWidget *label = gtk_bin_get_child (GTK_BIN (widget));
- PangoFontDescription *desc = pango_font_description_copy (style->font_desc);
- cairo_t *cr = gdk_cairo_create (widget->window);
- GtkImageMenuItem *image_menu_item = GTK_IS_IMAGE_MENU_ITEM (widget) ? GTK_IMAGE_MENU_ITEM (widget) : NULL;
- GtkImage *icon = image_menu_item ? GTK_IMAGE (gtk_image_menu_item_get_image (image_menu_item)) : NULL;
- GdkPixbuf *pixbuf = icon ? gtk_image_get_pixbuf (icon) : NULL;
- PangoLayout *layout_first = pango_cairo_create_layout (cr);
- PangoLayout *layout_second = pango_cairo_create_layout (cr);
- int width = 0, height = 0;
- int extrawidth = 0;
- gdouble extraheight = 0;
- int owidth, oheight;
- char *first, *second;
- char *secondtext;
+menu_title_item_expose (GtkWidget *widget, GdkEventExpose *event)
+{
+ GtkStyle *style;
+ GtkWidget *label;
+ PangoFontDescription *desc;
+ cairo_t *cr;
+ GtkImageMenuItem *image_menu_item;
+ GtkImage *icon;
+ GdkPixbuf *pixbuf;
+ PangoLayout *layout;
+ int width = 0, height = 0, owidth, oheight;
+ gdouble extraheight = 0, extrawidth = 0;
+ const char *text;
gdouble xpadding = 5.0;
gdouble ypadding = 5.0;
gdouble postpadding = 0.0;
- first = g_strdup (gtk_label_get_text (GTK_LABEL (label)));
- second = strchr (first, ':');
- if (second) {
- *second = 0;
- second++;
- second++;
- secondtext = g_strdup_printf ("%s", second);
- }
+ label = gtk_bin_get_child (GTK_BIN (widget));
+
+ cr = gdk_cairo_create (widget->window);
+
+ /* The drawing area we get is the whole menu; clip the drawing to the
+ * event area, which should just be our menu item.
+ */
+ cairo_rectangle (cr,
+ event->area.x, event->area.y,
+ event->area.width, event->area.height);
+ cairo_clip (cr);
+
+ /* We also need to reposition the cairo context so that (0, 0) is the
+ * top-left of where we're supposed to start drawing.
+ */
+ cairo_translate (cr, widget->allocation.x, widget->allocation.y);
+
+ image_menu_item = GTK_IS_IMAGE_MENU_ITEM (widget) ? GTK_IMAGE_MENU_ITEM (widget) : NULL;
+
+ icon = image_menu_item ? GTK_IMAGE (gtk_image_menu_item_get_image (image_menu_item)) : NULL;
+ pixbuf = icon ? gtk_image_get_pixbuf (icon) : NULL;
- /* lets put together both layout lines */
+ text = gtk_label_get_text (GTK_LABEL (label));
+
+ layout = pango_cairo_create_layout (cr);
+ style = gtk_widget_get_style (widget);
+ desc = pango_font_description_copy (style->font_desc);
pango_font_description_set_variant (desc, PANGO_VARIANT_SMALL_CAPS);
pango_font_description_set_weight (desc, PANGO_WEIGHT_SEMIBOLD);
- pango_layout_set_font_description (layout_first, desc);
- pango_layout_set_text (layout_first, first, -1);
- pango_cairo_update_layout (cr, layout_first);
- pango_layout_get_size (layout_first, &owidth, &oheight);
+ pango_layout_set_font_description (layout, desc);
+ pango_layout_set_text (layout, text, -1);
+ pango_cairo_update_layout (cr, layout);
+ pango_layout_get_size (layout, &owidth, &oheight);
width = owidth / PANGO_SCALE;
height += oheight / PANGO_SCALE;
- if (second) {
- pango_font_description_set_weight (desc, PANGO_WEIGHT_NORMAL);
- pango_layout_set_font_description (layout_second, desc);
- pango_layout_set_text (layout_second, secondtext, -1);
- pango_cairo_update_layout (cr, layout_second);
- pango_layout_get_size (layout_second, &owidth, &oheight);
- width = width < owidth / PANGO_SCALE ? owidth / PANGO_SCALE : width;
- height += oheight / PANGO_SCALE;
- }
-
if (pixbuf) {
gdouble w = gdk_pixbuf_get_width (pixbuf);
gdouble h = gdk_pixbuf_get_height (pixbuf);
+
if (width < w)
width = w;
if (height < h) {
@@ -582,20 +582,12 @@ menu_title_item_expose (GtkWidget *widget,
width += extrawidth;
cairo_save (cr);
- cairo_translate (cr, ((double) event->area.x) , ((double) event->area.y));
cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.0);
- cairo_rectangle (cr, 0, 0, ((double) event->area.width), ((double) event->area.height - postpadding));
- cairo_fill (cr);
-
-/* no border atm
- cairo_set_source_rgba (cr, 0.1, 0.1, 0.1, 0.6);
- cairo_rectangle (cr, 0, 0, ((double) event->area.width), 0.5);
+ cairo_rectangle (cr, 0, 0,
+ (double) (width + 2 * xpadding),
+ (double) (height + ypadding + postpadding));
cairo_fill (cr);
- cairo_set_source_rgba (cr, 0.6, 0.6, 0.6, 0.4);
- cairo_rectangle (cr, 0, ((double) event->area.height - postpadding - 0.5), ((double) event->area.width), 0.5);
- cairo_fill (cr);
-*/
/* now the in-padding content */
cairo_translate (cr, xpadding , ypadding);
@@ -604,6 +596,7 @@ menu_title_item_expose (GtkWidget *widget,
gdouble y = height / 2.0 - gdk_pixbuf_get_height (pixbuf) / 2.0;
gdouble w = gdk_pixbuf_get_width (pixbuf);
gdouble h = gdk_pixbuf_get_height (pixbuf);
+
gdk_cairo_set_source_pixbuf (cr, pixbuf, x, y);
cairo_rectangle (cr, x, y, w, h);
cairo_fill (cr);
@@ -611,29 +604,16 @@ menu_title_item_expose (GtkWidget *widget,
cairo_set_source_rgb (cr, TITLE_TEXT_R, TITLE_TEXT_G, TITLE_TEXT_B);
cairo_move_to (cr, extrawidth, extraheight);
- pango_cairo_show_layout (cr, layout_first);
-
- if (second) {
- cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
- cairo_move_to (cr, extrawidth, extraheight + oheight / PANGO_SCALE);
- pango_cairo_show_layout (cr, layout_second);
- }
+ pango_cairo_show_layout (cr, layout);
cairo_restore(cr);
- pango_font_description_free (desc);
- g_free (first);
- g_object_unref (layout_first);
- g_object_unref (layout_second);
+ pango_font_description_free (desc);
+ g_object_unref (layout);
cairo_destroy (cr);
gtk_widget_set_size_request (widget, width + 2 * xpadding, height + ypadding + postpadding);
-
return TRUE;
-
- #undef TITLE_TEXT_R
- #undef TITLE_TEXT_G
- #undef TITLE_TEXT_B
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]