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