com gtk/php-gtk: Implement a bunch of drag-n-drop methods.: ext/gtk+/Makefile.frag ext/gtk+/gtk.overrides ext/gtk+/gtkdrag.overrides

[email protected] (David Soria Parra) Sat, 04 Feb 2006 21:46:18 +0000
Newsgroups php.gtk.cvs
Message-ID <[email protected]>
Commit:    df050b749d959ff05eac54593924ffdd6cf4c96e
Author:    Andrei Zmievski <[email protected]>         Sat, 4 Feb 2006 21:46:18 +0000
Parents:   5d372f76d25cb502c3906f5e2d0a919404aab730
Branches:  master

Link:       http://git.php.net/?p=gtk/php-gtk.git;a=commitdiff;h=df050b749d959ff05eac54593924ffdd6cf4c96e

Log:
Implement a bunch of drag-n-drop methods.

Changed paths:
  M  ext/gtk+/Makefile.frag
  M  ext/gtk+/gtk.overrides
  A  ext/gtk+/gtkdrag.overrides


Diff:
df050b749d959ff05eac54593924ffdd6cf4c96e
diff --git a/ext/gtk+/Makefile.frag b/ext/gtk+/Makefile.frag
index d12babb..f9e5b5c 100644
--- a/ext/gtk+/Makefile.frag
+++ b/ext/gtk+/Makefile.frag
@@ -7,7 +7,8 @@ GTK_OVERRIDES = \
 	$(srcdir)/gtkcontainer.overrides \
 	$(srcdir)/gtkstyle.overrides \
 	$(srcdir)/gtktextview.overrides \
-	$(srcdir)/gtktreeview.overrides
+	$(srcdir)/gtktreeview.overrides \
+	$(srcdir)/gtkdrag.overrides
 
 $(builddir)/gen_gtk.c: $(srcdir)/gtk.defs $(COMMONDEFS) $(srcdir)/gtk-extrafuncs.defs $(GTK_OVERRIDES)
 $(builddir)/gen_gdk.c: $(srcdir)/gdk.defs $(COMMONDEFS) $(srcdir)/gdk.overrides
diff --git a/ext/gtk+/gtk.overrides b/ext/gtk+/gtk.overrides
index ef4fbbf..c432757 100644
--- a/ext/gtk+/gtk.overrides
+++ b/ext/gtk+/gtk.overrides
@@ -2528,3 +2528,4 @@ PHP_METHOD
 
 %% include gtktextview.overrides
 %% include gtktreeview.overrides
