/* * CDE - Common Desktop Environment * * Copyright (c) 1993-2012, The Open Group. All rights reserved. * * These libraries and programs are free software; you can * redistribute them and/or modify them under the terms of the GNU * Lesser General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) * any later version. * * These libraries and programs are distributed in the hope that * they will be useful, but WITHOUT ANY WARRANTY; without even the * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public * License along with these librararies and programs; if not, write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301 USA */ /* $TOG: UIComponent.C /main/9 1998/07/23 17:57:36 mgreess $ */ /* *+SNOTICE * * RESTRICTED CONFIDENTIAL INFORMATION: * * The information in this document is subject to special * restrictions in a confidential disclosure agreement bertween * HP, IBM, Sun, USL, SCO and Univel. Do not distribute this * document outside HP, IBM, Sun, USL, SCO, or Univel wihtout * Sun's specific written approval. This documment and all copies * and derivative works thereof must be returned or destroyed at * Sun's request. * * Copyright 1993 Sun Microsystems, Inc. All rights reserved. * *+ENOTICE */ /////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// // This example code is from the book: // // Object-Oriented Programming with C++ and OSF/Motif // by // Douglas Young // Prentice Hall, 1992 // ISBN 0-13-630252-1 // // Copyright 1991 by Prentice Hall // All Rights Reserved // // Permission to use, copy, modify, and distribute this software for // any purpose except publication and without fee is hereby granted, provided // that the above copyright notice appear in all copies of the software. /////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////// // UIComponent.C: Base class for all C++/Motif UI components /////////////////////////////////////////////////////////////// #include
#include "UIComponent.h" #include #include UIComponent::UIComponent ( const char *name ) : BasicComponent ( name ) { // Empty _numPendingTasks = 0; } void UIComponent::widgetDestroyedCallback( Widget, XtPointer clientData, XtPointer ) { UIComponent * obj = (UIComponent *) clientData; obj->widgetDestroyed(); } void UIComponent::widgetDestroyed() { _w = NULL; } void UIComponent::installDestroyHandler() { assert ( _w != NULL ); XtAddCallback ( _w, XmNdestroyCallback, &UIComponent::widgetDestroyedCallback, (XtPointer) this ); } void UIComponent::manage() { assert ( _w != NULL ); assert ( XtHasCallbacks ( _w, XmNdestroyCallback ) == XtCallbackHasSome ); XtManageChild ( _w ); } void UIComponent::displayInCurrentWorkspace() { Widget w = baseWidget(); while (w && !XtIsShell(w)) w = XtParent(w); if (w && XtIsShell(w)) displayInCurrentWorkspace(w); manage(); } void UIComponent::displayInCurrentWorkspace(Widget shell) { while (shell && !XtIsShell(shell)) shell = XtParent(shell); // Make sure the shell is popped up and occupying the current workspace. if (NULL != shell && XtIsShell(shell)) { Atom pCurrent; Display *display = XtDisplay(shell); Window window = XtWindow(shell); XtVaSetValues(shell, XmNiconic, False, NULL); XRaiseWindow(display, window); /* Get the current Workspace */ if (Success == DtWsmGetCurrentWorkspace( display, XRootWindowOfScreen(XtScreen(shell)), &pCurrent)) { Atom *ws = NULL; unsigned long num = 0; int k; if (Success==DtWsmGetWorkspacesOccupied(display, window, &ws, &num)) { /* Already in this workspace? */ for (k = 0; k < num; k++) if (ws[k] == pCurrent) break; /* Add to the workspace */ if (k >= num) { size_t nbytes = sizeof(Atom) * (num+1); ws = (Atom*) XtRealloc((char*) ws, nbytes); ws[num] = pCurrent; DtWsmSetWorkspacesOccupied(display, window, ws, num + 1); } XFree((char *)ws); } else /* Change the hints to reflect the current workspace */ DtWsmSetWorkspacesOccupied(display, window, &pCurrent, 1); } } } UIComponent::~UIComponent() { // Make sure the widget hasn't already been destroyed if ( _w ) { // Remove destroy callback so Xt can't call the callback // with a pointer to an object that has already been freed XtRemoveCallback ( _w, XmNdestroyCallback, &UIComponent::widgetDestroyedCallback, (XtPointer) this ); } } void UIComponent::getResources( const XtResourceList resources, const int numResources ) { // Check for errors assert ( _w != NULL ); assert ( resources != NULL ); // Retrieve the requested resources relative to the // parent of this object's base widget // Added support for doing getResources on the Application if ( XtParent( _w ) ) XtGetSubresources ( XtParent( _w ), (XtPointer) this, _name, className(), resources, numResources, NULL, 0 ); else XtGetSubresources ( _w , (XtPointer) this, _name, className(), resources, numResources, NULL, 0 ); } #ifdef DEAD_WOOD void UIComponent::setDefaultResources( const Widget w, const String *resourceSpec ) { int i; Display *dpy = XtDisplay ( w ); // Retrieve the display pointer XrmDatabase rdb = NULL; // A resource data base // Create an empty resource database rdb = XrmGetStringDatabase ( "" ); // Add the Component resources, prepending the name of the component i = 0; while ( resourceSpec[i] != NULL ) { char *buf = new char[1000]; sprintf(buf, "*%s%s", _name, resourceSpec[i++]); XrmPutLineResource( &rdb, buf ); delete [] buf; } // Merge them into the Xt database, with lowest precendence if ( rdb ) { XrmDatabase db = XtDatabase(dpy); XrmCombineDatabase(rdb, &db, FALSE); } } #endif /* DEAD_WOOD */ #ifndef CAN_INLINE_VIRTUALS const char *const UIComponent::className(void) { return "UIComponent"; } #endif /* ! CAN_INLINE_VIRTUALS */