📄 gtksocket.c
字号:
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 + -