/* * 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: Sash.c /main/12 1995/07/13 17:51:55 drk $" #endif #endif /* (c) Copyright 1989, DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. */ /* (c) Copyright 1987, 1988, 1989, 1990, 1991, 1992 HEWLETT-PACKARD COMPANY */ /* (c) Copyright 1988 MASSACHUSETTS INSTITUTE OF TECHNOLOGY */ #ifdef HAVE_CONFIG_H #include #endif #include #include "XmI.h" #include #include #include #include #include "MenuStateI.h" #include "TraversalI.h" #define defTranslations _XmSash_defTranslations #define SASHSIZE 10 /******** Static Function Declarations ********/ static void ClassPartInitialize( WidgetClass wc) ; static void ClassInitialize( void ) ; static void Initialize( Widget rw, Widget nw, ArgList args, Cardinal *num_args) ; static void HighlightSash( Widget sash) ; static void UnhighlightSash( Widget sash) ; static XmNavigability WidgetNavigable( Widget wid) ; static void SashFocusIn( Widget w, XEvent *event, char **params, Cardinal *num_params) ; static void SashFocusOut( Widget w, XEvent *event, char **params, Cardinal *num_params) ; static void SashAction( Widget widget, XEvent *event, String *params, Cardinal *num_params) ; static void Realize( register Widget w, XtValueMask *p_valueMask, XSetWindowAttributes *attributes) ; static void Redisplay( Widget w, XEvent *event, Region region) ; static void SashDisplayDestroyCallback ( Widget w, XtPointer client_data, XtPointer call_data ); /******** End Static Function Declarations ********/ static XtResource resources[] = { {XmNborderWidth, XmCBorderWidth, XmRHorizontalDimension, sizeof(Dimension), XtOffsetOf( struct _XmSashRec, core.border_width), XmRImmediate, (XtPointer) 0}, {XmNcallback, XmCCallback, XmRCallback, sizeof(XtCallbackList), XtOffsetOf( struct _XmSashRec, sash.sash_action), XmRPointer, NULL}, { XmNnavigationType, XmCNavigationType, XmRNavigationType, sizeof (unsigned char), XtOffsetOf( struct _XmPrimitiveRec, primitive.navigation_type), XmRImmediate, (XtPointer) XmSTICKY_TAB_GROUP}, }; static XtActionsRec actionsList[] = { {"SashAction", SashAction}, {"SashFocusIn", SashFocusIn}, {"SashFocusOut", SashFocusOut}, }; static XmBaseClassExtRec SashBaseClassExtRec = { NULL, NULLQUARK, XmBaseClassExtVersion, sizeof(XmBaseClassExtRec), NULL, /* InitializePrehook */ NULL, /* SetValuesPrehook */ NULL, /* InitializePosthook */ NULL, /* SetValuesPosthook */ NULL, /* secondaryObjectClass */ NULL, /* secondaryCreate */ NULL, /* getSecRes data */ { 0 }, /* fastSubclass flags */ NULL, /* get_values_prehook */ NULL, /* get_values_posthook */ NULL, /* classPartInitPrehook */ NULL, /* classPartInitPosthook*/ NULL, /* ext_resources */ NULL, /* compiled_ext_resources*/ 0, /* num_ext_resources */ FALSE, /* use_sub_resources */ WidgetNavigable, /* widgetNavigable */ XmInheritFocusChange, /* focusChange */ }; externaldef(xmsashclassrec) XmSashClassRec xmSashClassRec = { { /* core class fields */ /* superclass */ (WidgetClass) &xmPrimitiveClassRec, /* class name */ "XmSash", /* size */ sizeof(XmSashRec), /* class initialize */ ClassInitialize, /* class_part_init */ ClassPartInitialize, /* class_inited */ FALSE, /* initialize */ Initialize, /* initialize_hook */ NULL, /* realize */ Realize, /* actions */ actionsList, /* num_actions */ XtNumber(actionsList), /* resourses */ resources, /* resource_count */ XtNumber(resources), /* xrm_class */ NULLQUARK, /* compress_motion */ TRUE, /* compress_exposure */ XtExposeCompressMaximal, /* compress_enter/lv */ TRUE, /* visible_interest */ FALSE, /* destroy */ NULL, /* resize */ NULL, /* expose */ Redisplay, /* set_values */ NULL, /* set_values_hook */ NULL, /* set_values_almost */ XtInheritSetValuesAlmost, /* get_values_hook */ NULL, /* accept_focus */ NULL, /* version */ XtVersion, /* callback_private */ NULL, /* tm_table */ defTranslations, /* query_geometry */ NULL, NULL, /* display_accelerator */ (XtPointer)&SashBaseClassExtRec, /* extension */ }, { XmInheritWidgetProc, /* Primitive border_highlight */ XmInheritWidgetProc, /* Primitive border_unhighlight */ NULL, /* translations */ NULL, /* arm_and_activate */ NULL, /* get resources */ 0, /* num get_resources */ NULL, /* extension */ }, { (XtPointer) NULL, /* extension */ } }; externaldef(xmsashwidgetclass) WidgetClass xmSashWidgetClass = (WidgetClass) &xmSashClassRec; /************************************************************************ * * ClassPartInitialize * Set up the fast subclassing for the widget. * ************************************************************************/ static void ClassPartInitialize( WidgetClass wc ) { _XmFastSubclassInit(wc, XmSASH_BIT); } /************************************************************************ * * ClassInitialize * Initialize the primitive part of class structure with * routines to do special highlight & unhighlight for Sash. * ************************************************************************/ static void ClassInitialize( void ) { xmSashClassRec.primitive_class.border_highlight = HighlightSash; xmSashClassRec.primitive_class.border_unhighlight = UnhighlightSash; SashBaseClassExtRec.record_type = XmQmotif; } /*ARGSUSED*/ static void Initialize( Widget rw, Widget nw, ArgList args, /* unused */ Cardinal *num_args ) /* unused */ { XmSashWidget request = (XmSashWidget) rw ; XmSashWidget new_w = (XmSashWidget) nw ; if (request->core.width == 0) new_w->core.width += SASHSIZE; if (request->core.height == 0) new_w->core.height += SASHSIZE; new_w->sash.has_focus = False; } static void HighlightSash( Widget sash ) { int x, y; x = y = ((XmSashWidget) sash)->primitive.shadow_thickness; XFillRectangle( XtDisplay( sash), XtWindow( sash), ((XmSashWidget) sash)->primitive.highlight_GC, x,y, sash->core.width-(2*x), sash->core.height-(2*y)); } static void UnhighlightSash( Widget sash ) { int x, y; x = y = ((XmSashWidget) sash)->primitive.shadow_thickness; XClearArea( XtDisplay( sash), XtWindow( sash), x,y, sash->core.width-(2*x), sash->core.height-(2*y), FALSE); } static XmNavigability WidgetNavigable( Widget wid) { if( _XmShellIsExclusive( wid) ) { /* Preserve 1.0 behavior. (Why? Don't ask me!) */ return XmNOT_NAVIGABLE ; } if( XtIsSensitive(wid) && ((XmPrimitiveWidget) wid)->primitive.traversal_on ) { XmNavigationType nav_type = ((XmPrimitiveWidget) wid) ->primitive.navigation_type ; if( (nav_type == XmSTICKY_TAB_GROUP) || (nav_type == XmEXCLUSIVE_TAB_GROUP) || ( (nav_type == XmTAB_GROUP) && !_XmShellIsExclusive( wid)) ) { return XmTAB_NAVIGABLE ; } } return XmNOT_NAVIGABLE ; } /* ARGSUSED */ static void SashFocusIn( Widget w, XEvent *event, char **params, Cardinal *num_params ) { register XmSashWidget sash = (XmSashWidget) w; if (event->xany.type != FocusIn || !event->xfocus.send_event) return; if (_XmGetFocusPolicy( (Widget) sash) == XmEXPLICIT) HighlightSash(w); XmeDrawShadows (XtDisplay (w), XtWindow (w), sash->primitive.top_shadow_GC, sash->primitive.bottom_shadow_GC, 0,0,w->core.width, w->core.height, sash->primitive.shadow_thickness, XmSHADOW_OUT); sash->sash.has_focus = True; } /* ARGSUSED */ static void SashFocusOut( Widget w, XEvent *event, char **params, Cardinal *num_params ) { register XmSashWidget sash = (XmSashWidget) w; if (event->xany.type != FocusOut || !event->xfocus.send_event) return; if (_XmGetFocusPolicy( (Widget) sash) == XmEXPLICIT) UnhighlightSash(w); XmeDrawShadows (XtDisplay (w), XtWindow (w), sash->primitive.top_shadow_GC, sash->primitive.bottom_shadow_GC, 0,0,w->core.width, w->core.height, sash->primitive.shadow_thickness, XmSHADOW_OUT); sash->sash.has_focus = False; } static void SashAction( Widget widget, XEvent *event, String *params, Cardinal *num_params ) { register XmSashWidget sash = (XmSashWidget) widget; SashCallDataRec call_data; call_data.event = event; call_data.params = params; call_data.num_params = *num_params; XtCallCallbackList(widget, sash->sash.sash_action, (XtPointer)&call_data); } static void Realize( register Widget w, XtValueMask *p_valueMask, XSetWindowAttributes *attributes ) { XmDisplay dd = (XmDisplay) XmGetXmDisplay(XtDisplay(w)); Cursor SashCursor = ((XmDisplayInfo *)(dd->display.displayInfo))->SashCursor; if (0L == SashCursor) { /* create some data shared among all instances on this ** display; the first one along can create it, and ** any one can remove it; note no reference count */ SashCursor = ((XmDisplayInfo *)(dd->display.displayInfo))->SashCursor = XCreateFontCursor(XtDisplay(w), XC_crosshair); XtAddCallback((Widget)dd, XtNdestroyCallback, SashDisplayDestroyCallback, (XtPointer) NULL); } attributes->cursor = SashCursor; XtCreateWindow (w, InputOutput, CopyFromParent, *p_valueMask | CWCursor, attributes); } /*ARGSUSED*/ static void SashDisplayDestroyCallback ( Widget w, XtPointer client_data, /* unused */ XtPointer call_data ) /* unused */ { XmDisplay dd = (XmDisplay) XmGetXmDisplay(XtDisplay(w)); Cursor SashCursor; if ((XmDisplay)NULL != dd) { SashCursor = ((XmDisplayInfo *)(dd->display.displayInfo))->SashCursor; if (0L != SashCursor) { XFreeCursor(XtDisplay(w), SashCursor); /* ((XmDisplayInfo *)(dd->display.displayInfo))->SashCursor= 0L; */ } } } /*************************************<->************************************* * * Redisplay (w, event) * * Description: * ----------- * Cause the widget, identified by w, to be redisplayed. * * * Inputs: * ------ * w = widget to be redisplayed; * event = event structure identifying need for redisplay on this * widget. * * Outputs: * ------- * * Procedures Called * ----------------- * DrawToggle() * XDrawString() *************************************<->***********************************/ /* ARGSUSED */ static void Redisplay( Widget w, XEvent *event, Region region ) { register XmSashWidget sash = (XmSashWidget) w; XmeDrawShadows (XtDisplay (w), XtWindow (w), sash->primitive.top_shadow_GC, sash->primitive.bottom_shadow_GC, 0,0,w->core.width, w->core.height, sash->primitive.shadow_thickness, XmSHADOW_OUT); if (sash->sash.has_focus) HighlightSash(w); }