+%% include gtkdrag.overrides
diff --git a/ext/gtk+/gtkdrag.overrides b/ext/gtk+/gtkdrag.overrides
new file mode 100644
index 0000000..4581498
--- /dev/null
+++ b/ext/gtk+/gtkdrag.overrides
@@ -0,0 +1,259 @@
+/* vim: set ft=cpp fdm=marker et: */
+
+%%
+headers
+extern PHP_GTK_EXPORT_CE(gdkdragcontext_ce);
+static GtkTargetEntry* phpg_parse_target_entries(zval *php_targets, int *n_targets);
+
+%%
+override gtk_drag_dest_set
+
+static GtkTargetEntry* phpg_parse_target_entries(zval *php_targets, int *n_targets)
+{
+    GtkTargetEntry *tents;
+    zval **item;
+    int n;
+
+    *n_targets = 0;
+	tents = emalloc(sizeof(GtkTargetEntry) * zend_hash_num_elements(Z_ARRVAL_P(php_targets)));
+
+	for (zend_hash_internal_pointer_reset(Z_ARRVAL_P(php_targets)), n = 0;
+		 zend_hash_get_current_data(Z_ARRVAL_P(php_targets), (void **)&item) == SUCCESS;
+		 zend_hash_move_forward(Z_ARRVAL_P(php_targets)), n++) {
+		if (Z_TYPE_PP(item) != IS_ARRAY ||
+			!php_gtk_parse_args_hash_quiet(*item, "sii", &tents[n].target,
+										   &tents[n].flags, &tents[n].info)) {
+			php_error(E_WARNING, "%s::%s() was unable to parse target #%d in the list of targets", get_active_class_name(NULL TSRMLS_CC), get_active_function_name(TSRMLS_C), n+1);
+			efree(tents);
+			return NULL;
+		}
+	}
+
+    *n_targets = n;
+    return tents;
+}
+
+PHP_METHOD
+{
+	zval *php_flags, *php_targets, *php_actions;
+	GtkDestDefaults flags;
+	GdkDragAction actions;
+	GtkTargetEntry *entries;
+	int n;
+
+	NOT_STATIC_METHOD();
+
+	if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "VaV", &php_flags, &php_targets, &php_actions)) {
+		return;
+	}
+
+	if (phpg_gvalue_get_flags(GTK_TYPE_DEST_DEFAULTS, php_flags, (gint *)&flags) == FAILURE) {
+		return;
+	}
+
+	if (phpg_gvalue_get_flags(GDK_TYPE_DRAG_ACTION, php_actions, (gint *)&actions) == FAILURE) {
+		return;
+	}
+
+	entries = phpg_parse_target_entries(php_targets, &n);
+	gtk_drag_dest_set(GTK_WIDGET(PHPG_GOBJECT(this_ptr)), flags, entries, n, actions);
+	efree(entries);
+}
+
+%%
+override gtk_drag_begin
+PHP_METHOD
+{
+	zval *php_targets, *php_actions, *event;
+	GdkDragAction actions;
+	GtkTargetEntry *entries;
+	GtkTargetList *tlist;
+	GdkDragContext *context;
+	gint button, n;
+
+	NOT_STATIC_METHOD();
+
+	if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "aViO", &php_targets, &php_actions,
+							&button, &event, gdkevent_ce)) {
+		return;
+    }
+
+	if (phpg_gvalue_get_flags(GDK_TYPE_DRAG_ACTION, php_actions, (gint *)&actions) == FAILURE) {
+		return;
+    }
+
+	entries = phpg_parse_target_entries(php_targets, &n);
+	tlist = gtk_target_list_new(entries, n);
+	efree(entries);
+	context = gtk_drag_begin(GTK_WIDGET(PHPG_GOBJECT(this_ptr)), tlist, actions, button, (GdkEvent *)PHPG_GBOXED(event));
+	gtk_target_list_unref(tlist);
+
+    phpg_gobject_new(&return_value, (GObject *)context TSRMLS_CC);
+}
+
+%%
+override gtk_drag_dest_get_target_list
+PHP_METHOD
+{
+    GtkTargetList *tlist;
+    GtkTargetPair *pair;
+    GList *tmp;
+    gchar *name;
+
+    NOT_STATIC_METHOD();
+
+    if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "")) {
+        return;
+    }
+
+    tlist = gtk_drag_dest_get_target_list(GTK_WIDGET(PHPG_GOBJECT(this_ptr)));
+    if (!tlist) {
+        return;
+    }
+
+    array_init(return_value);
+    for (tmp = tlist->list; tmp != NULL; tmp = tmp->next) {
+        zval *item = NULL;
+
+        pair = tmp->data;
+        name = gdk_atom_name(pair->target);
+        php_gtk_build_value(&item, "(sii)", name, pair->flags, pair->info);
+        g_free(name);
+        add_next_index_zval(return_value, item);
+    }
+}
+
+%%
+override gtk_drag_dest_set_target_list
+PHP_METHOD
+{
+    zval *php_targets;
+    GtkTargetEntry *entries;
+	GtkTargetList *tlist;
+    int n;
+
+    NOT_STATIC_METHOD();
+
+    if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "a", &php_targets)) {
+        return;
+    }
+
+	entries = phpg_parse_target_entries(php_targets, &n);
+	tlist = gtk_target_list_new(entries, n);
+	efree(entries);
+
+    gtk_drag_dest_set_target_list(GTK_WIDGET(PHPG_GOBJECT(this_ptr)), tlist);
+    gtk_target_list_unref(tlist);
+}
+
+%%
+override gtk_drag_dest_find_target
+PHP_METHOD
+{
+    zval *php_targets, *php_context;
+    GtkTargetEntry *entries;
+    GtkTargetList *tlist;
+    GdkAtom atom;
+    int n;
+
+    NOT_STATIC_METHOD();
+
+    if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "Oa", &php_context, gdkdragcontext_ce, &php_targets)) {
+        return;
+    }
+
+    entries = phpg_parse_target_entries(php_targets, &n);
+	tlist = gtk_target_list_new(entries, n);
+	efree(entries);
+
+    atom = gtk_drag_dest_find_target(GTK_WIDGET(PHPG_GOBJECT(this_ptr)),
+                                     GDK_DRAG_CONTEXT(PHPG_GOBJECT(php_context)), tlist);
+    gtk_target_list_unref(tlist);
+
+    RETURN_STRING(gdk_atom_name(atom), 0);
+}
+
+%%
+override gtk_drag_source_set
+PHP_METHOD
+{
+	zval *php_sbmask, *php_targets, *php_actions;
+	GdkModifierType sbmask;
+	GdkDragAction actions;
+	GtkTargetEntry *entries;
+	int n;
+
+	NOT_STATIC_METHOD();
+
+	if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "VaV", &php_sbmask, &php_targets, &php_actions)) {
+		return;
+    }
+
+	if (phpg_gvalue_get_flags(GDK_TYPE_MODIFIER_TYPE, php_sbmask, (gint *)&sbmask) == FAILURE) {
+		return;
+    }
+
+	if (phpg_gvalue_get_flags(GDK_TYPE_DRAG_ACTION, php_actions, (gint *)&actions) == FAILURE) {
+        return;
+    }
+
+	entries = phpg_parse_target_entries(php_targets, &n);
+	gtk_drag_source_set(GTK_WIDGET(PHPG_GOBJECT(this_ptr)), sbmask, entries, n, actions);
+	efree(entries);
+}
+
+%%
+override gtk_drag_source_get_target_list
+PHP_METHOD
+{
+    GtkTargetList *tlist;
+    GtkTargetPair *pair;
+    GList *tmp;
+    gchar *name;
+
+    NOT_STATIC_METHOD();
+
+    if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "")) {
+        return;
+    }
+
+    tlist = gtk_drag_source_get_target_list(GTK_WIDGET(PHPG_GOBJECT(this_ptr)));
+    if (!tlist) {
+        return;
+    }
+
+    array_init(return_value);
+    for (tmp = tlist->list; tmp != NULL; tmp = tmp->next) {
+        zval *item = NULL;
+
+        pair = tmp->data;
+        name = gdk_atom_name(pair->target);
+        php_gtk_build_value(&item, "(sii)", name, pair->flags, pair->info);
+        g_free(name);
+        add_next_index_zval(return_value, item);
+    }
+}
+
+%%
+override gtk_drag_source_set_target_list
+PHP_METHOD
+{
+    zval *php_targets;
+    GtkTargetEntry *entries;
+	GtkTargetList *tlist;
+    int n;
+
+    NOT_STATIC_METHOD();
+
+    if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "a", &php_targets)) {
+        return;
+    }
+
+	entries = phpg_parse_target_entries(php_targets, &n);
+	tlist = gtk_target_list_new(entries, n);
+	efree(entries);
+
+    gtk_drag_source_set_target_list(GTK_WIDGET(PHPG_GOBJECT(this_ptr)), tlist);
+    gtk_target_list_unref(tlist);
+}
+