~ubuntu-branches/ubuntu/jaunty/xvidcap/jaunty-proposed

« back to all changes in this revision

Viewing changes to Xw/Toggle.c

  • Committer: Bazaar Package Importer
  • Author(s): Christian Marillat
  • Date: 2004-08-29 10:53:42 UTC
  • Revision ID: james.westby@ubuntu.com-20040829105342-qgmnry37eadfkoxx
Tags: upstream-1.1.3
ImportĀ upstreamĀ versionĀ 1.1.3

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Toggle.c, vi: tabstop=4
 
3
 *
 
4
 * Copyright (C) 1998 Rasca Gmelch, Berlin
 
5
 * EMail: thron@gmx.de
 
6
 *
 
7
 * This library is free software; you can redistribute it and/or
 
8
 * modify it under the terms of the GNU Library General Public
 
9
 * License as published by the Free Software Foundation; either
 
10
 * version 2 of the License, or (at your option) any later version.
 
11
 *
 
12
 * This library is distributed in the hope that it will be useful,
 
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
15
 * Library General Public License for more details.
 
16
 *
 
17
 * You should have received a copy of the GNU Library General Public
 
18
 * License along with this library; if not, write to the Free Software
 
19
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
20
 */
 
21
 
 
22
#ifndef __FILE__
 
23
#define __FILE__ "Toggle.c"
 
24
#endif
 
25
 
 
26
#include <stdio.h>
 
27
#include <stdlib.h>
 
28
#include <X11/StringDefs.h>
 
29
#include <X11/IntrinsicP.h>
 
30
#include <X11/Xlib.h>
 
31
#include <Xw/ToggleP.h>
 
32
 
 
33
#define offset(field) XtOffsetOf (XwToggleRec, field)
 
34
 
 
35
/* resource list
 
36
 */
 
37
static XtResource resources [] = {
 
38
        /* toggle */
 
39
        { XtNstate, XtCState, XtRBoolean, sizeof(Boolean),
 
40
                offset(toggle.state), XtRBoolean, (XtPointer)0 },
 
41
        { XtNdoubleClickCallback, XtCCallback, XtRCallback, sizeof(XtPointer),
 
42
                offset(toggle.double_callbacks), XtRCallback, (XtPointer)NULL },
 
43
        /* button */
 
44
        { XtNactiveColor, XtCActiveColor, XtRPixel, sizeof(Pixel),
 
45
                offset(button.active_pixel), XtRString, "white" },
 
46
        { XtNaccel, XtCAccel, XtRString, sizeof(String),
 
47
                offset(button.accel), XtRImmediate, "toggle() notify()" },
 
48
        /* label */
 
49
        { XtNlabel, XtCLabel, XtRString, sizeof(String),
 
50
                offset (label.label), XtRImmediate, NULL },
 
51
        /* base */
 
52
        { XtNshadowType, XtCShadowType, XtRInt, sizeof(int),
 
53
                offset(base.shadow_type), XtRImmediate, (XtPointer)XtShadowUp },
 
54
 };
 
55
 
 
56
/*
 
57
 * action function declarations
 
58
 */
 
59
static void Highlight (Widget, XEvent*, String*, Cardinal *),
 
60
        Unhighlight (Widget, XEvent*, String*, Cardinal *),
 
61
        Focus (Widget, XEvent*, String*, Cardinal *),
 
62
        GetFocus (Widget, XEvent*, String*, Cardinal *),
 
63
        Reset (Widget, XEvent*, String*, Cardinal *),
 
64
        Set (Widget, XEvent*, String*, Cardinal *),
 
65
        Toggle (Widget, XEvent*, String*, Cardinal *),
 
66
        Notify (Widget, XEvent*, String*, Cardinal *),
 
67
        Unset (Widget, XEvent*, String*, Cardinal *),
 
68
        Popup (Widget, XEvent*, String*, Cardinal *),
 
69
        Tab (Widget, XEvent*, String*, Cardinal *);
 
70
 
 
71
/*
 
72
 * action table
 
73
 */
 
74
static XtActionsRec actions [] = {
 
75
        {"highlight",   Highlight       },
 
76
        {"unhighlight", Unhighlight     },
 
77
        {"focus",               Focus           },
 
78
        {"get-focus",   GetFocus        },
 
79
        {"reset",               Reset           },
 
80
        {"set",                 Set                     },
 
81
        {"unset",               Unset           },
 
82
        {"toggle",              Toggle          },
 
83
        {"notify",              Notify          },
 
84
        {"popup",               Popup           },
 
85
        {"tab",                 Tab                     },      /* execute the XtNtabCallback functions */
 
86
        };
 
