Documentation: Use G_SOURCE_CONTINUE and G_SOURCE_REMOVE
[geeqie.git] / src / view-dir.cc
index be9fa01..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);
 }
@@ -80,7 +153,7 @@ static void vd_notify_cb(FileData *fd, NotifyType type, gpointer data);
 
 static void vd_destroy_cb(GtkWidget *widget, gpointer data)
 {
-       ViewDir *vd = data;
+       ViewDir *vd = static_cast<ViewDir *>(data);
 
        file_data_unregister_notify_func(vd_notify_cb, vd);
 
@@ -251,7 +324,7 @@ FileData *vd_get_fd_from_tree_path(ViewDir *vd, GtkTreeView *tview, GtkTreePath
 
 static void vd_rename_finished_cb(gboolean success, const gchar *new_path, gpointer data)
 {
-       ViewDir *vd = data;
+       ViewDir *vd = static_cast<ViewDir *>(data);
        if (success)
                {
                FileData *fd = file_data_new_dir(new_path);
@@ -268,7 +341,7 @@ static void vd_rename_finished_cb(gboolean success, const gchar *new_path, gpoin
 
 static gboolean vd_rename_cb(TreeEditData *td, const gchar *UNUSED(old_name), const gchar *new_name, gpointer data)
 {
-       ViewDir *vd = data;
+       ViewDir *vd = static_cast<ViewDir *>(data);
        FileData *fd;
        gchar *new_path;
        gchar *base;
@@ -324,7 +397,7 @@ void vd_color_set(ViewDir *vd, FileData *fd, gint color_set)
 
 void vd_popup_destroy_cb(GtkWidget *UNUSED(widget), gpointer data)
 {
-       ViewDir *vd = data;
+       ViewDir *vd = static_cast<ViewDir *>(data);
 
        vd_color_set(vd, vd->click_fd, FALSE);
        vd->click_fd = NULL;
@@ -344,7 +417,7 @@ void vd_popup_destroy_cb(GtkWidget *UNUSED(widget), gpointer data)
 
 static void vd_drop_menu_copy_cb(GtkWidget *UNUSED(widget), gpointer data)
 {
-       ViewDir *vd = data;
+       ViewDir *vd = static_cast<ViewDir *>(data);
        const gchar *path;
        GList *list;
 
@@ -359,7 +432,7 @@ static void vd_drop_menu_copy_cb(GtkWidget *UNUSED(widget), gpointer data)
 
 static void vd_drop_menu_move_cb(GtkWidget *UNUSED(widget), gpointer data)
 {
-       ViewDir *vd = data;
+       ViewDir *vd = static_cast<ViewDir *>(data);
        const gchar *path;
        GList *list;
 
@@ -375,14 +448,14 @@ static void vd_drop_menu_move_cb(GtkWidget *UNUSED(widget), gpointer data)
 
 static void vd_drop_menu_filter_cb(GtkWidget *widget, gpointer data)
 {
-       ViewDir *vd = data;
+       ViewDir *vd = static_cast<ViewDir *>(data);
        const gchar *path;
        GList *list;
        const gchar *key;
 
        if (!vd->drop_fd) return;
 
-       key = g_object_get_data(G_OBJECT(widget), "filter_key");
+       key = static_cast<const gchar *>(g_object_get_data(G_OBJECT(widget), "filter_key"));
 
        path = vd->drop_fd->path;
        list = vd->drop_list;
@@ -414,7 +487,7 @@ GtkWidget *vd_drop_menu(ViewDir *vd, gint active)
        while (work)
                {
                GtkWidget *item;
-               const EditorDescription *editor = work->data;
+               const EditorDescription *editor = static_cast<const EditorDescription *>(work->data);
                gchar *key;
                work = work->next;
 
@@ -440,7 +513,7 @@ GtkWidget *vd_drop_menu(ViewDir *vd, gint active)
 
 static void vd_pop_menu_up_cb(GtkWidget *UNUSED(widget), gpointer data)
 {
-       ViewDir *vd = data;
+       ViewDir *vd = static_cast<ViewDir *>(data);
        gchar *path;
 
        if (!vd->dir_fd || strcmp(vd->dir_fd->path, G_DIR_SEPARATOR_S) == 0) return;
@@ -458,7 +531,7 @@ static void vd_pop_menu_up_cb(GtkWidget *UNUSED(widget), gpointer data)
 
 static void vd_pop_menu_slide_cb(GtkWidget *UNUSED(widget), gpointer data)
 {
-       ViewDir *vd = data;
+       ViewDir *vd = static_cast<ViewDir *>(data);
 
        if (!vd->layout) return;
        if (!vd->click_fd) return;
@@ -471,7 +544,7 @@ static void vd_pop_menu_slide_cb(GtkWidget *UNUSED(widget), gpointer data)
 
 static void vd_pop_menu_slide_rec_cb(GtkWidget *UNUSED(widget), gpointer data)
 {
-       ViewDir *vd = data;
+       ViewDir *vd = static_cast<ViewDir *>(data);
        GList *list;
 
        if (!vd->layout) return;
@@ -508,19 +581,19 @@ static void vd_pop_menu_dupe(ViewDir *vd, gint recursive)
 
 static void vd_pop_menu_dupe_cb(GtkWidget *UNUSED(widget), gpointer data)
 {
-       ViewDir *vd = data;
+       ViewDir *vd = static_cast<ViewDir *>(data);
        vd_pop_menu_dupe(vd, FALSE);
 }
 
 static void vd_pop_menu_dupe_rec_cb(GtkWidget *UNUSED(widget), gpointer data)
 {
-       ViewDir *vd = data;
+       ViewDir *vd = static_cast<ViewDir *>(data);
        vd_pop_menu_dupe(vd, TRUE);
 }
 
 static void vd_pop_menu_delete_cb(GtkWidget *UNUSED(widget), gpointer data)
 {
-       ViewDir *vd = data;
+       ViewDir *vd = static_cast<ViewDir *>(data);
 
        if (!vd->click_fd) return;
        file_util_delete_dir(vd->click_fd, vd->widget);
@@ -528,7 +601,7 @@ static void vd_pop_menu_delete_cb(GtkWidget *UNUSED(widget), gpointer data)
 
 static void vd_pop_menu_copy_path_cb(GtkWidget *UNUSED(widget), gpointer data)
 {
-       ViewDir *vd = data;
+       ViewDir *vd = static_cast<ViewDir *>(data);
 
        if (!vd->click_fd) return;
 
@@ -537,7 +610,7 @@ static void vd_pop_menu_copy_path_cb(GtkWidget *UNUSED(widget), gpointer data)
 
 static void vd_pop_menu_copy_path_unquoted_cb(GtkWidget *UNUSED(widget), gpointer data)
 {
-       ViewDir *vd = data;
+       ViewDir *vd = static_cast<ViewDir *>(data);
 
        if (!vd->click_fd) return;
 
@@ -546,22 +619,22 @@ static void vd_pop_menu_copy_path_unquoted_cb(GtkWidget *UNUSED(widget), gpointe
 
 static void vd_pop_submenu_dir_view_as_cb(GtkWidget *widget, gpointer data)
 {
-       ViewDir *vd = 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);
 }
 
 static void vd_pop_menu_refresh_cb(GtkWidget *UNUSED(widget), gpointer data)
 {
-       ViewDir *vd = data;
+       ViewDir *vd = static_cast<ViewDir *>(data);
 
        if (vd->layout) layout_refresh(vd->layout);
 }
 
 static void vd_toggle_show_hidden_files_cb(GtkWidget *UNUSED(widget), gpointer data)
 {
-       ViewDir *vd = data;
+       ViewDir *vd = static_cast<ViewDir *>(data);
 
        options->file_filter.show_hidden_files = !options->file_filter.show_hidden_files;
        if (vd->layout) layout_refresh(vd->layout);
@@ -569,7 +642,7 @@ static void vd_toggle_show_hidden_files_cb(GtkWidget *UNUSED(widget), gpointer d
 
 static void vd_pop_menu_new_folder_cb(gboolean success, const gchar *new_path, gpointer data)
 {
-       ViewDir *vd = data;
+       ViewDir *vd = static_cast<ViewDir *>(data);
        FileData *fd = NULL;
        GtkTreeIter iter;
        GtkTreePath *tpath;
@@ -604,7 +677,7 @@ static void vd_pop_menu_new_folder_cb(gboolean success, const gchar *new_path, g
 
 static void vd_pop_menu_new_cb(GtkWidget *UNUSED(widget), gpointer data)
 {
-       ViewDir *vd = data;
+       ViewDir *vd = static_cast<ViewDir *>(data);
        FileData *dir_fd = NULL;
 
        switch (vd->type)
@@ -628,14 +701,14 @@ static void vd_pop_menu_new_cb(GtkWidget *UNUSED(widget), gpointer data)
 
 static void vd_pop_menu_rename_cb(GtkWidget *UNUSED(widget), gpointer data)
 {
-       ViewDir *vd = data;
+       ViewDir *vd = static_cast<ViewDir *>(data);
 
        vd_rename_by_data(vd, vd->click_fd);
 }
 
 static void vd_pop_menu_sort_ascend_cb(GtkWidget *widget, gpointer data)
 {
-       ViewDir *vd = data;
+       ViewDir *vd = static_cast<ViewDir *>(data);
        gboolean ascend;
 
        if (!vd) return;
@@ -653,7 +726,7 @@ static void vd_pop_menu_sort_cb(GtkWidget *widget, gpointer data)
        ViewDir *vd;
        SortType type;
 
-       vd = submenu_item_get_data(widget);
+       vd = static_cast<ViewDir *>(submenu_item_get_data(widget));
 
        if (!vd) return;
        if (!vd->layout) return;
@@ -782,7 +855,7 @@ void vd_new_folder(ViewDir *vd, FileData *dir_fd)
  */
 
 static GtkTargetEntry vd_dnd_drop_types[] = {
-       { "text/uri-list", 0, TARGET_URI_LIST }
+       { const_cast<gchar *>("text/uri-list"), 0, TARGET_URI_LIST }
 };
 static gint vd_dnd_drop_types_count = 1;
 
@@ -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
                {
@@ -805,7 +878,7 @@ static void vd_dnd_get(GtkWidget *UNUSED(widget), GdkDragContext *UNUSED(context
                           GtkSelectionData *selection_data, guint info,
                           guint UNUSED(time), gpointer data)
 {
-       ViewDir *vd = data;
+       ViewDir *vd = static_cast<ViewDir *>(data);
        GList *list;
 
        if (!vd->click_fd) return;
@@ -823,7 +896,7 @@ static void vd_dnd_get(GtkWidget *UNUSED(widget), GdkDragContext *UNUSED(context
 
 static void vd_dnd_begin(GtkWidget *UNUSED(widget), GdkDragContext *UNUSED(context), gpointer data)
 {
-       ViewDir *vd = data;
+       ViewDir *vd = static_cast<ViewDir *>(data);
 
        vd_color_set(vd, vd->click_fd, TRUE);
        vd_dest_set(vd, FALSE);
@@ -831,7 +904,7 @@ static void vd_dnd_begin(GtkWidget *UNUSED(widget), GdkDragContext *UNUSED(conte
 
 static void vd_dnd_end(GtkWidget *UNUSED(widget), GdkDragContext *context, gpointer data)
 {
-       ViewDir *vd = data;
+       ViewDir *vd = static_cast<ViewDir *>(data);
 
        vd_color_set(vd, vd->click_fd, FALSE);
 
@@ -847,7 +920,7 @@ static void vd_dnd_drop_receive(GtkWidget *widget,
                                GtkSelectionData *selection_data, guint info,
                                guint UNUSED(time), gpointer data)
 {
-       ViewDir *vd = data;
+       ViewDir *vd = static_cast<ViewDir *>(data);
        GtkTreePath *tpath;
        FileData *fd = NULL;
        GdkDragAction action = GDK_ACTION_ASK;
@@ -964,7 +1037,7 @@ void vd_dnd_drop_scroll_cancel(ViewDir *vd)
 
 static gboolean vd_auto_scroll_idle_cb(gpointer data)
 {
-       ViewDir *vd = data;
+       ViewDir *vd = static_cast<ViewDir *>(data);
        GdkSeat *seat;
        GdkDevice *device;
 
@@ -988,12 +1061,12 @@ 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)
 {
-       ViewDir *vd = data;
+       ViewDir *vd = static_cast<ViewDir *>(data);
 
        if (!vd->drop_fd || vd->drop_list) return FALSE;
 
@@ -1005,14 +1078,14 @@ static gboolean vd_auto_scroll_notify_cb(GtkWidget *UNUSED(widget), gint UNUSED(
 static gboolean vd_dnd_drop_motion(GtkWidget *UNUSED(widget), GdkDragContext *context,
                                   gint x, gint y, guint time, gpointer data)
 {
-       ViewDir *vd = data;
+       ViewDir *vd = static_cast<ViewDir *>(data);
 
        vd->click_fd = NULL;
 
        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
@@ -1033,7 +1106,7 @@ static gboolean vd_dnd_drop_motion(GtkWidget *UNUSED(widget), GdkDragContext *co
 
 static void vd_dnd_drop_leave(GtkWidget *UNUSED(widget), GdkDragContext *UNUSED(context), guint UNUSED(time), gpointer data)
 {
-       ViewDir *vd = data;
+       ViewDir *vd = static_cast<ViewDir *>(data);
 
        if (vd->drop_fd != vd->click_fd) vd_color_set(vd, vd->drop_fd, FALSE);
 
@@ -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",
@@ -1071,7 +1144,7 @@ void vd_dnd_init(ViewDir *vd)
 
 //void vd_menu_position_cb(GtkMenu *menu, gint *x, gint *y, gboolean *UNUSED(push_in), gpointer data)
 //{
-       //ViewDir *vd = data;
+       //ViewDir *vd = static_cast<//ViewDir *>(data);
        //GtkTreeModel *store;
        //GtkTreeIter iter;
        //GtkTreePath *tpath;
@@ -1088,7 +1161,7 @@ void vd_dnd_init(ViewDir *vd)
 
 void vd_activate_cb(GtkTreeView *tview, GtkTreePath *tpath, GtkTreeViewColumn *UNUSED(column), gpointer data)
 {
-       ViewDir *vd = data;
+       ViewDir *vd = static_cast<ViewDir *>(data);
        FileData *fd = vd_get_fd_from_tree_path(vd, tview, tpath);
 
        vd_select_row(vd, fd);
@@ -1115,7 +1188,7 @@ static GdkColor *vd_color_shifted(GtkWidget *widget)
 void vd_color_cb(GtkTreeViewColumn *UNUSED(tree_column), GtkCellRenderer *cell,
                 GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data)
 {
-       ViewDir *vd = data;
+       ViewDir *vd = static_cast<ViewDir *>(data);
        gboolean set;
 
        gtk_tree_model_get(tree_model, iter, DIR_COLUMN_COLOR, &set, -1);
@@ -1126,7 +1199,7 @@ void vd_color_cb(GtkTreeViewColumn *UNUSED(tree_column), GtkCellRenderer *cell,
 
 gboolean vd_release_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
 {
-       ViewDir *vd = data;
+       ViewDir *vd = static_cast<ViewDir *>(data);
        GtkTreePath *tpath;
        FileData *fd = NULL;
 
@@ -1161,7 +1234,7 @@ gboolean vd_release_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
 
 gboolean vd_press_key_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
 {
-       ViewDir *vd = data;
+       ViewDir *vd = static_cast<ViewDir *>(data);
        gboolean ret = FALSE;
 
        switch (vd->type)
@@ -1175,7 +1248,7 @@ gboolean vd_press_key_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
 
 gboolean vd_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
 {
-       ViewDir *vd = data;
+       ViewDir *vd = static_cast<ViewDir *>(data);
        gboolean ret = FALSE;
        FileData *fd;
        GtkTreePath *tpath;
@@ -1224,7 +1297,7 @@ gboolean vd_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
 
 static void vd_notify_cb(FileData *fd, NotifyType type, gpointer data)
 {
-       ViewDir *vd = data;
+       ViewDir *vd = static_cast<ViewDir *>(data);
        gboolean refresh;
        gchar *base;