cvs: php-gtk / NEWS /ext/gtk+ gtk.overrides php_gtk+_types.c /test gtk.php scribble.php

[email protected] ("Andrei Zmievski")
Newsgroups php.gtk
Message-ID <cvsandrei996469875@cvsserver>
andrei		Mon Jul 30 01:11:15 2001 EDT

  Modified files:              
    /php-gtk	NEWS 
    /php-gtk/ext/gtk+	gtk.overrides php_gtk+_types.c 
    /php-gtk/test	gtk.php scribble.php 
  Log:
  - Finished drag-n-drop support.
  - Added drag-n-drop example to gtk.php.
  - GdkAtom parsing was completely screwed up from theoretical point of view,
    but it was still working somehow. Fixed.
andrei-20010730011115.txt (text/plain, 12.4 KB)
Index: php-gtk/NEWS
diff -u php-gtk/NEWS:1.30 php-gtk/NEWS:1.31
--- php-gtk/NEWS:1.30	Thu Jul 19 01:24:15 2001
+++ php-gtk/NEWS	Mon Jul 30 01:11:15 2001
@@ -1,3 +1,4 @@
+    - finished drag-n-drop support. (Andrei)
     - ported Scribble example from C. (Andrei)
     - modified GdkWindow::get_pointer() to be simpler, without XInput support.
       (Andrei)
Index: php-gtk/ext/gtk+/gtk.overrides
diff -u php-gtk/ext/gtk+/gtk.overrides:1.4 php-gtk/ext/gtk+/gtk.overrides:1.5
--- php-gtk/ext/gtk+/gtk.overrides:1.4	Thu Jul 19 01:24:16 2001
+++ php-gtk/ext/gtk+/gtk.overrides	Mon Jul 30 01:11:15 2001
@@ -2032,3 +2032,132 @@
 	add_property_long(return_value, "y", widget->allocation.y);
 	add_property_long(return_value, "width", widget->allocation.width);
 	add_property_long(return_value, "height", widget->allocation.height);
