Blame lib/Xm/Sash.c

Packit b099d7
/* 
Packit b099d7
 * Motif
Packit b099d7
 *
Packit b099d7
 * Copyright (c) 1987-2012, The Open Group. All rights reserved.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are free software; you can
Packit b099d7
 * redistribute them and/or modify them under the terms of the GNU
Packit b099d7
 * Lesser General Public License as published by the Free Software
Packit b099d7
 * Foundation; either version 2 of the License, or (at your option)
Packit b099d7
 * any later version.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are distributed in the hope that
Packit b099d7
 * they will be useful, but WITHOUT ANY WARRANTY; without even the
Packit b099d7
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
Packit b099d7
 * PURPOSE. See the GNU Lesser General Public License for more
Packit b099d7
 * details.
Packit b099d7
 *
Packit b099d7
 * You should have received a copy of the GNU Lesser General Public
Packit b099d7
 * License along with these librararies and programs; if not, write
Packit b099d7
 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
Packit b099d7
 * Floor, Boston, MA 02110-1301 USA
Packit b099d7
*/ 
Packit b099d7
/* 
Packit b099d7
 * HISTORY
Packit b099d7
*/ 
Packit b099d7
#ifdef REV_INFO
Packit b099d7
#ifndef lint
Packit b099d7
static char rcsid[] = "$XConsortium: Sash.c /main/12 1995/07/13 17:51:55 drk $"
Packit b099d7
#endif
Packit b099d7
#endif
Packit b099d7
/* (c) Copyright 1989, DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. */
Packit b099d7
/* (c) Copyright 1987, 1988, 1989, 1990, 1991, 1992 HEWLETT-PACKARD COMPANY */
Packit b099d7
/* (c) Copyright 1988 MASSACHUSETTS INSTITUTE OF TECHNOLOGY  */
Packit b099d7
Packit b099d7
#ifdef HAVE_CONFIG_H
Packit b099d7
#include <config.h>
Packit b099d7
#endif
Packit b099d7
Packit b099d7
Packit b099d7
#include <X11/cursorfont.h>
Packit b099d7
#include "XmI.h"
Packit b099d7
#include <Xm/SashP.h>
Packit b099d7
#include <Xm/TransltnsP.h>
Packit b099d7
#include <Xm/DrawP.h>
Packit b099d7
#include <Xm/DisplayP.h>
Packit b099d7
#include "MenuStateI.h"
Packit b099d7
#include "TraversalI.h"
Packit b099d7
Packit b099d7
#define defTranslations		_XmSash_defTranslations
Packit b099d7
#define SASHSIZE 10
Packit b099d7
Packit b099d7
/********    Static Function Declarations    ********/
Packit b099d7
Packit b099d7
static void ClassPartInitialize( 
Packit b099d7
                        WidgetClass wc) ;
Packit b099d7
static void ClassInitialize( void ) ;
Packit b099d7
static void Initialize( 
Packit b099d7
                        Widget rw,
Packit b099d7
                        Widget nw,
Packit b099d7
                        ArgList args,
Packit b099d7
                        Cardinal *num_args) ;
Packit b099d7
static void HighlightSash( 
Packit b099d7
                        Widget sash) ;
Packit b099d7
static void UnhighlightSash( 
Packit b099d7
                        Widget sash) ;
Packit b099d7
static XmNavigability WidgetNavigable( 
Packit b099d7
                        Widget wid) ;
Packit b099d7
static void SashFocusIn( 
Packit b099d7
                        Widget w,
Packit b099d7
                        XEvent *event,
Packit b099d7
                        char **params,
Packit b099d7
                        Cardinal *num_params) ;
Packit b099d7
static void SashFocusOut( 
Packit b099d7
                        Widget w,
Packit b099d7
                        XEvent *event,
Packit b099d7
                        char **params,
Packit b099d7
                        Cardinal *num_params) ;
Packit b099d7
static void SashAction( 
Packit b099d7
                        Widget widget,
Packit b099d7
                        XEvent *event,
Packit b099d7
                        String *params,
Packit b099d7
                        Cardinal *num_params) ;
Packit b099d7
static void Realize( 
Packit b099d7
                        register Widget w,
Packit b099d7
                        XtValueMask *p_valueMask,
Packit b099d7
                        XSetWindowAttributes *attributes) ;
Packit b099d7
static void Redisplay( 
Packit b099d7
                        Widget w,
Packit b099d7
                        XEvent *event,
Packit b099d7
                        Region region) ;
Packit b099d7
Packit b099d7
static void SashDisplayDestroyCallback ( 
Packit b099d7
			Widget w, 
Packit b099d7
			XtPointer client_data, 
Packit b099d7
			XtPointer call_data );
Packit b099d7
/********    End Static Function Declarations    ********/
Packit b099d7
Packit b099d7
Packit b099d7
static XtResource resources[] = {
Packit b099d7
   {XmNborderWidth, XmCBorderWidth, XmRHorizontalDimension, sizeof(Dimension),
Packit b099d7
      XtOffsetOf( struct _XmSashRec, core.border_width), XmRImmediate, (XtPointer) 0},
Packit b099d7
Packit b099d7
   {XmNcallback, XmCCallback, XmRCallback, sizeof(XtCallbackList), 
Packit b099d7
      XtOffsetOf( struct _XmSashRec, sash.sash_action), XmRPointer, NULL},
Packit b099d7
Packit b099d7
   { XmNnavigationType, XmCNavigationType, XmRNavigationType,
Packit b099d7
     sizeof (unsigned char),
Packit b099d7
     XtOffsetOf( struct _XmPrimitiveRec, primitive.navigation_type),
Packit b099d7
     XmRImmediate, (XtPointer) XmSTICKY_TAB_GROUP},
Packit b099d7
};
Packit b099d7
Packit b099d7
Packit b099d7
static XtActionsRec actionsList[] =
Packit b099d7
{
Packit b099d7
  {"SashAction",	SashAction},
Packit b099d7
  {"SashFocusIn",	SashFocusIn},
Packit b099d7
  {"SashFocusOut",	SashFocusOut},
Packit b099d7
};
Packit b099d7
Packit b099d7
Packit b099d7
static XmBaseClassExtRec SashBaseClassExtRec = {
Packit b099d7
    NULL,
Packit b099d7
    NULLQUARK,
Packit b099d7
    XmBaseClassExtVersion,
Packit b099d7
    sizeof(XmBaseClassExtRec),
Packit b099d7
    NULL,				/* InitializePrehook	*/
Packit b099d7
    NULL,				/* SetValuesPrehook	*/
Packit b099d7
    NULL,				/* InitializePosthook	*/
Packit b099d7
    NULL,				/* SetValuesPosthook	*/
Packit b099d7
    NULL,				/* secondaryObjectClass	*/
Packit b099d7
    NULL,				/* secondaryCreate	*/
Packit b099d7
    NULL,		                /* getSecRes data	*/
Packit b099d7
    { 0 },				/* fastSubclass flags	*/
Packit b099d7
    NULL,				/* get_values_prehook	*/
Packit b099d7
    NULL,				/* get_values_posthook	*/
Packit b099d7
    NULL,                               /* classPartInitPrehook */
Packit b099d7
    NULL,                               /* classPartInitPosthook*/
Packit b099d7
    NULL,                               /* ext_resources        */
Packit b099d7
    NULL,                               /* compiled_ext_resources*/
Packit b099d7
    0,                                  /* num_ext_resources    */
Packit b099d7
    FALSE,                              /* use_sub_resources    */
Packit b099d7
    WidgetNavigable,                    /* widgetNavigable      */
Packit b099d7
    XmInheritFocusChange,               /* focusChange          */
Packit b099d7
};
Packit b099d7
Packit b099d7
externaldef(xmsashclassrec) XmSashClassRec xmSashClassRec = {
Packit b099d7
   {
Packit b099d7
/* core class fields */
Packit b099d7
    /* superclass         */   (WidgetClass) &xmPrimitiveClassRec,
Packit b099d7
    /* class name         */   "XmSash",
Packit b099d7
    /* size               */   sizeof(XmSashRec),
Packit b099d7
    /* class initialize   */   ClassInitialize,
Packit b099d7
    /* class_part_init    */   ClassPartInitialize,
Packit b099d7
    /* class_inited       */   FALSE,
Packit b099d7
    /* initialize         */   Initialize,
Packit b099d7
    /* initialize_hook    */   NULL,
Packit b099d7
    /* realize            */   Realize,
Packit b099d7
    /* actions            */   actionsList,
Packit b099d7
    /* num_actions        */   XtNumber(actionsList),
Packit b099d7
    /* resourses          */   resources,
Packit b099d7
    /* resource_count     */   XtNumber(resources),
Packit b099d7
    /* xrm_class          */   NULLQUARK,
Packit b099d7
    /* compress_motion    */   TRUE,
Packit b099d7
    /* compress_exposure  */   XtExposeCompressMaximal,
Packit b099d7
    /* compress_enter/lv  */   TRUE,
Packit b099d7
    /* visible_interest   */   FALSE,
Packit b099d7
    /* destroy            */   NULL,
Packit b099d7
    /* resize             */   NULL,
Packit b099d7
    /* expose             */   Redisplay,
Packit b099d7
    /* set_values         */   NULL,
Packit b099d7
    /* set_values_hook    */   NULL,
Packit b099d7
    /* set_values_almost  */   XtInheritSetValuesAlmost,
Packit b099d7
    /* get_values_hook    */   NULL,
Packit b099d7
    /* accept_focus       */   NULL,
Packit b099d7
    /* version            */   XtVersion,
Packit b099d7
    /* callback_private   */   NULL,
Packit b099d7
    /* tm_table           */   defTranslations,
Packit b099d7
    /* query_geometry     */   NULL,
Packit b099d7
    NULL,                             /* display_accelerator   */
Packit b099d7
    (XtPointer)&SashBaseClassExtRec, /* extension             */
Packit b099d7
   },
Packit b099d7
Packit b099d7
   {
Packit b099d7
      XmInheritWidgetProc,   /* Primitive border_highlight   */
Packit b099d7
      XmInheritWidgetProc,   /* Primitive border_unhighlight */
Packit b099d7
      NULL,         /* translations                 */
Packit b099d7
      NULL,         /* arm_and_activate             */
Packit b099d7
      NULL,	    /* get resources                */
Packit b099d7
      0,	    /* num get_resources            */
Packit b099d7
      NULL,         /* extension                    */
Packit b099d7
   },
Packit b099d7
Packit b099d7
   {
Packit b099d7
      (XtPointer) NULL,         /* extension        */
Packit b099d7
   }
Packit b099d7
Packit b099d7
};
Packit b099d7
Packit b099d7
externaldef(xmsashwidgetclass) WidgetClass xmSashWidgetClass =
Packit b099d7
					         (WidgetClass) &xmSashClassRec;
