Trim trailing white spaces.
[geeqie.git] / src / desktop_file.c
1 /*
2  * Geeqie
3  * (C) 2004 John Ellis
4  * Copyright (C) 2008 - 2012 The Geeqie Team
5  *
6  * Author: Vladimir Nadvornik
7  *
8  * This software is released under the GNU General Public License (GNU GPL).
9  * Please read the included file COPYING for more information.
10  * This software comes with no warranty of any kind, use at your own risk!
11  */
12
13 #include "main.h"
14 #include "desktop_file.h"
15
16 #include "editors.h"
17 #include "filedata.h"
18 #include "misc.h"
19 #include "ui_misc.h"
20 #include "ui_fileops.h"
21 #include "ui_utildlg.h"
22 #include "pixbuf_util.h"
23 #include "window.h"
24 #include "utilops.h"
25 #include "layout_util.h"
26
27 #define CONFIG_WINDOW_DEF_WIDTH         700
28 #define CONFIG_WINDOW_DEF_HEIGHT        400
29
30
31
32 typedef struct _EditorWindow EditorWindow;
33 struct _EditorWindow
34 {
35         GtkWidget *window;
36         GtkWidget *entry;
37         GtkWidget *save_button;
38         GtkTextBuffer *buffer;
39         gchar *desktop_name;
40         gboolean modified;
41 };
42
43 typedef struct _EditorListWindow EditorListWindow;
44 struct _EditorListWindow
45 {
46         GtkWidget *window;
47         GtkWidget *view;
48         GenericDialog *gd;      /* any open confirm dialogs ? */
49         GtkWidget *delete_button;
50         GtkWidget *edit_button;
51 };
52
53 typedef struct _EditorWindowDel_Data EditorWindowDel_Data;
54 struct _EditorWindowDel_Data
55 {
56         EditorListWindow *ewl;
57         gchar *path;
58 };
59
60 static EditorListWindow *editor_list_window = NULL;
61
62 static gboolean editor_window_save(EditorWindow *ew)
63 {
64         gchar *dir;
65         gchar *path;
66         gchar *text;
67         GtkTextIter start, end;
68         GError *error = NULL;
69         gboolean ret = TRUE;
70         const gchar *name = gtk_entry_get_text(GTK_ENTRY(ew->entry));
71         
72         if (!name || !name[0])
73                 {
74                 file_util_warning_dialog(_("Can't save"), _("Please specify file name."), GTK_STOCK_DIALOG_ERROR, NULL);
75                 return FALSE;
76                 }
77         
78         gtk_text_buffer_get_bounds(ew->buffer, &start, &end);
79         text = gtk_text_buffer_get_text(ew->buffer, &start, &end, FALSE);
80
81         dir = g_build_filename(get_rc_dir(), "applications", NULL);
82         path = g_build_filename(dir, name, NULL);
83
84         if (!recursive_mkdir_if_not_exists(dir, 0755))
85                 {
86                 file_util_warning_dialog(_("Can't save"), _("Could not create directory"), GTK_STOCK_DIALOG_ERROR, NULL);
87                 ret = FALSE;
88                 }
89
90         if (ret && !g_file_set_contents(path, text, -1, &error))
91                 {
92                 file_util_warning_dialog(_("Can't save"), error->message, GTK_STOCK_DIALOG_ERROR, NULL);
93                 g_error_free(error);
94                 ret = FALSE;
95                 }
96         
97         g_free(path);
98         g_free(dir);
99         g_free(text);
100         layout_editors_reload_start();
101         /* idle function is not needed, everything should be cached */
102         layout_editors_reload_finish();
103         return ret;
104 }
105
106 static void editor_window_close_cb(GtkWidget *widget, gpointer data)
107 {
108         EditorWindow *ew = data;
109
110         g_free(ew->desktop_name);
111         gtk_widget_destroy(ew->window);
112         g_free(ew);
113 }
114
115 static gint editor_window_delete_cb(GtkWidget *w, GdkEventAny *event, gpointer data)
116 {
117         editor_window_close_cb(w, data);
118         return TRUE;
119 }
120
121 static void editor_window_save_cb(GtkWidget *widget, gpointer data)
122 {
123         EditorWindow *ew = data;
124
125         if (ew->modified)
126                 {
127                 editor_window_save(ew);
128                 }
129
130         gtk_widget_set_sensitive(ew->save_button, FALSE);
131         gtk_text_buffer_set_modified(ew->buffer, FALSE);
132         ew->modified = FALSE;
133 }
134
135 static void editor_window_text_modified_cb(GtkWidget *widget, gpointer data)
136 {
137         EditorWindow *ew = data;
138         
139         if (gtk_text_buffer_get_modified(ew->buffer))
140                 {
141                 gtk_widget_set_sensitive(ew->save_button, TRUE);
142                 ew->modified = TRUE;
143                 }
144 }
145
146 static void editor_window_entry_changed_cb(GtkWidget *widget, gpointer data)
147 {
148         EditorWindow *ew = data;
149         const gchar *content = gtk_entry_get_text(GTK_ENTRY(ew->entry));
150         gboolean modified = ew->modified;
151
152         if (!modified)
153                 {
154                 modified = (!ew->desktop_name && *content);
155                 }
156
157         if (!modified)
158                 {
159                 modified = strcmp(ew->desktop_name, content);
160                 }
161         
162         gtk_widget_set_sensitive(ew->save_button, modified);
163         ew->modified = modified;
164 }
165
166 static void editor_window_new(const gchar *src_path, const gchar *desktop_name)
167 {
168         EditorWindow *ew;
169         GtkWidget *win_vbox;
170         GtkWidget *hbox;
171         GtkWidget *button;
172         GtkWidget *ct_button;
173         GtkWidget *button_hbox;
174         GtkWidget *scrolled;
175         GtkWidget *text_view;
176         gchar *text;
177         gsize size;
178
179         ew = g_new0(EditorWindow, 1);
180
181
182         ew->window = window_new(GTK_WINDOW_TOPLEVEL, "Desktop", PIXBUF_INLINE_ICON_CONFIG, NULL, _("Desktop file"));
183         gtk_window_set_type_hint(GTK_WINDOW(ew->window), GDK_WINDOW_TYPE_HINT_DIALOG);
184
185         g_signal_connect(G_OBJECT(ew->window), "delete_event",
186                          G_CALLBACK(editor_window_delete_cb), ew);
187
188         gtk_window_set_default_size(GTK_WINDOW(ew->window), CONFIG_WINDOW_DEF_WIDTH, CONFIG_WINDOW_DEF_HEIGHT);
189         gtk_window_set_resizable(GTK_WINDOW(ew->window), TRUE);
190         gtk_container_set_border_width(GTK_CONTAINER(ew->window), PREF_PAD_BORDER);
191
192         win_vbox = gtk_vbox_new(FALSE, PREF_PAD_SPACE);
193         gtk_container_add(GTK_CONTAINER(ew->window), win_vbox);
194         gtk_widget_show(win_vbox);
195
196         hbox = gtk_hbox_new(FALSE, PREF_PAD_SPACE);
197         gtk_box_pack_end(GTK_BOX(win_vbox), hbox, FALSE, FALSE, 0);
198         gtk_widget_show(hbox);
199
200         ew->entry = gtk_entry_new();
201         gtk_box_pack_start(GTK_BOX(hbox), ew->entry, TRUE, TRUE, 0);
202         ew->desktop_name = NULL;
203         if (desktop_name)
204                 {
205                 gtk_entry_set_text(GTK_ENTRY(ew->entry), desktop_name);
206                 ew->desktop_name = g_strdup(desktop_name);
207                 }
208         gtk_widget_show(ew->entry);
209         g_signal_connect(G_OBJECT(ew->entry), "changed", G_CALLBACK(editor_window_entry_changed_cb), ew);
210
211         button_hbox = gtk_hbutton_box_new();
212         gtk_button_box_set_layout(GTK_BUTTON_BOX(button_hbox), GTK_BUTTONBOX_END);
213         gtk_box_set_spacing(GTK_BOX(button_hbox), PREF_PAD_BUTTON_GAP);
214         gtk_box_pack_end(GTK_BOX(hbox), button_hbox, FALSE, FALSE, 0);
215         gtk_widget_show(button_hbox);
216
217         ew->save_button = pref_button_new(NULL, GTK_STOCK_SAVE, NULL, FALSE,
218                                  G_CALLBACK(editor_window_save_cb), ew);
219         gtk_container_add(GTK_CONTAINER(button_hbox), ew->save_button);
220         gtk_widget_set_can_default(ew->save_button, TRUE);
221         gtk_widget_set_sensitive(ew->save_button, FALSE);
222         gtk_widget_show(ew->save_button);
223         ct_button = ew->save_button;
224
225         button = pref_button_new(NULL, GTK_STOCK_CLOSE, NULL, FALSE,
226                                  G_CALLBACK(editor_window_close_cb), ew);
227         gtk_container_add(GTK_CONTAINER(button_hbox), button);
228         gtk_widget_set_can_default(button, TRUE);
229         gtk_widget_show(button);
230
231         if (!generic_dialog_get_alternative_button_order(ew->window))
232                 {
233                 gtk_box_reorder_child(GTK_BOX(button_hbox), ct_button, -1);
234                 }
235
236
237         scrolled = gtk_scrolled_window_new(NULL, NULL);
238         gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN);
239         gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
240                                        GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
241         gtk_box_pack_start(GTK_BOX(win_vbox), scrolled, TRUE, TRUE, 5);
242         gtk_widget_show(scrolled);
243
244         text_view = gtk_text_view_new();
245         gtk_container_add(GTK_CONTAINER(scrolled), text_view);
246         gtk_widget_show(text_view);
247
248         ew->buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_view));
249         if (g_file_get_contents(src_path, &text, &size, NULL))
250                 {
251                 gtk_text_buffer_set_text(ew->buffer, text, size);
252                 }
253         gtk_text_buffer_set_modified(ew->buffer, FALSE);
254         g_signal_connect(G_OBJECT(ew->buffer), "modified-changed",
255                          G_CALLBACK(editor_window_text_modified_cb), ew);
256
257         gtk_widget_show(ew->window);
258 }
259
260
261 static void editor_list_window_close_cb(GtkWidget *widget, gpointer data)
262 {
263         gtk_widget_destroy(editor_list_window->window);
264         g_free(editor_list_window);
265         editor_list_window = NULL;
266 }
267
268 static gboolean editor_list_window_delete(GtkWidget *widget, GdkEventAny *event, gpointer data)
269 {
270         editor_list_window_close_cb(NULL, NULL);
271         return TRUE;
272 }
273
274 static void editor_list_window_delete_dlg_cancel(GenericDialog *gd, gpointer data);
275
276 static void editor_list_window_delete_dlg_cancel(GenericDialog *gd, gpointer data)
277 {
278         EditorWindowDel_Data *ewdl = data;
279
280         ewdl->ewl->gd = NULL;
281         g_free(ewdl->path);
282         g_free(ewdl);
283 }
284
285 static void editor_list_window_delete_dlg_ok_cb(GenericDialog *gd, gpointer data)
286 {
287         EditorWindowDel_Data *ewdl = data;
288
289         if (!unlink_file(ewdl->path))
290                 {
291                 gchar *text = g_strdup_printf(_("Unable to delete file:\n%s"), ewdl->path);
292                 warning_dialog(_("File deletion failed"), text, GTK_STOCK_DIALOG_WARNING, NULL);
293                 g_free(text);
294                 }
295         else
296                 {
297                 /* refresh list */
298                 layout_editors_reload_start();
299                 /* idle function is not needed, everything should be cached */
300                 layout_editors_reload_finish();
301                 }
302
303         editor_list_window_delete_dlg_cancel(gd, data);
304 }
305
306 static void editor_list_window_delete_cb(GtkWidget *widget, gpointer data)
307 {
308         EditorListWindow *ewl = data;
309         GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(ewl->view));
310         GtkTreeIter iter;
311
312         if (gtk_tree_selection_get_selected(sel, NULL, &iter))
313                 {
314                 GtkTreeModel *store = gtk_tree_view_get_model(GTK_TREE_VIEW(ewl->view));
315                 gchar *path;
316                 gchar *key;
317                 gchar *text;
318                 EditorWindowDel_Data *ewdl;
319
320                 gtk_tree_model_get(store, &iter,
321                                    DESKTOP_FILE_COLUMN_PATH, &path,
322                                    DESKTOP_FILE_COLUMN_KEY, &key, -1);
323
324
325                 ewdl = g_new(EditorWindowDel_Data, 1);
326                 ewdl->ewl = ewl;
327                 ewdl->path = path;
328         
329                 if (ewl->gd)
330                         {
331                         GenericDialog *gd = ewl->gd;
332                         editor_list_window_delete_dlg_cancel(ewl->gd, ewl->gd->data);
333                         generic_dialog_close(gd);
334                         }
335
336                 ewl->gd = generic_dialog_new(_("Delete file"), "dlg_confirm",
337                                             NULL, TRUE,
338                                             editor_list_window_delete_dlg_cancel, ewdl);
339
340                 generic_dialog_add_button(ewl->gd, GTK_STOCK_DELETE, NULL, editor_list_window_delete_dlg_ok_cb, TRUE);
341
342                 text = g_strdup_printf(_("About to delete the file:\n %s"), path);
343                 generic_dialog_add_message(ewl->gd, GTK_STOCK_DIALOG_QUESTION,
344                                            _("Delete file"), text);
345                 g_free(text);
346
347                 gtk_widget_show(ewl->gd->dialog);
348                 }
349 }
350
351 static void editor_list_window_edit_cb(GtkWidget *widget, gpointer data)
352 {
353         EditorListWindow *ewl = data;
354         GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(ewl->view));
355         GtkTreeIter iter;
356
357         if (gtk_tree_selection_get_selected(sel, NULL, &iter))
358                 {
359                 GtkTreeModel *store = gtk_tree_view_get_model(GTK_TREE_VIEW(ewl->view));
360                 gchar *path;
361                 gchar *key;
362
363                 gtk_tree_model_get(store, &iter,
364                                    DESKTOP_FILE_COLUMN_PATH, &path,
365                                    DESKTOP_FILE_COLUMN_KEY, &key, -1);
366                 editor_window_new(path, key);
367                 g_free(key);
368                 g_free(path);
369                 }
370 }
371
372 static void editor_list_window_new_cb(GtkWidget *widget, gpointer data)
373 {
374         editor_window_new(DESKTOP_FILE_TEMPLATE, _("new.desktop"));
375 }
376
377 static void editor_list_window_selection_changed_cb(GtkWidget *widget, gpointer data)
378 {
379         EditorListWindow *ewl = data;
380         GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(ewl->view));
381         GtkTreeIter iter;
382
383         if (gtk_tree_selection_get_selected(sel, NULL, &iter))
384                 {
385                 GtkTreeModel *store = gtk_tree_view_get_model(GTK_TREE_VIEW(ewl->view));
386                 gchar *path;
387
388                 gtk_tree_model_get(store, &iter,
389                                                    DESKTOP_FILE_COLUMN_PATH, &path,
390                                                    -1);
391                 
392                 gtk_widget_set_sensitive(ewl->delete_button, access_file(path, W_OK));
393                 gtk_widget_set_sensitive(ewl->edit_button, TRUE);
394                 g_free(path);
395                 }
396         
397 }
398
399 static gint editor_list_window_sort_cb(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer data)
400 {
401         gint n = GPOINTER_TO_INT(data);
402         gint ret = 0;
403
404         switch (n)
405                 {
406                 case DESKTOP_FILE_COLUMN_KEY:
407                 case DESKTOP_FILE_COLUMN_NAME:
408                 case DESKTOP_FILE_COLUMN_PATH:
409                 case DESKTOP_FILE_COLUMN_HIDDEN:
410                         {
411                         gchar *s1, *s2;
412
413                         gtk_tree_model_get(model, a, n, &s1, -1);
414                         gtk_tree_model_get(model, b, n, &s2, -1);
415
416                         if (!s1 || !s2)
417                                 {
418                                 if (!s1 && !s2) break;
419                                 ret = s1 ? 1 : -1;
420                                 }
421                         else
422                                 {
423                                 ret = g_utf8_collate(s1, s2);
424                                 }
425
426                         g_free(s1);
427                         g_free(s2);
428                         }
429                         break;
430         
431                 default:
432                         g_return_val_if_reached(0);
433                 }
434
435         return ret;
436 }
437
438 static void editor_list_window_create(void)
439 {
440         GtkWidget *win_vbox;
441         GtkWidget *hbox;
442         GtkWidget *button;
443         GtkWidget *scrolled;
444         GtkCellRenderer *renderer;
445         GtkTreeSelection *selection;
446         GtkTreeViewColumn *column;
447         GtkTreeModel *store;
448         GtkTreeSortable *sortable;
449         EditorListWindow *ewl;
450
451         editor_list_window = ewl = g_new0(EditorListWindow, 1);
452         
453         ewl->window = window_new(GTK_WINDOW_TOPLEVEL, "editors", PIXBUF_INLINE_ICON_CONFIG, NULL, _("Editors"));
454         gtk_window_set_type_hint(GTK_WINDOW(ewl->window), GDK_WINDOW_TYPE_HINT_DIALOG);
455         g_signal_connect(G_OBJECT(ewl->window), "delete_event",
456                          G_CALLBACK(editor_list_window_delete), NULL);
457         gtk_window_set_default_size(GTK_WINDOW(ewl->window), CONFIG_WINDOW_DEF_WIDTH, CONFIG_WINDOW_DEF_HEIGHT);
458         gtk_window_set_resizable(GTK_WINDOW(ewl->window), TRUE);
459         gtk_container_set_border_width(GTK_CONTAINER(ewl->window), PREF_PAD_BORDER);
460
461         win_vbox = gtk_vbox_new(FALSE, PREF_PAD_SPACE);
462         gtk_container_add(GTK_CONTAINER(ewl->window), win_vbox);
463         gtk_widget_show(win_vbox);
464
465         hbox = gtk_hbutton_box_new();
466         gtk_button_box_set_layout(GTK_BUTTON_BOX(hbox), GTK_BUTTONBOX_END);
467         gtk_box_set_spacing(GTK_BOX(hbox), PREF_PAD_BUTTON_GAP);
468         gtk_box_pack_end(GTK_BOX(win_vbox), hbox, FALSE, FALSE, 0);
469         gtk_widget_show(hbox);
470
471
472         button = pref_button_new(NULL, GTK_STOCK_NEW, NULL, FALSE,
473                                  G_CALLBACK(editor_list_window_new_cb), ewl);
474         gtk_container_add(GTK_CONTAINER(hbox), button);
475         gtk_widget_set_can_default(button, TRUE);
476         gtk_widget_show(button);
477
478         button = pref_button_new(NULL, GTK_STOCK_EDIT, NULL, FALSE,
479                                  G_CALLBACK(editor_list_window_edit_cb), ewl);
480         gtk_container_add(GTK_CONTAINER(hbox), button);
481         gtk_widget_set_can_default(button, TRUE);
482         gtk_widget_set_sensitive(button, FALSE);
483         gtk_widget_show(button);
484         ewl->edit_button = button;
485
486         button = pref_button_new(NULL, GTK_STOCK_DELETE, NULL, FALSE,
487                                  G_CALLBACK(editor_list_window_delete_cb), ewl);
488         gtk_container_add(GTK_CONTAINER(hbox), button);
489         gtk_widget_set_can_default(button, TRUE);
490         gtk_widget_set_sensitive(button, FALSE);
491         gtk_widget_show(button);
492         ewl->delete_button = button;
493
494         button = pref_button_new(NULL, GTK_STOCK_CLOSE, NULL, FALSE,
495                                  G_CALLBACK(editor_list_window_close_cb), ewl);
496         gtk_container_add(GTK_CONTAINER(hbox), button);
497         gtk_widget_set_can_default(button, TRUE);
498         gtk_widget_show(button);
499
500         scrolled = gtk_scrolled_window_new(NULL, NULL);
501         gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN);
502         gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
503                                        GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
504         gtk_box_pack_start(GTK_BOX(win_vbox), scrolled, TRUE, TRUE, 5);
505         gtk_widget_show(scrolled);
506
507         ewl->view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(desktop_file_list));
508         selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(ewl->view));
509         gtk_tree_selection_set_mode(GTK_TREE_SELECTION(selection), GTK_SELECTION_SINGLE);
510         g_signal_connect(selection, "changed", G_CALLBACK(editor_list_window_selection_changed_cb), ewl);
511
512         gtk_tree_view_set_enable_search(GTK_TREE_VIEW(ewl->view), FALSE);
513
514         column = gtk_tree_view_column_new();
515         gtk_tree_view_column_set_title(column, _("Name"));
516         gtk_tree_view_column_set_resizable(column, TRUE);
517         renderer = gtk_cell_renderer_text_new();
518         gtk_tree_view_column_pack_start(column, renderer, FALSE);
519         gtk_tree_view_column_add_attribute(column, renderer, "text", DESKTOP_FILE_COLUMN_NAME);
520         gtk_tree_view_append_column(GTK_TREE_VIEW(ewl->view), column);
521         gtk_tree_view_column_set_sort_column_id(column, DESKTOP_FILE_COLUMN_NAME);
522
523         column = gtk_tree_view_column_new();
524         gtk_tree_view_column_set_title(column, _("Hidden"));
525         gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
526         renderer = gtk_cell_renderer_text_new();
527         gtk_tree_view_column_pack_start(column, renderer, FALSE);
528         gtk_tree_view_column_add_attribute(column, renderer, "text", DESKTOP_FILE_COLUMN_HIDDEN);
529         gtk_tree_view_append_column(GTK_TREE_VIEW(ewl->view), column);
530         gtk_tree_view_column_set_sort_column_id(column, DESKTOP_FILE_COLUMN_HIDDEN);
531         gtk_tree_view_column_set_alignment(column, 0.5);
532
533         column = gtk_tree_view_column_new();
534         gtk_tree_view_column_set_title(column, _("Desktop file"));
535         gtk_tree_view_column_set_resizable(column, TRUE);
536         renderer = gtk_cell_renderer_text_new();
537         gtk_tree_view_column_pack_start(column, renderer, FALSE);
538         gtk_tree_view_column_add_attribute(column, renderer, "text", DESKTOP_FILE_COLUMN_KEY);
539         gtk_tree_view_append_column(GTK_TREE_VIEW(ewl->view), column);
540         gtk_tree_view_column_set_sort_column_id(column, DESKTOP_FILE_COLUMN_KEY);
541
542         column = gtk_tree_view_column_new();
543         gtk_tree_view_column_set_title(column, _("Path"));
544         gtk_tree_view_column_set_resizable(column, TRUE);
545         renderer = gtk_cell_renderer_text_new();
546         gtk_tree_view_column_pack_start(column, renderer, FALSE);
547         gtk_tree_view_column_add_attribute(column, renderer, "text", DESKTOP_FILE_COLUMN_PATH);
548         gtk_tree_view_append_column(GTK_TREE_VIEW(ewl->view), column);
549         gtk_tree_view_column_set_sort_column_id(column, DESKTOP_FILE_COLUMN_PATH);
550
551         /* set up sorting */
552         store = gtk_tree_view_get_model(GTK_TREE_VIEW(ewl->view));
553         sortable = GTK_TREE_SORTABLE(store);
554         gtk_tree_sortable_set_sort_func(sortable, DESKTOP_FILE_COLUMN_KEY, editor_list_window_sort_cb,
555                                         GINT_TO_POINTER(DESKTOP_FILE_COLUMN_KEY), NULL);
556         gtk_tree_sortable_set_sort_func(sortable, DESKTOP_FILE_COLUMN_HIDDEN, editor_list_window_sort_cb,
557                                         GINT_TO_POINTER(DESKTOP_FILE_COLUMN_HIDDEN), NULL);
558         gtk_tree_sortable_set_sort_func(sortable, DESKTOP_FILE_COLUMN_NAME, editor_list_window_sort_cb,
559                                         GINT_TO_POINTER(DESKTOP_FILE_COLUMN_NAME), NULL);
560         gtk_tree_sortable_set_sort_func(sortable, DESKTOP_FILE_COLUMN_PATH, editor_list_window_sort_cb,
561                                         GINT_TO_POINTER(DESKTOP_FILE_COLUMN_PATH), NULL);
562
563         /* set initial sort order */
564         //gtk_tree_sortable_set_sort_column_id(sortable, DESKTOP_FILE_COLUMN_KEY, GTK_SORT_ASCENDING);
565
566         gtk_container_add(GTK_CONTAINER(scrolled), ewl->view);
567         gtk_widget_show(ewl->view);
568
569         gtk_widget_show(ewl->window);
570 }
571
572 /*
573  *-----------------------------------------------------------------------------
574  * config window show (public)
575  *-----------------------------------------------------------------------------
576  */
577
578 void show_editor_list_window(void)
579 {
580         if (editor_list_window)
581                 {
582                 gtk_window_present(GTK_WINDOW(editor_list_window));
583                 return;
584                 }
585
586         editor_list_window_create();
587 }
588 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */