Question about XInput in GTK
- From: Lam Yick Yan <superylam netscape net>
- To: "List, GTK+" <gtk-list gnome org>
- Subject: Question about XInput in GTK
- Date: Sun, 03 Mar 2002 09:24:55 -0500
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);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]