+%%
+override gtk_drag_dest_set
+PHP_FUNCTION(wrap_gtk_drag_dest_set)
+{
+	zval *php_flags, *php_targets, *php_actions;
+	zval **item;
+	GtkDestDefaults flags;
+	GdkDragAction actions;
+	GtkTargetEntry *targets;
+	int i;
+
+	NOT_STATIC_METHOD();
+
+	if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "VaV", &php_flags, &php_targets,
+							&php_actions))
+		return;
+
+	if (!php_gtk_get_flag_value(GTK_TYPE_DEST_DEFAULTS, php_flags, (gint *)&flags))
+		return;
+
+	if (!php_gtk_get_flag_value(GTK_TYPE_GDK_DRAG_ACTION, php_actions, (gint *)&actions))
+		return;
+
+	targets = g_new(GtkTargetEntry, zend_hash_num_elements(Z_ARRVAL_P(php_targets)));
+
+	for (zend_hash_internal_pointer_reset(Z_ARRVAL_P(php_targets)), i = 0;
+		 zend_hash_get_current_data(Z_ARRVAL_P(php_targets), (void **)&item) == SUCCESS;
+		 zend_hash_move_forward(Z_ARRVAL_P(php_targets)), i++) {
+		if (Z_TYPE_PP(item) != IS_ARRAY ||
+			!php_gtk_parse_args_hash_quiet(*item, "sii", &targets[i].target,
+										   &targets[i].flags, &targets[i].info)) {
+			php_error(E_WARNING, "%s() was unable to parse target #%d in the list of targets", get_active_function_name(), i+1);
+			g_free(targets);
+			return;
+		}
+	}
+
+	gtk_drag_dest_set(GTK_WIDGET(PHP_GTK_GET(this_ptr)), flags, targets, i, actions);
+	g_free(targets);
+}
+%%
+override gtk_drag_source_set
+PHP_FUNCTION(wrap_gtk_drag_source_set)
+{
+	zval *php_sbmask, *php_targets, *php_actions;
+	zval **item;
+	GdkModifierType sbmask;
+	GdkDragAction actions;
+	GtkTargetEntry *targets;
+	int i;
+
+	NOT_STATIC_METHOD();
+
+	if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "VaV", &php_sbmask, &php_targets,
+							&php_actions))
+		return;
+
+	if (!php_gtk_get_flag_value(GTK_TYPE_GDK_MODIFIER_TYPE, php_sbmask, (gint *)&sbmask))
+		return;
+
+	if (!php_gtk_get_flag_value(GTK_TYPE_GDK_DRAG_ACTION, php_actions, (gint *)&actions))
+		return;
+
+	targets = g_new(GtkTargetEntry, zend_hash_num_elements(Z_ARRVAL_P(php_targets)));
+
+	for (zend_hash_internal_pointer_reset(Z_ARRVAL_P(php_targets)), i = 0;
+		 zend_hash_get_current_data(Z_ARRVAL_P(php_targets), (void **)&item) == SUCCESS;
+		 zend_hash_move_forward(Z_ARRVAL_P(php_targets)), i++) {
+		if (Z_TYPE_PP(item) != IS_ARRAY ||
+			!php_gtk_parse_args_hash_quiet(*item, "sii", &targets[i].target,
+										   &targets[i].flags, &targets[i].info)) {
+			php_error(E_WARNING, "%s() was unable to parse target #%d in the list of targets", get_active_function_name(), i+1);
+			g_free(targets);
+			return;
+		}
+	}
+
+	gtk_drag_source_set(GTK_WIDGET(PHP_GTK_GET(this_ptr)), sbmask, targets, i, actions);
+	g_free(targets);
+}
+%%
+override gtk_drag_begin
+PHP_FUNCTION(wrap_gtk_drag_begin)
+{
+	zval *php_targets, *php_actions, *event;
+	zval *php_ret, **item;
+	GdkDragAction actions;
+	GtkTargetEntry *tents;
+	GtkTargetList *targets;
+	GdkDragContext *context;
+	gint button, i;
+
+	NOT_STATIC_METHOD();
+
+	if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "aViO", &php_targets, &php_actions,
+							&button, &event, gdk_event_ce))
+		return;
+
+	if (!php_gtk_get_flag_value(GTK_TYPE_GDK_DRAG_ACTION, php_actions, (gint *)&actions))
+		return;
+
+	tents = g_new(GtkTargetEntry, zend_hash_num_elements(Z_ARRVAL_P(php_targets)));
+
+	for (zend_hash_internal_pointer_reset(Z_ARRVAL_P(php_targets)), i = 0;
+		 zend_hash_get_current_data(Z_ARRVAL_P(php_targets), (void **)&item) == SUCCESS;
+		 zend_hash_move_forward(Z_ARRVAL_P(php_targets)), i++) {
+		if (Z_TYPE_PP(item) != IS_ARRAY ||
+			!php_gtk_parse_args_hash_quiet(*item, "sii", &tents[i].target,
+										   &tents[i].flags, &tents[i].info)) {
+			php_error(E_WARNING, "%s() was unable to parse target #%d in the list of targets", get_active_function_name(), i+1);
+			g_free(tents);
+			return;
+		}
+	}
+
+	targets = gtk_target_list_new(tents, i);
+	g_free(tents);
+	context = gtk_drag_begin(GTK_WIDGET(PHP_GTK_GET(this_ptr)), targets, actions, button, PHP_GDK_EVENT_GET(event));
+	gtk_target_list_unref(targets);
+
+	php_ret = php_gdk_drag_context_new(context);
+	SEPARATE_ZVAL(&php_ret);
+	*return_value = *php_ret;
+}
+%%
+ignore
+  gtk_drag_source_handle_event gtk_drag_dest_handle_event
+  gtk_selection_request gtk_selection_notify gtk_selection_property_notify
+  gtk_selection_incr_event
Index: php-gtk/ext/gtk+/php_gtk+_types.c
diff -u php-gtk/ext/gtk+/php_gtk+_types.c:1.5 php-gtk/ext/gtk+/php_gtk+_types.c:1.6
--- php-gtk/ext/gtk+/php_gtk+_types.c:1.5	Thu Jul 19 01:24:16 2001
+++ php-gtk/ext/gtk+/php_gtk+_types.c	Mon Jul 30 01:11:15 2001
@@ -18,7 +18,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
-/* $Id: php_gtk+_types.c,v 1.5 2001/07/19 05:24:16 andrei Exp $ */
+/* $Id: php_gtk+_types.c,v 1.6 2001/07/30 05:11:15 andrei Exp $ */
 
 #include "php_gtk.h"
 
@@ -80,6 +80,7 @@
 	}
 
 	object_init_ex(result, gdk_event_ce);
+	php_gtk_set_object(result, event, le_php_gtk_wrapper);
 
 	add_property_long(result, "type", event->type);
 	