87
 
 
88
/*
 
89
 * default translation table
 
90
 */
 
91
static char defaultTranslations [] = "\
 
92
<EnterWindow>: highlight()\n\
 
93
<LeaveWindow>: unhighlight()\n\
 
94
<FocusIn>: focus(in)\n\
 
95
<FocusOut>: focus(out)\n\
 
96
<Btn1Down>,<Btn1Up>: toggle() notify() get-focus()\n\
 
97
<Btn2Down>,<Btn2Up>: toggle() notify() get-focus()\n\
 
98
<Btn3Down>: notify() popup()\n\
 
99
Shift<Key>Tab: tab(prev)\n\
 
100
<Key>Tab: tab(next)\n\
 
101
<Key>space: toggle() notify()";
 
102
 
 
103
/*
 
104
 * method function declarations
 
105
 */
 
106
 
 
107
static void
 
108
        Initialize (Widget treq, Widget tnew, ArgList args, Cardinal *nums),
 
109
        ClassInitialize (void);
 
110
static Boolean
 
111
        SetValues (Widget, Widget, Widget, ArgList, Cardinal* ),
 
112
        AcceptFocus (Widget w, Time *t);
 
113
static void
 
114
        Destroy (Widget w),
 
115
        Resize (Widget w),
 
116
        Redisplay (Widget w, XEvent *event, Region region);
 
117
 
 
118
/*
 
119
 * tool functions
 
120
 */
 
121
static void DrawToggle (Widget w);
 
122
 
 
123
/*
 
124
 * class record initialization
 
125
 */
 
126
#define BaseClass ((WidgetClass)&xwBaseClassRec)
 
127
#define SuperClass ((WidgetClass)&xwButtonClassRec)
 
128
#define ThisClass ((WidgetClass)&xwToggleClassRec)
 
129
XwToggleClassRec xwToggleClassRec = {
 
130
        {
 
131
                /* core_class fields     */
 
132
                /* superclass            */ SuperClass,
 
133
                /* class_name            */ "XwToggle",
 
134
                /* widget_size           */ sizeof(XwToggleRec),
 
135
                /* class_initialize      */ ClassInitialize,
 
136
                /* class_part_initialize */ NULL,
 
137
                /* class_inited          */ False,
 
138
                /* initialize            */ Initialize,
 
139
                /* initialize_hook       */ NULL,
 
140
                /* realize               */ XtInheritRealize,
 
141
                /* actions               */ actions,
 
142
                /* num_actions           */ XtNumber(actions),
 
143
                /* resources             */ resources,
 
144
                /* num_resources         */ XtNumber(resources),
 
145
                /* xrm_class             */ NULLQUARK,
 
146
                /* compress_motion       */ True,
 
147
                /* compress_exposure     */ XtExposeCompressMultiple,
 
148
                /* compress_enterleave   */ True,
 
149
                /* visible_interest      */ True,
 
150
                /* destroy               */ Destroy,
 
151
                /* resize                */ Resize,
 
152
                /* expose                */ Redisplay,
 
153
                /* set_values            */ SetValues,
 
154
                /* set_values_hook       */ NULL,
 
155
                /* set_values_almost     */ XtInheritSetValuesAlmost,
 
156
                /* get_values_hook       */ NULL,
 
157
                /* accept_focus          */ AcceptFocus,
 
158
                /* version               */ XtVersion,
 
159
                /* callback_private      */ NULL,
 
160
                /* tm_table              */ defaultTranslations,
 
161
                /* query_geometry        */ XtInheritQueryGeometry,
 
162
                /* display_accelerator   */ XtInheritDisplayAccelerator,
 
163
                /* extension             */ NULL
 
164
        },
 
165
        {       /* base_class fields */
 
166
                XtInheritTabAction,
 
167
                XtInheritFocusAction,
 
168
                XtInheritGetFocusAction,
 
169
        },
 
170
        {       /* label_class fields */
 
171
                XtInheritDrawLabel,
 
172
        },
 
173
        {       /* button_class fields */
 
174
                XtInheritDrawButton,
 
175
                XtInheritPopupMenu,
 
176
        },
 
177
        {       /* toggle_class fields */
 
178
                0,
 
179
        },
 
180
};
 
181
 
 
182
WidgetClass xwToggleWidgetClass = ThisClass;
 
183
 
 
184
 
 
185
/*
 
186
 * method function definitions
 
187
 */
 
188
#define FontHeight(f)  (int)(f->max_bounds.ascent + f->max_bounds.descent)
 
189
#define FontAscent(f)   (int)(f->max_bounds.ascent)
 
190
#define FontDescent(f)  (int)(f->max_bounds.descent)
 
191
#define TextWidth(f,s)  XTextWidth (f,s,strlen(s))
 
192
 
 
193
/*
 
194
 */
 
195
static void
 
196
ClassInitialize (void)
 
197
{
 
198
        XtRegisterGrabAction (Popup, True,
 
199
                ButtonPressMask | ButtonReleaseMask,
 
200
                GrabModeAsync, GrabModeAsync);
 
201
}
 
202
 
 
203
/*
 
204
 * initialize Method
 
205
 */
 
206
static void
 
207
Initialize (Widget treq, Widget tnew, ArgList args, Cardinal *num_args)
 
208
{
 
209
        XwToggleWidget new = (XwToggleWidget) tnew;
 
210
#ifdef DEBUG_TOGGLE
 
211
        printf ("%s: Initialize(%s) state=%d\n",
 
212
                __FILE__, new->core.name, new->toggle.state);
 
213
#endif
 
214
        if (new->base.shadow_type != XtShadowNone) {
 
215
                if (new->toggle.state > 0)
 
216
                        new->base.shadow_type = XtShadowDown;
 
217
                else
 
218
                        new->base.shadow_type = XtShadowUp;
 
219
        }
 
220
        new->toggle.multi_click_time = XtGetMultiClickTime (XtDisplay(new)) * 1.2;
 
221
        new->toggle.time =0;
 
222
}
 
223
 
 
224
/*
 
225
 * set_values method
 
226
 */
 
227
static Boolean
 
228
SetValues (Widget current, Widget request, Widget super,
 
229
                        ArgList args, Cardinal *nargs)
 
230
{
 
231
        Boolean redraw = False;
 
232
        XwToggleWidget tw = (XwToggleWidget) current;
 
233
        XwToggleWidget newi = (XwToggleWidget) super;
 
234
        
 
235
        if (tw->toggle.state != newi->toggle.state) {
 
236
                redraw = True;
 
237
                if (newi->base.shadow_type != XtShadowNone) {
 
238
                        if (newi->toggle.state) {
 
239
                                newi->base.shadow_type = XtShadowDown;
 
240
                        } else {
 
241
                                newi->base.shadow_type = XtShadowUp;
 
242
                        }
 
243
                }
 
244
        }
 
245
        if (tw->core.sensitive != newi->core.sensitive) {
 
246
                redraw = True;
 
247
        }
 
248
#ifdef DEBUG_TOGGLE
 
249
        printf ("%s: SetValues(%s ..) redraw=%d\n", __FILE__, newi->core.name, (int)redraw);
 
250
#endif
 
251
        return (redraw);
 
252
}
 
253
 
 
254
/*
 
255
 * destroy method
 
256
 */
 
257
/* ARGSUSED */
 
258
static void
 
259
Destroy (Widget w)
 
260
{
 
261
#ifdef DEBUG_TOGGLE
 
262
        printf ("%s: Destroy (%s)\n", __FILE__, w->core.name);
 
263
#endif
 
264
}
 
265
 
 
266
/*
 
267
 * resize method
 
268
 */
 
269
/* ARGSUSED */
 
270
static void
 
271
Resize (Widget w)
 
272
{
 
273
#ifdef DEBUG_TOGGLE
 
274
        printf ("%s: Resize(%s)\n", __FILE__, w->core.name);
 
275
#endif
 
276
}
 
277
 
 
278
/*
 
279
 * redisplay method
 
280
 */
 
281
static void
 
282
Redisplay (Widget w, XEvent *event, Region region)
 
283
{
 
284
#ifdef DEBUG_TOGGLE
 
285
        printf ("%s: Redisplay(%s)\n", __FILE__, w->core.name);
 
286
#endif
 
287
        if (!XtIsRealized(w))
 
288
                return;
 
289
        if (!((XwToggleWidget)w)->base.shadow_width) {
 
290
                DrawToggle (w);
 
291
        } else {
 
292
                (*xwButtonClassRec.core_class.expose)(w, event, region);
 
293
        }
 
294
}
 
295
 
 
296
/*
 
297
 */
 
298
static Boolean
 
299
AcceptFocus (Widget w, Time *t)
 
