Mercurial > hg > xemacs-beta
annotate lwlib/xlwcheckbox.c @ 4967:0d4c9d0f6a8d
rewrite dynarr code
-------------------- ChangeLog entries follow: --------------------
src/ChangeLog addition:
2010-02-03 Ben Wing <ben@xemacs.org>
* device-x.c (x_get_resource_prefix):
* device-x.c (Fx_get_resource):
* device-x.c (Fx_get_resource_prefix):
* device-x.c (Fx_put_resource):
* dialog-msw.c:
* dialog-msw.c (handle_question_dialog_box):
* dired-msw.c (mswindows_sort_files):
* dired-msw.c (mswindows_get_files):
* extents.c (extent_fragment_sort_by_priority):
* extents.c (Fset_extent_parent):
* file-coding.c (coding_reader):
* file-coding.c (coding_writer):
* file-coding.c (gzip_convert):
* frame.c (generate_title_string):
* gutter.c (calculate_gutter_size_from_display_lines):
* indent.c (vmotion_1):
* lread.c (read_bit_vector):
* mule-coding.c (iso2022_decode):
* rangetab.c:
* rangetab.c (Fcopy_range_table):
* rangetab.c (Fget_range_table):
* rangetab.c (unified_range_table_copy_data):
* redisplay-msw.c (mswindows_output_string):
* redisplay-output.c (output_display_line):
* redisplay-output.c (redisplay_move_cursor):
* redisplay-output.c (redisplay_clear_bottom_of_window):
* redisplay-tty.c (tty_output_ichar_dynarr):
* redisplay-tty.c (set_foreground_to):
* redisplay-tty.c (set_background_to):
* redisplay-xlike-inc.c (XLIKE_output_string):
* redisplay.c (redisplay_window_text_width_string):
* redisplay.c (redisplay_text_width_string):
* redisplay.c (create_text_block):
* redisplay.c (SET_CURRENT_MODE_CHARS_PIXSIZE):
* redisplay.c (generate_fstring_runes):
* redisplay.c (regenerate_modeline):
* redisplay.c (ensure_modeline_generated):
* redisplay.c (real_current_modeline_height):
* redisplay.c (create_string_text_block):
* redisplay.c (regenerate_window):
* redisplay.c (REGEN_INC_FIND_START_END):
* redisplay.c (point_visible):
* redisplay.c (redisplay_window):
* redisplay.c (mark_glyph_block_dynarr):
* redisplay.c (line_start_cache_start):
* redisplay.c (start_with_line_at_pixpos):
* redisplay.c (update_line_start_cache):
* redisplay.c (glyph_to_pixel_translation):
* redisplay.c (pixel_to_glyph_translation):
* sysdep.c (qxe_readdir):
* text.c (dfc_convert_to_external_format):
* text.c (dfc_convert_to_internal_format):
* toolbar-common.c (common_output_toolbar_button):
* window.c (window_modeline_height):
* window.c (Fwindow_last_line_visible_height):
* window.c (window_displayed_height):
* window.c (window_scroll):
* window.c (get_current_pixel_pos):
Use Dynarr_begin() in place of Dynarr_atp (foo, 0).
* dynarr.c (Dynarr_realloc):
* dynarr.c (Dynarr_lisp_realloc):
* dynarr.c (Dynarr_resize):
* dynarr.c (Dynarr_insert_many):
* dynarr.c (Dynarr_delete_many):
* dynarr.c (Dynarr_memory_usage):
* dynarr.c (stack_like_malloc):
* dynarr.c (stack_like_free):
* lisp.h:
* lisp.h (DECLARE_DYNARR_LISP_IMP):
* lisp.h (XD_DYNARR_DESC):
* lisp.h (Dynarr_pop):
* gutter.c (output_gutter):
* redisplay-output.c (sync_rune_structs):
* redisplay-output.c (redisplay_output_window):
Redo the dynarr code, add greater checks.
Rename the `len', `largest' and `max' members to `len_',
`largest_' and `max_' to try and catch existing places that might
directly modify these values. Make new accessors Dynarr_largest()
and Dynarr_max() and make them and existing Dynarr_length() be
non-lvalues by adding '+ 0' to them; fix a couple of places in the
redisplay code that tried to modify the length directly by setting
Dynarr_length(). Use the accessors whenever possible even in the
dynarr code itself. The accessors also verify that 0 <= len <=
largest <= max. Rename settor function Dynarr_set_size() to
Dynarr_set_length() and use it more consistently; also create
lower-level Dynarr_set_length_1(). This latter function should be
the only function that directly modifies the `len_' member of a
Dynarr, and in the process makes sure that the `largest' value is
kept correct.
Consistently use ERROR_CHECK_STRUCTURES instead of
ERROR_CHECK_TYPES for error-checking code. Reintroduce the
temporarily disabled verification code on the positions of
Dynarr_at(), Dynarr_atp() and Dynarr_atp_past_end().
Also create Dynarr_resize_if() in place of a repeated
code fragment. Clean up all the functions that modify Dynarrs to
use the new macros and functions and verify the correctness of the
Dynarr both before and after the change.
Note that there are two kinds of verification -- one for accessing
and one for modifying. The difference is that the modify
verification additionally checks to make sure that the Dynarr
isn't locked. (This is used in redisplay to check for problems
with reentrancy.)
* lrecord.h: Move XD_DYNARR_DESC to lisp.h, grouping with the dynarr code.
author | Ben Wing <ben@xemacs.org> |
---|---|
date | Wed, 03 Feb 2010 20:51:18 -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 } |