2 * AT-SPI - Assistive Technology Service Provider Interface
3 * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
5 * Copyright 2001 Sun Microsystems Inc.
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.
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.
17 * You should have received a copy of the GNU Library General Public
18 * License along with this library; if not, write to the
19 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 * Boston, MA 02111-1307, USA.
28 #include <X11/XKBlib.h> /* AccessX control defs */
33 static XkbDescPtr xkb;
40 } AccessXControlStruct;
43 gui_exit(GtkButton *notused, void *alsonotused)
49 toggle_xkb_control (GtkButton *toggle_button, AccessXControlStruct *control_struct)
51 gboolean is_active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle_button));
52 XkbChangeEnabledControls (GDK_DISPLAY(), XkbUseCoreKbd, control_struct->mask,
53 is_active ? control_struct->mask : 0);
57 toggle_xkb_notify_control (GtkButton *toggle_button, AccessXControlStruct *control_struct)
59 gboolean is_active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle_button));
60 unsigned short mask, always_off_mask;
61 XkbChangeEnabledControls (GDK_DISPLAY(), XkbUseCoreKbd, XkbAccessXFeedbackMask | XkbAudibleBellMask,
62 XkbAccessXFeedbackMask | XkbAudibleBellMask);
64 mask = XkbAX_TwoKeysMask | XkbAX_LatchToLockMask | XkbAX_DumbBellFBMask;
65 always_off_mask = XkbAX_SKPressFBMask | XkbAX_SKReleaseFBMask;
68 xkb->ctrls->ax_options |= (control_struct->mask | mask);
70 xkb->ctrls->ax_options &= (~control_struct->mask);
72 xkb->ctrls->ax_options &= ~always_off_mask;
74 XkbSetControls (GDK_DISPLAY(), XkbAccessXFeedbackMask, xkb);
78 toggle_accessx (GtkButton *toggle_button, void *unused)
80 gboolean is_active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle_button));
81 XkbChangeEnabledControls (GDK_DISPLAY(), XkbUseCoreKbd, XkbAllBooleanCtrlsMask,
82 (is_active) ? xkb->ctrls->enabled_ctrls : 0);
83 /*if (is_active/) XkbSetControls (GDK_DISPLAY(), XkbAllBooleanCtrlsMask, xkb);*/
87 set_accessx_control_value (GtkRange *range_control, AccessXControlStruct *control_struct)
89 *(control_struct->val) = (short int) gtk_range_get_value (range_control);
90 XkbSetControls (GDK_DISPLAY(), control_struct->mask, xkb);
96 int opcode, xkb_event_code, error, result, major, minor;
98 result = XkbQueryExtension (GDK_DISPLAY(), &opcode, &xkb_event_code, &error, &major, &minor);
99 if (result != True) return False;
101 xkb = XkbGetMap(GDK_DISPLAY(), 0, XkbUseCoreKbd);
102 if ((int)xkb == BadAlloc || xkb == NULL)
108 status = XkbGetControls(GDK_DISPLAY(), XkbAllControlsMask, xkb);
109 if (status != Success)
111 XkbFreeKeyboard(xkb, XkbAllControlsMask, True);
118 XkbFreeKeyboard(xkb, XkbAllControlsMask, True);
127 static AccessXControlStruct *
128 control_struct_new (unsigned int mask,
133 AccessXControlStruct *control = g_new0 (AccessXControlStruct, 1);
134 control->mask = mask;
135 control->val = val_ptr;
136 control->label = label;
137 control->val_label = val_label;
144 GtkWidget *hbox, *outer_vbox, *vbox, *label, *button, *range, *frame;
145 GtkAdjustment *adjustment;
146 AccessXControlStruct *control;
148 outer_vbox = gtk_widget_new (GTK_TYPE_VBOX,
149 "GtkWidget::visible", TRUE,
152 hbox = gtk_widget_new (GTK_TYPE_HBOX,
153 "GtkWidget::parent", outer_vbox,
154 "GtkWidget::visible", TRUE,
157 button = g_object_connect (gtk_widget_new (GTK_TYPE_CHECK_BUTTON,
158 "GtkButton::label", "Enable AccessX",
159 "GtkWidget::parent", hbox,
160 "GtkWidget::visible", TRUE,
163 toggle_accessx, NULL,
166 /* FeatureFBMask seems not to work :-(
168 control = control_struct_new (XkbAX_FeatureFBMask, &xkb->ctrls->ax_options, NULL, NULL);
170 button = g_object_connect (gtk_widget_new (GTK_TYPE_CHECK_BUTTON,
171 "GtkButton::label", "Notify Changes",
172 "GtkWidget::parent", hbox,
173 "GtkWidget::visible", TRUE,
176 toggle_xkb_notify_control, control,
180 gtk_widget_new (GTK_TYPE_HSEPARATOR,
181 "GtkWidget::parent", outer_vbox,
182 "GtkWidget::visible", TRUE,
185 hbox = gtk_widget_new (GTK_TYPE_HBOX,
186 "GtkWidget::parent", outer_vbox,
187 "GtkWidget::visible", TRUE,
190 control = control_struct_new (XkbStickyKeysMask, &xkb->ctrls->enabled_ctrls, NULL, NULL);
192 button = g_object_connect (gtk_widget_new (GTK_TYPE_CHECK_BUTTON,
193 "GtkButton::label", "Sticky Keys",
194 "GtkWidget::parent", hbox,
195 "GtkWidget::visible", TRUE,
198 toggle_xkb_control, control,
201 control = control_struct_new (XkbAX_StickyKeysFBMask, &xkb->ctrls->ax_options, NULL, NULL);
203 button = g_object_connect (gtk_widget_new (GTK_TYPE_CHECK_BUTTON,
204 "GtkButton::label", "Beep when Latched",
205 "GtkWidget::parent", hbox,
206 "GtkWidget::visible", TRUE,
209 toggle_xkb_notify_control, control,
212 frame = gtk_widget_new (gtk_frame_get_type(),
213 "GtkFrame::label", "Slow Keys",
214 "GtkWidget::parent", outer_vbox,
215 "GtkWidget::visible", TRUE,
218 vbox = gtk_widget_new (GTK_TYPE_VBOX,
219 "GtkWidget::parent", frame,
220 "GtkWidget::visible", TRUE,
223 hbox = gtk_widget_new (GTK_TYPE_HBOX,
224 "GtkWidget::parent", vbox,
225 "GtkWidget::visible", TRUE,
228 control = control_struct_new (XkbSlowKeysMask, &xkb->ctrls->slow_keys_delay, NULL, NULL);
230 button = g_object_connect (gtk_widget_new (GTK_TYPE_CHECK_BUTTON,
231 "GtkButton::label", "Enable Slow Keys",
232 "GtkWidget::parent", hbox,
233 "GtkWidget::visible", TRUE,
236 toggle_xkb_control, control,
239 adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (1.0, 1.0, 2000.0, 1.0, 10.0, 1.0 ));
241 range = g_object_connect (gtk_widget_new (GTK_TYPE_HSCALE,
242 "GtkWidget::parent", hbox,
243 "GtkWidget::visible", TRUE,
244 "GtkRange::update_policy", GTK_UPDATE_DELAYED,
245 "GtkScale::digits", 0,
246 "GtkScale::adjustment", adjustment,
248 "signal::value_changed",
249 set_accessx_control_value, control,
252 gtk_widget_set_usize (GTK_WIDGET (range), 150, -1);
254 label = gtk_widget_new (GTK_TYPE_LABEL,
255 "GtkLabel::label", "Delay (mS)",
256 "GtkWidget::parent", hbox,
257 "GtkWidget::visible", TRUE,
260 hbox = gtk_widget_new (GTK_TYPE_HBOX,
261 "GtkWidget::parent", vbox,
262 "GtkWidget::visible", TRUE,
265 control = control_struct_new (XkbAX_SKAcceptFBMask, &xkb->ctrls->ax_options, NULL, NULL);
267 button = g_object_connect (gtk_widget_new (GTK_TYPE_CHECK_BUTTON,
268 "GtkButton::label", "Beep on Accept",
269 "GtkWidget::parent", hbox,
270 "GtkWidget::visible", TRUE,
273 toggle_xkb_notify_control, control,
276 control = control_struct_new (XkbAX_SKRejectFBMask, &xkb->ctrls->ax_options, NULL, NULL);
278 button = g_object_connect (gtk_widget_new (GTK_TYPE_CHECK_BUTTON,
279 "GtkButton::label", "Beep on Reject",
280 "GtkWidget::parent", hbox,
281 "GtkWidget::visible", TRUE,
284 toggle_xkb_notify_control, control,
287 frame = gtk_widget_new (gtk_frame_get_type(),
288 "GtkFrame::label", "Bounce Keys",
289 "GtkWidget::parent", outer_vbox,
290 "GtkWidget::visible", TRUE,
293 vbox = gtk_widget_new (GTK_TYPE_VBOX,
294 "GtkWidget::parent", frame,
295 "GtkWidget::visible", TRUE,
298 hbox = gtk_widget_new (GTK_TYPE_HBOX,
299 "GtkWidget::parent", vbox,
300 "GtkWidget::visible", TRUE,
303 control = control_struct_new (XkbBounceKeysMask, &xkb->ctrls->debounce_delay, NULL, NULL);
305 button = g_object_connect (gtk_widget_new (GTK_TYPE_CHECK_BUTTON,
306 "GtkButton::label", "Enable Key Debounce",
307 "GtkWidget::parent", hbox,
308 "GtkWidget::visible", TRUE,
311 toggle_xkb_control, control,
314 adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (1.0, 1.0, 2000.0, 1.0, 10.0, 1.0 ));
316 range = g_object_connect (gtk_widget_new (GTK_TYPE_HSCALE,
317 "GtkWidget::parent", hbox,
318 "GtkWidget::visible", TRUE,
319 "GtkRange::update_policy", GTK_UPDATE_DELAYED,
320 "GtkScale::digits", 0,
321 "GtkScale::adjustment", adjustment,
323 "signal::value_changed",
324 set_accessx_control_value, control,
327 gtk_widget_set_usize (GTK_WIDGET (range), 150, -1);
329 label = gtk_widget_new (GTK_TYPE_LABEL,
330 "GtkLabel::label", "Delay (mS)",
331 "GtkWidget::parent", hbox,
332 "GtkWidget::visible", TRUE,
335 hbox = gtk_widget_new (GTK_TYPE_HBOX,
336 "GtkWidget::parent", vbox,
337 "GtkWidget::visible", TRUE,
340 control = control_struct_new (XkbAX_BKRejectFBMask, &xkb->ctrls->ax_options, NULL, NULL);
342 button = g_object_connect (gtk_widget_new (GTK_TYPE_CHECK_BUTTON,
343 "GtkButton::label", "Beep on Reject",
344 "GtkWidget::parent", hbox,
345 "GtkWidget::visible", TRUE,
348 toggle_xkb_notify_control, control,
357 GtkWidget *outer_hbox, *vbox, *label, *button, *range, *frame;
358 GtkAdjustment *adjustment;
359 AccessXControlStruct *control =
360 control_struct_new (XkbRepeatKeysMask, &xkb->ctrls->repeat_delay, NULL, NULL);
362 frame = gtk_widget_new (gtk_frame_get_type(),
363 "GtkFrame::label","Repeat Keys",
364 "GtkWidget::visible", TRUE,
367 outer_hbox = gtk_widget_new (GTK_TYPE_HBOX,
368 "GtkWidget::visible", TRUE,
369 "GtkWidget::parent", frame,
372 button = g_object_connect (gtk_widget_new (GTK_TYPE_CHECK_BUTTON,
373 "GtkButton::label", "Enable RepeatKeys",
374 "GtkWidget::parent", outer_hbox,
375 "GtkWidget::visible", TRUE,
378 toggle_xkb_control, control,
381 gtk_box_set_child_packing (GTK_BOX (outer_hbox), button, FALSE, FALSE, 0, GTK_PACK_START);
384 vbox = gtk_widget_new (GTK_TYPE_VBOX,
385 "GtkWidget::visible", TRUE,
386 "GtkWidget::parent", outer_hbox,
389 adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (200.0, 200.0, 4000.0, 10.0, 100.0, 10.0 ));
391 range = g_object_connect (gtk_widget_new (GTK_TYPE_HSCALE,
392 "GtkWidget::parent", vbox,
393 "GtkWidget::visible", TRUE,
394 "GtkRange::update_policy", GTK_UPDATE_DELAYED,
395 "GtkScale::digits", 0,
396 "GtkScale::adjustment", adjustment,
398 "signal::value_changed",
399 set_accessx_control_value, control,
402 gtk_widget_set_usize (GTK_WIDGET (range), 150, -1);
404 adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (200.0, 40.0, 4000.0, 1.0, 10.0, 1.0 ));
406 control = control_struct_new (XkbRepeatKeysMask, &xkb->ctrls->repeat_interval, NULL, NULL);
408 range = g_object_connect (gtk_widget_new (GTK_TYPE_HSCALE,
409 "GtkWidget::parent", vbox,
410 "GtkWidget::visible", TRUE,
411 "GtkRange::update_policy", GTK_UPDATE_DELAYED,
412 "GtkScale::digits", 0,
413 "GtkScale::adjustment", adjustment,
415 "signal::value_changed",
416 set_accessx_control_value, control,
419 gtk_widget_set_usize (GTK_WIDGET (range), 150, -1);
421 vbox = gtk_widget_new (GTK_TYPE_VBOX,
422 "GtkWidget::visible", TRUE,
423 "GtkWidget::parent", outer_hbox,
426 label = gtk_widget_new (GTK_TYPE_LABEL,
427 "GtkLabel::label", "Delay (mS)",
428 "GtkWidget::parent", vbox,
429 "GtkWidget::visible", TRUE,
432 label = gtk_widget_new (GTK_TYPE_LABEL,
433 "GtkLabel::label", "Interval (mS)",
434 "GtkWidget::parent", vbox,
435 "GtkWidget::visible", TRUE,
444 GtkWidget *outer_hbox, *vbox, *label, *button, *range, *frame;
445 GtkAdjustment *adjustment;
446 AccessXControlStruct *control =
447 control_struct_new (XkbMouseKeysMask, &xkb->ctrls->mk_delay, NULL, NULL);
449 frame = gtk_widget_new (gtk_frame_get_type(),
450 "GtkFrame::label","Mouse Keys",
451 "GtkWidget::visible", TRUE,
454 outer_hbox = gtk_widget_new (GTK_TYPE_HBOX,
455 "GtkWidget::visible", TRUE,
456 "GtkWidget::parent", frame,
459 button = g_object_connect (gtk_widget_new (GTK_TYPE_CHECK_BUTTON,
460 "GtkButton::label", "Enable MouseKeys",
461 "GtkWidget::parent", outer_hbox,
462 "GtkWidget::visible", TRUE,
465 toggle_xkb_control, control,
468 gtk_box_set_child_packing (GTK_BOX (outer_hbox), button, FALSE, FALSE, 0, GTK_PACK_START);
470 vbox = gtk_widget_new (GTK_TYPE_VBOX,
471 "GtkWidget::visible", TRUE,
472 "GtkWidget::parent", outer_hbox,
475 adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (200.0, 20.0, 4000.0, 10.0, 100.0, 10.0 ));
477 control = control_struct_new (XkbRepeatKeysMask, &xkb->ctrls->mk_interval, NULL, NULL);
479 range = g_object_connect (gtk_widget_new (GTK_TYPE_HSCALE,
480 "GtkWidget::parent", vbox,
481 "GtkWidget::visible", TRUE,
482 "GtkRange::update_policy", GTK_UPDATE_DELAYED,
483 "GtkScale::digits", 0,
484 "GtkScale::adjustment", adjustment,
486 "signal::value_changed",
487 set_accessx_control_value, control,
490 gtk_widget_set_usize (GTK_WIDGET (range), 150, -1);
492 adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (800.0, 200.0, 4000.0, 1.0, 10.0, 1.0 ));
494 control = control_struct_new (XkbRepeatKeysMask, &xkb->ctrls->mk_time_to_max, NULL, NULL);
496 range = g_object_connect (gtk_widget_new (GTK_TYPE_HSCALE,
497 "GtkWidget::parent", vbox,
498 "GtkWidget::visible", TRUE,
499 "GtkRange::update_policy", GTK_UPDATE_DELAYED,
500 "GtkScale::digits", 0,
501 "GtkScale::adjustment", adjustment,
503 "signal::value_changed",
504 set_accessx_control_value, control,
507 gtk_widget_set_usize (GTK_WIDGET (range), 150, -1);
509 adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (800.0, 200.0, 4000.0, 1.0, 10.0, 1.0 ));
511 control = control_struct_new (XkbMouseKeysMask, &xkb->ctrls->mk_max_speed, NULL, NULL);
513 range = g_object_connect (gtk_widget_new (GTK_TYPE_HSCALE,
514 "GtkWidget::parent", vbox,
515 "GtkWidget::visible", TRUE,
516 "GtkRange::update_policy", GTK_UPDATE_DELAYED,
517 "GtkScale::digits", 0,
518 "GtkScale::adjustment", adjustment,
520 "signal::value_changed",
521 set_accessx_control_value, control,
524 gtk_widget_set_usize (GTK_WIDGET (range), 150, -1);
526 adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (800.0, 200.0, 4000.0, 1.0, 10.0, 1.0 ));
528 control = control_struct_new (XkbMouseKeysMask, &xkb->ctrls->mk_curve, NULL, NULL);
530 range = g_object_connect (gtk_widget_new (GTK_TYPE_HSCALE,
531 "GtkWidget::parent", vbox,
532 "GtkWidget::visible", TRUE,
533 "GtkRange::update_policy", GTK_UPDATE_DELAYED,
534 "GtkScale::digits", 0,
535 "GtkScale::adjustment", adjustment,
537 "signal::value_changed",
538 set_accessx_control_value, control,
541 vbox = gtk_widget_new (gtk_vbox_get_type(),
542 "GtkWidget::name", "MouseKeys",
543 "GtkWidget::parent", outer_hbox,
544 "GtkWidget::visible", TRUE,
545 "GtkContainer::border_width", 5,
547 label = gtk_widget_new (GTK_TYPE_LABEL,
548 "GtkLabel::label", "Delay (mS)",
549 "GtkWidget::parent", vbox,
550 "GtkWidget::visible", TRUE,
553 label = gtk_widget_new (GTK_TYPE_LABEL,
554 "GtkLabel::label", "Accel. time (mS)",
555 "GtkWidget::parent", vbox,
556 "GtkWidget::visible", TRUE,
559 label = gtk_widget_new (GTK_TYPE_LABEL,
560 "GtkLabel::label", "Interval (mS)",
561 "GtkWidget::parent", vbox,
562 "GtkWidget::visible", TRUE,
565 label = gtk_widget_new (GTK_TYPE_LABEL,
566 "GtkLabel::label", "Max. Speed",
567 "GtkWidget::parent", vbox,
568 "GtkWidget::visible", TRUE,
571 label = gtk_widget_new (GTK_TYPE_LABEL,
572 "GtkLabel::label", "Curve",
573 "GtkWidget::parent", vbox,
574 "GtkWidget::visible", TRUE,
582 GtkWidget *hbox, *label, *button, *range;
583 GtkAdjustment *adjustment;
584 AccessXControlStruct *control =
585 control_struct_new (XkbAccessXTimeoutMask, &xkb->ctrls->ax_timeout, NULL, NULL);
587 hbox = gtk_widget_new (gtk_hbox_get_type(),
588 "GtkWidget::visible", TRUE,
591 button = g_object_connect (gtk_widget_new (GTK_TYPE_CHECK_BUTTON,
592 "GtkButton::label", "AccessX Timeout",
593 "GtkWidget::parent", hbox,
594 "GtkWidget::visible", TRUE,
597 toggle_xkb_control, control,
600 adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (1.0, 1.0, 200.0, 1.0, 10.0, 1.0 ));
602 range = g_object_connect (gtk_widget_new (GTK_TYPE_HSCALE,
603 "GtkWidget::parent", hbox,
604 "GtkWidget::visible", TRUE,
605 "GtkRange::update_policy", GTK_UPDATE_DELAYED,
606 "GtkScale::digits", 0,
607 "GtkScale::adjustment", adjustment,
609 "signal::value_changed",
610 set_accessx_control_value, control,
613 gtk_widget_set_usize (GTK_WIDGET (range), 150, -1);
615 label = gtk_widget_new (GTK_TYPE_LABEL,
616 "GtkLabel::label", "AccessX Timeout (Min.)",
617 "GtkWidget::parent", hbox,
618 "GtkWidget::visible", TRUE,
627 GtkWidget *window, *button, *container, *hbox;
629 window = g_object_connect (gtk_widget_new (gtk_window_get_type (),
632 "type", GTK_WINDOW_TOPLEVEL,
633 "window-position", GTK_WIN_POS_CENTER,
636 "allow_shrink", TRUE,
639 "signal::destroy", gui_exit, NULL,
642 container = gtk_widget_new (GTK_TYPE_VBOX,
643 "GtkWidget::parent", window,
644 "GtkWidget::visible", TRUE,
647 /* create and add containers for: AccessX on/off,
649 MouseKeys support, and timeout */
651 gtk_container_add (GTK_CONTAINER (container), basic_toggles_box ());
652 gtk_container_add (GTK_CONTAINER (container), repeat_keys_box ());
653 /* gtk_container_add (GTK_CONTAINER (container), mouse_keys_box ());
654 gtk_container_add (GTK_CONTAINER (container), timeout_box ());*/
656 hbox = gtk_widget_new (gtk_hbox_get_type(),
657 "GtkWidget::parent", container,
658 "GtkWidget::visible", TRUE,
659 "GtkContainer::border_width", 5,
662 button = g_object_connect (gtk_widget_new (gtk_button_get_type (),
663 "GtkButton::label", "Quit",
664 "GtkWidget::parent", hbox,
665 "GtkWidget::visible", TRUE,
671 gtk_widget_show (window);
677 GtkWidget *window, *button, *container, *hbox, *range;
678 GtkAdjustment *adjustment;
680 static AccessXControlStruct* controls[N_CONTROLS];
681 controls[0] = control_struct_new (XkbSlowKeysMask, &xkb->ctrls->slow_keys_delay, "Slow Keys", "Delay, mS");
682 controls[1] = control_struct_new (XkbStickyKeysMask, &xkb->ctrls->ax_options, "Sticky Keys", NULL);
683 controls[2] = control_struct_new (XkbBounceKeysMask, &xkb->ctrls->debounce_delay, "Key Debounce", "Delay, mS");
684 controls[3] = control_struct_new (XkbRepeatKeysMask, &xkb->ctrls->repeat_delay, "Repeat Keys", "Delay, mS");
685 controls[4] = control_struct_new (XkbRepeatKeysMask, &xkb->ctrls->repeat_interval, NULL, "Interval, mS");
686 controls[5] = control_struct_new (XkbMouseKeysMask, &xkb->ctrls->mk_delay, "MouseKeys", "Delay, mS");
687 controls[6] = control_struct_new (XkbMouseKeysAccelMask, &xkb->ctrls->mk_time_to_max, NULL, "Accel");
688 controls[7] = control_struct_new (XkbAccessXTimeoutMask, &xkb->ctrls->ax_timeout, "AccessX timeout", "Sec");
690 hbox = gtk_widget_new (gtk_hbox_get_type(),
691 "GtkWidget::parent", container,
692 "GtkWidget::visible", TRUE,
695 i = 0; /* FIXME: this looks bogus */
696 button = g_object_connect (gtk_widget_new (gtk_check_button_get_type (),
697 "GtkButton::label", "Access X Timeout",
698 "GtkWidget::parent", hbox,
699 "GtkWidget::visible", TRUE,
702 toggle_xkb_control, controls[i],
705 adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (1.0, 1.0, 200.0, 1.0, 10.0, 1.0 ));
707 range = g_object_connect (gtk_widget_new (gtk_hscale_get_type (),
708 "GtkWidget::parent", hbox,
709 "GtkWidget::visible", TRUE,
710 "GtkScale::adjustment", adjustment,
712 "signal::value_changed",
713 set_accessx_control_value, controls[i],
716 gtk_widget_set_usize (GTK_WIDGET (range), 150, -1);
717 gtk_widget_new (gtk_label_get_type(),
718 "GtkWidget::parent", hbox,
719 "GtkLabel::label", controls[i]->val_label,
720 "GtkWidget::visible", TRUE,
723 hbox = gtk_widget_new (gtk_hbox_get_type(),
724 "GtkWidget::parent", container,
725 "GtkWidget::visible", TRUE,
726 "GtkContainer::border_width", 5,
729 button = g_object_connect (gtk_widget_new (gtk_button_get_type (),
730 "GtkButton::label", "Quit",
731 "GtkWidget::parent", hbox,
732 "GtkWidget::visible", TRUE,
738 gtk_widget_show (window);
742 main(int argc, char **argv)
745 if ((argc > 1) && (!strncmp(argv[1],"-h",2)))
747 printf ("Usage: keysynth-demo\n");
751 gtk_init (&argc, &argv); /* must call, because this program uses GTK+ */
755 g_error ("Xkb extension not present, can't initialize accessX\n");