static gboolean cc_timezone_map_draw (GtkWidget *widget, cairo_t *cr) { CcTimezoneMapPrivate *priv = CC_TIMEZONE_MAP (widget)->priv; GdkPixbuf *hilight, *orig_hilight, *pin; GtkAllocation alloc; gchar *file; GError *err = NULL; gdouble pointx, pointy; char buf[16]; gtk_widget_get_allocation (widget, &alloc); /* paint background */ gdk_cairo_set_source_pixbuf (cr, priv->background, 0, 0); cairo_paint (cr); /* paint hilight */ file = g_strdup_printf (DATADIR "/timezone_%s.png", g_ascii_formatd (buf, sizeof (buf), "%g", priv->selected_offset)); orig_hilight = gdk_pixbuf_new_from_file (file, &err); g_free (file); file = NULL; if (!orig_hilight) { g_warning ("Could not load hilight: %s", (err) ? err->message : "Unknown Error"); if (err) g_clear_error (&err); } else { hilight = gdk_pixbuf_scale_simple (orig_hilight, alloc.width, alloc.height, GDK_INTERP_BILINEAR); gdk_cairo_set_source_pixbuf (cr, hilight, 0, 0); cairo_paint (cr); g_object_unref (hilight); g_object_unref (orig_hilight); } /* load pin icon */ pin = gdk_pixbuf_new_from_file (DATADIR "/pin.png", &err); if (err) { g_warning ("Could not load pin icon: %s", err->message); g_clear_error (&err); } if (priv->location) { pointx = convert_longtitude_to_x (priv->location->longitude, alloc.width); pointy = convert_latitude_to_y (priv->location->latitude, alloc.height); if (pointy > alloc.height) pointy = alloc.height; if (pin) { gdk_cairo_set_source_pixbuf (cr, pin, pointx - 8, pointy - 14); cairo_paint (cr); } } if (pin) { g_object_unref (pin); } return TRUE; }
static gboolean button_press_event (GtkWidget *widget, GdkEventButton *event) { CcTimezoneMapPrivate *priv = CC_TIMEZONE_MAP (widget)->priv; gint x, y; guchar r, g, b, a; guchar *pixels; gint rowstride; gsize i; const GPtrArray *array; gint width, height; GList *distances = NULL; GtkAllocation alloc; x = event->x; y = event->y; rowstride = priv->visible_map_rowstride; pixels = priv->visible_map_pixels; r = pixels[(rowstride * y + x * 4)]; g = pixels[(rowstride * y + x * 4) + 1]; b = pixels[(rowstride * y + x * 4) + 2]; a = pixels[(rowstride * y + x * 4) + 3]; for (i = 0; color_codes[i].offset != -100; i++) { if (color_codes[i].red == r && color_codes[i].green == g && color_codes[i].blue == b && color_codes[i].alpha == a) { priv->selected_offset = color_codes[i].offset; } } gtk_widget_queue_draw (widget); /* work out the co-ordinates */ array = tz_get_locations (priv->tzdb); gtk_widget_get_allocation (widget, &alloc); width = alloc.width; height = alloc.height; for (i = 0; i < array->len; i++) { gdouble pointx, pointy, dx, dy; TzLocation *loc = array->pdata[i]; pointx = convert_longtitude_to_x (loc->longitude, width); pointy = convert_latitude_to_y (loc->latitude, height); dx = pointx - x; dy = pointy - y; loc->dist = dx * dx + dy * dy; distances = g_list_prepend (distances, loc); } distances = g_list_sort (distances, (GCompareFunc) sort_locations); set_location (CC_TIMEZONE_MAP (widget), (TzLocation*) distances->data); g_list_free (distances); return TRUE; }
static gboolean cc_timezone_map_draw (GtkWidget *widget, cairo_t *cr) { CcTimezoneMapPrivate *priv = CC_TIMEZONE_MAP (widget)->priv; GdkPixbuf *hilight, *orig_hilight; GtkAllocation alloc; gchar *file; GError *err = NULL; gdouble pointx, pointy; char buf[16]; const char *fmt; gtk_widget_get_allocation (widget, &alloc); /* paint background */ gdk_cairo_set_source_pixbuf (cr, priv->background, 0, 0); cairo_paint (cr); /* paint hilight */ if (gtk_widget_is_sensitive (widget)) fmt = DATETIME_RESOURCE_PATH "/timezone_%s.png"; else fmt = DATETIME_RESOURCE_PATH "/timezone_%s_dim.png"; file = g_strdup_printf (fmt, g_ascii_formatd (buf, sizeof (buf), "%g", priv->selected_offset)); orig_hilight = gdk_pixbuf_new_from_resource (file, &err); g_free (file); file = NULL; if (!orig_hilight) { g_warning ("Could not load hilight: %s", (err) ? err->message : "Unknown Error"); if (err) g_clear_error (&err); } else { hilight = gdk_pixbuf_scale_simple (orig_hilight, alloc.width, alloc.height, GDK_INTERP_BILINEAR); gdk_cairo_set_source_pixbuf (cr, hilight, 0, 0); cairo_paint (cr); g_object_unref (hilight); g_object_unref (orig_hilight); } if (priv->location) { pointx = convert_longitude_to_x (priv->location->longitude, alloc.width); pointy = convert_latitude_to_y (priv->location->latitude, alloc.height); pointx = CLAMP (floor (pointx), 0, alloc.width); pointy = CLAMP (floor (pointy), 0, alloc.height); draw_text_bubble (cr, widget, pointx, pointy); if (priv->pin) { gdk_cairo_set_source_pixbuf (cr, priv->pin, pointx - PIN_HOT_POINT_X, pointy - PIN_HOT_POINT_Y); cairo_paint (cr); } } return TRUE; }