Package: ruby-gnome2 Severity: wishlist Tags: patch Hi Dafydd,
could you please take a look at the attached patch? It adds "row-draggable" and "row-drop-possible" signals to Gtk::ListStore and Gtk::TreeStore, thus enabling users to use the Gtk high-level DND API. Kind regards, Philipp Kern
diff -Naur ruby-gnome2-0.14.1~/gtk/src/rbgtkliststore.c ruby-gnome2-0.14.1/gtk/src/rbgtkliststore.c
--- ruby-gnome2-0.14.1~/gtk/src/rbgtkliststore.c 2005-11-14 09:14:00.000000000 +0100
+++ ruby-gnome2-0.14.1/gtk/src/rbgtkliststore.c 2006-08-16 03:00:54.000000000 +0200
@@ -11,6 +11,8 @@
#include "global.h"
+#include "rbgtktreedrag.h"
+
#define _SELF(s) (GTK_LIST_STORE(RVAL2GOBJ(s)))
#define ITR2RVAL(i) (BOXED2RVAL(i, GTK_TYPE_TREE_ITER))
#define RVAL2ITR(i) ((GtkTreeIter*)RVAL2BOXED(i, GTK_TYPE_TREE_ITER))
@@ -34,7 +36,8 @@
buf[cnt] = CLASS2GTYPE(argv[cnt]);
}
- store = gtk_list_store_newv(argc, buf);
+ store = GTK_LIST_STORE(g_object_new(RB_TYPE_DND_LIST_STORE, NULL));
+ gtk_list_store_set_column_types(store, argc, buf);
G_INITIALIZE(self, store);
@@ -282,11 +285,11 @@
void
Init_gtk_list_store()
{
- VALUE ls = G_DEF_CLASS(GTK_TYPE_LIST_STORE, "ListStore", mGtk);
+ VALUE ls = G_DEF_CLASS(RB_TYPE_DND_LIST_STORE, "ListStore", mGtk);
id_to_a = rb_intern("to_a");
- rbgtk_register_treeiter_set_value_func(GTK_TYPE_LIST_STORE,
+ rbgtk_register_treeiter_set_value_func(RB_TYPE_DND_LIST_STORE,
(rbgtkiter_set_value_func)>k_list_store_set_value);
rb_define_method(ls, "initialize", lstore_initialize, -1);
rb_define_method(ls, "set_column_types", lstore_set_column_types, -1);
diff -Naur ruby-gnome2-0.14.1~/gtk/src/rbgtktreedrag.c ruby-gnome2-0.14.1/gtk/src/rbgtktreedrag.c
--- ruby-gnome2-0.14.1~/gtk/src/rbgtktreedrag.c 1970-01-01 01:00:00.000000000 +0100
+++ ruby-gnome2-0.14.1/gtk/src/rbgtktreedrag.c 2006-08-16 02:55:40.000000000 +0200
@@ -0,0 +1,184 @@
+/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
+/************************************************
+
+ rbgtktreedrag.c -
+
+ $Author: ck $
+ $Date: 2006/08/16 02:06:00 $
+
+ Copyright (C) 2006 Armin Burgmeier
+************************************************/
+
+#include "global.h"
+#include "rbgtktreedrag.h"
+
+#define g_marshal_value_peek_boxed(v) g_value_get_boxed(v)
+#define g_marshal_value_peek_object(v) g_value_get_object(v)
+
+static void
+_rb_marshal_BOOLEAN__BOXED(GClosure *closure,
+ GValue *return_value,
+ guint n_param_values,
+ const GValue *param_values,
+ gpointer invocation_hint,
+ gpointer marshal_data)
+{
+ typedef gboolean (*GMarshalFunc_BOOLEAN__BOXED) (gpointer data1,
+ gpointer arg_1,
+ gpointer data2);
+ register GMarshalFunc_BOOLEAN__BOXED callback;
+ register GCClosure *cc = (GCClosure*) closure;
+ register gpointer data1, data2;
+ gboolean v_return;
+
+ g_return_if_fail (return_value != NULL);
+ g_return_if_fail (n_param_values == 2);
+
+ if (G_CCLOSURE_SWAP_DATA (closure))
+ {
+ data1 = closure->data;
+ data2 = g_value_peek_pointer (param_values + 0);
+ }
+ else
+ {
+ data1 = g_value_peek_pointer (param_values + 0);
+ data2 = closure->data;
+ }
+ callback = (GMarshalFunc_BOOLEAN__BOXED) (marshal_data ? marshal_data : cc->callback);
+
+ v_return = callback (data1,
+ g_marshal_value_peek_boxed (param_values + 1),
+ data2);
+
+ g_value_set_boolean (return_value, v_return);
+}
+
+static void
+_rb_marshal_BOOLEAN__BOXED_BOXED(GClosure *closure,
+ GValue *return_value,
+ guint n_param_values,
+ const GValue *param_values,
+ gpointer invocation_hint,
+ gpointer marshal_data)
+{
+ typedef gboolean (*GMarshalFunc_BOOLEAN__BOXED_BOXED) (gpointer data1,
+ gpointer arg_1,
+ gpointer arg_2,
+ gpointer data2);
+ register GMarshalFunc_BOOLEAN__BOXED_BOXED callback;
+ register GCClosure *cc = (GCClosure*) closure;
+ register gpointer data1, data2;
+ gboolean v_return;
+
+ g_return_if_fail (return_value != NULL);
+ g_return_if_fail (n_param_values == 3);
+
+ if (G_CCLOSURE_SWAP_DATA (closure))
+ {
+ data1 = closure->data;
+ data2 = g_value_peek_pointer (param_values + 0);
+ }
+ else
+ {
+ data1 = g_value_peek_pointer (param_values + 0);
+ data2 = closure->data;
+ }
+ callback = (GMarshalFunc_BOOLEAN__BOXED_BOXED) (marshal_data ? marshal_data : cc->callback);
+
+ v_return = callback (data1,
+ g_marshal_value_peek_boxed (param_values + 1),
+ g_marshal_value_peek_boxed (param_values + 2),
+ data2);
+
+ g_value_set_boolean (return_value, v_return);
+}
+
+static void
+rb_dnd_tree_drag_class_init(GType type)
+{
+ g_signal_new("row-draggable",
+ type,
+ G_SIGNAL_RUN_LAST,
+ 0,
+ NULL, NULL,
+ _rb_marshal_BOOLEAN__BOXED,
+ G_TYPE_BOOLEAN, 1,
+ GTK_TYPE_TREE_PATH);
+
+ g_signal_new("row-drop-possible",
+ type,
+ G_SIGNAL_RUN_LAST,
+ 0,
+ NULL, NULL,
+ _rb_marshal_BOOLEAN__BOXED_BOXED,
+ G_TYPE_BOOLEAN, 2,
+ GTK_TYPE_TREE_PATH,
+ GTK_TYPE_SELECTION_DATA);
+}
+
+static gboolean
+rb_dnd_tree_drag_row_draggable(GtkTreeDragSource *drag_source,
+ GtkTreePath *path)
+{
+ gboolean retval;
+ g_assert(G_TYPE_FROM_INSTANCE(drag_source) == RB_TYPE_DND_TREE_STORE ||
+ G_TYPE_FROM_INSTANCE(drag_source) == RB_TYPE_DND_LIST_STORE);
+
+ guint signal_id = g_signal_lookup("row-draggable", G_TYPE_FROM_INSTANCE(drag_source));
+
+ if(g_signal_has_handler_pending(drag_source, signal_id, 0, FALSE))
+ g_signal_emit(drag_source, signal_id, 0, path, &retval);
+ else
+ retval = TRUE; /* default value */
+
+ return retval;
+}
+
+static gboolean
+rb_dnd_tree_drag_row_drop_possible(GtkTreeDragDest* drag_dest,
+ GtkTreePath* dest_path,
+ GtkSelectionData* selection_data)
+{
+ gboolean retval;
+
+ g_assert(G_TYPE_FROM_INSTANCE(drag_dest) == RB_TYPE_DND_TREE_STORE ||
+ G_TYPE_FROM_INSTANCE(drag_dest) == RB_TYPE_DND_LIST_STORE);
+
+ guint signal_id = g_signal_lookup("row-drop-possible", G_TYPE_FROM_INSTANCE(drag_dest));
+
+ if(g_signal_has_handler_pending(drag_dest, signal_id, 0, FALSE))
+ g_signal_emit(drag_dest, signal_id, 0, dest_path, selection_data, &retval);
+ else
+ retval = TRUE; /* default value */
+
+ return retval;
+}
+
+static void
+rb_dnd_tree_store_init(RbDndTreeStore* store)
+{
+ GTK_TREE_DRAG_SOURCE_GET_IFACE(store)->row_draggable = rb_dnd_tree_drag_row_draggable;
+ GTK_TREE_DRAG_DEST_GET_IFACE(store)->row_drop_possible = rb_dnd_tree_drag_row_drop_possible;
+}
+
+static void
+rb_dnd_list_store_init(RbDndListStore* store)
+{
+ GTK_TREE_DRAG_SOURCE_GET_IFACE(store)->row_draggable = rb_dnd_tree_drag_row_draggable;
+ GTK_TREE_DRAG_DEST_GET_IFACE(store)->row_drop_possible = rb_dnd_tree_drag_row_drop_possible;
+}
+
+static void
+rb_dnd_tree_store_class_init(RbDndTreeStoreClass* klass)
+{
+ rb_dnd_tree_drag_class_init(G_TYPE_FROM_CLASS(klass));
+}
+
+static void
+rb_dnd_list_store_class_init(RbDndListStoreClass* klass)
+{
+ rb_dnd_tree_drag_class_init(G_TYPE_FROM_CLASS(klass));
+}
+
+G_DEFINE_TYPE(RbDndTreeStore, rb_dnd_tree_store, GTK_TYPE_TREE_STORE)
+G_DEFINE_TYPE(RbDndListStore, rb_dnd_list_store, GTK_TYPE_LIST_STORE)
diff -Naur ruby-gnome2-0.14.1~/gtk/src/rbgtktreedrag.h ruby-gnome2-0.14.1/gtk/src/rbgtktreedrag.h
--- ruby-gnome2-0.14.1~/gtk/src/rbgtktreedrag.h 1970-01-01 01:00:00.000000000 +0100
+++ ruby-gnome2-0.14.1/gtk/src/rbgtktreedrag.h 2006-08-16 02:28:40.000000000 +0200
@@ -0,0 +1,49 @@
+/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
+/************************************************
+
+ rbgtktreedrag.h -
+
+ $Author: ck $
+ $Date: 2006/08/16 02:24:00 $
+
+ Copyright (C) 2006 Armin Burgmeier
+************************************************/
+
+#ifndef __RBGTKTREEDRAG_H__
+#define __RBGTKTREEDRAG_H__
+
+#include <gtk/gtktreestore.h>
+#include <gtk/gtkliststore.h>
+
+#define RB_TYPE_DND_TREE_STORE (rb_dnd_tree_store_get_type())
+#define RB_TYPE_DND_LIST_STORE (rb_dnd_list_store_get_type())
+
+typedef struct _RbDndTreeStore RbDndTreeStore;
+typedef struct _RbDndListStore RbDndListStore;
+
+typedef struct _RbDndTreeStoreClass RbDndTreeStoreClass;
+typedef struct _RbDndListStoreClass RbDndListStoreClass;
+
+struct _RbDndTreeStore {
+ GtkTreeStore parent;
+};
+
+struct _RbDndTreeStoreClass {
+ GtkTreeStoreClass parent_class;
+};
+
+struct _RbDndListStore {
+ GtkListStore parent;
+};
+
+struct _RbDndListStoreClass {
+ GtkListStoreClass parent_class;
+};
+
+GType
+rb_dnd_tree_store_get_type(void) G_GNUC_CONST;
+
+GType
+rb_dnd_list_store_get_type(void) G_GNUC_CONST;
+
+#endif /* __RBGTKTREEDRAG_H__ */
diff -Naur ruby-gnome2-0.14.1~/gtk/src/rbgtktreestore.c ruby-gnome2-0.14.1/gtk/src/rbgtktreestore.c
--- ruby-gnome2-0.14.1~/gtk/src/rbgtktreestore.c 2005-11-14 09:14:00.000000000 +0100
+++ ruby-gnome2-0.14.1/gtk/src/rbgtktreestore.c 2006-08-16 02:34:56.000000000 +0200
@@ -11,6 +11,8 @@
#include "global.h"
+#include "rbgtktreedrag.h"
+
#define _SELF(s) (GTK_TREE_STORE(RVAL2GOBJ(s)))
#define ITR2RVAL(i) (BOXED2RVAL(i, GTK_TYPE_TREE_ITER))
#define RVAL2ITR(i) ((GtkTreeIter*)RVAL2BOXED(i, GTK_TYPE_TREE_ITER))
@@ -32,7 +34,8 @@
buf[cnt] = CLASS2GTYPE(argv[cnt]);
}
- store = gtk_tree_store_newv(argc, buf);
+ store = GTK_TREE_STORE(g_object_new(RB_TYPE_DND_TREE_STORE, NULL));
+ gtk_tree_store_set_column_types(store, argc, buf);
G_INITIALIZE(self, store);
@@ -256,9 +259,9 @@
void
Init_gtk_tree_store()
{
- VALUE ts = G_DEF_CLASS(GTK_TYPE_TREE_STORE, "TreeStore", mGtk);
+ VALUE ts = G_DEF_CLASS(RB_TYPE_DND_TREE_STORE, "TreeStore", mGtk);
- rbgtk_register_treeiter_set_value_func(GTK_TYPE_TREE_STORE,
+ rbgtk_register_treeiter_set_value_func(RB_TYPE_DND_TREE_STORE,
(rbgtkiter_set_value_func)>k_tree_store_set_value);
rb_define_method(ts, "initialize", tstore_initialize, -1);
signature.asc
Description: This is a digitally signed message part

