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.
27 #include <X11/XKBlib.h> /* AccessX control defs */
32 static XkbDescPtr xkb;
39 } AccessXControlStruct;
42 gui_exit(GtkButton *notused, void *alsonotused)
48 toggle_xkb_control (GtkButton *toggle_button, AccessXControlStruct *control_struct)
50 gboolean is_active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle_button));
51 XkbChangeEnabledControls (GDK_DISPLAY(), XkbUseCoreKbd, control_struct->mask,
52 is_active ? control_struct->mask : 0);
56 toggle_xkb_notify_control (GtkButton *toggle_button, AccessXControlStruct *control_struct)
58 gboolean is_active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle_button));
59 unsigned short mask, always_off_mask;
60 XkbChangeEnabledControls (GDK_DISPLAY(), XkbUseCoreKbd, XkbAccessXFeedbackMask | XkbAudibleBellMask,
61 XkbAccessXFeedbackMask | XkbAudibleBellMask);
63 mask = XkbAX_TwoKeysMask | XkbAX_LatchToLockMask | XkbAX_DumbBellFBMask;
64 always_off_mask = XkbAX_SKPressFBMask | XkbAX_SKReleaseFBMask;
67 xkb->ctrls->ax_options |= (control_struct->mask | mask);
69 xkb->ctrls->ax_options &= (~control_struct->mask);
71 xkb->ctrls->ax_options &= ~always_off_mask;
73 XkbSetControls (GDK_DISPLAY(), XkbAccessXFeedbackMask, xkb);
77 toggle_accessx (GtkButton *toggle_button, void *unused)
79 gboolean is_active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle_button));
80 XkbChangeEnabledControls (GDK_DISPLAY(), XkbUseCoreKbd, XkbAllBooleanCtrlsMask,
81 (is_active) ? xkb->ctrls->enabled_ctrls : 0);
82 /*if (is_active/) XkbSetControls (GDK_DISPLAY(), XkbAllBooleanCtrlsMask, xkb);*/
86 set_accessx_control_value (GtkRange *range_control, AccessXControlStruct *control_struct)
88 *(control_struct->val) = (short int) gtk_range_get_value (range_control);
89 XkbSetControls (GDK_DISPLAY(), control_struct->mask, xkb);
95 int opcode, xkb_event_code, error, result, major, minor;
97 result = XkbQueryExtension (GDK_DISPLAY(), &opcode, &xkb_event_code, &error, &major, &minor);
98 if (result != True) return False;
100 xkb = XkbGetMap(GDK_DISPLAY(), 0, XkbUseCoreKbd);
101 if ((int)xkb == BadAlloc || xkb == NULL)
107 status = XkbGetControls(GDK_DISPLAY(), XkbAllControlsMask, xkb);
108 if (status != Success)
110 XkbFreeKeyboard(xkb, XkbAllControlsMask, True);
117 XkbFreeKeyboard(xkb, XkbAllControlsMask, True);
126 static AccessXControlStruct *
127 control_struct_new (unsigned int mask,
132 AccessXControlStruct *control = g_new0 (AccessXControlStruct, 1);
133 control->mask = mask;
134 control->val = val_ptr;
135 control->label = label;
136 control->val_label = val_label;
143 GtkWidget *hbox, *outer_vbox, *vbox, *label, *button, *range, *frame;
144 GtkAdjustment *adjustment;
145 AccessXControlStruct *control;
147 outer_vbox = gtk_widget_new (GTK_TYPE_VBOX,
148 "GtkWidget::visible", TRUE,
151 hbox = gtk_widget_new (GTK_TYPE_HBOX,
152 "GtkWidget::parent", outer_vbox,
153 "GtkWidget::visible", TRUE,
156 button = g_object_connect (gtk_widget_new (GTK_TYPE_CHECK_BUTTON,
157 "GtkButton::label", "Enable AccessX",
158 "GtkWidget::parent", hbox,
159 "GtkWidget::visible", TRUE,
162 toggle_accessx, NULL,
165 /* FeatureFBMask seems not to work :-(
167 control = control_struct_new (XkbAX_FeatureFBMask, &xkb->ctrls->ax_options, NULL, NULL);
169 button = g_object_connect (gtk_widget_new (GTK_TYPE_CHECK_BUTTON,
170 "GtkButton::label", "Notify Changes",
171 "GtkWidget::parent", hbox,
172 "GtkWidget::visible", TRUE,
175 toggle_xkb_notify_control, control,
179 gtk_widget_new (GTK_TYPE_HSEPARATOR,
180 "GtkWidget::parent", outer_vbox,
181 "GtkWidget::visible", TRUE,
184 hbox = gtk_widget_new (GTK_TYPE_HBOX,
185 "GtkWidget::parent", outer_vbox,
186 "GtkWidget::visible", TRUE,
189 control = control_struct_new (XkbStickyKeysMask, &xkb->ctrls->enabled_ctrls, NULL, NULL);
191 button = g_object_connect (gtk_widget_new (GTK_TYPE_CHECK_BUTTON,
192 "GtkButton::label", "Sticky Keys",
193 "GtkWidget::parent", hbox,
194 "GtkWidget::visible", TRUE,
197 toggle_xkb_control, control,
200 control = control_struct_new (XkbAX_StickyKeysFBMask, &xkb->ctrls->ax_options, NULL, NULL);
202 button = g_object_connect (gtk_widget_new (GTK_TYPE_CHECK_BUTTON,
203 "GtkButton::label", "Beep when Latched",
204 "GtkWidget::parent", hbox,
205 "GtkWidget::visible", TRUE,
208 toggle_xkb_notify_control, control,
211 frame = gtk_widget_new (gtk_frame_get_type(),
212 "GtkFrame::label", "Slow Keys",
213 "GtkWidget::parent", outer_vbox,
214 "GtkWidget::visible", TRUE,
217 vbox = gtk_widget_new (GTK_TYPE_VBOX,
218 "GtkWidget::parent", frame,
219 "GtkWidget::visible", TRUE,
222 hbox = gtk_widget_new (GTK_TYPE_HBOX,
223 "GtkWidget::parent", vbox,
224 "GtkWidget::visible", TRUE,
227 control = control_struct_new (XkbSlowKeysMask, &xkb->ctrls->slow_keys_delay, NULL, NULL);
229 button = g_object_connect (gtk_widget_new (GTK_TYPE_CHECK_BUTTON,
230 "GtkButton::label", "Enable Slow Keys",
231 "GtkWidget::parent", hbox,
232 "GtkWidget::visible", TRUE,
235 toggle_xkb_control, control,
238 adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (1.0, 1.0, 2000.0, 1.0, 10.0, 1.0 ));
240 range = g_object_connect (gtk_widget_new (GTK_TYPE_HSCALE,
241 "GtkWidget::parent", hbox,
242 "GtkWidget::visible", TRUE,
243 "GtkRange::update_policy", GTK_UPDATE_DELAYED,
244 "GtkScale::digits", 0,
245 "GtkScale::adjustment", adjustment,
247 "signal::value_changed",
248 set_accessx_control_value, control,
251 gtk_widget_set_usize (GTK_WIDGET (range), 150, -1);
253 label = gtk_widget_new (GTK_TYPE_LABEL,
254 "GtkLabel::label", "Delay (mS)",
255 "GtkWidget::parent", hbox,
256 "GtkWidget::visible", TRUE,
259 hbox = gtk_widget_new (GTK_TYPE_HBOX,
260 "GtkWidget::parent", vbox,
261 "GtkWidget::visible", TRUE,
264 control = control_struct_new (XkbAX_SKAcceptFBMask, &xkb->ctrls->ax_options, NULL, NULL);
266 button = g_object_connect (gtk_widget_new (GTK_TYPE_CHECK_BUTTON,
267 "GtkButton::label", "Beep on Accept",
268 "GtkWidget::parent", hbox,
269 "GtkWidget::visible", TRUE,
272 toggle_xkb_notify_control, control,
275 control = control_struct_new (XkbAX_SKRejectFBMask, &xkb->ctrls->ax_options, NULL, NULL);
277 button = g_object_connect (gtk_widget_new (GTK_TYPE_CHECK_BUTTON,
278 "GtkButton::label", "Beep on Reject",
279 "GtkWidget::parent", hbox,
280 "GtkWidget::visible", TRUE,
283 toggle_xkb_notify_control, control,
286 frame = gtk_widget_new (gtk_frame_get_type(),
287 "GtkFrame::label", "Bounce Keys",
288 "GtkWidget::parent", outer_vbox,
289 "GtkWidget::visible", TRUE,
292 vbox = gtk_widget_new (GTK_TYPE_VBOX,
293 "GtkWidget::parent", frame,
294 "GtkWidget::visible", TRUE,
297 hbox = gtk_widget_new (GTK_TYPE_HBOX,
298 "GtkWidget::parent", vbox,
299 "GtkWidget::visible", TRUE,
302 control = control_struct_new (XkbBounceKeysMask, &xkb->ctrls->debounce_delay, NULL, NULL);
304 button = g_object_connect (gtk_widget_new (GTK_TYPE_CHECK_BUTTON,
305 "GtkButton::label", "Enable Key Debounce",
306 "GtkWidget::parent", hbox,
307 "GtkWidget::visible", TRUE,
310 toggle_xkb_control, control,
313 adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (1.0, 1.0, 2000.0, 1.0, 10.0, 1.0 ));
315 range = g_object_connect (gtk_widget_new (GTK_TYPE_HSCALE,
316 "GtkWidget::parent", hbox,
317 "GtkWidget::visible", TRUE,
318 "GtkRange::update_policy", GTK_UPDATE_DELAYED,
319 "GtkScale::digits", 0,
320 "GtkScale::adjustment", adjustment,
322 "signal::value_changed",
323 set_accessx_control_value, control,
326 gtk_widget_set_usize (GTK_WIDGET (range), 150, -1);
328 label = gtk_widget_new (GTK_TYPE_LABEL,
329 "GtkLabel::label", "Delay (mS)",
330 "GtkWidget::parent", hbox,
331 "GtkWidget::visible", TRUE,
334 hbox = gtk_widget_new (GTK_TYPE_HBOX,
335 "GtkWidget::parent", vbox,
336 "GtkWidget::visible", TRUE,
339 control = control_struct_new (XkbAX_BKRejectFBMask, &xkb->ctrls->ax_options, NULL, NULL);
341 button = g_object_connect (gtk_widget_new (GTK_TYPE_CHECK_BUTTON,
342 "GtkButton::label", "Beep on Reject",
343 "GtkWidget::parent", hbox,
344 "GtkWidget::visible", TRUE,
347 toggle_xkb_notify_control, control,
356 GtkWidget *outer_hbox, *vbox, *label, *button, *range, *frame;
357 GtkAdjustment *adjustment;
358 AccessXControlStruct *control =
359 control_struct_new (XkbRepeatKeysMask, &xkb->ctrls->repeat_delay, NULL, NULL);
361 frame = gtk_widget_new (gtk_frame_get_type(),
362 "GtkFrame::label","Repeat Keys",
363 "GtkWidget::visible", TRUE,
366 outer_hbox = gtk_widget_new (GTK_TYPE_HBOX,
367 "GtkWidget::visible", TRUE,
368 "GtkWidget::parent", frame,
371 button = g_object_connect (gtk_widget_new (GTK_TYPE_CHECK_BUTTON,
372 "GtkButton::label", "Enable RepeatKeys",
373 "GtkWidget::parent", outer_hbox,
374 "GtkWidget::visible", TRUE,
377 toggle_xkb_control, control,
380 gtk_box_set_child_packing (GTK_BOX (outer_hbox), button, FALSE, FALSE, 0, GTK_PACK_START);
383 vbox = gtk_widget_new (GTK_TYPE_VBOX,
384 "GtkWidget::visible", TRUE,
385 "GtkWidget::parent", outer_hbox,
388 adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (200.0, 200.0, 4000.0, 10.0, 100.0, 10.0 ));
390 range = g_object_connect (gtk_widget_new (GTK_TYPE_HSCALE,
391 "GtkWidget::parent", vbox,
392 "GtkWidget::visible", TRUE,
393 "GtkRange::update_policy", GTK_UPDATE_DELAYED,
394 "GtkScale::digits", 0,
395 "GtkScale::adjustment", adjustment,
397 "signal::value_changed",
398 set_accessx_control_value, control,
401 gtk_widget_set_usize (GTK_WIDGET (range), 150, -1);
403 adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (200.0, 40.0, 4000.0, 1.0, 10.0, 1.0 ));
405 control = control_struct_new (XkbRepeatKeysMask, &xkb->ctrls->repeat_interval, NULL, NULL);
407 range = g_object_connect (gtk_widget_new (GTK_TYPE_HSCALE,
408 "GtkWidget::parent", vbox,
409 "GtkWidget::visible", TRUE,
410 "GtkRange::update_policy", GTK_UPDATE_DELAYED,
411 "GtkScale::digits", 0,
412 "GtkScale::adjustment", adjustment,
414 "signal::value_changed",
415 set_accessx_control_value, control,
418 gtk_widget_set_usize (GTK_WIDGET (range), 150, -1);
420 vbox = gtk_widget_new (GTK_TYPE_VBOX,
421 "GtkWidget::visible", TRUE,
422 "GtkWidget::parent", outer_hbox,
425 label = gtk_widget_new (GTK_TYPE_LABEL,
426 "GtkLabel::label", "Delay (mS)",
427 "GtkWidget::parent", vbox,
428 "GtkWidget::visible", TRUE,
431 label = gtk_widget_new (GTK_TYPE_LABEL,
432 "GtkLabel::label", "Interval (mS)",
433 "GtkWidget::parent", vbox,
434 "GtkWidget::visible", TRUE,
443 GtkWidget *outer_hbox, *vbox, *label, *button, *range, *frame;
444 GtkAdjustment *adjustment;
445 AccessXControlStruct *control =
446 control_struct_new (XkbMouseKeysMask, &xkb->ctrls->mk_delay, NULL, NULL);
448 frame = gtk_widget_new (gtk_frame_get_type(),
449 "GtkFrame::label","Mouse Keys",
450 "GtkWidget::visible", TRUE,
453 outer_hbox = gtk_widget_new (GTK_TYPE_HBOX,
454 "GtkWidget::visible", TRUE,
455 "GtkWidget::parent", frame,
458 button = g_object_connect (gtk_widget_new (GTK_TYPE_CHECK_BUTTON,
459 "GtkButton::label", "Enable MouseKeys",
460 "GtkWidget::parent", outer_hbox,
461 "GtkWidget::visible", TRUE,
464 toggle_xkb_control, control,
467 gtk_box_set_child_packing (GTK_BOX (outer_hbox), button, FALSE, FALSE, 0, GTK_PACK_START);
469 vbox = gtk_widget_new (GTK_TYPE_VBOX,
470 "GtkWidget::visible", TRUE,
471 "GtkWidget::parent", outer_hbox,
474 adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (200.0, 20.0, 4000.0, 10.0, 100.0, 10.0 ));
476 control = control_struct_new (XkbRepeatKeysMask, &xkb->ctrls->mk_interval, NULL, NULL);
478 range = g_object_connect (gtk_widget_new (GTK_TYPE_HSCALE,
479 "GtkWidget::parent", vbox,
480 "GtkWidget::visible", TRUE,
481 "GtkRange::update_policy", GTK_UPDATE_DELAYED,
482 "GtkScale::digits", 0,
483 "GtkScale::adjustment", adjustment,
485 "signal::value_changed",
486 set_accessx_control_value, control,
489 gtk_widget_set_usize (GTK_WIDGET (range), 150, -1);
491 adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (800.0, 200.0, 4000.0, 1.0, 10.0, 1.0 ));
493 control = control_struct_new (XkbRepeatKeysMask, &xkb->ctrls->mk_time_to_max, NULL, NULL);
495 range = g_object_connect (gtk_widget_new (GTK_TYPE_HSCALE,
496 "GtkWidget::parent", vbox,
497 "GtkWidget::visible", TRUE,
498 "GtkRange::update_policy", GTK_UPDATE_DELAYED,
499 "GtkScale::digits", 0,
500 "GtkScale::adjustment", adjustment,
502 "signal::value_changed",
503 set_accessx_control_value, control,
506 gtk_widget_set_usize (GTK_WIDGET (range), 150, -1);
508 adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (800.0, 200.0, 4000.0, 1.0, 10.0, 1.0 ));
510 control = control_struct_new (XkbMouseKeysMask, &xkb->ctrls->mk_max_speed, NULL, NULL);
512 range = g_object_connect (gtk_widget_new (GTK_TYPE_HSCALE,
513 "GtkWidget::parent", vbox,
514 "GtkWidget::visible", TRUE,
515 "GtkRange::update_policy", GTK_UPDATE_DELAYED,
516 "GtkScale::digits", 0,
517 "GtkScale::adjustment", adjustment,
519 "signal::value_changed",
520 set_accessx_control_value, control,
523 gtk_widget_set_usize (GTK_WIDGET (range), 150, -1);
525 adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (800.0, 200.0, 4000.0, 1.0, 10.0, 1.0 ));
527 control = control_struct_new (XkbMouseKeysMask, &xkb->ctrls->mk_curve, NULL, NULL);
529 range = g_object_connect (gtk_widget_new (GTK_TYPE_HSCALE,
530 "GtkWidget::parent", vbox,
531 "GtkWidget::visible", TRUE,
532 "GtkRange::update_policy", GTK_UPDATE_DELAYED,
533 "GtkScale::digits", 0,
534 "GtkScale::adjustment", adjustment,
536 "signal::value_changed",
537 set_accessx_control_value, control,
540 vbox = gtk_widget_new (gtk_vbox_get_type(),
541 "GtkWidget::name", "MouseKeys",
542 "GtkWidget::parent", outer_hbox,
543 "GtkWidget::visible", TRUE,
544 "GtkContainer::border_width", 5,
546 label = gtk_widget_new (GTK_TYPE_LABEL,
547 "GtkLabel::label", "Delay (mS)",
548 "GtkWidget::parent", vbox,
549 "GtkWidget::visible", TRUE,
552 label = gtk_widget_new (GTK_TYPE_LABEL,
553 "GtkLabel::label", "Accel. time (mS)",
554 "GtkWidget::parent", vbox,
555 "GtkWidget::visible", TRUE,
558 label = gtk_widget_new (GTK_TYPE_LABEL,
559 "GtkLabel::label", "Interval (mS)",
560 "GtkWidget::parent", vbox,
561 "GtkWidget::visible", TRUE,
564 label = gtk_widget_new (GTK_TYPE_LABEL,
565 "GtkLabel::label", "Max. Speed",
566 "GtkWidget::parent", vbox,
567 "GtkWidget::visible", TRUE,
570 label = gtk_widget_new (GTK_TYPE_LABEL,
571 "GtkLabel::label", "Curve",
572 "GtkWidget::parent", vbox,
573 "GtkWidget::visible", TRUE,
581 GtkWidget *hbox, *label, *button, *range;
582 GtkAdjustment *adjustment;
583 AccessXControlStruct *control =
584 control_struct_new (XkbAccessXTimeoutMask, &xkb->ctrls->ax_timeout, NULL, NULL);
586 hbox = gtk_widget_new (gtk_hbox_get_type(),
587 "GtkWidget::visible", TRUE,
590 button = g_object_connect (gtk_widget_new (GTK_TYPE_CHECK_BUTTON,
591 "GtkButton::label", "AccessX Timeout",
592 "GtkWidget::parent", hbox,
593 "GtkWidget::visible", TRUE,
596 toggle_xkb_control, control,
599 adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (1.0, 1.0, 200.0, 1.0, 10.0, 1.0 ));
601 range = g_object_connect (gtk_widget_new (GTK_TYPE_HSCALE,
602 "GtkWidget::parent", hbox,
603 "GtkWidget::visible", TRUE,
604 "GtkRange::update_policy", GTK_UPDATE_DELAYED,
605 "GtkScale::digits", 0,
606 "GtkScale::adjustment", adjustment,
608 "signal::value_changed",
609 set_accessx_control_value, control,
612 gtk_widget_set_usize (GTK_WIDGET (range), 150, -1);
614 label = gtk_widget_new (GTK_TYPE_LABEL,
615 "GtkLabel::label", "AccessX Timeout (Min.)",
616 "GtkWidget::parent", hbox,
617 "GtkWidget::visible", TRUE,
626 GtkWidget *window, *button, *container, *hbox;
628 window = g_object_connect (gtk_widget_new (gtk_window_get_type (),
631 "type", GTK_WINDOW_TOPLEVEL,
632 "window-position", GTK_WIN_POS_CENTER,
635 "allow_shrink", TRUE,
638 "signal::destroy", gui_exit, NULL,
641 container = gtk_widget_new (GTK_TYPE_VBOX,
642 "GtkWidget::parent", window,
643 "GtkWidget::visible", TRUE,
646 /* create and add containers for: AccessX on/off,
648 MouseKeys support, and timeout */
650 gtk_container_add (GTK_CONTAINER (container), basic_toggles_box ());
651 gtk_container_add (GTK_CONTAINER (container), repeat_keys_box ());
652 /* gtk_container_add (GTK_CONTAINER (container), mouse_keys_box ());
653 gtk_container_add (GTK_CONTAINER (container), timeout_box ());*/
655 hbox = gtk_widget_new (gtk_hbox_get_type(),
656 "GtkWidget::parent", container,
657 "GtkWidget::visible", TRUE,
658 "GtkContainer::border_width", 5,
661 button = g_object_connect (gtk_widget_new (gtk_button_get_type (),
662 "GtkButton::label", "Quit",
663 "GtkWidget::parent", hbox,
664 "GtkWidget::visible", TRUE,
670 gtk_widget_show (window);
676 GtkWidget *window, *button, *container, *hbox, *range;
677 GtkAdjustment *adjustment;
679 static AccessXControlStruct* controls[N_CONTROLS];
680 controls[0] = control_struct_new (XkbSlowKeysMask, &xkb->ctrls->slow_keys_delay, "Slow Keys", "Delay, mS");
681 controls[1] = control_struct_new (XkbStickyKeysMask, &xkb->ctrls->ax_options, "Sticky Keys", NULL);
682 controls[2] = control_struct_new (XkbBounceKeysMask, &xkb->ctrls->debounce_delay, "Key Debounce", "Delay, mS");
683 controls[3] = control_struct_new (XkbRepeatKeysMask, &xkb->ctrls->repeat_delay, "Repeat Keys", "Delay, mS");
684 controls[4] = control_struct_new (XkbRepeatKeysMask, &xkb->ctrls->repeat_interval, NULL, "Interval, mS");
685 controls[5] = control_struct_new (XkbMouseKeysMask, &xkb->ctrls->mk_delay, "MouseKeys", "Delay, mS");
686 controls[6] = control_struct_new (XkbMouseKeysAccelMask, &xkb->ctrls->mk_time_to_max, NULL, "Accel");
687 controls[7] = control_struct_new (XkbAccessXTimeoutMask, &xkb->ctrls->ax_timeout, "AccessX timeout", "Sec");
691 hbox = gtk_widget_new (gtk_hbox_get_type(),
692 "GtkWidget::parent", container,
693 "GtkWidget::visible", TRUE,
696 i = 0; /* FIXME: this looks bogus */
697 button = g_object_connect (gtk_widget_new (gtk_check_button_get_type (),
698 "GtkButton::label", "Access X Timeout",
699 "GtkWidget::parent", hbox,
700 "GtkWidget::visible", TRUE,
703 toggle_xkb_control, controls[i],
706 adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (1.0, 1.0, 200.0, 1.0, 10.0, 1.0 ));
708 range = g_object_connect (gtk_widget_new (gtk_hscale_get_type (),
709 "GtkWidget::parent", hbox,
710 "GtkWidget::visible", TRUE,
711 "GtkScale::adjustment", adjustment,
713 "signal::value_changed",
714 set_accessx_control_value, controls[i],
717 gtk_widget_set_usize (GTK_WIDGET (range), 150, -1);
718 gtk_widget_new (gtk_label_get_type(),
719 "GtkWidget::parent", hbox,
720 "GtkLabel::label", controls[i]->val_label,
721 "GtkWidget::visible", TRUE,
724 hbox = gtk_widget_new (gtk_hbox_get_type(),
725 "GtkWidget::parent", container,
726 "GtkWidget::visible", TRUE,
727 "GtkContainer::border_width", 5,
730 button = g_object_connect (gtk_widget_new (gtk_button_get_type (),
731 "GtkButton::label", "Quit",
732 "GtkWidget::parent", hbox,
733 "GtkWidget::visible", TRUE,
739 gtk_widget_show (window);
743 main(int argc, char **argv)
746 if ((argc > 1) && (!strncmp(argv[1],"-h",2)))
748 printf ("Usage: keysynth-demo\n");
752 gtk_init (&argc, &argv); /* must call, because this program uses GTK+ */
756 g_error ("Xkb extension not present, can't initialize accessX\n");