Mercurial > hg > xemacs-beta
annotate lwlib/xlwcheckbox.c @ 4877:1a9c94ba117c
add issue about building on Cygwin with C++, NEWGC and optimization
| author | Ben Wing <ben@xemacs.org> |
|---|---|
| date | Fri, 15 Jan 2010 07:46:13 -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 } |