300
{
 
301
#ifdef DEBUG_TOGGLE
 
302
        printf ("%s: AcceptFocus(%s)\n", __FILE__, w->core.name);
 
303
#endif
 
304
        if (!XtIsRealized(w))
 
305
                return (False);
 
306
        if (!XtIsManaged(w))
 
307
                return (False);
 
308
        if (!XtIsSensitive(w))
 
309
                return (False);
 
310
        return (True);
 
311
}
 
312
 
 
313
 
 
314
/*
 
315
 * action function definitions
 
316
 */
 
317
 
 
318
/* ARGSUSED */
 
319
static void
 
320
Highlight (Widget w, XEvent *event, String *params, Cardinal *num_params)
 
321
{
 
322
        /* static Pixel bg; */
 
323
        XwToggleWidget tw = (XwToggleWidget) w;
 
324
#ifdef DEBUG_TOGGLE
 
325
        printf ("%s: Highlight(%s) event=%d\n", __FILE__, tw->label.text, event->type);
 
326
#endif
 
327
        if (!tw->core.sensitive)
 
328
                return;
 
329
        tw->label.textGC = tw->button.focusGC;
 
330
        tw->button.bgGC = tw->button.focus_bg_gc;
 
331
        DrawToggle (w);
 
332
}
 
333
 
 
334
/* ARGSUSED */
 
335
static void
 
336
Unhighlight (Widget w, XEvent *event, String *params, Cardinal *num_params)
 
337
{
 
338
        /* static Pixel bg; */
 
339
        XwToggleWidget tw = (XwToggleWidget) w;
 
340
#ifdef DEBUG_TOGGLE
 
341
        printf ("%s: Unhighlight(%s) event=%d\n", __FILE__, tw->label.text, event->type);
 
342
#endif
 
343
        if (!tw->core.sensitive)
 
344
                return;
 
345
        tw->label.textGC = tw->label.sensitiveGC;
 
346
        tw->button.bgGC = tw->button.std_bg_gc;
 
347
        DrawToggle (w);
 
348
}
 
349
 
 
350
/* ARGSUSED */
 
351
static void
 
352
Reset (Widget w, XEvent *event, String *params, Cardinal *num_params)
 
353
{
 
354
        XwToggleWidget bw = (XwToggleWidget) w;
 
355
#ifdef DEBUG_TOGGLE
 
356
        printf ("%s:Reset(%s)\n", __FILE__, bw->label.text);
 
357
#endif
 
358
        if (bw->toggle.state) {
 
359
                Unset (w, event, params, num_params);
 
360
        }
 
361
        Unhighlight (w, event, params, num_params);
 
362
}
 
363
 
 
364
/* ARGSUSED */
 
365
static void
 
366
Notify (Widget w, XEvent *event, String *params, Cardinal *num_params)
 
367
{
 
368
        XwToggleWidget tw = (XwToggleWidget) w;
 
369
        Boolean doubleClick = False;
 
370
#ifdef DEBUG_TOGGLE
 
371
        printf ("%s: Notify(%s)\n", __FILE__, tw->label.text);
 
372
#endif
 
373
        if (event->type == ButtonRelease) {
 
374
                if ( event->xbutton.time - tw->toggle.time
 
375
                                < tw->toggle.multi_click_time ) {
 
376
                        /* double click
 
377
                         */
 
378
                        doubleClick = True;
 
379
                        if (!tw->toggle.state) {
 
380
                                tw->toggle.state = True;
 
381
                                XtVaSetValues (w, XtNshadowType, XtShadowDown, NULL);
 
382
                        }
 
383
                        XtCallCallbackList (w, tw->toggle.double_callbacks, event);
 
384
                }
 
385
                tw->toggle.time = event->xbutton.time;
 
386
        }
 
387
        if (!doubleClick)
 
388
                XtCallCallbackList (w, tw->button.notify_callbacks, (XtPointer)event);
 
389
}
 
390
 
 
391
/* ARGSUSED */
 
392
static void
 
393
Set (Widget w, XEvent *event, String *params, Cardinal *num_params)
 
394
{
 
395
        XwToggleWidget bw = (XwToggleWidget) w;
 
396
#ifdef DEBUG_TOGGLE
 
397
        printf ("%s:Set(%s)\n", __FILE__, bw->label.text);
 
398
#endif
 
399
        if (bw->toggle.state)
 
400
                return;
 
401
        bw->toggle.state = True;
 
402
        XtVaSetValues (w, XtNshadowType, XtShadowDown, NULL);
 
403
}
 
404
 
 
405
static void
 
406
Unset (Widget w, XEvent *event, String *params, Cardinal *num_params)
 
407
{
 
408
        XwToggleWidget bw = (XwToggleWidget) w;
 
409
 
 
410
#ifdef DEBUG_TOGGLE
 
411
        printf ("%s:Unset(%s)\n", __FILE__, bw->label.text);
 
412
#endif
 
413
        if (!bw->toggle.state)
 
414
                return;
 
415
        bw->toggle.state = False;
 
416
        XtVaSetValues (w, XtNshadowType, XtShadowUp, NULL);
 
417
}
 
418
 
 
419
/*
 
420
 */
 
421
static void
 
422
Popup (Widget w, XEvent *event, String *params, Cardinal *num_params)
 
423
{
 
424
#ifdef DEBUG_TOGGLE
 
425
        printf ("%s: Popup(%s)\n", __FILE__, w->core.name);
 
426
#endif
 
427
        (*xwToggleClassRec.button_class.popup_menu)(w, event, params, num_params);
 
428
}
 
429
 
 
430
 
 
431
/*
 
432
 */
 
433
static void
 
434
Toggle (Widget w, XEvent *event, String *params, Cardinal *num_params)
 
435
{
 
436
        XwToggleWidget tw = (XwToggleWidget) w;
 
437
#ifdef DEBUG_TOGGLE
 
438
        printf ("%s: Toggle(%s)\n", __FILE__, tw->label.text);
 
439
#endif
 
440
 
 
441
        if (tw->toggle.state) {
 
442
                tw->toggle.state = False;
 
443
                XtVaSetValues (w, XtNshadowType, XtShadowUp, NULL);
 
444
        } else {
 
445
                tw->toggle.state = True;
 
446
                XtVaSetValues (w, XtNshadowType, XtShadowDown, NULL);
 
447
        }
 
448
}
 
449
 
 
450
 
 
451
/*
 
452
 * called if tab is pressed
 
453
 */
 
454
 
 
455
/* ARGSUSED */
 
456
static void
 
457
Tab (Widget w, XEvent *event, String *params, Cardinal *num_params)
 
458
{
 
459
#ifdef DEBUG_TOGGLE
 
460
    fprintf (stderr, "%s: Tab_action()\n", __FILE__);
 
461
#endif
 
462
    (*xwToggleClassRec.base_class.tab_action)(w, event, params, num_params);
 
463
}
 
464
 
 
465
/* ARGSUSED */
 
466
static void
 
467
Focus (Widget w, XEvent *event, String *params, Cardinal *num_params)
 
468
{
 
469
#ifdef DEBUG_TOGGLE
 
470
    fprintf (stderr, "%s: Focus()\n", __FILE__);
 
471
#endif
 
472
    (*xwToggleClassRec.base_class.focus_action)(w, event, params, num_params);
 
473
}
 
474
 
 
475
/* ARGSUSED */
 
476
static void
 
477
GetFocus (Widget w, XEvent *event, String *params, Cardinal *num_params)
 
478
{
 
479
#ifdef DEBUG_TOGGLE
 
480
    fprintf (stderr, "%s: GetFocus()\n", __FILE__);
 
481
#endif
 
482
    (*xwToggleClassRec.base_class.getfocus_action)(w,event, params, num_params);
 
483
}
 
484
 
 
485
/* tool functions
 
486
 */
 
487
static void
 
488
DrawToggle (Widget w)
 
489
{
 
490
        XwToggleWidget tw = (XwToggleWidget) w;
 
491
        GC gc;
 
492
#ifdef DEBUG_TOGGLE
 
493
        printf ("%s: DrawToggle(%s)\n", __FILE__, w->core.name);
 
494
#endif
 
495
        if (!XtIsRealized(w))
 
496
                return;
 
497
        (*xwToggleClassRec.button_class.draw_button)(w);
 
498
        if (!tw->base.shadow_width) {
 
499
                if (tw->toggle.state) {
 
500
                        /* draw frame */
 
501
                        gc = tw->label.textGC;
 
502
                } else {
 
503
                        gc = tw->button.bgGC;
 
504
                }
 
505
                XDrawRectangle (XtDisplay(w), XtWindow(w), gc, 0, 0,
 
506
                        tw->core.width-1, tw->core.height-1);
 
507
        }
 
508
}
 
509
 
 
510
/*
 
511
 * for external usage
 
512
 */
 
513
/*
 
514
 */
 
515
Boolean
 
516
XwIsSet (Widget w)
 
517
{
 
518
        XwToggleWidget tw = (XwToggleWidget) w;
 
519
        return ((Boolean)tw->toggle.state);
 
520
}
 
521
/*EOF*/
 
522