4 * Copyright (C) 2008 - 2009 The Geeqie Team
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!
15 #include "bar_keywords.h"
18 #include "history_list.h"
22 #include "ui_fileops.h"
24 #include "ui_utildlg.h"
29 static const gchar *keyword_favorite_defaults[] = {
41 static void bar_pane_keywords_keyword_update_all(void);
42 static void bar_pane_keywords_changed(GtkTextBuffer *buffer, gpointer data);
45 *-------------------------------------------------------------------
46 * keyword / comment utils
47 *-------------------------------------------------------------------
51 static GList *keyword_list_pull(GtkWidget *text_widget)
56 text = text_widget_text_pull(text_widget);
57 list = string_to_keywords_list(text);
64 static void keyword_list_push(GtkWidget *textview, GList *list)
66 GtkTextBuffer *buffer;
67 GtkTextIter start, end;
69 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
70 gtk_text_buffer_get_bounds(buffer, &start, &end);
71 gtk_text_buffer_delete(buffer, &start, &end);
75 const gchar *word = list->data;
78 gtk_text_buffer_get_end_iter(buffer, &iter);
79 if (word) gtk_text_buffer_insert(buffer, &iter, word, -1);
80 gtk_text_buffer_get_end_iter(buffer, &iter);
81 gtk_text_buffer_insert(buffer, &iter, "\n", -1);
89 *-------------------------------------------------------------------
91 *-------------------------------------------------------------------
94 #define KEYWORD_DIALOG_WIDTH 200
95 #define KEYWORD_DIALOG_HEIGHT 250
97 typedef struct _KeywordDlg KeywordDlg;
104 static KeywordDlg *keyword_dialog = NULL;
107 static void keyword_dialog_cancel_cb(GenericDialog *gd, gpointer data)
109 g_free(keyword_dialog);
110 keyword_dialog = NULL;
113 static void keyword_dialog_ok_cb(GenericDialog *gd, gpointer data)
115 KeywordDlg *kd = data;
120 history_list_free_key("keywords");
122 store = gtk_tree_view_get_model(GTK_TREE_VIEW(kd->treeview));
123 valid = gtk_tree_model_get_iter_first(store, &iter);
128 gtk_tree_model_get(store, &iter, 0, &key, -1);
129 valid = gtk_tree_model_iter_next(store, &iter);
131 history_list_add_to_key("keywords", key, 0);
134 keyword_dialog_cancel_cb(gd, data);
136 bar_pane_keywords_keyword_update_all();
139 static void keyword_dialog_add_cb(GtkWidget *button, gpointer data)
141 KeywordDlg *kd = data;
142 GtkTreeSelection *selection;
148 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(kd->treeview));
149 if (gtk_tree_selection_get_selected(selection, &store, &sibling))
151 gtk_list_store_insert_before(GTK_LIST_STORE(store), &iter, &sibling);
155 store = gtk_tree_view_get_model(GTK_TREE_VIEW(kd->treeview));
156 gtk_list_store_append(GTK_LIST_STORE(store), &iter);
159 gtk_list_store_set(GTK_LIST_STORE(store), &iter, 1, TRUE, -1);
161 tpath = gtk_tree_model_get_path(store, &iter);
162 gtk_tree_view_set_cursor(GTK_TREE_VIEW(kd->treeview), tpath,
163 gtk_tree_view_get_column(GTK_TREE_VIEW(kd->treeview), 0), TRUE);
164 gtk_tree_path_free(tpath);
167 static void keyword_dialog_remove_cb(GtkWidget *button, gpointer data)
169 KeywordDlg *kd = data;
170 GtkTreeSelection *selection;
176 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(kd->treeview));
177 if (!gtk_tree_selection_get_selected(selection, &store, &iter)) return;
181 if (gtk_tree_model_iter_next(store, &next))
183 tpath = gtk_tree_model_get_path(store, &next);
187 tpath = gtk_tree_model_get_path(store, &iter);
188 if (!gtk_tree_path_prev(tpath))
190 gtk_tree_path_free(tpath);
196 gtk_tree_view_set_cursor(GTK_TREE_VIEW(kd->treeview), tpath,
197 gtk_tree_view_get_column(GTK_TREE_VIEW(kd->treeview), 0), FALSE);
198 gtk_tree_path_free(tpath);
201 gtk_list_store_remove(GTK_LIST_STORE(store), &iter);
204 static void keyword_dialog_edit_cb(GtkCellRendererText *renderer, const gchar *path,
205 const gchar *new_text, gpointer data)
207 KeywordDlg *kd = data;
212 if (!new_text || strlen(new_text) == 0) return;
214 store = gtk_tree_view_get_model(GTK_TREE_VIEW(kd->treeview));
216 tpath = gtk_tree_path_new_from_string(path);
217 gtk_tree_model_get_iter(store, &iter, tpath);
218 gtk_tree_path_free(tpath);
220 gtk_list_store_set(GTK_LIST_STORE(store), &iter, 0, new_text, -1);
223 static void keyword_dialog_populate(KeywordDlg *kd)
228 store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(kd->treeview)));
229 gtk_list_store_clear(store);
231 list = history_list_get_by_key("keywords");
232 list = g_list_last(list);
237 gtk_list_store_append(store, &iter);
238 gtk_list_store_set(store, &iter, 0, list->data,
245 static void keyword_dialog_show(void)
249 GtkTreeViewColumn *column;
250 GtkCellRenderer *renderer;
256 gtk_window_present(GTK_WINDOW(keyword_dialog->gd->dialog));
260 keyword_dialog = g_new0(KeywordDlg, 1);
262 keyword_dialog->gd = generic_dialog_new(_("Keyword Presets"),
263 "keyword_presets", NULL, TRUE,
264 keyword_dialog_cancel_cb, keyword_dialog);
265 generic_dialog_add_message(keyword_dialog->gd, NULL, _("Favorite keywords list"), NULL);
267 generic_dialog_add_button(keyword_dialog->gd, GTK_STOCK_OK, NULL,
268 keyword_dialog_ok_cb, TRUE);
270 scrolled = gtk_scrolled_window_new(NULL, NULL);
271 gtk_widget_set_size_request(scrolled, KEYWORD_DIALOG_WIDTH, KEYWORD_DIALOG_HEIGHT);
272 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN);
273 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
274 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
275 gtk_box_pack_start(GTK_BOX(keyword_dialog->gd->vbox), scrolled, TRUE, TRUE, 5);
276 gtk_widget_show(scrolled);
278 store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_BOOLEAN);
279 keyword_dialog->treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
280 g_object_unref(store);
282 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(keyword_dialog->treeview), FALSE);
283 gtk_tree_view_set_search_column(GTK_TREE_VIEW(keyword_dialog->treeview), 0);
284 gtk_tree_view_set_reorderable(GTK_TREE_VIEW(keyword_dialog->treeview), TRUE);
286 column = gtk_tree_view_column_new();
287 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
288 renderer = gtk_cell_renderer_text_new();
289 g_signal_connect(G_OBJECT(renderer), "edited",
290 G_CALLBACK(keyword_dialog_edit_cb), keyword_dialog);
291 gtk_tree_view_column_pack_start(column, renderer, TRUE);
292 gtk_tree_view_column_add_attribute(column, renderer, "text", 0);
293 gtk_tree_view_column_add_attribute(column, renderer, "editable", 1);
294 gtk_tree_view_append_column(GTK_TREE_VIEW(keyword_dialog->treeview), column);
296 gtk_container_add(GTK_CONTAINER(scrolled), keyword_dialog->treeview);
297 gtk_widget_show(keyword_dialog->treeview);
299 hbox = gtk_hbox_new(FALSE, 5);
300 gtk_box_pack_start(GTK_BOX(keyword_dialog->gd->vbox), hbox, FALSE, FALSE, 0);
301 gtk_widget_show(hbox);
303 button = gtk_button_new_from_stock(GTK_STOCK_ADD);
304 g_signal_connect(G_OBJECT(button), "clicked",
305 G_CALLBACK(keyword_dialog_add_cb), keyword_dialog);
306 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
307 gtk_widget_show(button);
309 button = gtk_button_new_from_stock(GTK_STOCK_REMOVE);
310 g_signal_connect(G_OBJECT(button), "clicked",
311 G_CALLBACK(keyword_dialog_remove_cb), keyword_dialog);
312 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
313 gtk_widget_show(button);
315 keyword_dialog_populate(keyword_dialog);
317 gtk_widget_show(keyword_dialog->gd->dialog);
321 static void bar_keyword_edit_cb(GtkWidget *button, gpointer data)
323 keyword_dialog_show();
328 *-------------------------------------------------------------------
330 *-------------------------------------------------------------------
334 KEYWORD_COLUMN_TOGGLE = 0,
339 typedef struct _PaneKeywordsData PaneKeywordsData;
340 struct _PaneKeywordsData
345 GtkWidget *keyword_view;
346 GtkWidget *keyword_treeview;
353 static GList *bar_list = NULL;
356 static void bar_pane_keywords_write(PaneKeywordsData *pkd)
360 if (!pkd->fd) return;
362 list = keyword_list_pull(pkd->keyword_view);
364 metadata_write_list(pkd->fd, KEYWORD_KEY, list);
366 string_list_free(list);
369 static gchar *bar_pane_keywords_get_mark_text(const gchar *key)
372 static gchar buf[10];
374 for (i = 0; i < FILEDATA_MARKS_SIZE; i++)
376 FileDataGetMarkFunc get_mark_func;
377 FileDataSetMarkFunc set_mark_func;
379 file_data_get_registered_mark_func(i, &get_mark_func, &set_mark_func, &data);
380 if (get_mark_func == meta_data_get_keyword_mark && strcmp(data, key) == 0)
382 sprintf(buf, " %d ", i + 1);
389 static void bar_keyword_list_sync(PaneKeywordsData *pkd, GList *keywords)
395 list = history_list_get_by_key("keywords");
398 /* blank? set up a few example defaults */
402 while (keyword_favorite_defaults[i] != NULL)
404 history_list_add_to_key("keywords", _(keyword_favorite_defaults[i]), 0);
408 list = history_list_get_by_key("keywords");
411 store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(pkd->keyword_treeview)));
413 gtk_list_store_clear(store);
415 list = g_list_last(list);
418 gchar *key = list->data;
420 gtk_list_store_append(store, &iter);
421 gtk_list_store_set(store, &iter, KEYWORD_COLUMN_TOGGLE, find_string_in_list(keywords, key),
422 KEYWORD_COLUMN_TEXT, key,
423 KEYWORD_COLUMN_MARK, bar_pane_keywords_get_mark_text(key), -1);
429 static void bar_pane_keywords_keyword_update_all(void)
436 PaneKeywordsData *pkd;
442 keywords = keyword_list_pull(pkd->keyword_view);
443 bar_keyword_list_sync(pkd, keywords);
444 string_list_free(keywords);
448 static void bar_pane_keywords_update(PaneKeywordsData *pkd)
450 GList *keywords = NULL;
451 GtkTextBuffer *keyword_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(pkd->keyword_view));
453 g_signal_handlers_block_by_func(keyword_buffer, bar_pane_keywords_changed, pkd);
455 keywords = metadata_read_list(pkd->fd, KEYWORD_KEY, METADATA_PLAIN);
456 keyword_list_push(pkd->keyword_view, keywords);
457 bar_keyword_list_sync(pkd, keywords);
458 string_list_free(keywords);
460 g_signal_handlers_unblock_by_func(keyword_buffer, bar_pane_keywords_changed, pkd);
464 void bar_pane_keywords_set_fd(GtkWidget *pane, FileData *fd)
466 PaneKeywordsData *pkd;
468 pkd = g_object_get_data(G_OBJECT(pane), "pane_data");
471 file_data_unref(pkd->fd);
472 pkd->fd = file_data_ref(fd);
474 bar_pane_keywords_update(pkd);
477 gint bar_pane_keywords_event(GtkWidget *bar, GdkEvent *event)
479 PaneKeywordsData *pkd;
481 pkd = g_object_get_data(G_OBJECT(bar), "pane_data");
482 if (!pkd) return FALSE;
484 if (GTK_WIDGET_HAS_FOCUS(pkd->keyword_view)) return gtk_widget_event(pkd->keyword_view, event);
489 static void bar_pane_keywords_keyword_set(PaneKeywordsData *pkd, const gchar *keyword, gint active)
494 if (!keyword) return;
496 list = keyword_list_pull(pkd->keyword_view);
497 found = find_string_in_list(list, keyword);
507 gchar *key = work->data;
510 if (key && keyword && strcmp(key, keyword) == 0)
512 list = g_list_remove(list, key);
519 list = g_list_append(list, g_strdup(keyword));
522 keyword_list_push(pkd->keyword_view, list);
525 string_list_free(list);
528 static void bar_pane_keywords_keyword_toggle(GtkCellRendererToggle *toggle, const gchar *path, gpointer data)
530 PaneKeywordsData *pkd = data;
537 store = gtk_tree_view_get_model(GTK_TREE_VIEW(pkd->keyword_treeview));
539 tpath = gtk_tree_path_new_from_string(path);
540 gtk_tree_model_get_iter(store, &iter, tpath);
541 gtk_tree_path_free(tpath);
543 gtk_tree_model_get(store, &iter, KEYWORD_COLUMN_TOGGLE, &active,
544 KEYWORD_COLUMN_TEXT, &key, -1);
546 gtk_list_store_set(GTK_LIST_STORE(store), &iter, KEYWORD_COLUMN_TOGGLE, active, -1);
548 bar_pane_keywords_keyword_set(pkd, key, active);
552 static void bar_pane_keywords_set_selection(PaneKeywordsData *pkd, gboolean append)
554 GList *keywords = NULL;
558 if (!pkd->pane.list_func) return;
560 keywords = keyword_list_pull(pkd->keyword_view);
562 list = pkd->pane.list_func(pkd->pane.list_data);
566 FileData *fd = work->data;
571 metadata_append_list(fd, KEYWORD_KEY, keywords);
575 metadata_write_list(fd, KEYWORD_KEY, keywords);
580 string_list_free(keywords);
583 static void bar_pane_keywords_sel_add_cb(GtkWidget *button, gpointer data)
585 PaneKeywordsData *pkd = data;
587 bar_pane_keywords_set_selection(pkd, TRUE);
590 static void bar_pane_keywords_sel_replace_cb(GtkWidget *button, gpointer data)
592 PaneKeywordsData *pkd = data;
594 bar_pane_keywords_set_selection(pkd, FALSE);
597 static void bar_pane_keywords_populate_popup_cb(GtkTextView *textview, GtkMenu *menu, gpointer data)
599 PaneKeywordsData *pkd = data;
601 menu_item_add_divider(GTK_WIDGET(menu));
602 menu_item_add_stock(GTK_WIDGET(menu), _("Add keywords to selected files"), GTK_STOCK_ADD, G_CALLBACK(bar_pane_keywords_sel_add_cb), data);
603 menu_item_add_stock(GTK_WIDGET(menu), _("Replace existing keywords in selected files"), GTK_STOCK_CONVERT, G_CALLBACK(bar_pane_keywords_sel_replace_cb), data);
607 static void bar_pane_keywords_notify_cb(FileData *fd, NotifyType type, gpointer data)
609 PaneKeywordsData *pkd = data;
610 if (fd == pkd->fd) bar_pane_keywords_update(pkd);
613 static void bar_pane_keywords_changed(GtkTextBuffer *buffer, gpointer data)
615 PaneKeywordsData *pkd = data;
617 file_data_unregister_notify_func(bar_pane_keywords_notify_cb, pkd);
618 bar_pane_keywords_write(pkd);
619 file_data_register_notify_func(bar_pane_keywords_notify_cb, pkd, NOTIFY_PRIORITY_LOW);
622 static void bar_pane_keywords_mark_edited (GtkCellRendererText *cell, const gchar *path, const gchar *text, gpointer data)
624 PaneKeywordsData *pkd = data;
630 FileDataGetMarkFunc get_mark_func;
631 FileDataSetMarkFunc set_mark_func;
632 gpointer mark_func_data;
634 file_data_unregister_notify_func(bar_pane_keywords_notify_cb, pkd);
636 store = gtk_tree_view_get_model(GTK_TREE_VIEW(pkd->keyword_treeview));
638 tpath = gtk_tree_path_new_from_string(path);
639 gtk_tree_model_get_iter(store, &iter, tpath);
640 gtk_tree_path_free(tpath);
642 gtk_tree_model_get(store, &iter, KEYWORD_COLUMN_TEXT, &key, -1);
644 for (i = 0; i < FILEDATA_MARKS_SIZE; i++)
646 file_data_get_registered_mark_func(i, &get_mark_func, &set_mark_func, &mark_func_data);
647 if (get_mark_func == meta_data_get_keyword_mark && strcmp(mark_func_data, key) == 0)
649 g_free(mark_func_data);
650 file_data_register_mark_func(i, NULL, NULL, NULL);
654 if (sscanf(text, " %d ", &i) &&i >=1 && i <= FILEDATA_MARKS_SIZE)
657 file_data_get_registered_mark_func(i, &get_mark_func, &set_mark_func, &mark_func_data);
658 if (get_mark_func == meta_data_get_keyword_mark && mark_func_data) g_free(mark_func_data);
659 file_data_register_mark_func(i, meta_data_get_keyword_mark, meta_data_set_keyword_mark, g_strdup(key));
664 file_data_register_notify_func(bar_pane_keywords_notify_cb, pkd, NOTIFY_PRIORITY_LOW);
665 bar_pane_keywords_update(pkd);
668 void bar_pane_keywords_close(GtkWidget *bar)
670 PaneKeywordsData *pkd;
672 pkd = g_object_get_data(G_OBJECT(bar), "pane_data");
675 gtk_widget_destroy(pkd->widget);
678 static void bar_pane_keywords_destroy(GtkWidget *widget, gpointer data)
680 PaneKeywordsData *pkd = data;
682 file_data_unregister_notify_func(bar_pane_keywords_notify_cb, pkd);
684 file_data_unref(pkd->fd);
690 static GtkTreeModel *create_marks_list(void)
696 /* create list store */
697 model = gtk_list_store_new (1, G_TYPE_STRING);
698 for (i = 0; i < FILEDATA_MARKS_SIZE; i++)
701 sprintf(str, " %d ", i + 1);
702 gtk_list_store_append (model, &iter);
703 gtk_list_store_set(model, &iter, 0, str, -1);
705 gtk_list_store_append (model, &iter);
706 gtk_list_store_set(model, &iter, 0, " ... ", -1);
707 return GTK_TREE_MODEL (model);
710 GtkWidget *bar_pane_keywords_new(const gchar *title, const gchar *key)
712 PaneKeywordsData *pkd;
717 GtkTextBuffer *buffer;
721 GtkTreeViewColumn *column;
722 GtkCellRenderer *renderer;
724 pkd = g_new0(PaneKeywordsData, 1);
726 pkd->pane.pane_set_fd = bar_pane_keywords_set_fd;
727 pkd->pane.pane_event = bar_pane_keywords_event;
728 pkd->pane.title = g_strdup(title);
730 pkd->key = g_strdup(key);
733 hbox = gtk_hbox_new(FALSE, PREF_PAD_GAP);
736 g_object_set_data(G_OBJECT(pkd->widget), "pane_data", pkd);
737 g_signal_connect(G_OBJECT(pkd->widget), "destroy",
738 G_CALLBACK(bar_pane_keywords_destroy), pkd);
739 gtk_widget_show(hbox);
741 scrolled = gtk_scrolled_window_new(NULL, NULL);
742 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN);
743 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
744 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
745 gtk_box_pack_start(GTK_BOX(hbox), scrolled, TRUE, TRUE, 0);
746 gtk_widget_show(scrolled);
748 pkd->keyword_view = gtk_text_view_new();
749 gtk_container_add(GTK_CONTAINER(scrolled), pkd->keyword_view);
750 g_signal_connect(G_OBJECT(pkd->keyword_view), "populate-popup",
751 G_CALLBACK(bar_pane_keywords_populate_popup_cb), pkd);
752 gtk_widget_show(pkd->keyword_view);
754 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(pkd->keyword_view));
755 g_signal_connect(G_OBJECT(buffer), "changed",
756 G_CALLBACK(bar_pane_keywords_changed), pkd);
758 scrolled = gtk_scrolled_window_new(NULL, NULL);
759 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN);
760 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
761 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
762 gtk_box_pack_start(GTK_BOX(hbox), scrolled, TRUE, TRUE, 0);
763 gtk_widget_show(scrolled);
765 store = gtk_list_store_new(3, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING);
766 pkd->keyword_treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
767 g_object_unref(store);
769 gtk_widget_set_size_request(pkd->keyword_treeview, -1, 400);
771 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(pkd->keyword_treeview), FALSE);
773 gtk_tree_view_set_search_column(GTK_TREE_VIEW(pkd->keyword_treeview), KEYWORD_COLUMN_TEXT);
775 column = gtk_tree_view_column_new();
776 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
778 renderer = gtk_cell_renderer_toggle_new();
779 gtk_tree_view_column_pack_start(column, renderer, FALSE);
780 gtk_tree_view_column_add_attribute(column, renderer, "active", KEYWORD_COLUMN_TOGGLE);
781 g_signal_connect(G_OBJECT(renderer), "toggled",
782 G_CALLBACK(bar_pane_keywords_keyword_toggle), pkd);
784 renderer = gtk_cell_renderer_text_new();
785 gtk_tree_view_column_pack_start(column, renderer, TRUE);
786 gtk_tree_view_column_add_attribute(column, renderer, "text", KEYWORD_COLUMN_TEXT);
788 gtk_tree_view_append_column(GTK_TREE_VIEW(pkd->keyword_treeview), column);
790 column = gtk_tree_view_column_new();
791 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_GROW_ONLY);
793 renderer = gtk_cell_renderer_combo_new();
794 g_object_set(G_OBJECT(renderer), "editable", (gboolean)TRUE,
795 "model", create_marks_list(),
800 gtk_tree_view_column_pack_start(column, renderer, TRUE);
801 gtk_tree_view_column_add_attribute(column, renderer, "text", KEYWORD_COLUMN_MARK);
802 g_signal_connect (renderer, "edited",
803 G_CALLBACK (bar_pane_keywords_mark_edited), pkd);
804 gtk_tree_view_append_column(GTK_TREE_VIEW(pkd->keyword_treeview), column);
807 gtk_container_add(GTK_CONTAINER(scrolled), pkd->keyword_treeview);
808 gtk_widget_show(pkd->keyword_treeview);
810 file_data_register_notify_func(bar_pane_keywords_notify_cb, pkd, NOTIFY_PRIORITY_LOW);
814 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */