1 /*
2  * Copyright(c) 1992 Bell Communications Research, Inc. (Bellcore)
3  *                        All rights reserved
4  * Permission to use, copy, modify and distribute this material for
5  * any purpose and without fee is hereby granted, provided that the
6  * above copyright notice and this permission notice appear in all
7  * copies, and that the name of Bellcore not be used in advertising
8  * or publicity pertaining to this material without the specific,
9  * prior written permission of an authorized representative of
10  * Bellcore.
11  *
12  * BELLCORE MAKES NO REPRESENTATIONS AND EXTENDS NO WARRANTIES, EX-
13  * PRESS OR IMPLIED, WITH RESPECT TO THE SOFTWARE, INCLUDING, BUT
14  * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
15  * FITNESS FOR ANY PARTICULAR PURPOSE, AND THE WARRANTY AGAINST IN-
16  * FRINGEMENT OF PATENTS OR OTHER INTELLECTUAL PROPERTY RIGHTS.  THE
17  * SOFTWARE IS PROVIDED "AS IS", AND IN NO EVENT SHALL BELLCORE OR
18  * ANY OF ITS AFFILIATES BE LIABLE FOR ANY DAMAGES, INCLUDING ANY
19  * LOST PROFITS OR OTHER INCIDENTAL OR CONSEQUENTIAL DAMAGES RELAT-
20  * ING TO THE SOFTWARE.
21  *
22  * ClipWidget Author: Andrew Wason, Bellcore, aw@bae.bellcore.com
23  *
24  * $Id: Clip.c,v 1.1 1999/09/11 01:25:36 fnevgeny Exp $
25  */
26 
27 /*
28  * Clip.c - private child of Matrix - used to clip Matrix's textField child
29  */
30 
31 #ifdef HAVE_CONFIG_H
32 #include <config.h>
33 #endif
34 
35 #include <X11/StringDefs.h>
36 #include <Xm/XmP.h>
37 #include <Xbae/Macros.h>
38 #include <Xbae/ClipP.h>
39 
40 static char defaultTranslations[] =
41     "<FocusIn>:			FocusIn()";
42 
43 static XtResource resources[] = {
44     { XmNexposeProc, XmCFunction, XtRFunction, sizeof(XtExposeProc),
45       XtOffsetOf(XbaeClipRec, clip.expose_proc),
46       XtRFunction, (XtPointer) NULL },
47     { XmNfocusCallback, XmCCallback, XmRCallback, sizeof(XtCallbackList),
48       XtOffsetOf(XbaeClipRec, clip.focus_callback),
49       XtRImmediate, (XtPointer) NULL },
50 };
51 
52 /*
53  * Declaration of methods
54  */
55 static void ClassPartInitialize P((XbaeClipWidgetClass));
56 static void Realize P((XbaeClipWidget, XtValueMask *,
57 			XSetWindowAttributes *));
58 static void Redisplay P((XbaeClipWidget, XEvent *, Region));
59 static void Resize P((Widget));
60 static void Redraw P((XbaeClipWidget));
61 
62 /*
63  * Public convenience function
64  */
65 void XbaeClipRedraw P((Widget w));
66 
67 /*
68  * Clip actions
69  */
70 static void FocusInACT P((XbaeClipWidget, XEvent *, String *, Cardinal *));
71 
72 static XtActionsRec actions[] =
73 {
74     {"FocusIn", (XtActionProc)FocusInACT},
75 };
76 
77 XbaeClipClassRec xbaeClipClassRec = {
78     {
79     /* core_class fields */
80 	/* superclass		*/ (WidgetClass) &xmPrimitiveClassRec,
81 	/* class_name		*/ "XbaeClip",
82 	/* widget_size		*/ sizeof(XbaeClipRec),
83 	/* class_initialize	*/ NULL,
84 	/* class_part_initialize*/ (XtWidgetClassProc)ClassPartInitialize,
85 	/* class_inited		*/ False,
86 	/* initialize		*/ NULL,
87 	/* initialize_hook	*/ NULL,
88 	/* realize		*/ (XtRealizeProc)Realize,
89 	/* actions		*/ actions,
90 	/* num_actions		*/ XtNumber(actions),
91 	/* resources		*/ resources,
92 	/* num_resources	*/ XtNumber(resources),
93 	/* xrm_class		*/ NULLQUARK,
94 	/* compress_motion	*/ True,
95 	/* compress_exposure	*/ XtExposeCompressSeries |
96 				       XtExposeGraphicsExpose |
97 				       XtExposeNoExpose,
98 	/* compress_enterleave	*/ True,
99 	/* visible_interest	*/ False,
100 	/* destroy		*/ NULL,
101 	/* resize		*/ Resize,
102 	/* expose		*/ (XtExposeProc)Redisplay,
103 	/* set_values		*/ NULL,
104 	/* set_values_hook	*/ NULL,
105 	/* set_values_almost	*/ XtInheritSetValuesAlmost,
106 	/* get_values_hook	*/ NULL,
107 	/* accept_focus		*/ NULL,
108 	/* version		*/ XtVersion,
109 	/* callback_private	*/ NULL,
110 	/* tm_table		*/ defaultTranslations,
111 	/* query_geometry	*/ NULL,
112 	/* display_accelerator	*/ NULL,
113 	/* extension		*/ NULL
114     },
115     /* primitive_class fields */
116     {
117 	/* border_highlight	*/ NULL,
118 	/* border_unhighlight	*/ NULL,
119 	/* translations		*/ NULL,
120 	/* arm_and_activate	*/ NULL,
121 	/* syn_resources	*/ NULL,
122 	/* num_syn_resources	*/ 0,
123 	/* extension		*/ NULL
124     },
125     /* clip_class fields */
126     {
127 	/* redraw		*/ (XbaeClipRedrawProc)Redraw,
128 	/* extension		*/ NULL,
129     }
130 };
131 
132 WidgetClass xbaeClipWidgetClass = (WidgetClass) & xbaeClipClassRec;
133 
134 
135 static void
ClassPartInitialize(cwc)136 ClassPartInitialize(cwc)
137 XbaeClipWidgetClass cwc;
138 {
139     register XbaeClipWidgetClass super =
140 	(XbaeClipWidgetClass) cwc->core_class.superclass;
141 
142     /*
143      * Allow subclasses to inherit our redraw method
144      */
145     if (cwc->clip_class.redraw == XbaeInheritRedraw)
146 	cwc->clip_class.redraw = super->clip_class.redraw;
147 }
148 
149 static void
Realize(cw,valueMask,attributes)150 Realize(cw, valueMask, attributes)
151 XbaeClipWidget cw;
152 XtValueMask *valueMask;
153 XSetWindowAttributes *attributes;
154 {
155     /*
156      * Don't call our superclasses realize method, because Primitive sets
157      * bit_gravity and do_not_propagate
158      */
159     XtCreateWindow((Widget)cw, InputOutput, CopyFromParent,
160 		   *valueMask, attributes);
161 }
162 
163 /* ARGSUSED */
164 static void
Redisplay(cw,event,region)165 Redisplay(cw, event, region)
166 XbaeClipWidget cw;
167 XEvent *event;
168 Region region;
169 {
170     if (cw->clip.expose_proc)
171 	cw->clip.expose_proc((Widget)cw, event, region);
172 }
173 
174 /* ARGSUSED */
175 static void
Resize(w)176 Resize(w)
177 Widget w;
178 {
179     /*
180      * Xt will call the expose method when this method returns.
181      * So we won't have to do any exposure stuff here, which
182      * means the Matrix's  SetValues method only needs to force a
183      * redraw when a redisplay is needed, not when a relayout is performed.
184      */
185 }
186 
187 /*
188  * Clip redraw method
189  */
190 /* ARGSUSED */
191 static void
Redraw(cw)192 Redraw(cw)
193 XbaeClipWidget cw;
194 {
195     if (XtIsRealized((Widget)cw))
196 	XClearArea(XtDisplay(cw), XtWindow(cw), 0, 0, 0, 0, True);
197 }
198 
199 /*
200  * Public interface to redraw method
201  */
202 void
XbaeClipRedraw(w)203 XbaeClipRedraw(w)
204 Widget w;
205 {
206     /*
207      * Make sure w is a Clip or a subclass
208      */
209     XtCheckSubclass(w, xbaeClipWidgetClass, NULL);
210 
211     /*
212      * Call the redraw method
213      */
214     if (XtIsRealized(w))
215 	(*((XbaeClipWidgetClass) XtClass(w))->clip_class.redraw)
216 	    ((Widget)w);
217 }
218 
219 /* ARGSUSED */
220 static void
FocusInACT(cw,event,params,nparams)221 FocusInACT(cw, event, params, nparams)
222 XbaeClipWidget cw;
223 XEvent *event;
224 String *params;
225 Cardinal *nparams;
226 {
227     if (event->xany.type != FocusIn || !event->xfocus.send_event)
228 	return;
229 
230     if (cw->clip.focus_callback)
231 	XtCallCallbackList((Widget)cw, cw->clip.focus_callback, NULL);
232 }
233