Documentation: Use G_SOURCE_CONTINUE and G_SOURCE_REMOVE
[geeqie.git] / src / view-dir.cc
index 6f5f82a..1048819 100644 (file)
 static PixmapFolders *folder_icons_new(GtkWidget *widget)
 {
        PixmapFolders *pf = g_new0(PixmapFolders, 1);
+       GError *error = NULL;
+       GdkPixbuf *icon;
+       gint scale;
 
-#if 1
        GtkIconSize size = GTK_ICON_SIZE_MENU;
 
+/** @FIXME Emblems should be attached to icons via e.g.: \n
+ * GIcon *.... \n
+ * icon = g_themed_icon_new("folder"); \n
+ * emblem_icon = g_themed_icon_new("emblem_symbolic_link"); \n
+ * emblem = g_emblem_new(emblem_icon); \n
+ * emblemed = g_emblemed_icon_new(icon, emblem); \n
+ * gtk_icon_info_load_icon(icon_info, NULL) \n
+ * But there does not seem to be a way to get GtkIconInfo from a GIcon
+ */
+
        /* Attempt to use stock gtk icons */
        pf->close  = gtk_widget_render_icon(widget, GTK_STOCK_DIRECTORY, size, NULL);
        pf->open   = gtk_widget_render_icon(widget, GTK_STOCK_OPEN, size, NULL);
-       pf->deny   = gtk_widget_render_icon(widget, GTK_STOCK_STOP, size, NULL);
        pf->parent = gtk_widget_render_icon(widget, GTK_STOCK_GO_UP, size, NULL);
-       pf->link = gtk_widget_render_icon(widget, GTK_STOCK_REDO, size, NULL); /** @FIXME this is not a suitable icon */
-#else
-       /* GQView legacy icons */
-       pf->close  = pixbuf_inline(PIXBUF_INLINE_FOLDER_CLOSED);
-       pf->open   = pixbuf_inline(PIXBUF_INLINE_FOLDER_OPEN);
-       pf->deny   = pixbuf_inline(PIXBUF_INLINE_FOLDER_LOCKED);
-       pf->parent = pixbuf_inline(PIXBUF_INLINE_FOLDER_UP);
-#endif
+
+       if (gtk_icon_theme_has_icon(gtk_icon_theme_get_default(), "emblem-unreadable"))
+               {
+               icon = gtk_icon_theme_load_icon(gtk_icon_theme_get_default(), "emblem-unreadable", size, GTK_ICON_LOOKUP_USE_BUILTIN, &error);
+               if (error)
+                       {
+                       log_printf("Error: %s\n", error->message);
+                       g_error_free(error);
+
+                       pf->deny = gdk_pixbuf_copy(gtk_widget_render_icon(widget, GTK_STOCK_STOP, size, NULL));
+                       }
+               else
+                       {
+                       pf->deny = gdk_pixbuf_copy(gtk_widget_render_icon(widget, GTK_STOCK_DIRECTORY, size, NULL));
+                       scale = gdk_pixbuf_get_width(icon) / 2;
+                       gdk_pixbuf_composite(icon, pf->deny, scale, scale, scale, scale, scale, scale, 0.5, 0.5, GDK_INTERP_HYPER, 255);
+
+                       }
+               g_object_unref(icon);
+               }
+       else
+               {
+               pf->deny = gdk_pixbuf_copy(gtk_widget_render_icon(widget, GTK_STOCK_STOP, size, NULL));
+               }
+
+       if (gtk_icon_theme_has_icon(gtk_icon_theme_get_default(), "emblem-symbolic-link"))
+               {
+               icon = gtk_icon_theme_load_icon(gtk_icon_theme_get_default(), "emblem-symbolic-link", size, GTK_ICON_LOOKUP_USE_BUILTIN, &error);
+               if (error)
+                       {
+                       log_printf("Error: %s\n", error->message);
+                       g_error_free(error);
+
+                       pf->link = gdk_pixbuf_copy(gtk_widget_render_icon(widget, GTK_STOCK_REDO, size, NULL));
+                       }
+               else
+                       {
+                       pf->link = gdk_pixbuf_copy(gtk_widget_render_icon(widget, GTK_STOCK_DIRECTORY, size, NULL));
+                       scale = gdk_pixbuf_get_width(icon) / 2;
+                       gdk_pixbuf_composite(icon, pf->link, scale, scale, scale, scale, scale, scale, 0.5, 0.5, GDK_INTERP_HYPER, 255);
+                       }
+               g_object_unref(icon);
+               }
+       else
+               {
+               pf->link = gdk_pixbuf_copy(gtk_widget_render_icon(widget, GTK_STOCK_REDO, size, NULL));
+               }
+
+       pf->read_only = gdk_pixbuf_copy(gtk_widget_render_icon(widget, GTK_STOCK_DIRECTORY, size, NULL));
+
+       if (gtk_icon_theme_has_icon(gtk_icon_theme_get_default(), "emblem-readonly"))
+               {
+               icon = gtk_icon_theme_load_icon(gtk_icon_theme_get_default(), "emblem-readonly", size, GTK_ICON_LOOKUP_USE_BUILTIN, &error);
+               if (error)
+                       {
+                       log_printf("Error: %s\n", error->message);
+                       g_error_free(error);
+
+                       pf->read_only = gdk_pixbuf_copy(gtk_widget_render_icon(widget, GTK_STOCK_DIRECTORY, size, NULL));
+                       }
+               else
+                       {
+                       gint scale = gdk_pixbuf_get_width(icon) / 2;
+                       gdk_pixbuf_composite(icon, pf->read_only, scale, scale, scale, scale, scale, scale, 0.5, 0.5, GDK_INTERP_HYPER, 255);
+
+                       }
+               g_object_unref(icon);
+               }
+
        return pf;
 }
 
@@ -70,6 +142,7 @@ static void folder_icons_free(PixmapFolders *pf)
        g_object_unref(pf->deny);
        g_object_unref(pf->parent);
        g_object_unref(pf->link);
+       g_object_unref(pf->read_only);
 
        g_free(pf);
 }
@@ -548,7 +621,7 @@ static void vd_pop_submenu_dir_view_as_cb(GtkWidget *widget, gpointer data)
 {
        ViewDir *vd = static_cast<ViewDir *>(data);
 
-       DirViewType new_type = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), "menu_item_radio_data"));
+       DirViewType new_type = static_cast<DirViewType>(GPOINTER_TO_INT((g_object_get_data(G_OBJECT(widget), "menu_item_radio_data"))));
        layout_views_set(vd->layout, new_type, vd->layout->options.file_view_type);
 }
 
@@ -791,9 +864,9 @@ static void vd_dest_set(ViewDir *vd, gint enable)
        if (enable)
                {
                gtk_drag_dest_set(vd->view,
-                                 GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_DROP,
+                                 static_cast<GtkDestDefaults>(GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_DROP),
                                  vd_dnd_drop_types, vd_dnd_drop_types_count,
-                                 GDK_ACTION_MOVE | GDK_ACTION_COPY);
+                                 static_cast<GdkDragAction>(GDK_ACTION_MOVE | GDK_ACTION_COPY));
                }
        else
                {
@@ -988,7 +1061,7 @@ static gboolean vd_auto_scroll_idle_cb(gpointer data)
                }
 
        vd->drop_scroll_id = 0;
-       return FALSE;
+       return G_SOURCE_REMOVE;
 }
 
 static gboolean vd_auto_scroll_notify_cb(GtkWidget *UNUSED(widget), gint UNUSED(x), gint UNUSED(y), gpointer data)
@@ -1012,7 +1085,7 @@ static gboolean vd_dnd_drop_motion(GtkWidget *UNUSED(widget), GdkDragContext *co
        if (gtk_drag_get_source_widget(context) == vd->view)
                {
                /* from same window */
-               gdk_drag_status(context, 0, time);
+               gdk_drag_status(context, GDK_ACTION_DEFAULT, time);
                return TRUE;
                }
        else
@@ -1044,9 +1117,9 @@ static void vd_dnd_drop_leave(GtkWidget *UNUSED(widget), GdkDragContext *UNUSED(
 
 void vd_dnd_init(ViewDir *vd)
 {
-       gtk_drag_source_set(vd->view, GDK_BUTTON1_MASK | GDK_BUTTON2_MASK,
+       gtk_drag_source_set(vd->view, static_cast<GdkModifierType>(GDK_BUTTON1_MASK | GDK_BUTTON2_MASK),
                            dnd_file_drag_types, dnd_file_drag_types_count,
-                           GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_ASK);
+                           static_cast<GdkDragAction>(GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_ASK));
        g_signal_connect(G_OBJECT(vd->view), "drag_data_get",
                         G_CALLBACK(vd_dnd_get), vd);
        g_signal_connect(G_OBJECT(vd->view), "drag_begin",