Mercurial > hg > xemacs-beta
annotate lwlib/xlwcheckbox.c @ 5015:d95c102a96d3
cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
-------------------- ChangeLog entries follow: --------------------
src/ChangeLog addition:
2010-02-08 Ben Wing <ben@xemacs.org>
* faces.c:
* faces.c (face_property_matching_instance):
* faces.c (ensure_face_cachel_contains_charset):
* faces.h (FACE_FONT):
* lisp.h:
* lisp.h (enum font_specifier_matchspec_stages):
* objects-msw.c:
* objects-msw.c (mswindows_font_spec_matches_charset):
* objects-msw.c (mswindows_find_charset_font):
* objects-tty.c:
* objects-tty.c (tty_font_spec_matches_charset):
* objects-tty.c (tty_find_charset_font):
* objects-xlike-inc.c:
* objects-xlike-inc.c (XFUN):
* objects-xlike-inc.c (xft_find_charset_font):
* objects.c:
* objects.c (font_instantiate):
* objects.c (FROB):
* specifier.c:
* specifier.c (charset_matches_specifier_tag_set_p):
* specifier.c (call_charset_predicate):
* specifier.c (define_specifier_tag):
* specifier.c (Fdefine_specifier_tag):
* specifier.c (setup_charset_initial_specifier_tags):
* specifier.c (specifier_instance_from_inst_list):
* specifier.c (FROB):
* specifier.c (vars_of_specifier):
* specifier.h:
Rename the specifier-font-matching stages in preparation for
eliminating shadowed warnings, some other related fixes from
ben-unicode-internal.
1. Rename raw enums:
initial -> STAGE_INITIAL
final -> STAGE_FINAL
impossible -> NUM_MATCHSPEC_STAGES
2. Move `enum font_specifier_matchspec_stages' from
specifier.h to lisp.h.
3. Whitespace changes to match coding standards.
4. Eliminate unused second argument STAGE in charset predicates
that don't use it -- the code that calls the charset predicates
is now smart enough to supply the right number of arguments
automatically.
5. Add some long(ish) comments and authorial notices, esp. in
objects.c.
6. In specifier.c, change Vcharset_tag_lists from a vector over
leading bytes to a hash table over charsets. This change is
unnecessary currently but doesn't hurt and will be required
when we merge in Unicode-internal.
7. In specifier.c, extract out the code that calls charset predicates
into a function call_charset_predicate().
author | Ben Wing <ben@xemacs.org> |
---|---|
date | Mon, 08 Feb 2010 16:51:25 -0600 |
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 } |