Garry R. Osgood (gosgood@xxxxxxx) wrote: > Simon wrote: > > When selecting something (e.g. tearing the menu off) the marching ants die. > > When opening a new image they are alive for the new image. > > I Confirm this as well. Excellent, Simon, for you have brought forth > the work-around to the problem for the poor Gimp user until this is > resolved: When Marching Ants Die, Cntl-D for a New Image (I suppose > saving the image first won't be such a bad idea). This creates a new > Selection object for that image without an unbalanced pause count. Heh - I didn't realize this... :-) [does GTK handle the XInput-devices and the "normal mouse" in the same way?] > At present, we know that is not entirely true in two mixes of hardware. > However, the manner in which they are untrue appears essentially the same. > I have, however, just read Raphael's well-documented response, and he > is seeing quite different things. I need more time to reflect on his > mail, but his results suggest that 10498 does have hardware > dependencies. I think a sensible fix is not immediately forthcoming. I wrote a small program to monitor the extended XInput-Events, it is attached. For my Artpad II it shows a strange thing: If I press the "right" Pen-Button when pressing the Pen on the tablet, each motion event is surrounded by proximity in and proximity out events for the eraser side of the pen. This is probably a bug in the XFree-driver or a bad tablet-protocol. There is a strange comment in the Driver source (The Artpad II speaks the Wacom 4 protocol, Intuos Wacom 5: if (common->wcmProtocolLevel == 4 && !(common->wcmFlags & GRAPHIRE_FLAG)) { /* The stylus reports button 4 for the second side * switch and button 4/5 for the eraser tip. We know * how to choose when we come in proximity for the * first time. If we are in proximity and button 4 then * we have the eraser else we have the second side * switch. */ Maybe there is a bug in the XFree86 driver with this assumption? My demo program is simply compiled with gcc -o xinputev xinputev.c `gtk-config --libs --cflags` When invoked with an additional argument it does report the motion events too. When you press the right button it invokes a submenu without any function. You can see, that under certain circumstances the release events for the buttons 1/3 dont reach the main window. Bye, Simon -- Simon.Budig@xxxxxxxxxxx http://www.home.unix-ag.org/simon/
/* XInputEV -- a program for monitoring XInput-Events * Copyright (C) 2000 Simon Budig <Simon.Budig@xxxxxxxxxxx> * * Distributed under the terms of the GNU GPL. * * compile with * gcc -o xinputev xinputev.c `gtk-config --libs --cflags` */ #include <glib.h> #include <gdk/gdk.h> #include <gtk/gtk.h> #define EVENT_MASK ( GDK_PROXIMITY_IN_MASK | \ GDK_PROXIMITY_OUT_MASK | \ GDK_BUTTON_PRESS_MASK | \ GDK_BUTTON_RELEASE_MASK | \ GDK_POINTER_MOTION_MASK ) GtkMenu *menu = NULL; GtkWidget *menupoint = NULL; /* Event-Handler */ gboolean printevent (GtkWidget *widget, GdkEvent *ev, gpointer user_data) { GdkEventButton *bev=NULL; GdkEventMotion *mev=NULL; GdkEventProximity *pev=NULL; GtkWidget *win = NULL; switch (ev->type) { case GDK_BUTTON_PRESS: bev = (GdkEventButton *) ev; g_printerr ("button_press "); if (bev->button == 3) gtk_menu_popup (menu, NULL, NULL, NULL, NULL, 3, GDK_CURRENT_TIME); break; case GDK_2BUTTON_PRESS: bev = (GdkEventButton *) ev; g_printerr ("button2_press "); break; case GDK_3BUTTON_PRESS: bev = (GdkEventButton *) ev; g_printerr ("button3_press "); break; case GDK_BUTTON_RELEASE: bev = (GdkEventButton *) ev; g_printerr ("button_release"); break; case GDK_PROXIMITY_IN: pev = (GdkEventProximity *) ev; g_printerr ("proximity_in "); break; case GDK_PROXIMITY_OUT: pev = (GdkEventProximity *) ev; g_printerr ("proximity_out "); break; case GDK_MOTION_NOTIFY: mev = (GdkEventMotion *) ev; g_printerr ("motion_notify "); break; default: g_printerr ("Unknown Event\n"); } if (bev) g_printerr (": device %5d pressure %6.3f button %d\n", bev->deviceid, bev->pressure, bev->type == GDK_BUTTON_RELEASE ? bev->button * -1 : bev->button ); if (pev) g_printerr (": device %5d\n", pev->deviceid); if (mev) g_printerr (": device %5d pressure %6.3f\n", mev->deviceid, mev->pressure); return 0; } int main (int argc, char **argv) { GList *tmp_list; GtkWidget *win; gtk_init (&argc, &argv); win = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_widget_set_usize (GTK_WIDGET (win), 200, 200); gtk_signal_connect (GTK_OBJECT (win), "delete-event", GTK_SIGNAL_FUNC (gtk_main_quit), NULL); gtk_signal_connect (GTK_OBJECT (win), "destroy", GTK_SIGNAL_FUNC (gtk_main_quit), NULL); gtk_widget_set_events (win, EVENT_MASK); gtk_widget_set_extension_events (win, GDK_EXTENSION_EVENTS_ALL); /* only show motion events when an extra argument is given */ if (argc > 1) gtk_signal_connect (GTK_OBJECT (win), "motion_notify_event", GTK_SIGNAL_FUNC (printevent), NULL); gtk_signal_connect (GTK_OBJECT (win), "button_press_event", GTK_SIGNAL_FUNC (printevent), NULL); gtk_signal_connect (GTK_OBJECT (win), "button_release_event", GTK_SIGNAL_FUNC (printevent), NULL); gtk_signal_connect (GTK_OBJECT (win), "proximity_in_event", GTK_SIGNAL_FUNC (printevent), NULL); gtk_signal_connect (GTK_OBJECT (win), "proximity_out_event", GTK_SIGNAL_FUNC (printevent), NULL); gtk_widget_show_all (win); menu = GTK_MENU (gtk_menu_new()); menupoint = gtk_menu_item_new_with_label ("Hello"); gtk_widget_show_all (menupoint); gtk_menu_append (menu, menupoint); /* Input Devices */ tmp_list = gdk_input_list_devices (); while (tmp_list) { GdkDeviceInfo *info = (GdkDeviceInfo *) tmp_list->data; if (strstr (info->name, "raser")) /* Guess "Eraser"-Type devices */ gdk_input_set_source (info->deviceid, GDK_SOURCE_ERASER); g_printerr ("Enabling No. %d: \"%s\" (Type: %d)\n", info->deviceid, info->name, info->source); if (! strstr (info->name, "SWITCH")) /* Dont touch the "SWITCH"-Device - this seems to confuse Gtk+ */ gdk_input_set_mode (info->deviceid, GDK_MODE_SCREEN); tmp_list = tmp_list->next; } /* Start doing something */ gtk_main (); gdk_pointer_ungrab (GDK_CURRENT_TIME); return 0; } /* vim: sw=3 ts=8 cindent noai bs=2 cinoptions=(0 */