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();