@@ -375,6 +376,7 @@
 
 PHP_FUNCTION(gdk_window_property_get)
 {
+	zval *php_property;
 	GdkAtom property, type = 0;
 	gint delete = FALSE;
 	GdkAtom atype;
@@ -383,14 +385,15 @@
 
 	NOT_STATIC_METHOD();
 
-	if (!php_gtk_parse_args_quiet(ZEND_NUM_ARGS(), "O|Oi", &property, gdk_atom_ce, &type, gdk_atom_ce, &delete)) {
+	if (!php_gtk_parse_args_quiet(ZEND_NUM_ARGS(), "O|Oi", &php_property, gdk_atom_ce, &type, gdk_atom_ce, &delete)) {
 		gchar *prop_name;
 
 		if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "s|Oi", &prop_name, &type, gdk_atom_ce, &delete))
 			return;
 
 		property = gdk_atom_intern(prop_name, FALSE);
-	}
+	} else
+		property = PHP_GDK_ATOM_GET(php_property);
 
 	if (gdk_property_get(PHP_GDK_WINDOW_GET(this_ptr), property, type, 0, 9999, delete,
 						 &atype, &aformat, &alength, &data)) {
@@ -432,6 +435,7 @@
 
 PHP_FUNCTION(gdk_window_property_change)
 {
+	zval *php_property;
 	GdkAtom property, type;
 	gint format;
 	zval *php_mode, *php_data;
@@ -441,7 +445,7 @@
 
 	NOT_STATIC_METHOD();
 
-	if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "OOiVV", &property, gdk_atom_ce,
+	if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "OOiVV/", &php_property, gdk_atom_ce,
 							&type, gdk_atom_ce, &format, &php_mode, &php_data)) {
 		gchar *prop_name;
 
@@ -449,8 +453,9 @@
 								gdk_atom_ce, &format, &php_mode, &php_data))
 			return;
 
-			property = gdk_atom_intern(prop_name, FALSE);
-	}
+		property = gdk_atom_intern(prop_name, FALSE);
+	} else
+		property = PHP_GDK_ATOM_GET(php_property);
 
 	if (!php_gtk_get_enum_value(GTK_TYPE_GDK_PROP_MODE, php_mode, (gint *)&mode))
 		return;
@@ -522,18 +527,20 @@
 
 PHP_FUNCTION(gdk_window_property_delete)
 {
+	zval *php_property;
 	GdkAtom property;
 
 	NOT_STATIC_METHOD();
 
-	if (!php_gtk_parse_args_quiet(ZEND_NUM_ARGS(), "O", &property, gdk_atom_ce)) {
+	if (!php_gtk_parse_args_quiet(ZEND_NUM_ARGS(), "O", &php_property, gdk_atom_ce)) {
 		gchar *prop_name;
 
 		if (!php_gtk_parse_args_quiet(ZEND_NUM_ARGS(), "s", &prop_name))
 			return;
 
 		property = gdk_atom_intern(prop_name, FALSE);
-	}
+	} else
+		property = PHP_GDK_ATOM_GET(php_property);
 
 	gdk_property_delete(PHP_GDK_WINDOW_GET(this_ptr), property);
 }
@@ -1654,16 +1661,16 @@
 /* GtkSelectionData */
 PHP_FUNCTION(gtk_selection_data_set)
 {
-	GdkAtom type;
+	zval *type;
 	int format, length;
 	guchar *data;
 
 	NOT_STATIC_METHOD();
 
-	if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "iis#", &type, &format, &data, &length))
+	if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "Ois#", &type, gdk_atom_ce, &format, &data, &length))
 		return;
 
-	gtk_selection_data_set(PHP_GTK_SELECTION_DATA_GET(this_ptr), type, format, data, length);
+	gtk_selection_data_set(PHP_GTK_SELECTION_DATA_GET(this_ptr), PHP_GDK_ATOM_GET(type), format, data, length);
 	RETURN_NULL();
 }
 
Index: php-gtk/test/gtk.php
diff -u php-gtk/test/gtk.php:1.26 php-gtk/test/gtk.php:1.27
--- php-gtk/test/gtk.php:1.26	Wed May 23 12:59:39 2001
+++ php-gtk/test/gtk.php	Mon Jul 30 01:11:15 2001
@@ -1,5 +1,5 @@
 <?php
-/* $Id: gtk.php,v 1.26 2001/05/23 16:59:39 andrei Exp $ */
+/* $Id: gtk.php,v 1.27 2001/07/30 05:11:15 andrei Exp $ */
 
 if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN')
 	dl('php_gtk.dll');
@@ -50,6 +50,89 @@
 $ctree_data['books'] = 1;
 $ctree_data['pages'] = 0;
 
