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

📄 gdkevents.c

📁 gtk是linux一款强大的夸平台的图形化开发工具
💻 C
📖 第 1 页 / 共 4 页
字号:
      GDK_NOTE (EVENTS,		g_message ("configure notify:\twindow: %ld  x,y: %d %d	w,h: %d %d  b-w: %d  above: %ld	 ovr: %d%s",			   xevent->xconfigure.window,			   xevent->xconfigure.x,			   xevent->xconfigure.y,			   xevent->xconfigure.width,			   xevent->xconfigure.height,			   xevent->xconfigure.border_width,			   xevent->xconfigure.above,			   xevent->xconfigure.override_redirect,			   !window			   ? " (discarding)"			   : window_private->window_type == GDK_WINDOW_CHILD			   ? " (discarding child)"			   : ""));      if (window &&	  !window_private->destroyed &&	  (window_private->extension_events != 0) &&	  gdk_input_vtable.configure_event)	gdk_input_vtable.configure_event (&xevent->xconfigure, window);      if (!window || window_private->window_type == GDK_WINDOW_CHILD)	return_val = FALSE;      else	{	  event->configure.type = GDK_CONFIGURE;	  event->configure.window = window;	  event->configure.width = xevent->xconfigure.width;	  event->configure.height = xevent->xconfigure.height;	  	  if (!xevent->xconfigure.x &&	      !xevent->xconfigure.y &&	      !window_private->destroyed)	    {	      gint tx = 0;	      gint ty = 0;	      Window child_window = 0;	      gdk_error_trap_push ();	      if (XTranslateCoordinates (window_private->xdisplay,					 window_private->xwindow,					 gdk_root_window,					 0, 0,					 &tx, &ty,					 &child_window))		{		  if (!gdk_error_trap_pop ())		    {		      event->configure.x = tx;		      event->configure.y = ty;		    }		}	      else		gdk_error_trap_pop ();	    }	  else	    {	      event->configure.x = xevent->xconfigure.x;	      event->configure.y = xevent->xconfigure.y;	    }	  window_private->x = event->configure.x;	  window_private->y = event->configure.y;	  window_private->width = xevent->xconfigure.width;	  window_private->height = xevent->xconfigure.height;	  if (window_private->resize_count > 1)	    window_private->resize_count -= 1;	}      break;          case PropertyNotify:      /* Print debugging info.       */      GDK_NOTE (EVENTS,		gchar *atom = gdk_atom_name (xevent->xproperty.atom);		g_message ("property notify:\twindow: %ld, atom(%ld): %s%s%s",			   xevent->xproperty.window,			   xevent->xproperty.atom,			   atom ? "\"" : "",			   atom ? atom : "unknown",			   atom ? "\"" : "");		);            event->property.type = GDK_PROPERTY_NOTIFY;      event->property.window = window;      event->property.atom = xevent->xproperty.atom;      event->property.time = xevent->xproperty.time;      event->property.state = xevent->xproperty.state;            break;          case SelectionClear:      GDK_NOTE (EVENTS,		g_message ("selection clear:\twindow: %ld",			   xevent->xproperty.window));            event->selection.type = GDK_SELECTION_CLEAR;      event->selection.window = window;      event->selection.selection = xevent->xselectionclear.selection;      event->selection.time = xevent->xselectionclear.time;            break;          case SelectionRequest:      GDK_NOTE (EVENTS,		g_message ("selection request:\twindow: %ld",			   xevent->xproperty.window));            event->selection.type = GDK_SELECTION_REQUEST;      event->selection.window = window;      event->selection.selection = xevent->xselectionrequest.selection;      event->selection.target = xevent->xselectionrequest.target;      event->selection.property = xevent->xselectionrequest.property;      event->selection.requestor = xevent->xselectionrequest.requestor;      event->selection.time = xevent->xselectionrequest.time;            break;          case SelectionNotify:      GDK_NOTE (EVENTS,		g_message ("selection notify:\twindow: %ld",			   xevent->xproperty.window));                  event->selection.type = GDK_SELECTION_NOTIFY;      event->selection.window = window;      event->selection.selection = xevent->xselection.selection;      event->selection.target = xevent->xselection.target;      event->selection.property = xevent->xselection.property;      event->selection.time = xevent->xselection.time;            break;          case ColormapNotify:      /* Print debugging info.       */      GDK_NOTE (EVENTS,		g_message ("colormap notify:\twindow: %ld",			   xevent->xcolormap.window));            /* Not currently handled */      return_val = FALSE;      break;          case ClientMessage:      {	GList *tmp_list;	GdkFilterReturn result = GDK_FILTER_CONTINUE;	/* Print debugging info.	 */	GDK_NOTE (EVENTS,		  g_message ("client message:\twindow: %ld",			     xevent->xclient.window));		tmp_list = client_filters;	while (tmp_list)	  {	    GdkClientFilter *filter = tmp_list->data;	    if (filter->type == xevent->xclient.message_type)	      {		result = (*filter->function) (xevent, event, filter->data);		break;	      }	    	    tmp_list = tmp_list->next;	  }	switch (result)	  {	  case GDK_FILTER_REMOVE:	    return_val = FALSE;	    break;	  case GDK_FILTER_TRANSLATE:	    return_val = TRUE;	    break;	  case GDK_FILTER_CONTINUE:	    /* Send unknown ClientMessage's on to Gtk for it to use */	    event->client.type = GDK_CLIENT_EVENT;	    event->client.window = window;	    event->client.message_type = xevent->xclient.message_type;	    event->client.data_format = xevent->xclient.format;	    memcpy(&event->client.data, &xevent->xclient.data,		   sizeof(event->client.data));	  }      }            break;          case MappingNotify:      /* Print debugging info.       */      GDK_NOTE (EVENTS,		g_message ("mapping notify"));            /* Let XLib know that there is a new keyboard mapping.       */      XRefreshKeyboardMapping (&xevent->xmapping);      return_val = FALSE;      break;          default:      /* something else - (e.g., a Xinput event) */            if (window_private &&	  !window_private->destroyed &&	  (window_private->extension_events != 0) &&	  gdk_input_vtable.other_event)	return_val = gdk_input_vtable.other_event(event, xevent, window);      else	return_val = FALSE;            break;    }    if (return_val)    {      if (event->any.window)	gdk_window_ref (event->any.window);      if (((event->any.type == GDK_ENTER_NOTIFY) ||	   (event->any.type == GDK_LEAVE_NOTIFY)) &&	  (event->crossing.subwindow != NULL))	gdk_window_ref (event->crossing.subwindow);    }  else    {      /* Mark this event as having no resources to be freed */      event->any.window = NULL;      event->any.type = GDK_NOTHING;    }    if (window)    gdk_window_unref (window);    return return_val;}GdkFilterReturngdk_wm_protocols_filter (GdkXEvent *xev,			 GdkEvent  *event,			 gpointer data){  XEvent *xevent = (XEvent *)xev;  if ((Atom) xevent->xclient.data.l[0] == gdk_wm_delete_window)    {  /* The delete window request specifies a window   *  to delete. We don't actually destroy the   *  window because "it is only a request". (The   *  window might contain vital data that the   *  program does not want destroyed). Instead   *  the event is passed along to the program,   *  which should then destroy the window.   */      GDK_NOTE (EVENTS,		g_message ("delete window:\t\twindow: %ld",			   xevent->xclient.window));            event->any.type = GDK_DELETE;      return GDK_FILTER_TRANSLATE;    }  else if ((Atom) xevent->xclient.data.l[0] == gdk_wm_take_focus)    {    }  return GDK_FILTER_REMOVE;}#if 0static Boolgdk_event_get_type (Display  *display,		    XEvent   *xevent,		    XPointer  arg){  GdkEvent event;  GdkPredicate *pred;    if (gdk_event_translate (&event, xevent))    {      pred = (GdkPredicate*) arg;      return (* pred->func) (&event, pred->data);    }    return FALSE;}#endifstatic voidgdk_events_queue (void){  GList *node;  GdkEvent *event;  XEvent xevent;  while (!gdk_event_queue_find_first() && XPending (gdk_display))    {#ifdef USE_XIM      Window w = None;            XNextEvent (gdk_display, &xevent);      if (gdk_xim_window) 	switch (xevent.type) 	  { 	  case KeyPress: 	  case KeyRelease: 	  case ButtonPress: 	  case ButtonRelease: 	    w = GDK_WINDOW_XWINDOW (gdk_xim_window); 	    break; 	  }            if (XFilterEvent (&xevent, w))	continue;#else      XNextEvent (gdk_display, &xevent);#endif            event = gdk_event_new ();            event->any.type = GDK_NOTHING;      event->any.window = NULL;      event->any.send_event = xevent.xany.send_event ? TRUE : FALSE;      ((GdkEventPrivate *)event)->flags |= GDK_EVENT_PENDING;      gdk_event_queue_append (event);      node = queued_tail;      if (gdk_event_translate (event, &xevent))	{	  ((GdkEventPrivate *)event)->flags &= ~GDK_EVENT_PENDING;	}      else	{	  gdk_event_queue_remove_link (node);	  g_list_free_1 (node);	  gdk_event_free (event);	}    }}static gboolean  gdk_event_prepare (gpointer  source_data, 		   GTimeVal *current_time,		   gint     *timeout,		   gpointer  user_data){  gboolean retval;    GDK_THREADS_ENTER ();  *timeout = -1;  retval = (gdk_event_queue_find_first () != NULL) || XPending (gdk_display);  GDK_THREADS_LEAVE ();  return retval;}static gboolean  gdk_event_check (gpointer  source_data,		 GTimeVal *current_time,		 gpointer  user_data){  gboolean retval;    GDK_THREADS_ENTER ();  if (event_poll_fd.revents & G_IO_IN)    retval = (gdk_event_queue_find_first () != NULL) || XPending (gdk_display);  else    retval = FALSE;  GDK_THREADS_LEAVE ();  return retval;}static GdkEvent*gdk_event_unqueue (void){  GdkEvent *event = NULL;  GList *tmp_list;  tmp_list = gdk_event_queue_find_first ();  if (tmp_list)    {      event = tmp_list->data;      gdk_event_queue_remove_link (tmp_list);      g_list_free_1 (tmp_list);    }  return event;}static gboolean  gdk_event_dispatch (gpointer  source_data,		    GTimeVal *current_time,		    gpointer  user_data){  GdkEvent *event;   GDK_THREADS_ENTER ();  gdk_events_queue();  event = gdk_event_unqueue();  if (event)    {      if (event_func)	(*event_func) (event, event_data);            gdk_event_free (event);    }    GDK_THREADS_LEAVE ();  return TRUE;}static voidgdk_synthesize_click (GdkEvent *event,		      gint	nclicks){  GdkEvent temp_event;    g_return_if_fail (event != NULL);    temp_event = *event;  temp_event.type = (nclicks == 2) ? GDK_2BUTTON_PRESS : GDK_3BUTTON_PRESS;    gdk_event_put (&temp_event);}/* Sends a ClientMessage to all toplevel client windows */gbooleangdk_event_send_client_message (GdkEvent *event, guint32 xid){  XEvent sev;    g_return_val_if_fail(event != NULL, FALSE);    /* Set up our event to send, with the exception of its target window */  sev.xclient.type = ClientMessage;  sev.xclient.display = gdk_display;  sev.xclient.format = event->client.data_format;  sev.xclient.window = xid;  memcpy(&sev.xclient.data, &event->client.data, sizeof(sev.xclient.data));  sev.xclient.message_type = event->client.message_type;    return gdk_send_xevent (xid, False, NoEventMask, &sev);}/* Sends a ClientMessage to all toplevel client windows */gbooleangdk_event_send_client_message_to_all_recurse (XEvent  *xev, 					      guint32  xid,					      guint    level){  static GdkAtom wm_state_atom = GDK_NONE;  Atom type = None;  int format;  unsigned long nitems, after;  unsigned char *data;  Window *ret_children, ret_root, ret_parent;  unsigned int ret_nchildren;  gint old_warnings = gdk_error_warnings;  gboolean send = FALSE;  gboolean found = FALSE;  int i;  if (!wm_state_atom)    wm_state_atom = gdk_atom_intern ("WM_STATE", FALSE);  gdk_error_warnings = FALSE;  gdk_error_code = 0;  XGetWindowProperty (gdk_display, xid, wm_state_atom, 0, 0, False, AnyPropertyType,		      &type, &format, &nitems, &after, &data);  if (gdk_error_code)    {      gdk_error_warnings = old_warnings;      return FALSE;    }  if (type)    {      send = TRUE;      XFree (data);    }  else    {      /* OK, we're all set, now let's find some windows to send this to */      if (XQueryTree (gdk_display, xid, &ret_root, &ret_parent,		      &ret_children, &ret_nchildren) != True ||	  gdk_error_code)	{	  gdk_error_warnings = old_warnings;	  return FALSE;	}      for(i = 0; i < ret_nchildren; i++)	if (gdk_event_send_client_message_to_all_recurse (xev, ret_children[i], level + 1))	  found = TRUE;      XFree (ret_children);    }  if (send || (!found && (level == 1)))    {      xev->xclient.window = xid;      gdk_send_xevent (xid, False, NoEventMask, xev);    }  gdk_error_warnings = old_warnings;  return (send || found);}voidgdk_event_send_clientmessage_toall (GdkEvent *event){  XEvent sev;  gint old_warnings = gdk_error_warnings;  g_return_if_fail(event != NULL);    /* Set up our event to send, with the exception of its target window */  sev.xclient.type = ClientMessage;  sev.xclient.display = gdk_display;  sev.xclient.format = event->client.data_format;  memcpy(&sev.xclient.data, &event->client.data, sizeof(sev.xclient.data));  sev.xclient.message_type = event->client.message_type;  gdk_event_send_client_message_to_all_recurse(&sev, gdk_root_window, 0);  gdk_error_warnings = old_warnings;}/* *-------------------------------------------------------------- * gdk_flush * *   Flushes the Xlib output buffer and then waits *   until all requests have been received and processed *   by the X server. The only real use for this function *   is in dealing with XShm. * * Arguments: * * Results: * * Side effects: * *-------------------------------------------------------------- */voidgdk_flush (void){  XSync (gdk_display, False);}

⌨️ 快捷键说明

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