mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-05 16:46:26 +00:00
1133 lines
31 KiB
C
1133 lines
31 KiB
C
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
*
|
|
* The contents of this file are subject to the Netscape Public License
|
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
|
* http://www.mozilla.org/NPL/
|
|
*
|
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
|
* for the specific language governing rights and limitations under the
|
|
* NPL.
|
|
*
|
|
* The Initial Developer of this code under the NPL is Netscape
|
|
* Communications Corporation. Portions created by Netscape are
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
|
* Reserved.
|
|
*/
|
|
/*-----------------------------------------*/
|
|
/* */
|
|
/* Name: <Xfe/Oriented.c> */
|
|
/* Description: XfeToolScroll widget source. */
|
|
/* Author: Ramiro Estrugo <ramiro@netscape.com> */
|
|
/* */
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
|
|
#include <Xfe/OrientedP.h>
|
|
#include <Xfe/Primitive.h>
|
|
|
|
#define MESSAGE1 "Widget is not an XfeOriented."
|
|
#define MESSAGE2 "XmNcursorOn is a read-only resource."
|
|
#define MESSAGE3 "The XfeOriented widget is not alive."
|
|
#define MESSAGE4 "The descendant '%s' is not alive."
|
|
|
|
#define DESCENDANT_CURSOR_EVENTS (EnterWindowMask | \
|
|
LeaveWindowMask | \
|
|
PointerMotionMask)
|
|
|
|
#define DESCENDANT_DRAG_EVENTS (ButtonPressMask | \
|
|
ButtonReleaseMask | \
|
|
Button1MotionMask)
|
|
|
|
#define CURSOR_EVENTS (EnterWindowMask | \
|
|
LeaveWindowMask | \
|
|
PointerMotionMask)
|
|
|
|
#define DRAG_EVENTS (ButtonPressMask | \
|
|
ButtonReleaseMask | \
|
|
Button1MotionMask)
|
|
|
|
#define HOR_CURSOR "sb_h_double_arrow"
|
|
#define VER_CURSOR "sb_v_double_arrow"
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* */
|
|
/* Core class methods */
|
|
/* */
|
|
/*----------------------------------------------------------------------*/
|
|
static void Initialize (Widget,Widget,ArgList,Cardinal *);
|
|
static void ClassPartInit (WidgetClass);
|
|
static void Destroy (Widget);
|
|
static Boolean SetValues (Widget,Widget,Widget,ArgList,Cardinal *);
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* */
|
|
/* Constraint class methods */
|
|
/* */
|
|
/*----------------------------------------------------------------------*/
|
|
static void ConstraintInitialize(Widget,Widget,ArgList,Cardinal *);
|
|
static Boolean ConstraintSetValues (Widget,Widget,Widget,ArgList,Cardinal *);
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* */
|
|
/* XfeOriented class methods */
|
|
/* */
|
|
/*----------------------------------------------------------------------*/
|
|
static void EnterProc (Widget,Widget,int,int);
|
|
static void LeaveProc (Widget,Widget,int,int);
|
|
static void DescendantEnterProc (Widget,Widget,int,int);
|
|
static void DescendantLeaveProc (Widget,Widget,int,int);
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* */
|
|
/* Misc functions */
|
|
/* */
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* */
|
|
/* Event handlers */
|
|
/* */
|
|
/*----------------------------------------------------------------------*/
|
|
static void CursorEH (Widget,XtPointer,XEvent *,Boolean *);
|
|
static void DragEH (Widget,XtPointer,XEvent *,Boolean *);
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* */
|
|
/* Descendant event handlers */
|
|
/* */
|
|
/*----------------------------------------------------------------------*/
|
|
static void DescendantCursorEH (Widget,XtPointer,XEvent *,Boolean *);
|
|
static void DescendantDragEH (Widget,XtPointer,XEvent *,Boolean *);
|
|
|
|
static void DescendantPrimitiveCursorCB (Widget,XtPointer,XtPointer);
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* */
|
|
/* XfeOriented Resources */
|
|
/* */
|
|
/*----------------------------------------------------------------------*/
|
|
static XtResource resources[] =
|
|
{
|
|
/* Orientation resources */
|
|
{
|
|
XmNorientation,
|
|
XmCOrientation,
|
|
XmROrientation,
|
|
sizeof(unsigned char),
|
|
XtOffsetOf(XfeOrientedRec , xfe_oriented . orientation),
|
|
XmRImmediate,
|
|
(XtPointer) XmHORIZONTAL
|
|
},
|
|
|
|
/* Drag resources */
|
|
{
|
|
XmNallowDrag,
|
|
XmCBoolean,
|
|
XmRBoolean,
|
|
sizeof(Boolean),
|
|
XtOffsetOf(XfeOrientedRec , xfe_oriented . allow_drag),
|
|
XmRImmediate,
|
|
(XtPointer) False
|
|
},
|
|
{
|
|
XmNdragInProgress,
|
|
XmCDragInProgress,
|
|
XmRBoolean,
|
|
sizeof(Boolean),
|
|
XtOffsetOf(XfeOrientedRec , xfe_oriented . drag_in_progress),
|
|
XmRImmediate,
|
|
(XtPointer) False
|
|
},
|
|
|
|
{
|
|
XmNcursorOn,
|
|
XmCReadOnly,
|
|
XmRBoolean,
|
|
sizeof(Boolean),
|
|
XtOffsetOf(XfeOrientedRec , xfe_oriented . cursor_on),
|
|
XmRImmediate,
|
|
(XtPointer) False
|
|
},
|
|
|
|
/* Cursor resources */
|
|
{
|
|
XmNverticalCursor,
|
|
XmCVerticalCursor,
|
|
XmRCursor,
|
|
sizeof(Cursor),
|
|
XtOffsetOf(XfeOrientedRec , xfe_oriented . vertical_cursor),
|
|
XmRString,
|
|
VER_CURSOR
|
|
},
|
|
{
|
|
XmNhorizontalCursor,
|
|
XmCHorizontalCursor,
|
|
XmRCursor,
|
|
sizeof(Cursor),
|
|
XtOffsetOf(XfeOrientedRec , xfe_oriented . horizontal_cursor),
|
|
XmRString,
|
|
HOR_CURSOR
|
|
},
|
|
|
|
/* Spacing resources */
|
|
{
|
|
XmNspacing,
|
|
XmCSpacing,
|
|
XmRHorizontalDimension,
|
|
sizeof(Dimension),
|
|
XtOffsetOf(XfeOrientedRec , xfe_oriented . spacing),
|
|
XmRImmediate,
|
|
(XtPointer) 1
|
|
},
|
|
};
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* */
|
|
/* XfeToolBar Synthetic Resources */
|
|
/* */
|
|
/*----------------------------------------------------------------------*/
|
|
static XmSyntheticResource syn_resources[] =
|
|
{
|
|
{
|
|
XmNspacing,
|
|
sizeof(Dimension),
|
|
XtOffsetOf(XfeOrientedRec , xfe_oriented . spacing),
|
|
_XmFromHorizontalPixels,
|
|
_XmToHorizontalPixels
|
|
},
|
|
};
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* */
|
|
/* XfeOriented constraint resources */
|
|
/* */
|
|
/*----------------------------------------------------------------------*/
|
|
static XtResource constraint_resources[] =
|
|
{
|
|
{
|
|
XmNallowDrag,
|
|
XmCBoolean,
|
|
XmRBoolean,
|
|
sizeof(Boolean),
|
|
XtOffsetOf(XfeOrientedConstraintRec , xfe_oriented . allow_drag),
|
|
XmRImmediate,
|
|
(XtPointer) False
|
|
},
|
|
};
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* */
|
|
/* Widget Class Record Initialization */
|
|
/* */
|
|
/*----------------------------------------------------------------------*/
|
|
_XFE_WIDGET_CLASS_RECORD(oriented,Oriented) =
|
|
{
|
|
{
|
|
(WidgetClass) &xfeManagerClassRec, /* superclass */
|
|
"XfeOriented", /* class_name */
|
|
sizeof(XfeOrientedRec), /* widget_size */
|
|
NULL, /* class_initialize */
|
|
ClassPartInit, /* class_part_initialize*/
|
|
FALSE, /* class_inited */
|
|
Initialize, /* initialize */
|
|
NULL, /* initialize_hook */
|
|
XtInheritRealize, /* realize */
|
|
NULL, /* actions */
|
|
0, /* num_actions */
|
|
resources, /* resources */
|
|
XtNumber(resources), /* num_resources */
|
|
NULLQUARK, /* xrm_class */
|
|
TRUE, /* compress_motion */
|
|
XtExposeCompressMaximal, /* compress_exposure */
|
|
TRUE, /* compress_enterleave */
|
|
FALSE, /* visible_interest */
|
|
Destroy, /* destroy */
|
|
XtInheritResize, /* resize */
|
|
XtInheritExpose, /* expose */
|
|
SetValues, /* set_values */
|
|
NULL, /* set_values_hook */
|
|
XtInheritSetValuesAlmost, /* set_values_almost */
|
|
NULL, /* get_values_hook */
|
|
NULL, /* accexfe_focus */
|
|
XtVersion, /* version */
|
|
NULL, /* callback_private */
|
|
XtInheritTranslations, /* tm_table */
|
|
XtInheritQueryGeometry, /* query_geometry */
|
|
XtInheritDisplayAccelerator, /* display accel */
|
|
NULL, /* extension */
|
|
},
|
|
|
|
/* Composite Part */
|
|
{
|
|
XtInheritGeometryManager, /* geometry_manager */
|
|
XtInheritChangeManaged, /* change_managed */
|
|
XtInheritInsertChild, /* insert_child */
|
|
XtInheritDeleteChild, /* delete_child */
|
|
NULL /* extension */
|
|
},
|
|
|
|
/* Constraint Part */
|
|
{
|
|
constraint_resources, /* constraint res */
|
|
XtNumber(constraint_resources), /* num constraint res */
|
|
sizeof(XfeOrientedConstraintRec), /* constraint size */
|
|
ConstraintInitialize, /* init proc */
|
|
NULL, /* destroy proc */
|
|
ConstraintSetValues, /* set values proc */
|
|
NULL, /* extension */
|
|
},
|
|
|
|
/* XmManager Part */
|
|
{
|
|
XtInheritTranslations, /* tm_table */
|
|
syn_resources, /* syn resources */
|
|
XtNumber(syn_resources), /* num syn_resources */
|
|
NULL, /* syn_cont_resources */
|
|
0, /* num_syn_cont_resource*/
|
|
XmInheritParentProcess, /* parent_process */
|
|
NULL, /* extension */
|
|
},
|
|
|
|
/* XfeManager Part */
|
|
{
|
|
XfeInheritBitGravity, /* bit_gravity */
|
|
XfeInheritPreferredGeometry, /* preferred_geometry */
|
|
XfeInheritMinimumGeometry, /* minimum_geometry */
|
|
XfeInheritUpdateRect, /* update_rect */
|
|
NULL, /* accept_child */
|
|
NULL, /* insert_child */
|
|
NULL, /* delete_child */
|
|
NULL, /* change_managed */
|
|
NULL, /* prepare_components */
|
|
NULL, /* layout_components */
|
|
NULL, /* layout_children */
|
|
NULL, /* draw_background */
|
|
XfeInheritDrawShadow, /* draw_shadow */
|
|
NULL, /* draw_components */
|
|
False, /* count_layable_children*/
|
|
NULL, /* child_is_layable */
|
|
NULL, /* extension */
|
|
},
|
|
|
|
/* XfeOriented Part */
|
|
{
|
|
EnterProc, /* enter */
|
|
LeaveProc, /* leave */
|
|
NULL, /* motion */
|
|
NULL, /* drag_start */
|
|
NULL, /* drag_end */
|
|
NULL, /* drag_motion */
|
|
DescendantEnterProc, /* des_enter */
|
|
DescendantLeaveProc, /* des_leave */
|
|
NULL, /* des_motion */
|
|
NULL, /* des_drag_start */
|
|
NULL, /* des_drag_end */
|
|
NULL, /* des_drag_motion */
|
|
NULL, /* extension */
|
|
},
|
|
};
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* */
|
|
/* xfeOrientedWidgetClassdeclaration. */
|
|
/* */
|
|
/*----------------------------------------------------------------------*/
|
|
_XFE_WIDGET_CLASS(oriented,Oriented);
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* */
|
|
/* Core class methods */
|
|
/* */
|
|
/*----------------------------------------------------------------------*/
|
|
static void
|
|
ClassPartInit(WidgetClass wc)
|
|
{
|
|
XfeOrientedWidgetClass cc = (XfeOrientedWidgetClass) wc;
|
|
XfeOrientedWidgetClass sc = (XfeOrientedWidgetClass) wc->core_class.superclass;
|
|
|
|
_XfeResolve(cc,sc,xfe_oriented_class,enter,
|
|
XfeInheritEnter);
|
|
|
|
_XfeResolve(cc,sc,xfe_oriented_class,leave,
|
|
XfeInheritLeave);
|
|
|
|
_XfeResolve(cc,sc,xfe_oriented_class,motion,
|
|
XfeInheritMotion);
|
|
|
|
_XfeResolve(cc,sc,xfe_oriented_class,drag_start,
|
|
XfeInheritDragStart);
|
|
|
|
_XfeResolve(cc,sc,xfe_oriented_class,drag_end,
|
|
XfeInheritDragEnd);
|
|
|
|
_XfeResolve(cc,sc,xfe_oriented_class,drag_motion,
|
|
XfeInheritDragMotion);
|
|
|
|
_XfeResolve(cc,sc,xfe_oriented_class,descendant_enter,
|
|
XfeInheritDescendantEnter);
|
|
|
|
_XfeResolve(cc,sc,xfe_oriented_class,descendant_leave,
|
|
XfeInheritDescendantLeave);
|
|
|
|
_XfeResolve(cc,sc,xfe_oriented_class,descendant_motion,
|
|
XfeInheritDescendantMotion);
|
|
|
|
_XfeResolve(cc,sc,xfe_oriented_class,descendant_drag_start,
|
|
XfeInheritDescendantDragStart);
|
|
|
|
_XfeResolve(cc,sc,xfe_oriented_class,descendant_drag_end,
|
|
XfeInheritDescendantDragEnd);
|
|
|
|
_XfeResolve(cc,sc,xfe_oriented_class,descendant_drag_motion,
|
|
XfeInheritDescendantDragMotion);
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
static void
|
|
Initialize(Widget rw,Widget nw,ArgList args,Cardinal *nargs)
|
|
{
|
|
XfeOrientedPart * op = _XfeOrientedPart(nw);
|
|
|
|
/* Make sure rep types are ok */
|
|
XfeRepTypeCheck(nw,XmROrientation,&op->orientation,XmHORIZONTAL);
|
|
|
|
/* Set the allow_drag state for the first time */
|
|
XfeOrientedSetAllowDrag(nw,op->allow_drag);
|
|
|
|
/* Initialize other private members */
|
|
op->drag_start_x = 0;
|
|
op->drag_start_y = 0;
|
|
|
|
/* Finish of initialization */
|
|
_XfeManagerChainInitialize(rw,nw,xfeOrientedWidgetClass);
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
static void
|
|
Destroy(Widget w)
|
|
{
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
static Boolean
|
|
SetValues(Widget ow,Widget rw,Widget nw,ArgList args,Cardinal *nargs)
|
|
{
|
|
XfeOrientedPart * np = _XfeOrientedPart(nw);
|
|
XfeOrientedPart * op = _XfeOrientedPart(ow);
|
|
|
|
/* cursor_on */
|
|
if (np->cursor_on != op->cursor_on)
|
|
{
|
|
np->cursor_on = op->cursor_on;
|
|
|
|
_XfeWarning(nw,MESSAGE2);
|
|
}
|
|
|
|
/* orientation */
|
|
if (np->orientation != op->orientation)
|
|
{
|
|
/* Make sure the new orientation is ok */
|
|
XfeRepTypeCheck(nw,XmROrientation,&np->orientation,XmHORIZONTAL);
|
|
|
|
_XfemConfigFlags(nw) |= XfeConfigGLE;
|
|
}
|
|
|
|
/* spacing */
|
|
if (np->spacing != op->spacing)
|
|
{
|
|
_XfemConfigFlags(nw) |= XfeConfigGLE;
|
|
}
|
|
|
|
/* allow_drag */
|
|
if (np->allow_drag != op->allow_drag)
|
|
{
|
|
XfeOrientedSetAllowDrag(nw,np->allow_drag);
|
|
}
|
|
|
|
return _XfeManagerChainSetValues(ow,rw,nw,xfeOrientedWidgetClass);
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* */
|
|
/* Constraint class methods */
|
|
/* */
|
|
/*----------------------------------------------------------------------*/
|
|
static void
|
|
ConstraintInitialize(Widget rc,Widget nc,ArgList av,Cardinal * ac)
|
|
{
|
|
Widget w = _XfeParent(nc);
|
|
XfeOrientedConstraintPart * cp = _XfeOrientedConstraintPart(nc);
|
|
|
|
XfeOrientedDescendantSetAllowDrag(w,nc,cp->allow_drag);
|
|
|
|
/* Finish constraint initialization */
|
|
_XfeConstraintChainInitialize(rc,nc,xfeOrientedWidgetClass);
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
static Boolean
|
|
ConstraintSetValues(Widget oc,Widget rc,Widget nc,ArgList av,Cardinal * ac)
|
|
{
|
|
Widget w = XtParent(nc);
|
|
XfeOrientedConstraintPart * ncp = _XfeOrientedConstraintPart(nc);
|
|
XfeOrientedConstraintPart * ocp = _XfeOrientedConstraintPart(oc);
|
|
|
|
/* allow_drag */
|
|
if (ncp->allow_drag != ocp->allow_drag)
|
|
{
|
|
XfeOrientedDescendantSetAllowDrag(w,nc,ncp->allow_drag);
|
|
}
|
|
|
|
/* Finish constraint set values */
|
|
return _XfeConstraintChainSetValues(oc,rc,nc,xfeOrientedWidgetClass);
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* */
|
|
/* XfeOriented class methods */
|
|
/* */
|
|
/*----------------------------------------------------------------------*/
|
|
static void
|
|
EnterProc(Widget w,Widget descendant,int x,int y)
|
|
{
|
|
_XfeOrientedSetCursorState(w,True);
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
static void
|
|
LeaveProc(Widget w,Widget descendant,int x,int y)
|
|
{
|
|
_XfeOrientedSetCursorState(w,False);
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
static void
|
|
DescendantEnterProc(Widget w,Widget descendant,int x,int y)
|
|
{
|
|
_XfeOrientedSetCursorState(w,True);
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
static void
|
|
DescendantLeaveProc(Widget w,Widget descendant,int x,int y)
|
|
{
|
|
_XfeOrientedSetCursorState(w,False);
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* */
|
|
/* Misc functions */
|
|
/* */
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* */
|
|
/* Dragging event handlers */
|
|
/* */
|
|
/*----------------------------------------------------------------------*/
|
|
static void
|
|
CursorEH(Widget oriented,
|
|
XtPointer client_data,
|
|
XEvent * event,
|
|
Boolean * cont)
|
|
{
|
|
Widget w = (Widget) client_data;
|
|
XfeOrientedPart * op = _XfeOrientedPart(w);
|
|
int x;
|
|
int y;
|
|
|
|
/* If a drag is in progress, dont change the cursor */
|
|
if (op->drag_in_progress)
|
|
{
|
|
return;
|
|
}
|
|
|
|
/* Obtain the coords for the event */
|
|
XfeEventGetXY(event,&x,&y);
|
|
|
|
/* Enter */
|
|
if (event->type == EnterNotify)
|
|
{
|
|
_XfeOrientedEnter(w,NULL,x,y);
|
|
}
|
|
/* Leave */
|
|
else if (event->type == LeaveNotify)
|
|
{
|
|
_XfeOrientedLeave(w,NULL,x,y);
|
|
}
|
|
/* Motion */
|
|
else if (event->type == MotionNotify)
|
|
{
|
|
_XfeOrientedMotion(w,NULL,x,y);
|
|
}
|
|
|
|
*cont = True;
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
static void
|
|
DragEH(Widget oriented,
|
|
XtPointer client_data,
|
|
XEvent * event,
|
|
Boolean * cont)
|
|
{
|
|
Widget w = (Widget) client_data;
|
|
XfeOrientedPart * op = _XfeOrientedPart(w);
|
|
int x;
|
|
int y;
|
|
|
|
/* Obtain the coords for the event */
|
|
XfeEventGetXY(event,&x,&y);
|
|
|
|
switch(event->type)
|
|
{
|
|
case ButtonPress:
|
|
|
|
/* Make sure a drag is not already in progress */
|
|
if (!op->drag_in_progress)
|
|
{
|
|
op->drag_in_progress = True;
|
|
|
|
op->drag_start_x = x;
|
|
op->drag_start_y = y;
|
|
|
|
_XfeOrientedDragStart(w,NULL,x,y);
|
|
}
|
|
|
|
break;
|
|
|
|
case ButtonRelease:
|
|
|
|
/* Make sure a drag is indeed in progress */
|
|
if (op->drag_in_progress)
|
|
{
|
|
op->drag_in_progress = False;
|
|
|
|
_XfeOrientedDragEnd(w,NULL,x,y);
|
|
}
|
|
|
|
break;
|
|
|
|
case MotionNotify:
|
|
|
|
/* Make sure a drag is indeed in progress */
|
|
if (op->drag_in_progress)
|
|
{
|
|
op->drag_in_progress = True;
|
|
|
|
_XfeOrientedDragMotion(w,NULL,x,y);
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
*cont = True;
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* */
|
|
/* Descendant event handlers */
|
|
/* */
|
|
/*----------------------------------------------------------------------*/
|
|
static void
|
|
DescendantCursorEH(Widget descendant,
|
|
XtPointer client_data,
|
|
XEvent * event,
|
|
Boolean * cont)
|
|
{
|
|
Widget w = (Widget) client_data;
|
|
XfeOrientedPart * op = _XfeOrientedPart(w);
|
|
int root_x;
|
|
int root_y;
|
|
int x;
|
|
int y;
|
|
|
|
/* If a drag is in progress, dont change the cursor */
|
|
if (op->drag_in_progress)
|
|
{
|
|
return;
|
|
}
|
|
|
|
/* Obtain the root coords for the event */
|
|
XfeEventGetRootXY(event,&root_x,&root_y);
|
|
|
|
/* Compute coords relative to the oriented widget */
|
|
x = root_x - XfeRootX(w);
|
|
y = root_y - XfeRootY(w);
|
|
|
|
/* Enter */
|
|
if (event->type == EnterNotify)
|
|
{
|
|
_XfeOrientedDescendantEnter(w,descendant,x,y);
|
|
}
|
|
/* Leave */
|
|
else if (event->type == LeaveNotify)
|
|
{
|
|
_XfeOrientedDescendantLeave(w,descendant,x,y);
|
|
}
|
|
/* Motion */
|
|
else if (event->type == MotionNotify)
|
|
{
|
|
_XfeOrientedDescendantMotion(w,descendant,x,y);
|
|
}
|
|
|
|
*cont = True;
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
static void
|
|
DescendantDragEH(Widget descendant,
|
|
XtPointer client_data,
|
|
XEvent * event,
|
|
Boolean * cont)
|
|
{
|
|
Widget w = (Widget) client_data;
|
|
XfeOrientedPart * op = _XfeOrientedPart(w);
|
|
int root_x;
|
|
int root_y;
|
|
int x;
|
|
int y;
|
|
|
|
/* Obtain the root coords for the event */
|
|
XfeEventGetRootXY(event,&root_x,&root_y);
|
|
|
|
/* Compute coords relative to the oriented widget */
|
|
x = root_x - XfeRootX(w);
|
|
y = root_y - XfeRootY(w);
|
|
|
|
switch(event->type)
|
|
{
|
|
case ButtonPress:
|
|
|
|
/* Make sure a drag is not already in progress */
|
|
if (!op->drag_in_progress)
|
|
{
|
|
op->drag_in_progress = True;
|
|
|
|
op->drag_start_x = x;
|
|
op->drag_start_y = y;
|
|
|
|
_XfeOrientedDescendantDragStart(w,descendant,x,y);
|
|
}
|
|
|
|
break;
|
|
|
|
case ButtonRelease:
|
|
|
|
/* Make sure a drag is indeed in progress */
|
|
if (op->drag_in_progress)
|
|
{
|
|
op->drag_in_progress = False;
|
|
|
|
_XfeOrientedDescendantDragEnd(w,descendant,x,y);
|
|
}
|
|
|
|
break;
|
|
|
|
case MotionNotify:
|
|
|
|
/* Make sure a drag is indeed in progress */
|
|
if (op->drag_in_progress)
|
|
{
|
|
op->drag_in_progress = True;
|
|
|
|
_XfeOrientedDescendantDragMotion(w,descendant,x,y);
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
*cont = True;
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
static void
|
|
DescendantPrimitiveCursorCB(Widget descendant,
|
|
XtPointer client_data,
|
|
XtPointer call_data)
|
|
{
|
|
Widget w = (Widget) client_data;
|
|
XfeOrientedPart * op = _XfeOrientedPart(w);
|
|
|
|
XmAnyCallbackStruct * data = (XmAnyCallbackStruct *) call_data;
|
|
XEvent * event = data->event;
|
|
|
|
int root_x;
|
|
int root_y;
|
|
int x;
|
|
int y;
|
|
|
|
/* If a drag is in progress, dont change the cursor */
|
|
if (op->drag_in_progress)
|
|
{
|
|
return;
|
|
}
|
|
|
|
/* Obtain the root coords for the event */
|
|
XfeEventGetRootXY(event,&root_x,&root_y);
|
|
|
|
/* Compute coords relative to the oriented widget */
|
|
x = root_x - XfeRootX(w);
|
|
y = root_y - XfeRootY(w);
|
|
|
|
/* Enter */
|
|
if (data->reason == XmCR_ENTER)
|
|
{
|
|
_XfeOrientedDescendantEnter(w,descendant,x,y);
|
|
}
|
|
/* Leave */
|
|
else if (data->reason == XmCR_LEAVE)
|
|
{
|
|
_XfeOrientedDescendantLeave(w,descendant,x,y);
|
|
}
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* */
|
|
/* XfeOriented method invocation functions */
|
|
/* */
|
|
/*----------------------------------------------------------------------*/
|
|
/* extern */ void
|
|
_XfeOrientedEnter(Widget w,Widget descendant,int x,int y)
|
|
{
|
|
XfeOrientedWidgetClass oc = (XfeOrientedWidgetClass) XtClass(w);
|
|
|
|
if (oc->xfe_oriented_class.enter)
|
|
{
|
|
(*oc->xfe_oriented_class.enter)(w,descendant,x,y);
|
|
}
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
/* extern */ void
|
|
_XfeOrientedLeave(Widget w,Widget descendant,int x,int y)
|
|
{
|
|
XfeOrientedWidgetClass oc = (XfeOrientedWidgetClass) XtClass(w);
|
|
|
|
if (oc->xfe_oriented_class.leave)
|
|
{
|
|
(*oc->xfe_oriented_class.leave)(w,descendant,x,y);
|
|
}
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
/* extern */ void
|
|
_XfeOrientedMotion(Widget w,Widget descendant,int x,int y)
|
|
{
|
|
XfeOrientedWidgetClass oc = (XfeOrientedWidgetClass) XtClass(w);
|
|
|
|
if (oc->xfe_oriented_class.motion)
|
|
{
|
|
(*oc->xfe_oriented_class.motion)(w,descendant,x,y);
|
|
}
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
/* extern */ void
|
|
_XfeOrientedDragStart(Widget w,Widget descendant,int x,int y)
|
|
{
|
|
XfeOrientedWidgetClass oc = (XfeOrientedWidgetClass) XtClass(w);
|
|
|
|
if (oc->xfe_oriented_class.drag_start)
|
|
{
|
|
(*oc->xfe_oriented_class.drag_start)(w,descendant,x,y);
|
|
}
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
/* extern */ void
|
|
_XfeOrientedDragEnd(Widget w,Widget descendant,int x,int y)
|
|
{
|
|
XfeOrientedWidgetClass oc = (XfeOrientedWidgetClass) XtClass(w);
|
|
|
|
if (oc->xfe_oriented_class.drag_end)
|
|
{
|
|
(*oc->xfe_oriented_class.drag_end)(w,descendant,x,y);
|
|
}
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
/* extern */ void
|
|
_XfeOrientedDragMotion(Widget w,Widget descendant,int x,int y)
|
|
{
|
|
XfeOrientedWidgetClass oc = (XfeOrientedWidgetClass) XtClass(w);
|
|
|
|
if (oc->xfe_oriented_class.drag_motion)
|
|
{
|
|
(*oc->xfe_oriented_class.drag_motion)(w,descendant,x,y);
|
|
}
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
/* extern */ void
|
|
_XfeOrientedDescendantEnter(Widget w,Widget descendant,int x,int y)
|
|
{
|
|
XfeOrientedWidgetClass oc = (XfeOrientedWidgetClass) XtClass(w);
|
|
|
|
if (oc->xfe_oriented_class.descendant_enter)
|
|
{
|
|
(*oc->xfe_oriented_class.descendant_enter)(w,descendant,x,y);
|
|
}
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
/* extern */ void
|
|
_XfeOrientedDescendantLeave(Widget w,Widget descendant,int x,int y)
|
|
{
|
|
XfeOrientedWidgetClass oc = (XfeOrientedWidgetClass) XtClass(w);
|
|
|
|
if (oc->xfe_oriented_class.descendant_leave)
|
|
{
|
|
(*oc->xfe_oriented_class.descendant_leave)(w,descendant,x,y);
|
|
}
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
/* extern */ void
|
|
_XfeOrientedDescendantMotion(Widget w,Widget descendant,int x,int y)
|
|
{
|
|
XfeOrientedWidgetClass oc = (XfeOrientedWidgetClass) XtClass(w);
|
|
|
|
if (oc->xfe_oriented_class.descendant_motion)
|
|
{
|
|
(*oc->xfe_oriented_class.descendant_motion)(w,descendant,x,y);
|
|
}
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
/* extern */ void
|
|
_XfeOrientedDescendantDragStart(Widget w,Widget descendant,int x,int y)
|
|
{
|
|
XfeOrientedWidgetClass oc = (XfeOrientedWidgetClass) XtClass(w);
|
|
|
|
if (oc->xfe_oriented_class.descendant_drag_start)
|
|
{
|
|
(*oc->xfe_oriented_class.descendant_drag_start)(w,descendant,x,y);
|
|
}
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
/* extern */ void
|
|
_XfeOrientedDescendantDragEnd(Widget w,Widget descendant,int x,int y)
|
|
{
|
|
XfeOrientedWidgetClass oc = (XfeOrientedWidgetClass) XtClass(w);
|
|
|
|
if (oc->xfe_oriented_class.descendant_drag_end)
|
|
{
|
|
(*oc->xfe_oriented_class.descendant_drag_end)(w,descendant,x,y);
|
|
}
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
/* extern */ void
|
|
_XfeOrientedDescendantDragMotion(Widget w,Widget descendant,int x,int y)
|
|
{
|
|
XfeOrientedWidgetClass oc = (XfeOrientedWidgetClass) XtClass(w);
|
|
|
|
if (oc->xfe_oriented_class.descendant_drag_motion)
|
|
{
|
|
(*oc->xfe_oriented_class.descendant_drag_motion)(w,descendant,x,y);
|
|
}
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* */
|
|
/* XfeOriented private Methods */
|
|
/* */
|
|
/*----------------------------------------------------------------------*/
|
|
/* extern */ void
|
|
_XfeOrientedSetCursorState(Widget w,Boolean state)
|
|
{
|
|
XfeOrientedPart * op = _XfeOrientedPart(w);
|
|
Cursor cursor;
|
|
|
|
assert( XfeIsOriented(w) );
|
|
assert( _XfeIsAlive(w) );
|
|
|
|
/* Vertical */
|
|
if (op->orientation == XmVERTICAL)
|
|
{
|
|
cursor = op->vertical_cursor;
|
|
}
|
|
/* Horizontal */
|
|
else
|
|
{
|
|
cursor = op->horizontal_cursor;
|
|
}
|
|
|
|
/* Make sure the cursor is good */
|
|
if (!_XfeCursorGood(cursor))
|
|
{
|
|
return;
|
|
}
|
|
|
|
/* On */
|
|
if (state)
|
|
{
|
|
/* Turn cursor on if needed */
|
|
if (!op->cursor_on)
|
|
{
|
|
op->cursor_on = True;
|
|
|
|
XfeCursorDefine(w,cursor);
|
|
}
|
|
}
|
|
/* Off */
|
|
else
|
|
{
|
|
/* Turn cursor off if needed */
|
|
if (op->cursor_on)
|
|
{
|
|
op->cursor_on = False;
|
|
|
|
XfeCursorUndefine(w);
|
|
}
|
|
}
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* */
|
|
/* XfeOriented public Methods */
|
|
/* */
|
|
/*----------------------------------------------------------------------*/
|
|
/* extern */ Boolean
|
|
XfeOrientedSetAllowDrag(Widget w,Boolean allow_drag)
|
|
{
|
|
assert( XfeIsOriented(w) );
|
|
assert( _XfeIsAlive(w) );
|
|
|
|
/* Make sure the oriented is alive */
|
|
if (!_XfeIsAlive(w))
|
|
{
|
|
_XfeWarning(w,MESSAGE3);
|
|
|
|
return False;
|
|
}
|
|
|
|
/* First remove any event handlers that might have been added */
|
|
XtRemoveEventHandler(w,
|
|
CURSOR_EVENTS,
|
|
True,
|
|
CursorEH,
|
|
w);
|
|
|
|
XtRemoveEventHandler(w,
|
|
DRAG_EVENTS,
|
|
True,
|
|
DragEH,
|
|
w);
|
|
|
|
/* Add the event handlers if needed */
|
|
if (allow_drag)
|
|
{
|
|
XtAddEventHandler(w,
|
|
CURSOR_EVENTS,
|
|
True,
|
|
CursorEH,
|
|
w);
|
|
|
|
XtAddEventHandler(w,
|
|
DRAG_EVENTS,
|
|
True,
|
|
DragEH,
|
|
w);
|
|
}
|
|
|
|
return True;
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
/* extern */ Boolean
|
|
XfeOrientedDescendantSetAllowDrag(Widget w,
|
|
Widget descendant,
|
|
Boolean allow_drag)
|
|
{
|
|
assert( XfeIsOriented(w) );
|
|
assert( _XfeIsAlive(w) );
|
|
assert( _XfeIsAlive(descendant) );
|
|
|
|
/* Make sure the oriented is alive */
|
|
if (!_XfeIsAlive(w))
|
|
{
|
|
_XfeWarning(w,MESSAGE3);
|
|
|
|
return False;
|
|
}
|
|
|
|
/* Make sure the descendant is alive */
|
|
if (!_XfeIsAlive(descendant))
|
|
{
|
|
_XfeArgWarning(w,MESSAGE4,descendant);
|
|
|
|
return False;
|
|
}
|
|
|
|
/* First remove any event handlers that might have been added */
|
|
if (XfeIsPrimitive(descendant))
|
|
{
|
|
XtRemoveCallback(descendant,
|
|
XmNenterCallback,
|
|
DescendantPrimitiveCursorCB,
|
|
w);
|
|
|
|
XtRemoveCallback(descendant,
|
|
XmNleaveCallback,
|
|
DescendantPrimitiveCursorCB,
|
|
w);
|
|
}
|
|
else
|
|
{
|
|
XtRemoveEventHandler(descendant,
|
|
DESCENDANT_CURSOR_EVENTS,
|
|
True,
|
|
DescendantCursorEH,
|
|
w);
|
|
}
|
|
|
|
/* Add the event handlers if needed */
|
|
if (allow_drag)
|
|
{
|
|
if (XfeIsPrimitive(descendant))
|
|
{
|
|
XtAddCallback(descendant,
|
|
XmNenterCallback,
|
|
DescendantPrimitiveCursorCB,
|
|
w);
|
|
|
|
XtAddCallback(descendant,
|
|
XmNleaveCallback,
|
|
DescendantPrimitiveCursorCB,
|
|
w);
|
|
}
|
|
else
|
|
{
|
|
XtAddEventHandler(descendant,
|
|
DESCENDANT_CURSOR_EVENTS,
|
|
True,
|
|
DescendantCursorEH,
|
|
w);
|
|
}
|
|
|
|
XtAddEventHandler(descendant,
|
|
DESCENDANT_DRAG_EVENTS,
|
|
True,
|
|
DescendantDragEH,
|
|
w);
|
|
}
|
|
|
|
|
|
return True;
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
static void
|
|
ApplyChildSetAllowDrag(Widget w,Widget child,XtPointer client_data)
|
|
{
|
|
XfeOrientedDescendantSetAllowDrag(w,child,(Boolean) client_data);
|
|
}
|
|
/*----------------------------------------------------------------------*/
|
|
/* extern */ void
|
|
XfeOrientedChildrenSetAllowDrag(Widget w,Boolean allow_drag)
|
|
{
|
|
assert( XfeIsOriented(w) );
|
|
assert( _XfeIsAlive(w) );
|
|
|
|
/* Make sure the oriented is alive */
|
|
if (!_XfeIsAlive(w))
|
|
{
|
|
_XfeWarning(w,MESSAGE3);
|
|
|
|
return;
|
|
}
|
|
|
|
XfeManagerApply(w,ApplyChildSetAllowDrag,(XtPointer) allow_drag,False);
|
|
}
|
|
/*----------------------------------------------------------------------*/
|