+function create_dnd()
+{
+	global	$windows;
+	if (!isset($windows['dnd'])) {
+		$targets = array(array('text/plain', 0, -1));
+
+		function dnd_drag_data_get($widget, $context, $selection_data, $info, $time)
+		{
+			$dnd_string = "Perl is the only language that looks\nthe same before and after RSA encryption";
+			$selection_data->set($selection_data->target, 8, $dnd_string);
+		}
+
+		function dnd_drag_data_received($widget, $context, $x, $y, $data, $info, $time)
+		{
+			if ($data && $data->format == 8)
+				print "Drop data of type " . $data->target->string . " was:\n'$data->data'.\n";
+		}
+		
+		$window = &new GtkWindow;
+		$windows['dnd'] = $window;
+		$window->connect('delete-event', 'delete_event');
+		$window->set_title('Drag-n-Drop');
+
+		$box1 = &new GtkVBox();
+		$window->add($box1);
+		$box1->show();
+
+		$box2 = &new GtkHBox(false, 5);
+		$box2->set_border_width(10);
+		$box1->pack_start($box2);
+		$box2->show();
+		
+		$frame = &new GtkFrame('Drag');
+		$box2->pack_start($frame);
+		$frame->show();
+
+		$box3 = &new GtkVBox(false, 5);
+		$box3->set_border_width(5);
+		$frame->add($box3);
+		$box3->show();
+
+		$button = &new GtkButton('Drag me!');
+		$box3->pack_start($button);
+		$button->show();
+		$button->connect('drag_data_get', 'dnd_drag_data_get');
+		$button->drag_source_set(GDK_BUTTON1_MASK|GDK_BUTTON3_MASK, $targets,
+								 GDK_ACTION_COPY);
+
+		$frame = &new GtkFrame('Drop');
+		$box2->pack_start($frame);
+		$frame->show();
+
+		$box3 = &new GtkVBox(false, 5);
+		$box3->set_border_width(5);
+		$frame->add($box3);
+		$box3->show();
+
+		$button = &new GtkButton('To');
+		$box3->pack_start($button);
+		$button->show();
+		$button->realize();
+		$button->connect('drag_data_received', 'dnd_drag_data_received');
+		$button->drag_dest_set(GTK_DEST_DEFAULT_ALL, $targets, GDK_ACTION_COPY);
+
+		$separator = &new GtkHSeparator();
+		$box1->pack_start($separator, false);
+		$separator->show();
+
+		$box2 = &new GtkVBox(false, 10);
+		$box2->set_border_width(10);
+		$box1->pack_start($box2, false);
+		$box2->show();
+
+		$button = &new GtkButton('close');
+		$button->connect('clicked', 'close_window');
+		$box2->pack_start($button);
+		$button->set_flags(GTK_CAN_DEFAULT);
+		$button->grab_default();
+		$button->show();
+	}
+	$windows['dnd']->show();
+}
+
 function create_ctree()
 {
 	global	$windows,
@@ -1877,6 +1960,7 @@
 					 'dialog'			=> null,
 					 'panes'			=> null,
 					 'pixmap'			=> 'create_pixmap',
+					 'drag\'n\'drop'	=> 'create_dnd',
 					);
 
 	$window = &new GtkWindow();
Index: php-gtk/test/scribble.php
diff -u php-gtk/test/scribble.php:1.2 php-gtk/test/scribble.php:1.3
--- php-gtk/test/scribble.php:1.2	Thu Jul 19 16:04:14 2001
+++ php-gtk/test/scribble.php	Mon Jul 30 01:11:15 2001
@@ -1,5 +1,5 @@
 <?php
-/* $Id: scribble.php,v 1.2 2001/07/19 20:04:14 andrei Exp $ */
+/* $Id: scribble.php,v 1.3 2001/07/30 05:11:15 andrei Exp $ */
 
 if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN')
 	dl('php_gtk.dll');
@@ -80,13 +80,14 @@
 	global	$pixmap;
 
 	gdk::draw_arc($pixmap, $widget->style->black_gc,
-				  true, $x - 5, $y - 5, 10, 10, 0, 64 * 360); 
-	$widget->draw($x - 5, $y - 5, 10, 10);
+				  true, $x - 4, $y - 4, 8, 8, 0, 64 * 360); 
+	$widget->draw($x - 4, $y - 4, 8, 8);
 }
 
 
 $window = &new GtkWindow();
 $window->set_name('Test Input');
+$window->set_position(GTK_WIN_POS_CENTER);
 
 $window->connect_object('destroy', array('gtk', 'main_quit'));
 
@@ -95,7 +96,7 @@
 $vbox->show();
 
 $drawing_area = &new GtkDrawingArea();
-$drawing_area->size(200, 200);
+$drawing_area->size(300, 300);
 $vbox->pack_start($drawing_area);
 $drawing_area->show();
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.