/* ARGSUSED */ static void DisplayInitialize( Widget requested_widget, Widget new_widget, ArgList args, Cardinal *num_args ) { XmDisplay xmDisplay = (XmDisplay)new_widget; int dummy1, dummy2; XContext context; xmDisplay->display.shellCount = 0; xmDisplay->display.numModals = 0; xmDisplay->display.modals = NULL; xmDisplay->display.maxModals = 0; xmDisplay->display.userGrabbed = False; xmDisplay->display.activeDC = NULL; xmDisplay->display.dsm = (XmDropSiteManagerObject) NULL; xmDisplay->display.proxyWindow = _XmGetDragProxyWindow(XtDisplay(xmDisplay)); _XmInitByteOrderChar(); xmDisplay->display.xmim_info = NULL; xmDisplay->display.displayInfo = (XtPointer) XtNew(XmDisplayInfo); ((XmDisplayInfo *)(xmDisplay->display.displayInfo))->SashCursor = 0L; ((XmDisplayInfo *)(xmDisplay->display.displayInfo))->TearOffCursor = 0L; ((XmDisplayInfo *)(xmDisplay->display.displayInfo))->UniqueStamp = 0L; ((XmDisplayInfo *)(xmDisplay->display.displayInfo))->destinationWidget= (Widget)NULL; ((XmDisplayInfo *)(xmDisplay->display.displayInfo))->excParentPane.pane = (Widget *)NULL; ((XmDisplayInfo *)(xmDisplay->display.displayInfo))->excParentPane.pane_list_size = 0; ((XmDisplayInfo *)(xmDisplay->display.displayInfo))->excParentPane.num_panes= 0; ((XmDisplayInfo *)(xmDisplay->display.displayInfo))->resetFocusFlag = 0; ((XmDisplayInfo *)(xmDisplay->display.displayInfo))->traversal_in_progress= FALSE; xmDisplay->display.displayHasShapeExtension = XShapeQueryExtension(XtDisplay(xmDisplay), &dummy1, &dummy2); /* Handle dynamic default of receiver protocol style */ if (xmDisplay->display.dragReceiverProtocolStyle == INVALID_PROTOCOL_VALUE) { if (xmDisplay->display.displayHasShapeExtension) xmDisplay->display.dragReceiverProtocolStyle = XmDRAG_PREFER_DYNAMIC; else xmDisplay->display.dragReceiverProtocolStyle = XmDRAG_PREFER_PREREGISTER; } _XmVirtKeysInitialize (new_widget); /* Solaris 2.6 Motif diff bug #4085003 4 lines */ #ifdef SUN_MOTIF _XmGetKPKeysymToKeycodeList(new_widget); _XmGetModifierMapping(new_widget); #endif /* SUN_MOTIF */ _XmProcessLock(); if (displayContext == 0) displayContext = XUniqueContext(); context = displayContext; _XmProcessUnlock(); if (! XFindContext(XtDisplay(xmDisplay), None, context, (char **) &xmDisplay)) { /* * There's one already created for this display. * What should we do? If we destroy the previous one, we may * wreak havoc with shell modality and screen objects. BUT, * Xt doesn't really give us a way to abort a create. We'll * just let the new one dangle. */ XmeWarning((Widget) xmDisplay, MESSAGE1); } else { XSaveContext(XtDisplayOfObject((Widget)xmDisplay), None, context, (char *)xmDisplay); } if (xmDisplay->display.enable_multi_key_bindings) { Display * display = XtDisplay(new_widget); int i, num_screens = ScreenCount(display); XrmDatabase new_db; for (i = 0; i < num_screens; i++) { Screen * screen = ScreenOfDisplay(display, i); XrmDatabase db = XtScreenDatabase(screen); new_db = XrmGetStringDatabase(_XmDisplay_baseTranslations); XrmCombineDatabase(new_db, &db, False); } } }
/* * Warn the user about double XmDisplay instances for the same display. This * can otherwise cause trouble and many tears... Yes, programmers do have * feelings. */ static void initialize(Widget request, Widget new_w, ArgList args, Cardinal *num_args) { XPointer FirstDisplayWidget; XmDisplay dpy = (XmDisplay)new_w; DEBUGOUT(_LtDebug(__FILE__, new_w, "%s:initialize(%d) - %i args\n" "\trequest X %5i Y %5i W %5i H %5i\n" "\t new_w X %5i Y %5i W %5i H %5i\n", __FILE__, __LINE__, *num_args, XtX(request), XtY(request), XtWidth(request), XtHeight(request), XtX(new_w), XtY(new_w), XtWidth(new_w), XtHeight(new_w))); DEBUGOUT(_LtDebugPrintArgList(__FILE__, new_w, args, *num_args, False)); dpy->display.shellCount = 0; dpy->display.numModals = 0; dpy->display.maxModals = 0; dpy->display.modals = NULL; /* * If haven't yet allocated the context with all kind of information * about LessTif goodies we'll do it right now. This context contains * LessTif goodies on a per display basis. */ if (PerDisplayWidgetContext == PDWC_None) { PerDisplayWidgetContext = XUniqueContext(); } /* * Make sure, that there hasn't already allocated another XmDisplay * widget. Then register this widget as the XmDisplay widget for the * appropiate display. */ if (XFindContext(XtDisplay(new_w), PDWC_RID_DisplayWidget, PerDisplayWidgetContext, &FirstDisplayWidget) == XCSUCCESS) { _XmWarning(new_w, "Don't create multiple XmDisplays for one Display"); } else { XSaveContext(XtDisplay(new_w), PDWC_RID_DisplayWidget, PerDisplayWidgetContext, (XPointer)new_w); } /* * ... */ _XmMessageBoxInstallImages(new_w); _XmInstallStippleImages(new_w); Display_DisplayInfo(new_w) = (XtPointer)XtMalloc(sizeof(XmDisplayInfo)); ((XmDisplayInfo *) Display_DisplayInfo(new_w))->SashCursor = XCreateFontCursor(XtDisplay(new_w), XC_crosshair); ((XmDisplayInfo *) Display_DisplayInfo(new_w))->TearOffCursor = XCreateFontCursor(XtDisplay(new_w), XC_fleur); ((XmDisplayInfo *) Display_DisplayInfo(new_w))->destinationWidget = NULL; ((XmDisplayInfo *) Display_DisplayInfo(new_w))->UniqueStamp = NULL; /* * Allocate space for the virtual key bindings and then fetch the * translations for the convertion from keys to csf keys. This is all * done in the following proc call. */ ((XmDisplayRec *)new_w)->display.bindings = NULL; _XmVirtKeysInitialize(new_w); /* * Register ourself with the current connection so we can kill ourself * when the connection is closed. */ _XmAddCloseConnectionCallback(new_w, DisplaySuicide); Display_DSM(new_w) = NULL; Display_ProxyWindow(new_w) = _XmGetDragProxyWindow(XtDisplay(new_w)); }