2 * Copyright (c) 2000 by Conectiva S.A. (http://www.conectiva.com)
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * CONECTIVA LINUX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
18 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
19 * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 * Except as contained in this notice, the name of Conectiva Linux shall
23 * not be used in advertising or otherwise to promote the sale, use or other
24 * dealings in this Software without prior written authorization from
27 * Author: Paulo César Pereira de Andrade <pcpa@conectiva.com.br>
32 #include <sys/types.h>
35 #include <X11/XKBlib.h>
36 #include <X11/Shell.h>
37 #include <X11/Xaw/Command.h>
38 #include <X11/Xaw/Form.h>
39 #include <X11/Xaw/Label.h>
40 #include <X11/Xaw/Scrollbar.h>
41 #include <X11/Xaw/Toggle.h>
42 #include "keyboard-cfg.h"
44 #define MAX_TIMEOUT 20
45 #define MAX_MOUSE_SPEED 500
46 #define MAX_MOUSE_TIME 4
47 #define MAX_MOUSE_DELAY 2.09
48 #define MAX_REPEAT_RATE 8.04
49 #define MAX_REPEAT_DELAY 6.04
50 #define MAX_SLOW_TIME 4
51 #define MAX_BOUNCE_TIME 4
57 Widget label
, number
, scroller
;
58 double min
, max
, value
, resolution
;
65 static Widget shell
, accessx
, enable
, timeoutToggle
, form
, apply
;
66 static Widget sticky
, stickyAuto
, stickyBeep
;
69 static Widget slowToggle
, slowPressed
, slowAccepted
;
70 static Widget bounceToggle
;
71 static Scale
*timeout
, *mouseSpeed
, *mouseTime
, *mouseDelay
, *slow
,
72 *repeatRate
, *repeatDelay
, *bounce
;
78 static void CreateAccessXHelpDialog(void);
79 static void EnableCallback(Widget
, XtPointer
, XtPointer
);
80 static void ScaleEnableCallback(Widget
, XtPointer
, XtPointer
);
81 static void ScaleJumpCallback(Widget
, XtPointer
, XtPointer
);
83 static void ApplyCallback(Widget
, XtPointer
, XtPointer
);
84 static void AccessXInitialize(void);
86 void CloseAccessXAction(Widget
, XEvent
*, String
*, Cardinal
*);
87 void AccessXConfigureStart(void);
88 void AccessXConfigureEnd(void);
99 XkbGetControls(DPY
, XkbAllControlsMask
, xkb_info
->xkb
);
100 if (xkb_info
->xkb
->ctrls
== NULL
)
101 xkb_info
->xkb
->ctrls
= (XkbControlsPtr
)
102 XtCalloc(1, sizeof(XkbControlsRec
));
104 xkb_info
->xkb
->ctrls
->enabled_ctrls
|= XkbMouseKeysMask
|
105 XkbMouseKeysAccelMask
;
106 xkb_info
->xkb
->ctrls
->mk_delay
= 40;
107 xkb_info
->xkb
->ctrls
->mk_interval
= 10;
108 xkb_info
->xkb
->ctrls
->mk_time_to_max
= 1000;
109 xkb_info
->xkb
->ctrls
->mk_max_speed
= 500;
110 xkb_info
->xkb
->ctrls
->mk_curve
= 0;
111 XkbSetControls(DPY
, XkbAllControlsMask
, xkb_info
->xkb
);
112 (void)UpdateKeyboard(True
);
113 CreateAccessXHelpDialog();
118 CreateAccessXHelpDialog()
122 shell
= XtVaCreatePopupShell("accessx", transientShellWidgetClass
, toplevel
,
123 XtNx
, toplevel
->core
.x
+ toplevel
->core
.width
,
124 XtNy
, toplevel
->core
.y
, NULL
);
125 form
= XtCreateManagedWidget("form", formWidgetClass
, shell
, NULL
, 0);
126 XtCreateManagedWidget("label", labelWidgetClass
, form
, NULL
, 0);
127 XtCreateManagedWidget("lock", labelWidgetClass
, form
, NULL
, 0);
128 XtCreateManagedWidget("div", labelWidgetClass
, form
, NULL
, 0);
129 XtCreateManagedWidget("mul", labelWidgetClass
, form
, NULL
, 0);
130 XtCreateManagedWidget("minus", labelWidgetClass
, form
, NULL
, 0);
131 XtCreateManagedWidget("7", labelWidgetClass
, form
, NULL
, 0);
132 XtCreateManagedWidget("8", labelWidgetClass
, form
, NULL
, 0);
133 XtCreateManagedWidget("9", labelWidgetClass
, form
, NULL
, 0);
134 XtCreateManagedWidget("plus", labelWidgetClass
, form
, NULL
, 0);
135 XtCreateManagedWidget("4", labelWidgetClass
, form
, NULL
, 0);
136 XtCreateManagedWidget("5", labelWidgetClass
, form
, NULL
, 0);
137 XtCreateManagedWidget("6", labelWidgetClass
, form
, NULL
, 0);
138 XtCreateManagedWidget("1", labelWidgetClass
, form
, NULL
, 0);
139 XtCreateManagedWidget("2", labelWidgetClass
, form
, NULL
, 0);
140 XtCreateManagedWidget("3", labelWidgetClass
, form
, NULL
, 0);
141 XtCreateManagedWidget("enter", labelWidgetClass
, form
, NULL
, 0);
142 XtCreateManagedWidget("0", labelWidgetClass
, form
, NULL
, 0);
143 XtCreateManagedWidget("del", labelWidgetClass
, form
, NULL
, 0);
145 XtRealizeWidget(shell
);
146 XSetWMProtocols(DPY
, XtWindow(shell
), &wm_delete_window
, 1);
147 XtPopup(shell
, XtGrabNone
);
152 CloseAccessXAction(Widget w
, XEvent
*event
, String
*params
, Cardinal
*num_params
)
158 AccessXInitialize(void)
160 static int first
= 1;
163 Widget stickyForm
, mouseForm
, repeatForm
, slowForm
, bounceForm
;
170 InitializeKeyboard();
172 XkbGetControls(DPY
, XkbAllControlsMask
, xkb_info
->xkb
);
173 if (xkb_info
->xkb
->ctrls
== NULL
)
174 xkb_info
->xkb
->ctrls
= (XkbControlsPtr
)
175 XtCalloc(1, sizeof(XkbControlsRec
));
177 timeout
= XtNew(Scale
);
178 accessx
= XtCreateWidget("accessxForm", formWidgetClass
, work
, NULL
, 0);
179 enable
= XtVaCreateManagedWidget("enable", toggleWidgetClass
, accessx
,
181 (xkb_info
->xkb
->ctrls
->enabled_ctrls
&
182 (XkbAccessXKeysMask
| XkbStickyKeysMask
|
183 XkbSlowKeysMask
| XkbBounceKeysMask
)) != 0, NULL
);
185 apply
= XtCreateManagedWidget("apply", commandWidgetClass
, accessx
, NULL
, 0);
186 XtAddCallback(apply
, XtNcallback
, ApplyCallback
, NULL
);
188 form
= XtCreateManagedWidget("Accessx", formWidgetClass
, accessx
, NULL
, 0);
189 timeoutToggle
= XtVaCreateManagedWidget("timeoutToggle", toggleWidgetClass
,
191 xkb_info
->xkb
->ctrls
->ax_timeout
> 60
192 && xkb_info
->xkb
->ctrls
->ax_timeout
194 XtAddCallback(timeoutToggle
, XtNcallback
, ScaleEnableCallback
,
196 timeout
->label
= XtCreateManagedWidget("timeoutLabel", labelWidgetClass
,
198 timeout
->number
= XtCreateManagedWidget("timeoutNumber", labelWidgetClass
,
200 timeout
->scroller
= XtCreateManagedWidget("timeoutScroller",
201 scrollbarWidgetClass
,
203 XtAddCallback(timeout
->scroller
, XtNjumpProc
, ScaleJumpCallback
,
206 timeout
->max
= MAX_TIMEOUT
;
207 timeout
->resolution
= 1;
208 timeout
->integer
= True
;
210 sticky
= XtVaCreateManagedWidget("sticky", toggleWidgetClass
, form
,
212 (xkb_info
->xkb
->ctrls
->enabled_ctrls
&
213 XkbStickyKeysMask
) != 0, NULL
);
214 stickyForm
= XtCreateManagedWidget("stickyForm", formWidgetClass
,
216 XtAddCallback(sticky
, XtNcallback
, EnableCallback
, (XtPointer
)stickyForm
);
217 stickyAuto
= XtVaCreateManagedWidget("auto", toggleWidgetClass
, stickyForm
,
219 (xkb_info
->xkb
->ctrls
->ax_options
&
220 XkbAX_LatchToLockMask
) == 0, NULL
);
221 stickyBeep
= XtVaCreateManagedWidget("beep", toggleWidgetClass
, stickyForm
,
223 (xkb_info
->xkb
->ctrls
->ax_options
&
224 XkbAX_StickyKeysFBMask
) != 0, NULL
);
226 mouse
= XtVaCreateManagedWidget("mouseKeys", toggleWidgetClass
, form
,
228 (xkb_info
->xkb
->ctrls
->enabled_ctrls
&
229 (XkbMouseKeysMask
| XkbMouseKeysAccelMask
))
231 mouseForm
= XtCreateManagedWidget("mouseForm", formWidgetClass
,
233 XtAddCallback(mouse
, XtNcallback
, EnableCallback
, (XtPointer
)mouseForm
);
234 mouseSpeed
= XtNew(Scale
);
235 mouseSpeed
->label
= XtCreateManagedWidget("speedLabel", labelWidgetClass
,
237 mouseSpeed
->number
= XtCreateManagedWidget("speedNumber", labelWidgetClass
,
239 mouseSpeed
->scroller
= XtCreateManagedWidget("speedScroller",
240 scrollbarWidgetClass
,
242 XtAddCallback(mouseSpeed
->scroller
, XtNjumpProc
, ScaleJumpCallback
,
243 (XtPointer
)mouseSpeed
);
244 mouseSpeed
->min
= 10;
245 mouseSpeed
->max
= MAX_MOUSE_SPEED
;
246 mouseSpeed
->resolution
= 10;
247 mouseSpeed
->integer
= True
;
248 mouseTime
= XtNew(Scale
);
249 mouseTime
->label
= XtCreateManagedWidget("timeLabel", labelWidgetClass
,
251 mouseTime
->number
= XtCreateManagedWidget("timeNumber", labelWidgetClass
,
253 mouseTime
->scroller
= XtCreateManagedWidget("timeScroller",
254 scrollbarWidgetClass
,
256 XtAddCallback(mouseTime
->scroller
, XtNjumpProc
, ScaleJumpCallback
,
257 (XtPointer
)mouseTime
);
259 mouseTime
->max
= MAX_MOUSE_TIME
;
260 mouseTime
->resolution
= .1;
261 mouseTime
->integer
= False
;
262 mouseDelay
= XtNew(Scale
);
263 mouseDelay
->label
= XtCreateManagedWidget("delayLabel", labelWidgetClass
,
265 mouseDelay
->number
= XtCreateManagedWidget("delayNumber", labelWidgetClass
,
267 mouseDelay
->scroller
= XtCreateManagedWidget("delayScroller",
268 scrollbarWidgetClass
,
270 XtAddCallback(mouseDelay
->scroller
, XtNjumpProc
, ScaleJumpCallback
,
271 (XtPointer
)mouseDelay
);
272 mouseDelay
->min
= .1;
273 mouseDelay
->max
= MAX_MOUSE_DELAY
;
274 mouseDelay
->resolution
= .1;
275 mouseDelay
->integer
= False
;
277 repeat
= XtVaCreateManagedWidget("repeatKeys", toggleWidgetClass
, form
,
279 (xkb_info
->xkb
->ctrls
->enabled_ctrls
&
280 XkbRepeatKeysMask
) != 0, NULL
);
281 repeatForm
= XtCreateManagedWidget("repeatForm", formWidgetClass
,
283 XtAddCallback(repeat
, XtNcallback
, EnableCallback
, (XtPointer
)repeatForm
);
284 repeatRate
= XtNew(Scale
);
285 repeatRate
->label
= XtCreateManagedWidget("rateLabel", labelWidgetClass
,
286 repeatForm
, NULL
, 0);
287 repeatRate
->number
= XtCreateManagedWidget("rateNumber", labelWidgetClass
,
288 repeatForm
, NULL
, 0);
289 repeatRate
->scroller
= XtCreateManagedWidget("rateScroller",
290 scrollbarWidgetClass
,
291 repeatForm
, NULL
, 0);
292 XtAddCallback(repeatRate
->scroller
, XtNjumpProc
, ScaleJumpCallback
,
293 (XtPointer
)repeatRate
);
294 repeatRate
->min
= .05;
295 repeatRate
->max
= MAX_REPEAT_RATE
;
296 repeatRate
->resolution
= .05;
297 repeatRate
->integer
= False
;
298 repeatDelay
= XtNew(Scale
);
299 repeatDelay
->label
= XtCreateManagedWidget("delayLabel", labelWidgetClass
,
300 repeatForm
, NULL
, 0);
301 repeatDelay
->number
= XtCreateManagedWidget("delayNumber", labelWidgetClass
,
302 repeatForm
, NULL
, 0);
303 repeatDelay
->scroller
= XtCreateManagedWidget("delayScroller",
304 scrollbarWidgetClass
,
305 repeatForm
, NULL
, 0);
306 XtAddCallback(repeatDelay
->scroller
, XtNjumpProc
, ScaleJumpCallback
,
307 (XtPointer
)repeatDelay
);
308 repeatDelay
->min
= .05;
309 repeatDelay
->max
= MAX_REPEAT_DELAY
;
310 repeatDelay
->resolution
= .05;
311 repeatDelay
->integer
= False
;
313 slowToggle
= XtVaCreateManagedWidget("slow", toggleWidgetClass
,
315 (xkb_info
->xkb
->ctrls
->enabled_ctrls
&
316 XkbSlowKeysMask
) != 0, NULL
);
317 slowForm
= XtCreateManagedWidget("slowForm", formWidgetClass
,
319 XtAddCallback(slowToggle
, XtNcallback
, EnableCallback
, (XtPointer
)slowForm
);
320 XtCreateManagedWidget("beep", labelWidgetClass
, slowForm
, NULL
, 0);
321 slowPressed
= XtVaCreateManagedWidget("pressed", toggleWidgetClass
,
323 (xkb_info
->xkb
->ctrls
->ax_options
&
324 XkbAX_SKPressFBMask
) != 0,
326 slowAccepted
= XtVaCreateManagedWidget("accepted", toggleWidgetClass
,
328 (xkb_info
->xkb
->ctrls
->ax_options
&
329 XkbAX_SKAcceptFBMask
) != 0,
332 slow
->label
= XtCreateManagedWidget("slowLabel", labelWidgetClass
,
334 slow
->number
= XtCreateManagedWidget("slowNumber", labelWidgetClass
,
336 slow
->scroller
= XtCreateManagedWidget("slowScroller",
337 scrollbarWidgetClass
,
339 XtAddCallback(slow
->scroller
, XtNjumpProc
, ScaleJumpCallback
,
342 slow
->max
= MAX_SLOW_TIME
;
343 slow
->resolution
= 0.1;
344 slow
->integer
= False
;
346 bounceToggle
= XtVaCreateManagedWidget("bounce", toggleWidgetClass
,
348 (xkb_info
->xkb
->ctrls
->enabled_ctrls
&
349 XkbBounceKeysMask
) != 0,
351 bounceForm
= XtCreateManagedWidget("bounceForm", formWidgetClass
,
353 XtAddCallback(bounceToggle
, XtNcallback
, EnableCallback
, (XtPointer
)bounceForm
);
354 bounce
= XtNew(Scale
);
355 bounce
->label
= XtCreateManagedWidget("bounceLabel", labelWidgetClass
,
356 bounceForm
, NULL
, 0);
357 bounce
->number
= XtCreateManagedWidget("bounceNumber", labelWidgetClass
,
358 bounceForm
, NULL
, 0);
359 bounce
->scroller
= XtCreateManagedWidget("bounceScroller",
360 scrollbarWidgetClass
,
361 bounceForm
, NULL
, 0);
362 XtAddCallback(bounce
->scroller
, XtNjumpProc
, ScaleJumpCallback
,
365 bounce
->max
= MAX_BOUNCE_TIME
;
366 bounce
->resolution
= 0.1;
367 bounce
->integer
= False
;
369 XtRealizeWidget(accessx
);
371 XtSetArg(args
[0], XtNstate
, &state
);
372 XtGetValues(timeoutToggle
, args
, 1);
373 ScaleEnableCallback(enable
, (XtPointer
)timeout
, (XtPointer
)(long)state
);
374 if (xkb_info
->xkb
->ctrls
->ax_timeout
> 60)
375 val
= (float)(xkb_info
->xkb
->ctrls
->ax_timeout
- 60) /
376 (float)(MAX_TIMEOUT
* 60);
379 ScaleJumpCallback(timeout
->scroller
, (XtPointer
)timeout
, (XtPointer
)&val
);
381 XtSetArg(args
[0], XtNstate
, &state
);
382 XtGetValues(sticky
, args
, 1);
383 EnableCallback(sticky
, (XtPointer
)stickyForm
, (XtPointer
)(long)state
);
385 XtSetArg(args
[0], XtNstate
, &state
);
386 XtGetValues(mouse
, args
, 1);
387 EnableCallback(mouse
, (XtPointer
)mouseForm
, (XtPointer
)(long)state
);
388 if (xkb_info
->xkb
->ctrls
->mk_time_to_max
> 10)
389 val
= (float)((xkb_info
->xkb
->ctrls
->mk_time_to_max
* (40. / 10.))) /
390 (float)(MAX_MOUSE_TIME
* 100);
392 val
= 10.0 / (float)(MAX_MOUSE_TIME
* 100);
393 ScaleJumpCallback(mouseTime
->scroller
, (XtPointer
)mouseTime
,
395 tmp
= mouseTime
->value
;
396 if (xkb_info
->xkb
->ctrls
->mk_max_speed
!= 0)
397 val
= (float)(xkb_info
->xkb
->ctrls
->mk_max_speed
/ tmp
- 10) /
398 (float)MAX_MOUSE_SPEED
;
400 val
= 10.0 / (float)MAX_MOUSE_SPEED
;
401 ScaleJumpCallback(mouseSpeed
->scroller
, (XtPointer
)mouseSpeed
,
403 if (xkb_info
->xkb
->ctrls
->mk_delay
> 10)
404 val
= (float)(xkb_info
->xkb
->ctrls
->mk_delay
- 10) /
405 (float)(MAX_MOUSE_DELAY
* 100);
407 val
= 10.0 / (float)(MAX_MOUSE_DELAY
* 100);
408 ScaleJumpCallback(mouseDelay
->scroller
, (XtPointer
)mouseDelay
,
411 XtSetArg(args
[0], XtNstate
, &state
);
412 XtGetValues(repeat
, args
, 1);
413 EnableCallback(repeat
, (XtPointer
)repeatForm
, (XtPointer
)(long)state
);
414 if (xkb_info
->xkb
->ctrls
->repeat_interval
> 5)
415 val
= (float)(xkb_info
->xkb
->ctrls
->repeat_interval
- 5) /
416 (float)(MAX_REPEAT_RATE
* 1000);
418 val
= 5.0 / (float)(MAX_REPEAT_RATE
* 1000);
419 ScaleJumpCallback(repeatRate
->scroller
, (XtPointer
)repeatRate
,
421 if (xkb_info
->xkb
->ctrls
->repeat_delay
> 5)
422 val
= (float)(xkb_info
->xkb
->ctrls
->repeat_delay
- 5) /
423 (float)(MAX_REPEAT_DELAY
* 1000);
425 val
= 5.0 / (float)(MAX_REPEAT_DELAY
* 1000);
426 ScaleJumpCallback(repeatDelay
->scroller
, (XtPointer
)repeatDelay
,
429 XtSetArg(args
[0], XtNstate
, &state
);
430 XtGetValues(slowToggle
, args
, 1);
431 EnableCallback(slowToggle
, (XtPointer
)slowForm
, (XtPointer
)(long)state
);
432 if (xkb_info
->xkb
->ctrls
->slow_keys_delay
> 10)
433 val
= (float)(xkb_info
->xkb
->ctrls
->repeat_delay
- 10) /
434 (float)(MAX_SLOW_TIME
* 1000);
436 val
= 10.0 / (float)(MAX_SLOW_TIME
* 1000);
437 ScaleJumpCallback(slow
->scroller
, (XtPointer
)slow
, (XtPointer
)&val
);
439 XtSetArg(args
[0], XtNstate
, &state
);
440 XtGetValues(bounceToggle
, args
, 1);
441 EnableCallback(bounceToggle
, (XtPointer
)bounceForm
, (XtPointer
)(long)state
);
442 if (xkb_info
->xkb
->ctrls
->debounce_delay
> 10)
443 val
= (float)(xkb_info
->xkb
->ctrls
->debounce_delay
- 10) /
444 (float)(MAX_BOUNCE_TIME
* 1000);
446 val
= 10.0 / (float)(MAX_BOUNCE_TIME
* 1000);
447 ScaleJumpCallback(bounce
->scroller
, (XtPointer
)bounce
, (XtPointer
)&val
);
449 XtSetArg(args
[0], XtNstate
, &state
);
450 XtGetValues(enable
, args
, 1);
454 AccessXConfigureStart(void)
458 XtMapWidget(accessx
);
462 AccessXConfigureEnd(void)
464 XtUnmapWidget(accessx
);
469 EnableCallback(Widget w
, XtPointer user_data
, XtPointer call_data
)
471 XtSetSensitive((Widget
)user_data
, (long)call_data
);
476 ScaleEnableCallback(Widget w
, XtPointer user_data
, XtPointer call_data
)
478 Scale
*scale
= (Scale
*)user_data
;
480 XtSetSensitive(scale
->label
, (long)call_data
);
481 XtSetSensitive(scale
->number
, (long)call_data
);
482 XtSetSensitive(scale
->scroller
, (long)call_data
);
486 ScaleJumpCallback(Widget w
, XtPointer user_data
, XtPointer call_data
)
488 Scale
*scale
= (Scale
*)user_data
;
489 float percent
= *(float *)call_data
, timeout
= percent
* scale
->max
;
494 if (timeout
>= scale
->max
- scale
->min
)
495 timeout
= scale
->max
- scale
->min
;
497 if (scale
->integer
) {
498 int tm
= timeout
+ scale
->min
;
500 tm
-= tm
% (int)scale
->resolution
;
501 XmuSnprintf(str
, sizeof(str
), "%i", tm
);
505 long tm
= (timeout
+ scale
->min
) * 1e+6;
507 tm
-= tm
% (long)(scale
->resolution
* 1e+6);
508 scale
->value
= (double)tm
/ 1e+6;
509 XmuSnprintf(str
, sizeof(str
), "%f", scale
->value
);
512 XtSetArg(args
[0], XtNlabel
, str
);
513 XtSetValues(scale
->number
, args
, 1);
514 x
= w
->core
.x
+ w
->core
.border_width
;
515 x
+= ((double)(w
->core
.width
- scale
->number
->core
.width
) / scale
->max
) * timeout
;
516 XtMoveWidget(scale
->number
, x
, scale
->number
->core
.y
);
517 XawScrollbarSetThumb(w
, timeout
/ (scale
->max
- scale
->min
),
518 scale
->resolution
/ (scale
->max
- scale
->min
));
523 ApplyCallback(Widget w
, XtPointer user_data
, XtPointer call_data
)
528 XkbGetControls(DPY
, XkbAllControlsMask
, xkb_info
->xkb
);
531 XtSetArg(args
[0], XtNstate
, &state
);
532 XtGetValues(enable
, args
, 1);
534 xkb_info
->config
.initial_ctrls
|= XkbAccessXKeysMask
;
535 xkb_info
->xkb
->ctrls
->enabled_ctrls
|= XkbAccessXKeysMask
;
538 xkb_info
->config
.initial_ctrls
&= ~XkbAccessXKeysMask
;
539 xkb_info
->xkb
->ctrls
->enabled_ctrls
&= ~XkbAccessXKeysMask
;
543 XtSetArg(args
[0], XtNstate
, &state
);
544 XtGetValues(timeoutToggle
, args
, 1);
546 xkb_info
->config
.ax_timeout
=
547 xkb_info
->xkb
->ctrls
->ax_timeout
= timeout
->value
* 60;
549 xkb_info
->config
.ax_timeout
=
550 xkb_info
->xkb
->ctrls
->ax_timeout
= 65535;
552 /* Enable StickyKeys */
553 XtSetArg(args
[0], XtNstate
, &state
);
554 XtGetValues(sticky
, args
, 1);
556 xkb_info
->config
.initial_ctrls
|= XkbStickyKeysMask
;
557 xkb_info
->xkb
->ctrls
->enabled_ctrls
|= XkbStickyKeysMask
;
560 xkb_info
->config
.initial_ctrls
&= ~XkbStickyKeysMask
;
561 xkb_info
->xkb
->ctrls
->enabled_ctrls
&= ~XkbStickyKeysMask
;
563 XtSetArg(args
[0], XtNstate
, &state
);
564 XtGetValues(stickyAuto
, args
, 1);
566 xkb_info
->config
.initial_opts
&= ~XkbAX_TwoKeysMask
;
567 xkb_info
->config
.initial_opts
&= ~XkbAX_LatchToLockMask
;
568 xkb_info
->xkb
->ctrls
->ax_options
&= ~XkbAX_TwoKeysMask
;
569 xkb_info
->xkb
->ctrls
->ax_options
&= ~XkbAX_LatchToLockMask
;
572 xkb_info
->config
.initial_opts
&= ~XkbAX_TwoKeysMask
;
573 xkb_info
->config
.initial_opts
|= XkbAX_LatchToLockMask
;
574 xkb_info
->xkb
->ctrls
->ax_options
&= ~XkbAX_TwoKeysMask
;
575 xkb_info
->xkb
->ctrls
->ax_options
|= XkbAX_LatchToLockMask
;
577 XtSetArg(args
[0], XtNstate
, &state
);
578 XtGetValues(stickyBeep
, args
, 1);
580 xkb_info
->config
.initial_opts
|= XkbAX_StickyKeysFBMask
;
581 xkb_info
->xkb
->ctrls
->ax_options
|= XkbAX_StickyKeysFBMask
;
584 xkb_info
->config
.initial_opts
&= ~XkbAX_StickyKeysFBMask
;
585 xkb_info
->xkb
->ctrls
->ax_options
&= ~XkbAX_StickyKeysFBMask
;
588 /* Enable MouseKeys */
589 XtSetArg(args
[0], XtNstate
, &state
);
590 XtGetValues(mouse
, args
, 1);
592 xkb_info
->config
.initial_ctrls
|= XkbMouseKeysAccelMask
;
593 xkb_info
->xkb
->ctrls
->enabled_ctrls
|= XkbMouseKeysMask
|
594 XkbMouseKeysAccelMask
;
595 xkb_info
->config
.mk_delay
=
596 xkb_info
->xkb
->ctrls
->mk_delay
= mouseDelay
->value
* 100;
597 xkb_info
->config
.mk_interval
=
598 xkb_info
->xkb
->ctrls
->mk_interval
= 40;
599 xkb_info
->config
.mk_time_to_max
=
600 xkb_info
->xkb
->ctrls
->mk_time_to_max
=
601 (mouseTime
->value
* 1000) / xkb_info
->xkb
->ctrls
->mk_interval
;
602 xkb_info
->config
.mk_max_speed
=
603 xkb_info
->xkb
->ctrls
->mk_max_speed
=
604 mouseSpeed
->value
* mouseTime
->value
;
605 xkb_info
->config
.mk_curve
= xkb_info
->xkb
->ctrls
->mk_curve
= 0;
608 xkb_info
->config
.initial_ctrls
&= ~(XkbMouseKeysMask
|
609 XkbMouseKeysAccelMask
);
610 xkb_info
->xkb
->ctrls
->enabled_ctrls
&= ~(XkbMouseKeysMask
|
611 XkbMouseKeysAccelMask
);
614 /* Enable RepeatKeys */
615 XtSetArg(args
[0], XtNstate
, &state
);
616 XtGetValues(repeat
, args
, 1);
618 xkb_info
->config
.initial_ctrls
|= XkbRepeatKeysMask
;
619 xkb_info
->xkb
->ctrls
->enabled_ctrls
|= XkbRepeatKeysMask
;
620 xkb_info
->config
.repeat_interval
=
621 xkb_info
->xkb
->ctrls
->repeat_interval
= repeatRate
->value
* 1000;
622 xkb_info
->config
.repeat_delay
=
623 xkb_info
->xkb
->ctrls
->repeat_delay
= repeatDelay
->value
* 1000;
626 xkb_info
->config
.initial_ctrls
&= ~XkbRepeatKeysMask
;
627 xkb_info
->xkb
->ctrls
->enabled_ctrls
&= ~XkbRepeatKeysMask
;
630 /* Enable SlowKeys */
631 XtSetArg(args
[0], XtNstate
, &state
);
632 XtGetValues(slowToggle
, args
, 1);
634 xkb_info
->config
.initial_ctrls
|= XkbSlowKeysMask
;
635 xkb_info
->xkb
->ctrls
->enabled_ctrls
|= XkbSlowKeysMask
;
636 xkb_info
->config
.slow_keys_delay
=
637 xkb_info
->xkb
->ctrls
->slow_keys_delay
= slow
->value
* 1000;
640 xkb_info
->config
.initial_ctrls
&= ~XkbSlowKeysMask
;
641 xkb_info
->xkb
->ctrls
->enabled_ctrls
&= ~XkbSlowKeysMask
;
643 XtSetArg(args
[0], XtNstate
, &state
);
644 XtGetValues(slowPressed
, args
, 1);
646 xkb_info
->config
.initial_opts
|= XkbAX_SKPressFBMask
;
647 xkb_info
->xkb
->ctrls
->ax_options
|= XkbAX_SKPressFBMask
;
650 xkb_info
->config
.initial_opts
&= ~XkbAX_SKPressFBMask
;
651 xkb_info
->xkb
->ctrls
->ax_options
&= ~XkbAX_SKPressFBMask
;
653 XtSetArg(args
[0], XtNstate
, &state
);
654 XtGetValues(slowAccepted
, args
, 1);
656 xkb_info
->config
.initial_opts
|= XkbAX_SKAcceptFBMask
;
657 xkb_info
->xkb
->ctrls
->ax_options
|= XkbAX_SKAcceptFBMask
;
660 xkb_info
->config
.initial_opts
&= ~XkbAX_SKAcceptFBMask
;
661 xkb_info
->xkb
->ctrls
->ax_options
&= ~XkbAX_SKAcceptFBMask
;
664 /* Enable BounceKeys */
665 XtSetArg(args
[0], XtNstate
, &state
);
666 XtGetValues(bounceToggle
, args
, 1);
668 xkb_info
->config
.initial_ctrls
|= XkbBounceKeysMask
;
669 xkb_info
->xkb
->ctrls
->enabled_ctrls
|= XkbBounceKeysMask
;
670 xkb_info
->config
.debounce_delay
=
671 xkb_info
->xkb
->ctrls
->debounce_delay
= bounce
->value
* 1000;
674 xkb_info
->config
.initial_ctrls
&= ~XkbBounceKeysMask
;
675 xkb_info
->xkb
->ctrls
->enabled_ctrls
&= ~XkbBounceKeysMask
;
678 XkbSetControls(DPY
, XkbAllControlsMask
, xkb_info
->xkb
);
680 (void)UpdateKeyboard(True
);