/* * 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 REV_INFO #ifndef lint static char rcsid[] = "$XConsortium: GadgetUtil.c /main/16 1996/10/23 15:00:52 cde-osf $" #endif #endif /* (c) Copyright 1987, 1988, 1989, 1990, 1991, 1992 HEWLETT-PACKARD COMPANY */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include #include #include "GadgetUtiI.h" #include "XmI.h" /******** Static Function Declarations ********/ /******** End Static Function Declarations ********/ /************************************************************************ * * _XmInputForGadget * This routine is a front-end for XmObjectAtPoint which returns a * gadget or NULL if XmbjectAtPoint is not sensitive. * ************************************************************************/ XmGadget _XmInputForGadget( Widget wid, int x, int y ) { Widget widget; widget = XmObjectAtPoint (wid, x, y); if (!widget || !XtIsSensitive (widget)) return ((XmGadget) NULL); return ((XmGadget) widget); } /************************************************************************ * * XmConfigureObject * Wrapper around Xt equivalent + DropSite update. * ************************************************************************/ void XmeConfigureObject( Widget wid, #if NeedWidePrototypes int x, int y, int width, int height, int border_width ) #else Position x, Position y, Dimension width, Dimension height, Dimension border_width ) #endif /* NeedWidePrototypes */ { _XmWidgetToAppContext(wid); XmDropSiteStartUpdate(wid); _XmAppLock(app); if (!width && !height) { XtWidgetGeometry desired, preferred ; desired.request_mode = 0; XtQueryGeometry(wid, &desired, &preferred); width = preferred.width; height = preferred.height; } if (!width) width++; if (!height) height++; XtConfigureWidget(wid, x, y, width, height, border_width); XmDropSiteEndUpdate(wid); _XmAppUnlock(app); } /************************************************************************ * * XmeRedisplayGadgets * Redisplay any gadgets contained within the manager mw which * are intersected by the region. * ************************************************************************/ void XmeRedisplayGadgets( Widget w, register XEvent *event, Region region ) { CompositeWidget mw = (CompositeWidget) w ; register int i; register Widget child; XtExposeProc expose; _XmWidgetToAppContext(w); _XmAppLock(app); for (i = 0; i < mw->composite.num_children; i++) { child = mw->composite.children[i]; if (XmIsGadget(child) && XtIsManaged(child)) { if (region == NULL) { if (child->core.x < event->xexpose.x + event->xexpose.width && child->core.x + child->core.width > event->xexpose.x && child->core.y < event->xexpose.y + event->xexpose.height && child->core.y + child->core.height > event->xexpose.y) { _XmProcessLock(); expose = child->core.widget_class->core_class.expose; _XmProcessUnlock(); if (expose) (*(expose)) (child, event, region); } } else { if (XRectInRegion (region, child->core.x, child->core.y, child->core.width, child->core.height)) { _XmProcessLock(); expose = child->core.widget_class->core_class.expose; _XmProcessUnlock(); if (expose) (*(expose)) (child, event, region); } } } } _XmAppUnlock(app); } /************************************************************************ * * _XmDispatchGadgetInput * Call the gadgets class function and send the desired data to it. * ************************************************************************/ void _XmDispatchGadgetInput( Widget wid, XEvent *event, Mask mask ) { XmGadget g = (XmGadget) wid ; if ((g->gadget.event_mask & mask) && XtIsSensitive ((Widget)g) && XtIsManaged ((Widget)g)) { if (event != NULL) { XEvent synth_event; #define CopyEvent(source, dest, type) \ source.type = dest->type switch(mask) { case XmENTER_EVENT: CopyEvent(synth_event, event, xcrossing); if (event->type != EnterNotify) { synth_event.type = EnterNotify; } break; case XmLEAVE_EVENT: CopyEvent(synth_event, event, xcrossing); if (event->type != LeaveNotify) { synth_event.type = LeaveNotify; } break; case XmFOCUS_IN_EVENT: CopyEvent(synth_event, event, xfocus); if (event->type != FocusIn) { synth_event.type = FocusIn; } break; case XmFOCUS_OUT_EVENT: CopyEvent(synth_event, event, xfocus); if (event->type != FocusIn) { synth_event.type = FocusOut; } break; case XmMOTION_EVENT: CopyEvent(synth_event, event, xmotion); if (event->type != MotionNotify) { event->type = MotionNotify; } break; case XmARM_EVENT: CopyEvent(synth_event, event, xkey); if (event->type != ButtonPress && event->type != KeyPress) { synth_event.type = ButtonPress; } break; case XmACTIVATE_EVENT: CopyEvent(synth_event, event, xkey); if (event->type != ButtonRelease && event->type != KeyPress) { synth_event.type = ButtonRelease; } break; case XmKEY_EVENT: CopyEvent(synth_event, event, xkey); if (event->type != KeyPress && event->type != ButtonPress) { synth_event.type = KeyPress; } break; case XmHELP_EVENT: CopyEvent(synth_event, event, xkey); if (event->type != KeyPress) { synth_event.type = KeyPress; } break; default: memcpy((char*)&synth_event, (char*)event, (size_t)sizeof(synth_event)); break; } (*(((XmGadgetClass) (g->object.widget_class))-> gadget_class.input_dispatch)) ((Widget) g, (XEvent *) &synth_event, mask) ; } else { (*(((XmGadgetClass) (g->object.widget_class))-> gadget_class.input_dispatch)) ((Widget) g, (XEvent *) event, mask) ; } } }