📄 gtk2xtbin.c
字号:
printf("gtk_xtbin_destroy()\n");#endif g_return_if_fail (object != NULL); g_return_if_fail (GTK_IS_XTBIN (object)); xtbin = GTK_XTBIN (object); if(xtbin->xtwindow) { /* remove the event handler */ xt_client_destroy(&(xtbin->xtclient)); xtbin->xtwindow = 0; num_widgets--; /* reduce our usage count */ /* If this is the last running widget, remove the Xt display connection from the mainloop */ if (0 == num_widgets) {#ifdef DEBUG_XTBIN printf("removing the Xt connection from the main loop\n");#endif g_main_context_remove_poll((GMainContext*)NULL, &xt_event_poll_fd); g_source_remove(tag); gtk_timeout_remove(xt_polling_timer_id); xt_polling_timer_id = 0; } } GTK_OBJECT_CLASS(parent_class)->destroy(object);}/** Following is the implementation of Xt XEmbedded for client side*//* Initial Xt plugin */static voidxt_client_init( XtClient * xtclient, Visual *xtvisual, Colormap xtcolormap, int xtdepth){ XtAppContext app_context; char *mArgv[1]; int mArgc = 0; /* * Initialize Xt stuff */ xtclient->top_widget = NULL; xtclient->child_widget = NULL; xtclient->xtdisplay = NULL; xtclient->xtvisual = NULL; xtclient->xtcolormap = 0; xtclient->xtdepth = 0; if (!xt_is_initialized) {#ifdef DEBUG_XTBIN printf("starting up Xt stuff\n");#endif XtToolkitInitialize(); app_context = XtCreateApplicationContext(); if (fallback) XtAppSetFallbackResources(app_context, fallback); xtdisplay = XtOpenDisplay(app_context, gdk_get_display(), NULL, "Wrapper", NULL, 0, &mArgc, mArgv); if (xtdisplay) xt_is_initialized = TRUE; } xtclient->xtdisplay = xtdisplay; xtclient->xtvisual = xtvisual; xtclient->xtcolormap = xtcolormap; xtclient->xtdepth = xtdepth;}/* Create the Xt client widgets* */static voidxt_client_create ( XtClient* xtclient , Window embedderid, int height, int width ) { int n; Arg args[6]; Widget child_widget; Widget top_widget;#ifdef DEBUG_XTBIN printf("xt_client_create() \n");#endif top_widget = XtAppCreateShell("drawingArea", "Wrapper", applicationShellWidgetClass, xtclient->xtdisplay, NULL, 0); xtclient->top_widget = top_widget; /* set size of Xt window */ n = 0; XtSetArg(args[n], XtNheight, height);n++; XtSetArg(args[n], XtNwidth, width);n++; XtSetValues(top_widget, args, n); child_widget = XtVaCreateWidget("form", compositeWidgetClass, top_widget, NULL); n = 0; XtSetArg(args[n], XtNheight, height);n++; XtSetArg(args[n], XtNwidth, width);n++; XtSetArg(args[n], XtNvisual, xtclient->xtvisual ); n++; XtSetArg(args[n], XtNdepth, xtclient->xtdepth ); n++; XtSetArg(args[n], XtNcolormap, xtclient->xtcolormap ); n++; XtSetArg(args[n], XtNborderWidth, 0); n++; XtSetValues(child_widget, args, n); XSync(xtclient->xtdisplay, FALSE); xtclient->oldwindow = top_widget->core.window; top_widget->core.window = embedderid; /* this little trick seems to finish initializing the widget */#if XlibSpecificationRelease >= 6 XtRegisterDrawable(xtclient->xtdisplay, embedderid, top_widget);#else _XtRegisterWindow( embedderid, top_widget);#endif XtRealizeWidget(child_widget); /* listen to all Xt events */ XSelectInput(xtclient->xtdisplay, XtWindow(top_widget), 0x0FFFFF); xt_client_set_info (child_widget, 0); XtManageChild(child_widget); xtclient->child_widget = child_widget; /* set the event handler */ XtAddEventHandler(child_widget, 0x0FFFFF & ~ResizeRedirectMask, TRUE, (XtEventHandler)xt_client_event_handler, xtclient); XtAddEventHandler(child_widget, SubstructureNotifyMask | ButtonReleaseMask, TRUE, (XtEventHandler)xt_client_focus_listener, xtclient); XSync(xtclient->xtdisplay, FALSE);}static voidxt_client_unrealize ( XtClient* xtclient ){#if XlibSpecificationRelease >= 6 XtUnregisterDrawable(xtclient->xtdisplay, xtclient->top_widget->core.window);#else _XtUnregisterWindow(xtclient->top_widget->core.window, xtclient->top_widget);#endif /* flush the queue before we returning origin top_widget->core.window or we can get X error since the window is gone */ XSync(xtclient->xtdisplay, False); xtclient->top_widget->core.window = xtclient->oldwindow; XtUnrealizeWidget(xtclient->top_widget);}static void xt_client_destroy (XtClient* xtclient){ if(xtclient->top_widget) { XtRemoveEventHandler(xtclient->child_widget, 0x0FFFFF, TRUE, (XtEventHandler)xt_client_event_handler, xtclient); XtDestroyWidget(xtclient->top_widget); xtclient->top_widget = NULL; }}static void xt_client_set_info (Widget xtplug, unsigned long flags){ unsigned long buffer[2]; Atom infoAtom = XInternAtom(XtDisplay(xtplug), "_XEMBED_INFO", False); buffer[1] = 0; /* Protocol version */ buffer[1] = flags; XChangeProperty (XtDisplay(xtplug), XtWindow(xtplug), infoAtom, infoAtom, 32, PropModeReplace, (unsigned char *)buffer, 2);}static voidxt_client_handle_xembed_message(Widget w, XtPointer client_data, XEvent *event){ XtClient *xtplug = (XtClient*)client_data; switch (event->xclient.data.l[1]) { case XEMBED_EMBEDDED_NOTIFY: break; case XEMBED_WINDOW_ACTIVATE:#ifdef DEBUG_XTBIN printf("Xt client get XEMBED_WINDOW_ACTIVATE\n");#endif break; case XEMBED_WINDOW_DEACTIVATE:#ifdef DEBUG_XTBIN printf("Xt client get XEMBED_WINDOW_DEACTIVATE\n");#endif break; case XEMBED_MODALITY_ON:#ifdef DEBUG_XTBIN printf("Xt client get XEMBED_MODALITY_ON\n");#endif break; case XEMBED_MODALITY_OFF:#ifdef DEBUG_XTBIN printf("Xt client get XEMBED_MODALITY_OFF\n");#endif break; case XEMBED_FOCUS_IN: case XEMBED_FOCUS_OUT: { XEvent xevent; memset(&xevent, 0, sizeof(xevent)); if(event->xclient.data.l[1] == XEMBED_FOCUS_IN) {#ifdef DEBUG_XTBIN printf("XTEMBED got focus in\n");#endif xevent.xfocus.type = FocusIn; } else {#ifdef DEBUG_XTBIN printf("XTEMBED got focus out\n");#endif xevent.xfocus.type = FocusOut; } xevent.xfocus.window = XtWindow(xtplug->child_widget); xevent.xfocus.display = XtDisplay(xtplug->child_widget); XSendEvent(XtDisplay(xtplug->child_widget), xevent.xfocus.window, False, NoEventMask, &xevent ); XSync( XtDisplay(xtplug->child_widget), False); } break; default: break; } /* End of XEmbed Message */}static void xt_client_event_handler( Widget w, XtPointer client_data, XEvent *event){ XtClient *xtplug = (XtClient*)client_data; switch(event->type) { case ClientMessage: /* Handle xembed message */ if (event->xclient.message_type== XInternAtom (XtDisplay(xtplug->child_widget), "_XEMBED", False)) { xt_client_handle_xembed_message(w, client_data, event); } break; case ReparentNotify: break; case MappingNotify: xt_client_set_info (w, XEMBED_MAPPED); break; case UnmapNotify: xt_client_set_info (w, 0); break; case FocusIn: send_xembed_message ( xtplug, XEMBED_REQUEST_FOCUS, 0, 0, 0, 0); break; case FocusOut: break; case KeyPress:#ifdef DEBUG_XTBIN printf("Key Press Got!\n");#endif break; default: break; } /* End of switch(event->type) */}static voidsend_xembed_message (XtClient *xtclient, long message, long detail, long data1, long data2, long time) { XEvent xevent; Window w=XtWindow(xtclient->top_widget); Display* dpy=xtclient->xtdisplay; int errorcode; memset(&xevent,0,sizeof(xevent)); xevent.xclient.window = w; xevent.xclient.type = ClientMessage; xevent.xclient.message_type = XInternAtom(dpy,"_XEMBED",False); xevent.xclient.format = 32; xevent.xclient.data.l[0] = time; xevent.xclient.data.l[1] = message; xevent.xclient.data.l[2] = detail; xevent.xclient.data.l[3] = data1; xevent.xclient.data.l[4] = data2; trap_errors (); XSendEvent (dpy, w, False, NoEventMask, &xevent); XSync (dpy,False); if((errorcode = untrap_error())) {#ifdef DEBUG_XTBIN printf("send_xembed_message error(%d)!!!\n",errorcode);#endif }}static int error_handler(Display *display, XErrorEvent *error){ trapped_error_code = error->error_code; return 0;}static void trap_errors(void){ trapped_error_code =0; old_error_handler = XSetErrorHandler(error_handler);}static int untrap_error(void){ XSetErrorHandler(old_error_handler); if(trapped_error_code) {#ifdef DEBUG_XTBIN printf("Get X Window Error = %d\n", trapped_error_code);#endif } return trapped_error_code;}static void xt_client_focus_listener( Widget w, XtPointer user_data, XEvent *event){ Display *dpy = XtDisplay(w); XtClient *xtclient = user_data; Window win = XtWindow(w); switch(event->type) { case CreateNotify: if(event->xcreatewindow.parent == win) { Widget child=XtWindowToWidget( dpy, event->xcreatewindow.window); if (child) xt_add_focus_listener_tree(child, user_data); } break; case DestroyNotify: xt_remove_focus_listener( w, user_data); break; case ReparentNotify: if(event->xreparent.parent == win) { /* I am the new parent */ Widget child=XtWindowToWidget(dpy, event->xreparent.window); if (child) xt_add_focus_listener_tree( child, user_data); } else if(event->xreparent.window == win) { /* I am the new child */ } else { /* I am the old parent */ } break; case ButtonRelease:#if 0 XSetInputFocus(dpy, XtWindow(xtclient->child_widget), RevertToParent, event->xbutton.time);#endif send_xembed_message ( xtclient, XEMBED_REQUEST_FOCUS, 0, 0, 0, 0); break; default: break; } /* End of switch(event->type) */}static voidxt_add_focus_listener( Widget w, XtPointer user_data){ XWindowAttributes attr; long eventmask; XtClient *xtclient = user_data; int errorcode; trap_errors (); XGetWindowAttributes(XtDisplay(w), XtWindow(w), &attr); eventmask = attr.your_event_mask | SubstructureNotifyMask | ButtonReleaseMask; XSelectInput(XtDisplay(w), XtWindow(w), eventmask); XtAddEventHandler(w, SubstructureNotifyMask | ButtonReleaseMask, TRUE, (XtEventHandler)xt_client_focus_listener, xtclient); untrap_error();}static voidxt_remove_focus_listener(Widget w, XtPointer user_data){ int errorcode; trap_errors (); XtRemoveEventHandler(w, SubstructureNotifyMask | ButtonReleaseMask, TRUE, (XtEventHandler)xt_client_focus_listener, user_data); untrap_error();}static voidxt_add_focus_listener_tree ( Widget treeroot, XtPointer user_data) { Window win = XtWindow(treeroot); Window *children; Window root, parent; Display *dpy = XtDisplay(treeroot); unsigned int i, nchildren; /* ensure we don't add more than once */ xt_remove_focus_listener( treeroot, user_data); xt_add_focus_listener( treeroot, user_data); trap_errors(); if(!XQueryTree(dpy, win, &root, &parent, &children, &nchildren)) { untrap_error(); return; } if(untrap_error()) return; for(i=0; i<nchildren; ++i) { Widget child = XtWindowToWidget(dpy, children[i]); if (child) xt_add_focus_listener_tree( child, user_data); } XFree((void*)children); return;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -