⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gdkinputcommon.h

📁 gtk是linux一款强大的夸平台的图形化开发工具
💻 H
📖 第 1 页 / 共 2 页
字号:
/* GDK - The GIMP Drawing Kit * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. *//* * Modified by the GTK+ Team and others 1997-1999.  See the AUTHORS * file for a list of people on the GTK+ Team.  See the ChangeLog * files for a list of changes.  These files are distributed with * GTK+ at ftp://ftp.gtk.org/pub/gtk/.  */#if defined(XINPUT_GXI) || defined(XINPUT_XFREE)/* Forward declarations */static void gdk_input_get_root_relative_geometry (Display *dpy, Window w, 						  int *x_ret, int *y_ret,						  int *width_ret, 						  int *height_ret);static GdkDevicePrivate *gdk_input_device_new(XDeviceInfo *device, 					      gint include_core);static void gdk_input_common_find_events(GdkWindow *window,					 GdkDevicePrivate *gdkdev,					 gint mask,					 XEventClass *classes,					 int *num_classes);static void gdk_input_common_select_events(GdkWindow *window,					   GdkDevicePrivate *gdkdev);static void gdk_input_translate_coordinates(GdkDevicePrivate *gdkdev,					    GdkInputWindow *input_window,					    gint *axis_data,					    gdouble *x, gdouble *y,					    gdouble *pressure,					    gdouble *xtilt, gdouble *ytilt);static guint gdk_input_translate_state(guint state, guint device_state);static gint gdk_input_common_init(gint include_core);static gint  gdk_input_common_other_event (GdkEvent *event, 					   XEvent *xevent, 					   GdkInputWindow *input_window,					   GdkDevicePrivate *gdkdev);static void gdk_input_common_set_axes (guint32 deviceid, GdkAxisUse *axes);static GdkTimeCoord * gdk_input_common_motion_events (GdkWindow *window,						      guint32 deviceid,						      guint32 start,						      guint32 stop,						      gint *nevents_return);static void  gdk_input_common_get_pointer     (GdkWindow       *window,					       guint32	   deviceid,					       gdouble         *x,					       gdouble         *y,					       gdouble         *pressure,					       gdouble         *xtilt,					       gdouble         *ytilt,					       GdkModifierType *mask);#define GDK_MAX_DEVICE_CLASSES 13/* Global variables */static gint gdk_input_root_width;static gint gdk_input_root_height;static voidgdk_input_get_root_relative_geometry(Display *dpy, Window w, int *x_ret, int *y_ret,			       int *width_ret, int *height_ret){  Window root,parent;  Window *children;  guint nchildren;  gint x,y;  guint width, height;  gint xc,yc;  guint widthc,heightc,border_widthc,depthc;    XQueryTree(dpy,w,&root,&parent,&children,&nchildren);  if (children) XFree(children);  XGetGeometry(dpy,w,&root,&x,&y,&width,&height,&border_widthc,	       &depthc);  x += border_widthc;  y += border_widthc;  while (root != parent)    {      w = parent;      XQueryTree(dpy,w,&root,&parent,&children,&nchildren);      if (children) XFree(children);      XGetGeometry(dpy,w,&root,&xc,&yc,&widthc,&heightc,		   &border_widthc,&depthc);      x += xc + border_widthc;      y += yc + border_widthc;    }  if (x_ret)    *x_ret = x;  if (y_ret)    *y_ret = y;  if (width_ret)    *width_ret = width;  if (height_ret)    *height_ret = height;}static GdkDevicePrivate *gdk_input_device_new(XDeviceInfo *device, gint include_core){  GdkDevicePrivate *gdkdev;  gchar *tmp_name, *p;  XAnyClassPtr class;  gint i,j;  gdkdev = g_new(GdkDevicePrivate,1);  gdkdev->info.deviceid = device->id;  if (device->name[0]) {    gdkdev->info.name = g_new(char, strlen(device->name)+1);    strcpy(gdkdev->info.name,device->name);  } else {    /* XFree86 3.2 gives an empty name to the default core devices,       (fixed in 3.2A) */    gdkdev->info.name = g_strdup("pointer");    strcpy(gdkdev->info.name,"pointer");    gdkdev->info.source = GDK_SOURCE_MOUSE;  }  gdkdev->info.mode = GDK_MODE_DISABLED;  /* Try to figure out what kind of device this is by its name -     could invite a very, very, long list... Lowercase name     for comparison purposes */  tmp_name = g_strdup(gdkdev->info.name);  for (p = tmp_name; *p; p++)    {      if (*p >= 'A' && *p <= 'Z')	*p += 'a' - 'A';    }    if (!strcmp (tmp_name, "pointer"))    gdkdev->info.source = GDK_SOURCE_MOUSE;  else if (!strcmp (tmp_name, "wacom") ||	   !strcmp (tmp_name, "pen"))    gdkdev->info.source = GDK_SOURCE_PEN;  else if (!strcmp (tmp_name, "eraser"))    gdkdev->info.source = GDK_SOURCE_ERASER;  else if (!strcmp (tmp_name, "cursor"))    gdkdev->info.source = GDK_SOURCE_CURSOR;  else    gdkdev->info.source = GDK_SOURCE_PEN;  g_free(tmp_name);  gdkdev->xdevice = NULL;  /* step through the classes */  gdkdev->info.num_axes = 0;  gdkdev->info.num_keys = 0;  gdkdev->info.keys = NULL;  gdkdev->axes = 0;  gdkdev->info.has_cursor = 0;  gdkdev->needs_update = FALSE;  gdkdev->claimed = FALSE;  gdkdev->button_state = 0;  class = device->inputclassinfo;  for (i=0;i<device->num_classes;i++)     {      switch (class->class) {      case ButtonClass:	{	  break;	}      case KeyClass:	{	  XKeyInfo *xki = (XKeyInfo *)class;	  /* Hack to catch XFree86 3.3.1 bug. Other devices better	   * not have exactly 25 keys... 	   */	  if ((xki->min_keycode == 8) && (xki->max_keycode == 32))	    {	      gdkdev->info.num_keys = 32;	      gdkdev->min_keycode = 1;	    }	  else	    {	      gdkdev->info.num_keys = xki->max_keycode - xki->min_keycode + 1;	      gdkdev->min_keycode = xki->min_keycode;	    }	  gdkdev->info.keys = g_new (GdkDeviceKey, gdkdev->info.num_keys);	  for (j=0; j<gdkdev->info.num_keys; j++)	    {	      gdkdev->info.keys[j].keyval = 0;	      gdkdev->info.keys[j].modifiers = 0;	    }	  break;	}      case ValuatorClass:	{	  XValuatorInfo *xvi = (XValuatorInfo *)class;	  gdkdev->info.num_axes = xvi->num_axes;	  gdkdev->axes = g_new(GdkAxisInfo, xvi->num_axes);	  gdkdev->info.axes = g_new(GdkAxisUse, xvi->num_axes);	  for (j=0;j<xvi->num_axes;j++)	    {	      gdkdev->axes[j].resolution = 		gdkdev->axes[j].xresolution = xvi->axes[j].resolution;	      gdkdev->axes[j].min_value =		gdkdev->axes[j].xmin_value = xvi->axes[j].min_value;	      gdkdev->axes[j].max_value =		gdkdev->axes[j].xmax_value = xvi->axes[j].max_value;	      gdkdev->info.axes[j] = GDK_AXIS_IGNORE;	    }	  j=0;	  if (j<xvi->num_axes)	    gdkdev->info.axes[j++] = GDK_AXIS_X;	  if (j<xvi->num_axes)	    gdkdev->info.axes[j++] = GDK_AXIS_Y;	  if (j<xvi->num_axes)	    gdkdev->info.axes[j++] = GDK_AXIS_PRESSURE;	  if (j<xvi->num_axes)	    gdkdev->info.axes[j++] = GDK_AXIS_XTILT;	  if (j<xvi->num_axes)	    gdkdev->info.axes[j++] = GDK_AXIS_YTILT;	  	  /* set up reverse lookup on axis use */	  for (j=GDK_AXIS_IGNORE;j<GDK_AXIS_LAST;j++)	    gdkdev->axis_for_use[j] = -1;	  	  for (j=0;j<xvi->num_axes;j++)	    if (gdkdev->info.axes[j] != GDK_AXIS_IGNORE)	      gdkdev->axis_for_use[gdkdev->info.axes[j]] = j;		       	  break;	}      }      class = (XAnyClassPtr)(((char *)class) + class->length);    }  /* return NULL if no axes */  if (!gdkdev->info.num_axes || !gdkdev->axes ||      (!include_core && device->use == IsXPointer))    {      g_free(gdkdev->info.name);      if (gdkdev->axes)	g_free(gdkdev->axes);      if (gdkdev->info.keys)	g_free(gdkdev->info.keys);      g_free(gdkdev);      return NULL;    }  if (device->use != IsXPointer)    {      int error_warn = gdk_error_warnings;      gdk_error_warnings = 0;      gdk_error_code = 0;      gdkdev->xdevice = XOpenDevice(gdk_display, gdkdev->info.deviceid);      gdk_error_warnings = error_warn;      /* return NULL if device is not ready */      if (gdk_error_code)	{	  g_free (gdkdev->info.name);	  if (gdkdev->axes)	    g_free (gdkdev->axes);	  if (gdkdev->info.keys)	    g_free (gdkdev->info.keys);	  if (gdkdev->info.axes)	    g_free (gdkdev->info.axes);	  g_free (gdkdev);	  return NULL;	}    }  gdkdev->buttonpress_type = 0;  gdkdev->buttonrelease_type = 0;  gdkdev->keypress_type = 0;  gdkdev->keyrelease_type = 0;  gdkdev->motionnotify_type = 0;  gdkdev->proximityin_type = 0;  gdkdev->proximityout_type = 0;  gdkdev->changenotify_type = 0;  return gdkdev;}static voidgdk_input_common_find_events(GdkWindow *window,			     GdkDevicePrivate *gdkdev,			     gint mask,			     XEventClass *classes,			     int *num_classes){  gint i;  XEventClass class;    i = 0;  /* We have to track press and release events in pairs to keep     track of button state correctly and implement grabbing for     the gxi support */  if (mask & GDK_BUTTON_PRESS_MASK || mask & GDK_BUTTON_RELEASE_MASK)    {      DeviceButtonPress (gdkdev->xdevice, gdkdev->buttonpress_type,			     class);      if (class != 0)	  classes[i++] = class;      DeviceButtonPressGrab (gdkdev->xdevice, 0, class);      if (class != 0)	  classes[i++] = class;      DeviceButtonRelease (gdkdev->xdevice, gdkdev->buttonrelease_type,			   class);      if (class != 0)	  classes[i++] = class;    }  if (mask & GDK_POINTER_MOTION_MASK)    {      DeviceMotionNotify  (gdkdev->xdevice, gdkdev->motionnotify_type, class);      if (class != 0)	  classes[i++] = class;    }  else    if (mask & (GDK_BUTTON1_MOTION_MASK | GDK_BUTTON2_MOTION_MASK |		GDK_BUTTON3_MOTION_MASK | GDK_BUTTON_MOTION_MASK |		GDK_POINTER_MOTION_HINT_MASK))      {	/* Make sure gdkdev->motionnotify_type is set */	DeviceMotionNotify  (gdkdev->xdevice, gdkdev->motionnotify_type, class);      }  if (mask & GDK_BUTTON1_MOTION_MASK)    {      DeviceButton1Motion  (gdkdev->xdevice, 0, class);      if (class != 0)	  classes[i++] = class;    }  if (mask & GDK_BUTTON2_MOTION_MASK)    {      DeviceButton2Motion  (gdkdev->xdevice, 0, class);      if (class != 0)	  classes[i++] = class;    }  if (mask & GDK_BUTTON3_MOTION_MASK)    {      DeviceButton3Motion  (gdkdev->xdevice, 0, class);      if (class != 0)	  classes[i++] = class;    }  if (mask & GDK_BUTTON_MOTION_MASK)    {      DeviceButtonMotion  (gdkdev->xdevice, 0, class);      if (class != 0)	  classes[i++] = class;    }  if (mask & GDK_POINTER_MOTION_HINT_MASK)    {      /* We'll get into trouble if the macros change, but at least we'll	 know about it, and we avoid warnings now */      DevicePointerMotionHint (gdkdev->xdevice, 0, class);      if (class != 0)	  classes[i++] = class;    }  if (mask & GDK_KEY_PRESS_MASK)    {      DeviceKeyPress (gdkdev->xdevice, gdkdev->keypress_type, class);      if (class != 0)	  classes[i++] = class;    }  if (mask & GDK_KEY_RELEASE_MASK)    {      DeviceKeyRelease (gdkdev->xdevice, gdkdev->keyrelease_type, class);      if (class != 0)	  classes[i++] = class;    }  if (mask & GDK_PROXIMITY_IN_MASK)    {      ProximityIn   (gdkdev->xdevice, gdkdev->proximityin_type, class);      if (class != 0)	  classes[i++] = class;    }  if (mask & GDK_PROXIMITY_OUT_MASK)    {      ProximityOut  (gdkdev->xdevice, gdkdev->proximityout_type, class);      if (class != 0)	  classes[i++] = class;    }  *num_classes = i;}static voidgdk_input_common_select_events(GdkWindow *window,			       GdkDevicePrivate *gdkdev){  XEventClass classes[GDK_MAX_DEVICE_CLASSES];  gint num_classes;  if (gdkdev->info.mode == GDK_MODE_DISABLED)    gdk_input_common_find_events(window, gdkdev, 0, classes, &num_classes);  else    gdk_input_common_find_events(window, gdkdev, 				 ((GdkWindowPrivate *)window)->extension_events,				 classes, &num_classes);    XSelectExtensionEvent (gdk_display,			 GDK_WINDOW_XWINDOW(window),			 classes, num_classes);}gint gdk_input_common_init(gint include_core){  char **extensions;  XDeviceInfo   *devices;  int num_devices;  int num_extensions, loop;  Display *display = gdk_display;  /* Init global vars */  gdk_window_get_geometry(NULL,	/* use root window */			  NULL,NULL,			  &gdk_input_root_width,&gdk_input_root_height, 			  NULL);  /* Init XInput extension */    extensions = XListExtensions(display, &num_extensions);  for (loop = 0; loop < num_extensions &&	 (strcmp(extensions[loop], "XInputExtension") != 0); loop++);  XFreeExtensionList(extensions);  gdk_input_devices = NULL;  if (loop < num_extensions)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -