Mercurial > hg > xemacs-beta
annotate lwlib/xlwcheckbox.c @ 5342:174aed57a32a
Require that NAME be an unquoted symbol, #'block, #'return-from
2011-01-22 Aidan Kehoe <kehoea@parhasard.net>
* cl-macs.el (block, return-from): Require that NAME be a symbol
in these macros, as always documented in the #'block docstring and
as required by Common Lisp.
* descr-text.el (unidata-initialize-unihan-database):
Correct the use of non-symbols in #'block and #'return-from in
this function.
author | Aidan Kehoe <kehoea@parhasard.net> |
---|---|
date | Sat, 22 Jan 2011 17:20:19 +0000 |
parents | 5460287a3327 |
children | 308d34e9f07d |
rev | line source |
---|---|
424 | 1 /* Checkbox Widget for XEmacs. |
2 Copyright (C) 1999 Edward A. Falk | |
3 | |
4 This file is part of XEmacs. | |
5 | |
6 XEmacs is free software; you can redistribute it and/or modify it | |
7 under the terms of the GNU General Public License as published by the | |
8 Free Software Foundation; either version 2, or (at your option) any | |
9 later version. | |
10 | |
11 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
14 for more details. | |
15 | |
16 You should have received a copy of the GNU General Public License | |
17 along with XEmacs; see the file COPYING. If not, write to | |
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
19 Boston, MA 02111-1307, USA. */ | |
20 | |
21 /* Synched up with: Checkbox.c 1.1 */ | |
22 | |
23 /* | |
24 * Checkbox.c - Checkbox button widget | |
25 * | |
26 * Author: Edward A. Falk | |
27 * falk@falconer.vip.best.com | |
442 | 28 * |
424 | 29 * Date: June 30, 1997 |
30 * | |
31 * Overview: This widget is identical to the Radio widget in behavior, | |
32 * except that the button is square and has a check mark. | |
33 */ | |
34 | |
35 | |
36 #include <config.h> | |
37 #include <stdio.h> | |
38 | |
39 #include <X11/IntrinsicP.h> | |
40 #include <X11/StringDefs.h> | |
442 | 41 #include ATHENA_XawInit_h_ |
4528
726060ee587c
First draft of g++ 4.3 warning removal patch. Builds. *Needs ChangeLogs.*
Stephen J. Turnbull <stephen@xemacs.org>
parents:
4522
diff
changeset
|
42 #include "xt-wrappers.h" |
424 | 43 #include "xlwcheckboxP.h" |
44 | |
45 | |
46 /* by using the same size for the checkbox as for the diamond box, | |
47 * we can let the Radio widget do the vast majority of the work. | |
48 */ | |
49 | |
50 #define BOX_SIZE 8 | |
51 #define DRAW_CHECK 0 /* don't draw the check mark */ | |
52 | |
53 #define cclass(w) ((CheckboxWidgetClass)((w)->core.widget_class)) | |
54 | |
55 #ifdef _ThreeDP_h | |
56 #define swid(cw) ((cw)->threeD.shadow_width) | |
57 #else | |
58 #define swid(cw) ((cw)->core.border_width) | |
59 #endif | |
60 | |
61 #define bsize(cw) (cclass(cw)->radio_class.dsize) | |
62 #define bs(cw) (bsize(cw) + 2*swid(cw)) | |
63 | |
64 | |
65 #if DRAW_CHECK | |
66 #define check_width 14 | |
67 #define check_height 14 | |
458 | 68 static unsigned char check_bits[] = { |
424 | 69 0x00, 0x00, 0x00, 0x20, 0x00, 0x18, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x03, |
70 0x8c, 0x03, 0xde, 0x01, 0xff, 0x01, 0xfe, 0x00, 0xfc, 0x00, 0x78, 0x00, | |
71 0x70, 0x00, 0x20, 0x00}; | |
72 #endif | |
73 | |
74 | |
75 /**************************************************************** | |
76 * | |
77 * Full class record constant | |
78 * | |
79 ****************************************************************/ | |
80 | |
81 | |
82 #if DRAW_CHECK | |
83 static char defaultTranslations[] = | |
84 "<EnterWindow>: highlight()\n\ | |
85 <LeaveWindow>: unpress(draw) unhighlight()\n\ | |
86 <Btn1Down>: press()\n\ | |
87 <Btn1Down>,<Btn1Up>: unpress(nodraw) toggle() notify()"; | |
88 #endif | |
89 | |
90 | |
91 | |
4528
726060ee587c
First draft of g++ 4.3 warning removal patch. Builds. *Needs ChangeLogs.*
Stephen J. Turnbull <stephen@xemacs.org>
parents:
4522
diff
changeset
|
92 #define offset(field) XtOffsetOf(CheckboxRec, checkbox.field) |
726060ee587c
First draft of g++ 4.3 warning removal patch. Builds. *Needs ChangeLogs.*
Stephen J. Turnbull <stephen@xemacs.org>
parents:
4522
diff
changeset
|
93 #define res(name,_class,intrepr,type,member,extrepr,value) \ |
726060ee587c
First draft of g++ 4.3 warning removal patch. Builds. *Needs ChangeLogs.*
Stephen J. Turnbull <stephen@xemacs.org>
parents:
4522
diff
changeset
|
94 Xt_RESOURCE (name, _class, intrepr, type, offset(member), extrepr, value) |
424 | 95 static XtResource resources[] = { |
4528
726060ee587c
First draft of g++ 4.3 warning removal patch. Builds. *Needs ChangeLogs.*
Stephen J. Turnbull <stephen@xemacs.org>
parents:
4522
diff
changeset
|
96 res (XtNtristate, XtCTristate, XtRBoolean, Boolean, tristate, |
726060ee587c
First draft of g++ 4.3 warning removal patch. Builds. *Needs ChangeLogs.*
Stephen J. Turnbull <stephen@xemacs.org>
parents:
4522
diff
changeset
|
97 XtRImmediate, FALSE), |
424 | 98 } ; |
99 #undef offset | |
100 | |
101 /* Member functions */ | |
102 | |
103 static void CheckboxClassInit (void); | |
104 static void CheckboxInit (Widget, Widget, ArgList, Cardinal *); | |
105 #if DRAW_CHECK | |
106 static void CheckboxRealize (Widget, Mask *, XSetWindowAttributes *); | |
107 #endif | |
108 static void DrawCheck (Widget); | |
109 | |
110 | |
111 /* Action procs */ | |
112 #if DRAW_CHECK | |
113 static void CheckboxPress (Widget, XEvent *, String *, Cardinal *); | |
114 static void CheckboxUnpress (Widget, XEvent *, String *, Cardinal *); | |
115 #endif | |
116 | |
117 /* internal privates */ | |
118 | |
119 #if DRAW_CHECK | |
120 static XtActionsRec actionsList[] = | |
121 { | |
122 {"press", CheckboxPress}, | |
123 {"unpress", CheckboxUnpress}, | |
124 } ; | |
125 #endif | |
126 | |
127 #define SuperClass ((RadioWidgetClass)&radioClassRec) | |
128 | |
129 CheckboxClassRec checkboxClassRec = { | |
130 { | |
442 | 131 (WidgetClass) SuperClass, /* superclass */ |
4528
726060ee587c
First draft of g++ 4.3 warning removal patch. Builds. *Needs ChangeLogs.*
Stephen J. Turnbull <stephen@xemacs.org>
parents:
4522
diff
changeset
|
132 (String) "Checkbox", /* class_name */ |
424 | 133 sizeof(CheckboxRec), /* size */ |
134 CheckboxClassInit, /* class_initialize */ | |
135 NULL, /* class_part_initialize */ | |
136 FALSE, /* class_inited */ | |
137 CheckboxInit, /* initialize */ | |
138 NULL, /* initialize_hook */ | |
139 #if DRAW_CHECK | |
140 CheckboxRealize, /* realize */ | |
141 actionsList, /* actions */ | |
142 XtNumber(actionsList), /* num_actions */ | |
143 #else | |
144 XtInheritRealize, /* realize */ | |
145 NULL, /* actions */ | |
146 0, /* num_actions */ | |
147 #endif | |
148 resources, /* resources */ | |
149 XtNumber(resources), /* resource_count */ | |
150 NULLQUARK, /* xrm_class */ | |
151 TRUE, /* compress_motion */ | |
152 TRUE, /* compress_exposure */ | |
153 TRUE, /* compress_enterleave */ | |
154 FALSE, /* visible_interest */ | |
155 NULL, /* destroy */ | |
156 XtInheritResize, /* resize */ | |
157 XtInheritExpose, /* expose */ | |
158 NULL, /* set_values */ | |
159 NULL, /* set_values_hook */ | |
160 XtInheritSetValuesAlmost, /* set_values_almost */ | |
161 NULL, /* get_values_hook */ | |
162 NULL, /* accept_focus */ | |
163 XtVersion, /* version */ | |
164 NULL, /* callback_private */ | |
165 #if DRAW_CHECK | |
166 defaultTranslations, /* tm_table */ | |
167 #else | |
168 XtInheritTranslations, /* tm_table */ | |
169 #endif | |
170 XtInheritQueryGeometry, /* query_geometry */ | |
171 XtInheritDisplayAccelerator, /* display_accelerator */ | |
172 NULL /* extension */ | |
173 }, /* CoreClass fields initialization */ | |
174 { | |
442 | 175 XtInheritChangeSensitive /* change_sensitive */ |
424 | 176 }, /* SimpleClass fields initialization */ |
177 #ifdef _ThreeDP_h | |
178 { | |
179 XtInheritXaw3dShadowDraw /* field not used */ | |
180 }, /* ThreeDClass fields initialization */ | |
181 #endif | |
182 { | |
183 0 /* field not used */ | |
184 }, /* LabelClass fields initialization */ | |
185 { | |
186 0 /* field not used */ | |
187 }, /* CommandClass fields initialization */ | |
188 { | |
189 RadioSet, /* Set Procedure. */ | |
190 RadioUnset, /* Unset Procedure. */ | |
191 NULL /* extension. */ | |
192 }, /* ToggleClass fields initialization */ | |
193 { | |
194 BOX_SIZE, | |
195 DrawCheck, /* draw procedure */ | |
196 NULL /* extension. */ | |
197 }, /* RadioClass fields initialization */ | |
198 { | |
199 NULL /* extension. */ | |
200 }, /* CheckboxClass fields initialization */ | |
201 }; | |
202 | |
203 /* for public consumption */ | |
204 WidgetClass checkboxWidgetClass = (WidgetClass) &checkboxClassRec; | |
205 | |
206 | |
207 | |
208 | |
209 | |
210 | |
211 /**************************************************************** | |
212 * | |
213 * Class Methods | |
214 * | |
215 ****************************************************************/ | |
216 | |
217 static void | |
218 CheckboxClassInit (void) | |
219 { | |
220 XawInitializeWidgetSet(); | |
221 } | |
222 | |
223 | |
224 /*ARGSUSED*/ | |
225 static void | |
2286 | 226 CheckboxInit (Widget UNUSED (request), |
227 #if DRAW_CHECK | |
424 | 228 Widget new, |
2286 | 229 #else |
3072 | 230 Widget UNUSED (new_), |
2286 | 231 #endif |
232 ArgList UNUSED (args), | |
233 Cardinal *UNUSED (num_args)) | |
424 | 234 { |
235 #if DRAW_CHECK | |
3072 | 236 CheckboxWidget cw = (CheckboxWidget) new_; |
424 | 237 cw->checkbox.checkmark = None ; |
238 cw->checkbox.checkmark_GC = None ; | |
239 #endif | |
240 } | |
241 | |
242 | |
243 #if DRAW_CHECK | |
244 static void | |
245 CheckboxRealize(Widget w, | |
246 Mask *valueMask, | |
247 XSetWindowAttributes *attributes) | |
248 { | |
249 CheckboxWidget cw = (CheckboxWidget) w; | |
250 XtGCMask value_mask, dynamic_mask, dontcare_mask ; | |
251 XGCValues values ; | |
252 | |
253 /* first, call superclass realize */ | |
254 (*checkboxWidgetClass->core_class.superclass->core_class.realize) | |
255 (w, valueMask, attributes); | |
256 | |
257 /* TODO: cache this via xmu */ | |
258 if( cw->checkbox.checkmark == None ) | |
259 cw->checkbox.checkmark = | |
260 XCreateBitmapFromData( XtDisplay(w), XtWindow(w), | |
261 check_bits,check_width,check_height); | |
262 | |
263 values.fill_style = FillStippled ; | |
264 values.stipple = cw->checkbox.checkmark ; | |
265 values.foreground = cw->label.foreground ; | |
266 value_mask = GCFillStyle | GCStipple | GCForeground ; | |
267 dynamic_mask = GCTileStipXOrigin | GCTileStipYOrigin ; | |
268 dontcare_mask = GCLineWidth | GCLineStyle | GCCapStyle | GCJoinStyle | | |
269 GCFont | GCSubwindowMode | GCGraphicsExposures | | |
270 GCDashOffset | GCDashList | GCArcMode ; | |
271 cw->checkbox.checkmark_GC = | |
272 XtAllocateGC(w, 0, value_mask, &values, dynamic_mask, dontcare_mask) ; | |
273 } | |
274 #endif | |
275 | |
276 | |
277 /* Function Name: CheckboxDestroy | |
278 * Description: Destroy Callback for checkbox widget. | |
279 * Arguments: w - the checkbox widget that is being destroyed. | |
442 | 280 * junk, garbage - not used. |
424 | 281 * Returns: none. |
282 */ | |
283 | |
284 /* ARGSUSED */ | |
3072 | 285 #if DRAW_CHECK |
424 | 286 static void |
2286 | 287 CheckboxDestroy ( |
288 Widget w, | |
289 XtPointer UNUSED (junk), | |
290 XtPointer UNUSED (garbage)) | |
424 | 291 { |
292 CheckboxWidget cw = (CheckboxWidget) w; | |
293 | |
294 /* TODO: cache this via xmu */ | |
295 if( cw->checkbox.checkmark != None ) | |
296 XFreePixmap( XtDisplay(w), cw->checkbox.checkmark ) ; | |
297 if( cw->checkbox.checkmark_GC != None ) | |
298 XtReleaseGC(w, cw->checkbox.checkmark_GC) ; | |
299 } | |
3072 | 300 #endif /* DRAW_CHECK */ |
424 | 301 |
302 | |
303 | |
304 #if DRAW_CHECK | |
305 /************************************************************ | |
306 * | |
307 * Actions Procedures | |
308 * | |
309 ************************************************************/ | |
310 | |
311 /* ARGSUSED */ | |
312 static void | |
313 CheckboxPress (Widget w, | |
314 XEvent *event, | |
315 String *params, /* unused */ | |
316 Cardinal *num_params) /* unused */ | |
317 { | |
318 CheckboxWidget cw = (CheckboxWidget) w ; | |
319 if( !cw->checkbox.pressed ) { | |
320 cw->checkbox.pressed = TRUE ; | |
321 ((CheckboxWidgetClass)(w->core.widget_class))->radio_class.drawDiamond(w) ; | |
322 } | |
323 } | |
324 | |
325 static void | |
326 CheckboxUnpress (Widget w, | |
327 XEvent *event, | |
328 String *params, /* unused */ | |
329 Cardinal *num_params) /* unused */ | |
330 { | |
331 CheckboxWidget cw = (CheckboxWidget) w ; | |
332 int i ; | |
333 | |
334 if( cw->checkbox.pressed ) { | |
335 cw->checkbox.pressed = FALSE ; | |
336 if( *num_params > 0 && **params == 'd' ) | |
337 ((CheckboxWidgetClass)(w->core.widget_class))->radio_class.drawDiamond(w); | |
338 } | |
339 } | |
340 #endif | |
341 | |
342 | |
343 | |
344 | |
345 | |
346 /************************************************************ | |
347 * | |
348 * Internal Procedures | |
349 * | |
350 ************************************************************/ | |
351 | |
352 static void | |
353 DrawCheck (Widget w) | |
354 { | |
355 CheckboxWidget cw = (CheckboxWidget) w ; | |
356 Display *dpy = XtDisplay(w) ; | |
357 Window win = XtWindow(w) ; | |
358 GC gc ; | |
359 | |
360 #ifdef _ThreeDP_h | |
361 XPoint pts[6] ; | |
362 #endif | |
363 Dimension s = swid(cw); | |
364 Dimension bsz = bsize(cw); | |
365 Position bx,by ; /* Check upper-left */ | |
2286 | 366 Dimension bh ; |
424 | 367 #ifdef _ThreeDP_h |
2286 | 368 Dimension bw; |
424 | 369 GC top, bot; |
370 #endif | |
371 GC ctr ; | |
372 | |
373 /* foreground GC */ | |
374 gc = XtIsSensitive(w) ? cw->command.normal_GC : cw->label.gray_GC ; | |
375 | |
2286 | 376 bh = bs(cw) ; |
424 | 377 bx = cw->label.internal_width ; |
378 by = cw->core.height/2 - bh/2 ; | |
379 | |
380 #ifdef _ThreeDP_h | |
2286 | 381 bw = bh ; |
382 | |
424 | 383 if( !cw->command.set ) { |
384 top = cw->threeD.top_shadow_GC ; | |
385 bot = cw->threeD.bot_shadow_GC ; | |
386 } else { | |
387 top = cw->threeD.bot_shadow_GC ; | |
388 bot = cw->threeD.top_shadow_GC ; | |
389 } | |
390 ctr = cw->command.inverse_GC ; | |
391 #else | |
392 ctr = cw->command.set ? cw->command.normal_GC : cw->command.inverse_GC ; | |
393 #endif | |
394 | |
395 XFillRectangle(dpy,win,ctr, bx+s,by+s, bsz,bsz) ; | |
396 | |
397 #ifdef _ThreeDP_h | |
398 /* top-left shadow */ | |
399 pts[0].x = bx ; pts[0].y = by ; | |
400 pts[1].x = bw ; pts[1].y = 0 ; | |
401 pts[2].x = -s ; pts[2].y = s ; | |
402 pts[3].x = -bsz ; pts[3].y = 0 ; | |
403 pts[4].x = 0 ; pts[4].y = bsz ; | |
404 pts[5].x = -s ; pts[5].y = s ; | |
405 XFillPolygon(dpy,win,top, pts,6, Nonconvex,CoordModePrevious) ; | |
406 /* bottom-right shadow */ | |
407 pts[0].x = bx+bw ; pts[0].y = by+bh ; | |
408 pts[1].x = -bw ; pts[1].y = 0 ; | |
409 pts[2].x = s ; pts[2].y = -s ; | |
410 pts[3].x = bsz ; pts[3].y = 0 ; | |
411 pts[4].x = 0 ; pts[4].y = -bsz ; | |
412 pts[5].x = s ; pts[5].y = -s ; | |
413 XFillPolygon(dpy,win,bot, pts,6, Nonconvex,CoordModePrevious) ; | |
414 #else | |
415 XDrawRectangle(dpy,win,gc, bx+s,by+s, bsz,bsz) ; | |
416 #endif | |
417 | |
418 #if DRAW_CHECK | |
419 if( cw->command.set && cw->checkbox.checkmark_GC != None ) { | |
420 XSetTSOrigin(dpy,cw->checkbox.checkmark_GC, bx+s, by+s) ; | |
421 XFillRectangle(dpy,win,cw->checkbox.checkmark_GC, | |
422 bx+s, by+s, check_width,check_height) ; | |
423 } | |
424 #endif | |
425 } |