GdkPixbuf * gth_icon_cache_get_pixbuf (GthIconCache *icon_cache, GIcon *icon) { const char *key; GdkPixbuf *pixbuf; key = NULL; if (icon != NULL) key = _gth_icon_cache_get_icon_key (icon); if (key == NULL) key = VOID_PIXBUF_KEY; performance (DEBUG_INFO, "get pixbuf for %s", key); pixbuf = g_hash_table_lookup (icon_cache->cache, key); if (pixbuf != NULL) { g_object_ref (pixbuf); return pixbuf; } if (icon != NULL) pixbuf = _g_icon_get_pixbuf (icon, icon_cache->icon_size, icon_cache->icon_theme); if (pixbuf == NULL) { GIcon *unknown_icon; unknown_icon = g_themed_icon_new ("missing-image"); pixbuf = _g_icon_get_pixbuf (unknown_icon, icon_cache->icon_size, icon_cache->icon_theme); g_object_unref (unknown_icon); } g_hash_table_insert (icon_cache->cache, (gpointer) key, g_object_ref (pixbuf)); performance (DEBUG_INFO, "done (not cached)"); return pixbuf; }
static void gth_organize_task_init (GthOrganizeTask *self) { GIcon *icon; self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GTH_TYPE_ORGANIZE_TASK, GthOrganizeTaskPrivate); self->priv->builder = _gtk_builder_new_from_file ("organize-files-task.ui", "catalogs"); self->priv->results_liststore = (GtkListStore *) gtk_builder_get_object (self->priv->builder, "results_liststore"); self->priv->catalogs = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (self->priv->results_liststore), KEY_COLUMN, GTK_SORT_ASCENDING); g_object_set (GET_WIDGET ("catalog_name_cellrenderertext"), "editable", TRUE, NULL); icon = g_themed_icon_new ("file-catalog"); self->priv->icon_pixbuf = _g_icon_get_pixbuf (icon, _gtk_icon_get_pixel_size (GET_WIDGET ("organization_treeview"), GTK_ICON_SIZE_MENU), gtk_icon_theme_get_for_screen (gtk_widget_get_screen (GET_WIDGET ("organization_treeview")))); g_object_unref (icon); self->priv->file_list = gth_file_list_new (GTH_FILE_LIST_TYPE_NORMAL, FALSE); gth_file_list_set_caption (GTH_FILE_LIST (self->priv->file_list), "standard::display-name"); gtk_widget_show (self->priv->file_list); gtk_box_pack_start (GTK_BOX (GET_WIDGET ("preview_box")), self->priv->file_list, TRUE, TRUE, 0); g_signal_connect (GET_WIDGET ("catalog_name_cellrenderertext"), "edited", G_CALLBACK (catalog_name_cellrenderertext_edited_cb), self); g_signal_connect (GET_WIDGET ("create_cellrenderertoggle"), "toggled", G_CALLBACK (create_cellrenderertoggle_toggled_cb), self); g_signal_connect (GET_WIDGET ("organize_files_dialog"), "response", G_CALLBACK (organize_files_dialog_response_cb), self); g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (GET_WIDGET ("organization_treeview"))), "changed", G_CALLBACK (organization_treeview_selection_changed_cb), self); g_signal_connect (GET_WIDGET ("select_all_button"), "clicked", G_CALLBACK (select_all_button_clicked_cb), self); g_signal_connect (GET_WIDGET ("select_none_button"), "clicked", G_CALLBACK (select_none_button_clicked_cb), self); }
GdkPixbuf * get_mime_type_pixbuf (const char *mime_type, int icon_size, GtkIconTheme *icon_theme) { GdkPixbuf *pixbuf = NULL; GIcon *icon; if (icon_theme == NULL) icon_theme = gtk_icon_theme_get_default (); icon = g_content_type_get_icon (mime_type); pixbuf = _g_icon_get_pixbuf (icon, icon_size, icon_theme); g_object_unref (icon); return pixbuf; }
static gboolean video_area_expose_event_cb (GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { GthMediaViewerPage *self = user_data; if (event->count > 0) return FALSE; if (self->priv->xwin_assigned && self->priv->has_video) return FALSE; if (self->priv->icon == NULL) { char *type; GIcon *icon; int size; type = NULL; if (self->priv->file_data != NULL) type = g_content_type_from_mime_type (gth_file_data_get_mime_type (self->priv->file_data)); if (type == NULL) type = g_content_type_from_mime_type ("text/plain"); icon = g_content_type_get_icon (type); size = widget->allocation.width; if (size > widget->allocation.height) size = widget->allocation.height; size = size / 3; self->priv->icon = _g_icon_get_pixbuf (icon, size, gtk_icon_theme_get_for_screen (gtk_widget_get_screen (widget))); g_object_unref (icon); g_free (type); } gdk_draw_rectangle (gtk_widget_get_window (widget), self->priv->has_video ? widget->style->black_gc : widget->style->text_gc[GTK_WIDGET_STATE (widget)], TRUE, event->area.x, event->area.y, event->area.width, event->area.height); if (self->priv->icon != NULL) { int icon_w, icon_h; int icon_x, icon_y; PangoRectangle logical_rect; int x, y; icon_w = gdk_pixbuf_get_width (self->priv->icon); icon_h = gdk_pixbuf_get_height (self->priv->icon); pango_layout_set_width (self->priv->caption_layout, PANGO_SCALE * (icon_w * 3 / 2)); pango_layout_get_extents (self->priv->caption_layout, NULL, &logical_rect); icon_x = (widget->allocation.width - icon_w) / 2; x = (widget->allocation.width - PANGO_PIXELS (logical_rect.width)) / 2 + PANGO_PIXELS (logical_rect.x); icon_y = (widget->allocation.height - (icon_h + PANGO_PIXELS (logical_rect.height))) / 2; y = icon_y + icon_h; gdk_draw_pixbuf (gtk_widget_get_window (widget), widget->style->base_gc[GTK_WIDGET_STATE (widget)], self->priv->icon, 0, 0, icon_x, icon_y, icon_w, icon_h, GDK_RGB_DITHER_NORMAL, 0, 0); gdk_draw_layout (gtk_widget_get_window (widget), widget->style->base_gc[GTK_WIDGET_STATE (widget)], x, y, self->priv->caption_layout); } return FALSE; }
static gboolean video_area_draw_cb (GtkWidget *widget, cairo_t *cr, gpointer user_data) { GthMediaViewerPage *self = user_data; GtkAllocation allocation; GtkStyleContext *style_context; if (self->priv->xwin_assigned && self->priv->has_video) return FALSE; gtk_widget_get_allocation (widget, &allocation); style_context = gtk_widget_get_style_context (widget); if (self->priv->icon == NULL) { char *type; GIcon *icon; int size; type = NULL; if (self->priv->file_data != NULL) type = g_content_type_from_mime_type (gth_file_data_get_mime_type (self->priv->file_data)); if (type == NULL) type = g_content_type_from_mime_type ("text/plain"); icon = g_content_type_get_icon (type); size = allocation.width; if (size > allocation.height) size = allocation.height; size = size / 3; self->priv->icon = _g_icon_get_pixbuf (icon, size, _gtk_widget_get_icon_theme (widget)); g_object_unref (icon); g_free (type); } cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); cairo_rectangle (cr, 0, 0, allocation.width, allocation.height); cairo_fill (cr); if (self->priv->icon != NULL) { int icon_w, icon_h; int text_w; int icon_x, icon_y; PangoRectangle logical_rect; int x, y; PangoFontDescription *font; icon_w = gdk_pixbuf_get_width (self->priv->icon); icon_h = gdk_pixbuf_get_height (self->priv->icon); text_w = (icon_w * 3 / 2); pango_layout_set_width (self->priv->caption_layout, PANGO_SCALE * text_w); pango_layout_get_extents (self->priv->caption_layout, NULL, &logical_rect); icon_x = (allocation.width - icon_w) / 2; x = (allocation.width - text_w) / 2; icon_y = (allocation.height - (icon_h + PANGO_PIXELS (logical_rect.height))) / 2; y = icon_y + icon_h; gdk_cairo_set_source_pixbuf (cr, self->priv->icon, icon_x, icon_y); cairo_rectangle (cr, icon_x, icon_y, icon_w, icon_h); cairo_fill (cr); cairo_move_to (cr, x, y); gtk_style_context_get (style_context, gtk_widget_get_state_flags (widget), "font", &font, NULL); pango_layout_set_font_description (self->priv->caption_layout, font); pango_cairo_layout_path (cr, self->priv->caption_layout); cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); cairo_fill (cr); } return TRUE; }