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

📄 gtksocket.c

📁 gtk是linux一款强大的夸平台的图形化开发工具
💻 C
📖 第 1 页 / 共 2 页
字号:
  if (socket->focus_in && socket->plug_window)    {      gdk_error_trap_push ();      XSetInputFocus (GDK_DISPLAY (),		      GDK_WINDOW_XWINDOW (socket->plug_window),		      RevertToParent, GDK_CURRENT_TIME);      gdk_flush();      gdk_error_trap_pop ();    }    return TRUE;}static gintgtk_socket_focus_out_event (GtkWidget *widget, GdkEventFocus *event){  GtkWidget *toplevel;  GtkSocket *socket;  g_return_val_if_fail (GTK_IS_SOCKET (widget), FALSE);  socket = GTK_SOCKET (widget);  toplevel = gtk_widget_get_ancestor (widget, gtk_window_get_type());    if (toplevel)    {      XSetInputFocus (GDK_DISPLAY (),		      GDK_WINDOW_XWINDOW (toplevel->window),		      RevertToParent, CurrentTime); /* FIXME? */    }  socket->focus_in = FALSE;  return TRUE;}static voidgtk_socket_claim_focus (GtkSocket *socket){        socket->focus_in = TRUE;    /* Oh, the trickery... */    GTK_WIDGET_SET_FLAGS (socket, GTK_CAN_FOCUS);  gtk_widget_grab_focus (GTK_WIDGET (socket));  GTK_WIDGET_UNSET_FLAGS (socket, GTK_CAN_FOCUS);    /* FIXME: we might grab the focus even if we don't have   * it as an app... (and see _focus_in ()) */  if (socket->plug_window)    {      gdk_error_trap_push ();      XSetInputFocus (GDK_DISPLAY (),		      GDK_WINDOW_XWINDOW (socket->plug_window),		      RevertToParent, GDK_CURRENT_TIME);      gdk_flush ();      gdk_error_trap_pop ();    }}static gint gtk_socket_focus (GtkContainer *container, GtkDirectionType direction){  GtkSocket *socket;  g_return_val_if_fail (GTK_IS_SOCKET (container), FALSE);    socket = GTK_SOCKET (container);  if (!socket->focus_in && socket->plug_window)    {      XEvent xevent;      gtk_socket_claim_focus (socket);            xevent.xkey.type = KeyPress;      xevent.xkey.display = GDK_DISPLAY ();      xevent.xkey.window = GDK_WINDOW_XWINDOW (socket->plug_window);      xevent.xkey.root = GDK_ROOT_WINDOW (); /* FIXME */      xevent.xkey.time = GDK_CURRENT_TIME; /* FIXME */      /* FIXME, the following might cause big problems for       * non-GTK apps */      xevent.xkey.x = 0;      xevent.xkey.y = 0;      xevent.xkey.x_root = 0;      xevent.xkey.y_root = 0;      xevent.xkey.state = 0;      xevent.xkey.same_screen = TRUE; /* FIXME ? */      switch (direction)	{	case GTK_DIR_UP:	  xevent.xkey.keycode =  XKeysymToKeycode(GDK_DISPLAY(), GDK_Up);	  break;	case GTK_DIR_DOWN:	  xevent.xkey.keycode =  XKeysymToKeycode(GDK_DISPLAY(), GDK_Down);	  break;	case GTK_DIR_LEFT:	  xevent.xkey.keycode =  XKeysymToKeycode(GDK_DISPLAY(), GDK_Left);	  break;	case GTK_DIR_RIGHT:	  xevent.xkey.keycode =  XKeysymToKeycode(GDK_DISPLAY(), GDK_Right);	  break;	case GTK_DIR_TAB_FORWARD:	  xevent.xkey.keycode =  XKeysymToKeycode(GDK_DISPLAY(), GDK_Tab);	  break;	case GTK_DIR_TAB_BACKWARD:	  xevent.xkey.keycode =  XKeysymToKeycode(GDK_DISPLAY(), GDK_Tab);	  xevent.xkey.state = ShiftMask;	  break;	}      gdk_error_trap_push ();      XSendEvent (gdk_display,		  GDK_WINDOW_XWINDOW (socket->plug_window),		  False, NoEventMask, &xevent);      gdk_flush();      gdk_error_trap_pop ();            return TRUE;    }  else    {      return FALSE;    }}static voidgtk_socket_send_configure_event (GtkSocket *socket){  XEvent event;  g_return_if_fail (socket->plug_window != NULL);  event.xconfigure.type = ConfigureNotify;  event.xconfigure.display = gdk_display;  event.xconfigure.event = GDK_WINDOW_XWINDOW (socket->plug_window);  event.xconfigure.window = GDK_WINDOW_XWINDOW (socket->plug_window);  event.xconfigure.x = 0;  event.xconfigure.y = 0;  event.xconfigure.width = GTK_WIDGET(socket)->allocation.width;  event.xconfigure.height = GTK_WIDGET(socket)->allocation.height;  event.xconfigure.border_width = 0;  event.xconfigure.above = None;  event.xconfigure.override_redirect = False;  gdk_error_trap_push ();  XSendEvent (gdk_display,	      GDK_WINDOW_XWINDOW (socket->plug_window),	      False, NoEventMask, &event);  gdk_flush ();  gdk_error_trap_pop ();}static voidgtk_socket_add_window (GtkSocket *socket, guint32 xid){  socket->plug_window = gdk_window_lookup (xid);  socket->same_app = TRUE;  if (!socket->plug_window)    {      GtkWidget *toplevel;      GdkDragProtocol protocol;            socket->plug_window = gdk_window_foreign_new (xid);      if (!socket->plug_window) /* Already gone */	return;	      socket->same_app = FALSE;      gdk_error_trap_push ();      XSelectInput (GDK_DISPLAY (),		    GDK_WINDOW_XWINDOW(socket->plug_window),		    StructureNotifyMask | PropertyChangeMask);            if (gdk_drag_get_protocol (xid, &protocol))	gtk_drag_dest_set_proxy (GTK_WIDGET (socket), socket->plug_window, 				 protocol, TRUE);      gdk_flush ();      gdk_error_trap_pop ();      gdk_window_add_filter (socket->plug_window, 			     gtk_socket_filter_func, socket);      /* Add a pointer to the socket on our toplevel window */      toplevel = gtk_widget_get_toplevel (GTK_WIDGET (socket));      if (toplevel && GTK_IS_WINDOW (toplevel))	{	  gtk_window_add_embedded_xid (GTK_WINDOW (toplevel), xid);	}    }}static GdkFilterReturngtk_socket_filter_func (GdkXEvent *gdk_xevent, GdkEvent *event, gpointer data){  GtkSocket *socket;  GtkWidget *widget;  XEvent *xevent;  GdkFilterReturn return_val;    socket = GTK_SOCKET (data);  widget = GTK_WIDGET (socket);  xevent = (XEvent *)gdk_xevent;  return_val = GDK_FILTER_CONTINUE;  switch (xevent->type)    {    case CreateNotify:      {	XCreateWindowEvent *xcwe = &xevent->xcreatewindow;	if (!socket->plug_window)	  {	    gtk_socket_add_window (socket, xcwe->window);	    gdk_error_trap_push ();	    gdk_window_move_resize(socket->plug_window,				   0, 0,				   widget->allocation.width, 				   widget->allocation.height);	    gdk_flush ();	    gdk_error_trap_pop ();		    socket->request_width = xcwe->width;	    socket->request_height = xcwe->height;	    socket->have_size = TRUE;	    GTK_NOTE(PLUGSOCKET,		     g_message ("GtkSocket - window created with size: %d %d",				socket->request_width,				socket->request_height));	    	    gtk_widget_queue_resize (widget);	  }		return_val = GDK_FILTER_REMOVE;		break;      }    case ConfigureRequest:      {	XConfigureRequestEvent *xcre = &xevent->xconfigurerequest;		if (!socket->plug_window)	  gtk_socket_add_window (socket, xcre->window);		if (xcre->window == GDK_WINDOW_XWINDOW (socket->plug_window))	  {	    if (xcre->value_mask & (CWWidth | CWHeight))	      {		socket->request_width = xcre->width;		socket->request_height = xcre->height;		socket->have_size = TRUE;				GTK_NOTE(PLUGSOCKET,			 g_message ("GtkSocket - configure request: %d %d",				    socket->request_width,				    socket->request_height));				gtk_widget_queue_resize (widget);	      }	    else if (xcre->value_mask & (CWX | CWY))	      {		gtk_socket_send_configure_event (socket);	      }	    /* Ignore stacking requests. */	    	    return_val = GDK_FILTER_REMOVE;	  }	break;      }    case DestroyNotify:      {	XDestroyWindowEvent *xdwe = &xevent->xdestroywindow;	if (socket->plug_window &&	    (xdwe->window == GDK_WINDOW_XWINDOW (socket->plug_window)))	  {	    GtkWidget *toplevel;	    GTK_NOTE(PLUGSOCKET,		     g_message ("GtkSocket - destroy notify"));	    	    toplevel = gtk_widget_get_toplevel (GTK_WIDGET (socket));	    if (toplevel && GTK_IS_WINDOW (toplevel))	      gtk_window_remove_embedded_xid (GTK_WINDOW (toplevel), xdwe->window);	    gdk_window_destroy_notify (socket->plug_window);	    gtk_widget_destroy (widget);	    socket->plug_window = NULL;	    	    return_val = GDK_FILTER_REMOVE;	  }	break;    }          case FocusIn:      if (xevent->xfocus.mode == EMBEDDED_APP_WANTS_FOCUS)	{	  gtk_socket_claim_focus (socket);	}      else if (xevent->xfocus.detail == NotifyInferior)	{#if 0	  GtkWidget *toplevel;	  toplevel = gtk_widget_get_ancestor (widget, gtk_window_get_type());	  	  if (toplevel)	    {	      XSetInputFocus (GDK_DISPLAY (),			      GDK_WINDOW_XWINDOW (toplevel->window),			      RevertToParent, CurrentTime); /* FIXME? */	    }#endif	  	}      return_val = GDK_FILTER_REMOVE;      break;    case FocusOut:      return_val = GDK_FILTER_REMOVE;      break;    case MapRequest:      if (!socket->plug_window)	gtk_socket_add_window (socket, xevent->xmaprequest.window);	      if (xevent->xmaprequest.window ==	  GDK_WINDOW_XWINDOW (socket->plug_window))	{	  GTK_NOTE(PLUGSOCKET,		   g_message ("GtkSocket - Map Request"));	  gdk_error_trap_push ();	  gdk_window_show (socket->plug_window);	  gdk_flush ();	  gdk_error_trap_pop ();	  return_val = GDK_FILTER_REMOVE;	}      break;    case PropertyNotify:      if (xevent->xproperty.window ==	  GDK_WINDOW_XWINDOW (socket->plug_window))	{	  GdkDragProtocol protocol;	  if ((xevent->xproperty.atom == gdk_atom_intern ("XdndAware", FALSE)) ||	      (xevent->xproperty.atom == gdk_atom_intern ("_MOTIF_DRAG_RECEIVER_INFO", FALSE)))	    {	      gdk_error_trap_push ();	      if (gdk_drag_get_protocol (xevent->xproperty.window, &protocol))		gtk_drag_dest_set_proxy (GTK_WIDGET (socket),					 socket->plug_window,					 protocol, TRUE);	      gdk_flush ();	      gdk_error_trap_pop ();	    }	  return_val = GDK_FILTER_REMOVE;	}    }  return return_val;}

⌨️ 快捷键说明

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