void meta_data_connect_mark_with_keyword(GtkTreeModel *keyword_tree, GtkTreeIter *kw_iter, gint mark) { FileDataGetMarkFunc get_mark_func; FileDataSetMarkFunc set_mark_func; gpointer mark_func_data; gint i; for (i = 0; i < FILEDATA_MARKS_SIZE; i++) { file_data_get_registered_mark_func(i, &get_mark_func, &set_mark_func, &mark_func_data); if (get_mark_func == meta_data_get_keyword_mark) { GtkTreeIter old_kw_iter; GList *old_path = mark_func_data; if (keyword_tree_get_iter(keyword_tree, &old_kw_iter, old_path) && (i == mark || /* release any previous connection of given mark */ keyword_compare(keyword_tree, &old_kw_iter, kw_iter) == 0)) /* or given keyword */ { file_data_register_mark_func(i, NULL, NULL, NULL, NULL); gtk_tree_store_set(GTK_TREE_STORE(keyword_tree), &old_kw_iter, KEYWORD_COLUMN_MARK, "", -1); } } } if (mark >= 0 && mark < FILEDATA_MARKS_SIZE) { GList *path; gchar *mark_str; path = keyword_tree_get_path(keyword_tree, kw_iter); file_data_register_mark_func(mark, meta_data_get_keyword_mark, meta_data_set_keyword_mark, path, (GDestroyNotify)string_list_free); mark_str = g_strdup_printf("%d", (mark < 9 ? mark : -1) + 1); gtk_tree_store_set(GTK_TREE_STORE(keyword_tree), kw_iter, KEYWORD_COLUMN_MARK, mark_str, -1); g_free(mark_str); } }
static void bar_pane_keywords_dnd_get(GtkWidget *tree_view, GdkDragContext *context, GtkSelectionData *selection_data, guint info, guint time, gpointer data) { GtkTreeIter iter; GtkTreeModel *model; GtkTreeIter child_iter; GtkTreeModel *keyword_tree; GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view)); if (!gtk_tree_selection_get_selected(sel, &model, &iter)) return; keyword_tree = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(model)); gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(model), &child_iter, &iter); switch (info) { case TARGET_APP_KEYWORD_PATH: { GList *path = keyword_tree_get_path(keyword_tree, &child_iter); gtk_selection_data_set(selection_data, gtk_selection_data_get_target(selection_data), 8, (gpointer) &path, sizeof(path)); break; } case TARGET_TEXT_PLAIN: default: { gchar *name = keyword_get_name(keyword_tree, &child_iter); gtk_selection_data_set_text(selection_data, name, -1); g_free(name); } break; } }