Packit b099d7

Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  ClassPartInitialize
Packit b099d7
 *    Set up the fast subclassing for the widget.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
static void 
Packit b099d7
ClassPartInitialize(
Packit b099d7
        WidgetClass wc )
Packit b099d7
{
Packit b099d7
   _XmFastSubclassInit(wc, XmSASH_BIT);
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  ClassInitialize
Packit b099d7
 *    Initialize the primitive part of class structure with 
Packit b099d7
 *    routines to do special highlight & unhighlight for Sash.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
static void 
Packit b099d7
ClassInitialize( void )
Packit b099d7
{
Packit b099d7
   xmSashClassRec.primitive_class.border_highlight =
Packit b099d7
                  HighlightSash;
Packit b099d7
   xmSashClassRec.primitive_class.border_unhighlight = 
Packit b099d7
                  UnhighlightSash;
Packit b099d7
   SashBaseClassExtRec.record_type = XmQmotif;
Packit b099d7
}
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
Initialize(
Packit b099d7
        Widget rw,
Packit b099d7
        Widget nw,
Packit b099d7
        ArgList args,		/* unused */
Packit b099d7
        Cardinal *num_args )	/* unused */
Packit b099d7
{
Packit b099d7
        XmSashWidget request = (XmSashWidget) rw ;
Packit b099d7
        XmSashWidget new_w = (XmSashWidget) nw ;
Packit b099d7
  if (request->core.width == 0)
Packit b099d7
     new_w->core.width += SASHSIZE;
Packit b099d7
  if (request->core.height == 0)
Packit b099d7
     new_w->core.height += SASHSIZE;
Packit b099d7
  new_w->sash.has_focus = False;
Packit b099d7
}
Packit b099d7
Packit b099d7
static void 
Packit b099d7
HighlightSash(
Packit b099d7
        Widget sash )
Packit b099d7
{
Packit b099d7
  int x, y;
Packit b099d7
  
Packit b099d7
  x = y = ((XmSashWidget) sash)->primitive.shadow_thickness;
Packit b099d7
  
Packit b099d7
  XFillRectangle( XtDisplay( sash), XtWindow( sash),
Packit b099d7
                   ((XmSashWidget) sash)->primitive.highlight_GC,
Packit b099d7
                   x,y, sash->core.width-(2*x), sash->core.height-(2*y));
Packit b099d7
}
Packit b099d7
Packit b099d7
static void 
Packit b099d7
UnhighlightSash(
Packit b099d7
        Widget sash )
Packit b099d7
{
Packit b099d7
  int x, y;
Packit b099d7
  
Packit b099d7
  x = y = ((XmSashWidget) sash)->primitive.shadow_thickness;
Packit b099d7
Packit b099d7
  XClearArea( XtDisplay( sash), XtWindow( sash),
Packit b099d7
                   x,y, sash->core.width-(2*x), sash->core.height-(2*y),
Packit b099d7
	           FALSE);
Packit b099d7
}
Packit b099d7
Packit b099d7
static XmNavigability
Packit b099d7
WidgetNavigable(
Packit b099d7
        Widget wid)
Packit b099d7
{   
Packit b099d7
  if(    _XmShellIsExclusive( wid)    )
Packit b099d7
    {
Packit b099d7
      /* Preserve 1.0 behavior.  (Why?  Don't ask me!)
Packit b099d7
       */
Packit b099d7
      return XmNOT_NAVIGABLE ;
Packit b099d7
    }
Packit b099d7
  if(    XtIsSensitive(wid)
Packit b099d7
     &&  ((XmPrimitiveWidget) wid)->primitive.traversal_on    )
Packit b099d7
    {   
Packit b099d7
      XmNavigationType nav_type = ((XmPrimitiveWidget) wid)
Packit b099d7
	                                          ->primitive.navigation_type ;
Packit b099d7
      if(    (nav_type == XmSTICKY_TAB_GROUP)
Packit b099d7
	 ||  (nav_type == XmEXCLUSIVE_TAB_GROUP)
Packit b099d7
	 ||  (    (nav_type == XmTAB_GROUP)
Packit b099d7
	      &&  !_XmShellIsExclusive( wid))    )
Packit b099d7
	{
Packit b099d7
	  return XmTAB_NAVIGABLE ;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
  return XmNOT_NAVIGABLE ;
Packit b099d7
}
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void 
Packit b099d7
SashFocusIn(
Packit b099d7
        Widget w,
Packit b099d7
        XEvent *event,
Packit b099d7
        char **params,
Packit b099d7
        Cardinal *num_params )
Packit b099d7
{
Packit b099d7
    register XmSashWidget sash = (XmSashWidget) w;
Packit b099d7
Packit b099d7
    if (event->xany.type != FocusIn || !event->xfocus.send_event)
Packit b099d7
          return;
Packit b099d7
Packit b099d7
    if (_XmGetFocusPolicy( (Widget) sash) == XmEXPLICIT)
Packit b099d7
       HighlightSash(w);
Packit b099d7
Packit b099d7
Packit b099d7
    XmeDrawShadows (XtDisplay (w), XtWindow (w),
Packit b099d7
                     sash->primitive.top_shadow_GC,
Packit b099d7
                     sash->primitive.bottom_shadow_GC,
Packit b099d7
                     0,0,w->core.width, w->core.height,
Packit b099d7
                     sash->primitive.shadow_thickness,
Packit b099d7
		     XmSHADOW_OUT);
Packit b099d7
Packit b099d7
    sash->sash.has_focus = True;
Packit b099d7
}
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void 
Packit b099d7
SashFocusOut(
Packit b099d7
        Widget w,
Packit b099d7
        XEvent *event,
Packit b099d7
        char **params,
Packit b099d7
        Cardinal *num_params )
Packit b099d7
{
Packit b099d7
    register XmSashWidget sash = (XmSashWidget) w;
Packit b099d7
Packit b099d7
    if (event->xany.type != FocusOut || !event->xfocus.send_event)
Packit b099d7
          return;
Packit b099d7
Packit b099d7
    if (_XmGetFocusPolicy( (Widget) sash) == XmEXPLICIT)
Packit b099d7
       UnhighlightSash(w);
Packit b099d7
Packit b099d7
    XmeDrawShadows (XtDisplay (w), XtWindow (w),
Packit b099d7
                     sash->primitive.top_shadow_GC,
Packit b099d7
                     sash->primitive.bottom_shadow_GC,
Packit b099d7
                     0,0,w->core.width, w->core.height,
Packit b099d7
                     sash->primitive.shadow_thickness,
Packit b099d7
		     XmSHADOW_OUT);
Packit b099d7
Packit b099d7
    sash->sash.has_focus = False;
Packit b099d7
}
Packit b099d7
Packit b099d7
static void 
Packit b099d7
SashAction(
Packit b099d7
        Widget widget,
Packit b099d7
        XEvent *event,
Packit b099d7
        String *params,
Packit b099d7
        Cardinal *num_params )
Packit b099d7
{
Packit b099d7
    register XmSashWidget sash = (XmSashWidget) widget;
Packit b099d7
    SashCallDataRec call_data;
Packit b099d7
Packit b099d7
    call_data.event = event;
Packit b099d7
    call_data.params = params;
Packit b099d7
    call_data.num_params = *num_params;
Packit b099d7
Packit b099d7
    XtCallCallbackList(widget, sash->sash.sash_action, (XtPointer)&call_data);
Packit b099d7
}
Packit b099d7
Packit b099d7
static void 
Packit b099d7
Realize(
Packit b099d7
        register Widget w,
Packit b099d7
        XtValueMask *p_valueMask,
Packit b099d7
        XSetWindowAttributes *attributes )
Packit b099d7
{
Packit b099d7
	XmDisplay   dd = (XmDisplay) XmGetXmDisplay(XtDisplay(w));
Packit b099d7
	Cursor SashCursor = 
Packit b099d7
		((XmDisplayInfo *)(dd->display.displayInfo))->SashCursor;
Packit b099d7
	
Packit b099d7
	if (0L == SashCursor)
Packit b099d7
		{
Packit b099d7
		/* create some data shared among all instances on this 
Packit b099d7
		** display; the first one along can create it, and 
Packit b099d7
		** any one can remove it; note no reference count
Packit b099d7
		*/
Packit b099d7
        	SashCursor = 
Packit b099d7
		((XmDisplayInfo *)(dd->display.displayInfo))->SashCursor = 
Packit b099d7
			XCreateFontCursor(XtDisplay(w), XC_crosshair);
Packit b099d7
		XtAddCallback((Widget)dd, XtNdestroyCallback, 
Packit b099d7
			SashDisplayDestroyCallback, (XtPointer) NULL);
Packit b099d7
		}
Packit b099d7
Packit b099d7
	attributes->cursor = SashCursor;
Packit b099d7
	XtCreateWindow (w, InputOutput, CopyFromParent, 
Packit b099d7
		*p_valueMask | CWCursor, attributes);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
SashDisplayDestroyCallback 
Packit b099d7
	( Widget w,
Packit b099d7
        XtPointer client_data,	/* unused */
Packit b099d7
        XtPointer call_data )	/* unused */
Packit b099d7
{
Packit b099d7
	XmDisplay   dd = (XmDisplay) XmGetXmDisplay(XtDisplay(w));
Packit b099d7
	Cursor SashCursor;
Packit b099d7
        if ((XmDisplay)NULL != dd)
Packit b099d7
	{
Packit b099d7
	  SashCursor  = 
Packit b099d7
		((XmDisplayInfo *)(dd->display.displayInfo))->SashCursor;
Packit b099d7
	    if (0L != SashCursor)
Packit b099d7
		{
Packit b099d7
			XFreeCursor(XtDisplay(w), SashCursor);
Packit b099d7
			/*
Packit b099d7
			((XmDisplayInfo *)(dd->display.displayInfo))->SashCursor= 0L;
Packit b099d7
			*/
Packit b099d7
		}
Packit b099d7
	}
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  Redisplay (w, event)
Packit b099d7
 *
Packit b099d7
 *   Description:
Packit b099d7
 *   -----------
Packit b099d7
 *     Cause the widget, identified by w, to be redisplayed.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *   Inputs:
Packit b099d7
 *   ------
Packit b099d7
 *     w = widget to be redisplayed;
Packit b099d7
 *     event = event structure identifying need for redisplay on this
Packit b099d7
 *             widget.
Packit b099d7
 * 
Packit b099d7
 *   Outputs:
Packit b099d7
 *   -------
Packit b099d7
 *
Packit b099d7
 *   Procedures Called
Packit b099d7
 *   -----------------
Packit b099d7
 *   DrawToggle()
Packit b099d7
 *   XDrawString()
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void 
Packit b099d7
Redisplay(
Packit b099d7
        Widget w,
Packit b099d7
        XEvent *event,
Packit b099d7
        Region region )
Packit b099d7
{
Packit b099d7
   register XmSashWidget sash = (XmSashWidget) w;
Packit b099d7
Packit b099d7
     XmeDrawShadows (XtDisplay (w), XtWindow (w), 
Packit b099d7
                      sash->primitive.top_shadow_GC,
Packit b099d7
                      sash->primitive.bottom_shadow_GC, 
Packit b099d7
		      0,0,w->core.width, w->core.height,
Packit b099d7
                      sash->primitive.shadow_thickness,
Packit b099d7
		      XmSHADOW_OUT);
Packit b099d7
Packit b099d7
     if (sash->sash.has_focus) HighlightSash(w);
Packit b099d7
}