/* $XConsortium: MenuState.c /main/5 1995/07/15 20:52:55 drk $ */ /* * Motif * * Copyright (c) 1987-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 * */ /* * HISTORY */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include "MenuStateI.h" /******** Static Function Declarations ********/ static void ScreenDestroyCallback ( Widget w, XtPointer client_data, XtPointer call_data ); /******** End Static Function Declarations ********/ Widget _XmGetRC_PopupPosted ( Widget wid) { if (XmIsRowColumn(wid)) return (RC_PopupPosted(wid)); else return NULL; } /* * The following two functions are used by menu and menu-item widgets to keep * track of whether we're in drag (button down) or traversal mode. */ Boolean _XmGetInDragMode ( Widget widget) { return((_XmGetMenuState(widget))->MU_InDragMode); } void _XmSetInDragMode( Widget widget, #if NeedWidePrototypes int mode ) #else Boolean mode ) #endif { (_XmGetMenuState(widget))->MU_InDragMode = mode; } /************************************************************************ * * _XmGetMenuState(wid) * ************************************************************************/ XmMenuState _XmGetMenuState( Widget wid) { XmScreen scrn = (XmScreen) XmGetXmScreen(XtScreen(wid)); XmMenuState menu_state = (XmMenuState)NULL; if ((XmScreen)NULL != scrn) { menu_state = (XmMenuState)((XmScreenInfo *)(scrn->screen.screenInfo))->menu_state; if ((XmMenuState)NULL == menu_state) { menu_state = (XmMenuState)XtMalloc(sizeof(XmMenuStateRec)); ((XmScreenInfo *)(scrn->screen.screenInfo))->menu_state = (XtPointer)menu_state; XtAddCallback((Widget)scrn, XtNdestroyCallback, ScreenDestroyCallback, (XtPointer) NULL); menu_state->RC_LastSelectToplevel = NULL; menu_state->RC_ButtonEventStatus.time = (unsigned) -1; menu_state->RC_ButtonEventStatus.verified = FALSE; menu_state->RC_ButtonEventStatus.waiting_to_be_managed = TRUE; /*menu_state->RC_ButtonEventStatus.event = (XButtonEvent)NULL;*/ menu_state->RC_ReplayInfo.time = 0; menu_state->RC_ReplayInfo.toplevel_menu = NULL; menu_state->RC_activeItem = NULL; menu_state->RC_allowAcceleratedInsensitiveUnmanagedMenuItems = False; menu_state->RC_menuFocus.oldFocus = (Window)NULL; menu_state->RC_menuFocus.oldRevert = 0; menu_state->RC_menuFocus.oldWidget = NULL; menu_state->MS_LastManagedMenuTime = (Time)0L; menu_state->MU_InDragMode = False; menu_state->MU_CurrentMenuChild = NULL; menu_state->MU_InPMMode = False; } } return menu_state; } /*ARGSUSED*/ static void ScreenDestroyCallback ( Widget w, XtPointer client_data, XtPointer call_data ) /* unused */ { XmScreen scrn = (XmScreen) XmGetXmScreen(XtScreen(w)); if ((XmScreen)NULL != scrn) { XmMenuState menu_state = (XmMenuState)((XmScreenInfo *) (scrn->screen.screenInfo))->menu_state; if ((XmMenuState)NULL != menu_state) { XtFree((char*)menu_state); } } }