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

📄 gtk2xtbin.c

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 C
📖 第 1 页 / 共 2 页
字号:
  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 + -