It turns out the problem is in the following line:

static gint
gdk_input_common_other_event (GdkEvent *event,
                               XEvent *xevent,
                               GdkInputWindow *input_window,
                               GdkDevicePrivate *gdkdev) {

.....
       gdk_input_translate_coordinates (gdkdev,input_window,
                                        xdbe->axis_data, 
&event->button.x,
&event->button.y,
                                        &event->button.pressure,
                                        &event->button.xtilt,
                                        &event->button.ytilt);

     I dont what gdk_input_translate_coordinates does. Can someone tell
me? It just corrupt the X, Y coordiante I read from my gtk
input program.

Yick
Hong Kong,china





[EMAIL PROTECTED] wrote:

> Hello World,
> 
>    I would like to ask a questiona about XInput in GTK.
> I have a GTK program and in it, I have a drawing area that
> response to the motion_notify event from my graphic tablet.
> However, the coordinate I got from callback function is very
> strange. For example, the screen is 800x600. However,
> the range of X cooridnate I got report from the motion_notify
> event runs from 0 to 912 instead of 0 to 799. I am sure the
> driver is working perfectly as I tested it with "xinput -test"
> and the cooridnates reported is correct!!!! Why?
> 
>    I have attached the source code.
> 
> Yick
> Hong Kong, China
> 
> 
> 
> ------------------------------------------------------------------------
> 
> #include <gtk/gtk.h>
> #include <string.h>
> 
> #define DEVICE_NAME "GOGO_PEN"
> 
> void 
> hello(GtkWidget *widget, gpointer data)
> {
>     g_print ("Hello World\n");
> }
> 
> gint
> delete_event(GtkWidget *widget, GdkEvent *event, gpointer data)
> {
>     g_print ("delete event occurred\n");
>     return(FALSE);
> }
> 
> void
> destroy(GtkWidget *widget, gpointer data)
> {
>     gtk_main_quit();
> }
> 
> static gint
> expose_event(GtkWidget *widget, GdkEventExpose *event) {
>     g_print("expose_event\n");
>     return FALSE;
> }
> 
> static gint 
> button_press_event(GtkWidget *widget, GdkEventButton *event, 
>            gpointer data) {
>     g_print("button pressed\n");
>     return FALSE;
> }
> 
> static gint
> motion_notify_event(GtkWidget *widget, GdkEventMotion *event) {
>     gdouble x, y;
>     gdouble pressure;
>     GdkRectangle update_rect;
>     GdkModifierType state;
> 
>     if (event->is_hint) {
>         gdk_input_window_get_pointer(event->window, event->deviceid, 
>                          &x, &y, &pressure, NULL, NULL, &state);
>         g_print("motion_notify is_hint x%lfd y%lf device_id%d\n",
>             x, y, event->deviceid);
>     } else {
>     g_print("motion_notify is_not_hint x%lf y%lf device_id%d\n", 
>         event->x, event->y, event->deviceid);
>     }
> 
>     gtk_widget_draw(widget, &update_rect);
> 
>     return TRUE;
> }
> 
> 
> static 
> GdkDeviceInfo *find_device_info(char *name)
> {
>     GList *tmp_list = gdk_input_list_devices();
>     GdkDeviceInfo *device, *found_device=NULL;
> 
>     while (tmp_list) {
>     device=(GdkDeviceInfo *)tmp_list->data;
>         if (strcmp(device->name, name)) {
>         device->mode=GDK_MODE_DISABLED;
>     } else {
>         found_device=device;
>         device->mode=GDK_MODE_WINDOW;
>         }
>         tmp_list = tmp_list->next;
>     }
>     return found_device;
> }
> 
> void
> input_dialog_destroy (GtkWidget *w, gpointer data)
> {
>   *((GtkWidget **)data) = NULL;
> }
> 
> void
> create_input_dialog ()
> {
>   static GtkWidget *inputd = NULL;
> 
>   if (!inputd)
>     {
>       inputd = gtk_input_dialog_new();
> 
>       gtk_signal_connect(GTK_OBJECT(inputd), "destroy",
>           GTK_SIGNAL_FUNC(input_dialog_destroy), &inputd);
>       gtk_signal_connect_object(
>           GTK_OBJECT(GTK_INPUT_DIALOG (inputd)->close_button),
>           "clicked", GTK_SIGNAL_FUNC(gtk_widget_hide),
>       GTK_OBJECT(inputd));
> 
>       gtk_widget_hide (GTK_INPUT_DIALOG (inputd)->save_button);
> 
>       gtk_widget_show (inputd);
>     }
>   else
>     {
>       if (!GTK_WIDGET_MAPPED (inputd))
>         gtk_widget_show (inputd);
>       else
>         gdk_window_raise (inputd->window);
>     }
> }
> 
> int main( int   argc,
>           char *argv[] )
> {
>     GtkWidget *window;
>     GtkWidget *drawing_area;
>     GdkDeviceInfo *device_info;
>     
>     gtk_init(&argc, &argv);
>     
>     window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
> 
>     gtk_signal_connect (GTK_OBJECT (window), "delete_event",
>             GTK_SIGNAL_FUNC (delete_event), NULL);
>     gtk_signal_connect (GTK_OBJECT (window), "destroy",
>             GTK_SIGNAL_FUNC (destroy), NULL);
> 
>     drawing_area = gtk_drawing_area_new ();
>     gtk_drawing_area_size(GTK_DRAWING_AREA(drawing_area), 200, 200);
>     gtk_container_add (GTK_CONTAINER(window), drawing_area);
>     gtk_signal_connect(GTK_OBJECT (drawing_area), "expose_event",
>                   (GtkSignalFunc) expose_event, NULL);
>     gtk_signal_connect(GTK_OBJECT (drawing_area), "motion_notify_event",
>                       (GtkSignalFunc) motion_notify_event, NULL);
>     gtk_signal_connect (GTK_OBJECT (drawing_area), "button_press_event",
>               (GtkSignalFunc) button_press_event, NULL);
>     gtk_signal_connect(GTK_OBJECT (drawing_area), "button_release_event",
>                   (GtkSignalFunc) button_press_event, (gpointer)1);
> 
>     gtk_widget_set_events(drawing_area, GDK_EXPOSURE_MASK
>                       | GDK_LEAVE_NOTIFY_MASK
>                       | GDK_BUTTON_PRESS_MASK
>                   | GDK_POINTER_MOTION_MASK
>                       | GDK_POINTER_MOTION_HINT_MASK);
> 
>     gtk_widget_set_extension_events(drawing_area, 
>                             GDK_EXTENSION_EVENTS_CURSOR);
> 
>     gtk_widget_show(drawing_area);
>     gtk_widget_show(window);
> 
>     create_input_dialog();
> 
>     /* Look for device... */
>     device_info=find_device_info(DEVICE_NAME);
> 
>     if (!device_info) {
>         g_error("unable to find device %s\n", DEVICE_NAME);
>         return 1;
>     }
> 
> 
>     gtk_main ();
>     
>     return(0);
> }
> 


_______________________________________________
gtk-list mailing list
[EMAIL PROTECTED]
http://mail.gnome.org/mailman/listinfo/gtk-list

Reply via email to