551N/A/*
551N/A*
943N/A* Copyright (c) 1993, 2009, Oracle and/or its affiliates. All rights reserved.
551N/A*
551N/A* Permission is hereby granted, free of charge, to any person obtaining a
919N/A* copy of this software and associated documentation files (the "Software"),
919N/A* to deal in the Software without restriction, including without limitation
919N/A* the rights to use, copy, modify, merge, publish, distribute, sublicense,
919N/A* and/or sell copies of the Software, and to permit persons to whom the
919N/A* Software is furnished to do so, subject to the following conditions:
551N/A*
919N/A* The above copyright notice and this permission notice (including the next
919N/A* paragraph) shall be included in all copies or substantial portions of the
919N/A* Software.
551N/A*
919N/A* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
919N/A* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
919N/A* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
919N/A* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
919N/A* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
919N/A* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
919N/A* DEALINGS IN THE SOFTWARE.
551N/A*/
551N/A
551N/A/************************************************************************/
551N/A/* */
551N/A/* Copyright 1987, 1988, 1989, 1990, 1991, 1992, 1993 */
551N/A/* by Digital Equipment Corp., Maynard, MA */
551N/A/* */
551N/A/* Permission to use, copy, modify, and distribute this software */
551N/A/* and its documentation for any purpose and without fee is hereby */
551N/A/* granted, provided that the above copyright notice appear in all */
551N/A/* copies and that both that copyright notice and this permission */
551N/A/* notice appear in supporting documentation, and that the name of */
551N/A/* Digital not be used in advertising or publicity pertaining to */
551N/A/* distribution of the software without specific, written prior */
551N/A/* permission. */
551N/A/* */
551N/A/* DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, */
551N/A/* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND */
551N/A/* FITNESS, IN NO EVENT SHALL DIGITAL BE LIABLE FOR ANY SPECIAL, */
551N/A/* INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER */
551N/A/* RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN */
551N/A/* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
551N/A/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE */
551N/A/* OF THIS SOFTWARE. */
551N/A/* */
551N/A/************************************************************************/
551N/A/* */
551N/A/* AccessX */
551N/A/* */
551N/A/* This module is intended to provide access features for people */
551N/A/* with physical disabilities. This is a Motif client that */
551N/A/* communicates with the AccessX server extension and allows us to */
551N/A/* get visual feedback regarding the state of the AccessX features.*/
551N/A/* */
551N/A/* Revision History: */
551N/A/* */
551N/A/* 11-Jun-1993 WDW & MEN */
551N/A/* Develop sample implementation. */
551N/A/* */
551N/A/* 14-Aug-1993 JMS & WEJ */
551N/A/* Redesign GUI */
551N/A/* */
551N/A/************************************************************************/
551N/A
551N/A/* Special constants needed for the accessx extension */
551N/A#define NEED_EVENTS
551N/A#define NEED_REPLIES
551N/A
551N/A/************************************************************************/
551N/A/* */
551N/A/* Include Files */
551N/A/* */
551N/A/************************************************************************/
551N/A
551N/A/* Standard C Include Files */
551N/A#include <stdio.h>
551N/A#include <sys/param.h>
551N/A#include <stdlib.h>
551N/A
551N/A/* X Window System Include Files */
551N/A#include <X11/Xlib.h>
551N/A#include <X11/Xproto.h>
551N/A#include <X11/Intrinsic.h>
551N/A
551N/A/* accessx Specific Include Files */
551N/A#include "AccessXlib.h"
551N/A#include "AccessXproto.h"
551N/A#include "accessx.btm"
551N/A
551N/A/* XKB files */
551N/A#include <X11/XKBlib.h>
551N/A
551N/A/* Help related files */
551N/A#include <locale.h>
551N/A
551N/A
551N/A/* Motif Toolkit Include Files */
551N/A#include <Xm/Form.h>
551N/A#include <Xm/Text.h>
551N/A#include <Xm/DialogS.h>
551N/A#include <Xm/MessageB.h>
551N/A#include <Xm/ToggleB.h>
551N/A#include <Xm/ToggleBG.h>
551N/A#include <Xm/Scale.h>
551N/A#include <Mrm/MrmAppl.h>
551N/A
551N/A/************************************************************************/
551N/A/* */
551N/A/* Forward Declarations */
551N/A/* */
551N/A/************************************************************************/
551N/A#if NeedFunctionPrototypes
551N/A#define P(s) s
551N/A#else
551N/A#define P(s) ()
551N/A#endif
551N/A
551N/Aint XAccessXConfigure P((Display *dpy,
551N/A AccessXClientContextRec *accessXClient,
551N/A CARD16 mask,
551N/A AccessXStateRec *accessXState));
551N/Aint XAccessXQueryState P((Display *dpy,
551N/A AccessXClientContextRec *accessXClient,
551N/A AccessXStateRec *accessXState));
551N/Avoid XAccessXSelectInput P((Display *dpy,
551N/A AccessXClientContextRec *accessXClient,
551N/A BYTE enable));
551N/Avoid XAccessXInit P((Display *dpy,
551N/A AccessXClientContextRec *accessXClient));
551N/Avoid XAccessXAppMainLoop P((XtAppContext appContext,
551N/A AccessXClientContextRec *accessXClient));
551N/A
551N/A
551N/Avoid AccessXEventHandler P((XAccessXEvent *));
551N/A
551N/A/* Conversion Related Functions */
551N/Afloat ConvertScaleValueToUnits P((int, short));
551N/Aint ConvertUnitsToScaleValue P((float, short));
551N/A
551N/A/* State-of-Widget related Functions */
551N/Avoid SetStateFromView P((void));
551N/Avoid SetStateFromViewXKB P((void));
551N/Avoid SetStateFromViewAX P((void));
551N/Avoid SetViewFromState P((void));
551N/Avoid SetViewFromStateXKB P((void));
551N/Avoid SetViewFromStateAX P((void));
551N/Avoid SetSettingsViewFromState P((AccessXStateRec));
551N/Avoid SetStickyStatusViewFromState P((void));
551N/Avoid SetStickyStatusViewFromStateXKB P((void));
551N/Avoid SetStickyStatusViewFromStateAX P((void));
551N/Avoid SetMouseStatusViewFromState P((void));
551N/Avoid SetMouseStatusViewFromStateXKB P((void));
551N/Avoid SetMouseStatusViewFromStateAX P((void));
551N/Avoid UpdateWidgetSensitivity P((void));
551N/Avoid DisplayStatusDialogsIfNeeded P((void));
551N/Avoid SetDefaults P((void));
551N/Avoid SetDefaultsXKB P((void));
551N/Avoid SetDefaultsAX P((void));
551N/A
551N/A/* UIL Callback Functions */
551N/Avoid CreateProc P((Widget, int *, unsigned long));
551N/Avoid ActivateProc P((Widget, int *, XmAnyCallbackStruct *));
551N/Avoid ChangeControlProc P((Widget, int *, XmToggleButtonCallbackStruct *));
551N/A
551N/A/* Help Facility Functions */
551N/Aint GetSizeOfHelpText P((int));
551N/ABool AllocateHelpTextMemory P((int));
551N/ABool SetHelpText P((int));
551N/ABool InitHelp P((void));
551N/ABool ReadHelpFile P((FILE *));
551N/A
551N/A/* Creation-Destruction Status Windows Functions */
551N/Avoid InitializeInterface P((unsigned int, char **));
551N/Avoid CreateAndMapStickyStatusWindow P((void));
551N/Avoid UnmapStickyStatusWindow P((void));
551N/Avoid CreateAndMapMouseStatusWindow P((void));
551N/Avoid UnmapMouseStatusWindow P((void));
551N/A
551N/A/* Load-Save Related Functions */
551N/Achar *ResolveResourceFileName P((void));
551N/Avoid LoadSettingsFromFile P((void));
551N/Avoid SaveSettingsToFile P((void));
551N/Avoid StoreSettingsWindowToDatabase P((void));
551N/Avoid RestoreSettingsWindowFromDatabase P((void));
551N/A
551N/A/* XKB related functions */
551N/ABoolean XkbEventHandler P((XEvent *));
551N/ABoolean InitXkb P((Display *));
551N/A#undef P
551N/A
551N/A/************************************************************************/
551N/A/* */
551N/A/* X11, Xt, and Other Global Variables */
551N/A/* */
551N/A/************************************************************************/
551N/AAccessXClientContextRec accessXClient;
551N/A
551N/A/* X11, Xt and General Widgets Global Variables */
551N/ADisplay *dpy;
551N/AXtAppContext appContext;
551N/AWidget topLevel;
551N/AWidget mainWindow;
551N/Astatic XrmDatabase settingsWindowDatabase = NULL;
551N/A
551N/A/* XKB stuff */
551N/Aint xkbEventBase;
551N/A
551N/A/* Widgets Shells and Dialogs */
551N/AWidget mouseTopLevel = NULL;
551N/AWidget stickyTopLevel = NULL;
551N/AWidget statusStickyKeysDialog;
551N/AWidget statusMouseKeysDialog;
551N/AWidget settingsDialog;
551N/AWidget helpDialog;
551N/AWidget helpErrDialog, helpErrBox;
551N/AWidget saveDoneDialog, saveDoneBox;
551N/AWidget saveErrDialog, saveErrBox;
551N/AWidget loadDoneDialog, loadDoneBox;
551N/AWidget loadErrDialog, loadErrBox;
551N/A
551N/A/* Global Flags and State */
551N/Achar *textString; /* Help text string */
551N/Aint XKBExtension; /* 1:XKB 0:Accessx */
551N/A
551N/A/************************************************************************/
551N/A/* */
551N/A/* Mrm & Motif Global Variables */
551N/A/* */
551N/A/************************************************************************/
551N/AMrmHierarchy mrmHierarchy;
551N/AMrmCode dummyClass;
551N/A
551N/Achar *dbFilenameVec[] = {"accessx.uid"};
551N/Aint dbFilenameNum = (sizeof dbFilenameVec / sizeof dbFilenameVec [0]);
551N/A
551N/Astatic MrmRegisterArg regList [] = {
551N/A {"CreateProc", (caddr_t)CreateProc},
551N/A {"ActivateProc", (caddr_t)ActivateProc},
551N/A {"ChangeControlProc", (caddr_t)ChangeControlProc}
551N/A};
551N/Aint regListNum = (sizeof regList / sizeof regList[0]);
551N/A
551N/A/* Motif String Global Variables */
551N/AXmString helpWindowString;
551N/AXmString stickyKeysString, mouseKeysString;
551N/AXmString shiftString, shiftEmptyString;
551N/AXmString controlString, controlEmptyString;
551N/AXmString mod1String, mod1EmptyString;
551N/AXmString mod2String, mod2EmptyString;
551N/AXmString mod3String, mod3EmptyString;
551N/AXmString mod4String, mod4EmptyString;
551N/AXmString mod5String, mod5EmptyString;
551N/AXmString mb1String, mb1EmptyString;
551N/AXmString mb2String, mb2EmptyString;
551N/AXmString mb3String, mb3EmptyString;
551N/AXmString mb4String, mb4EmptyString;
551N/AXmString mb5String, mb5EmptyString;
551N/A
551N/A/************************************************************************/
551N/A/* */
551N/A/* Help Global variables */
551N/A/* */
551N/A/************************************************************************/
551N/Astatic char *generalHelpString = NULL;
551N/Astatic char *stickyHelpString = NULL;
551N/Astatic char *mouseHelpString = NULL;
551N/Astatic char *toggleHelpString = NULL;
551N/Astatic char *repeatHelpString = NULL;
551N/Astatic char *slowHelpString = NULL;
551N/Astatic char *bounceHelpString = NULL;
551N/A
851N/A#define ACCESSXHELP_DIRECTORY "/usr/share/X11/locale/"
551N/A/* used for debugging.
551N/A#define ACCESSXHELP_DIRECTORY "./locale/"
551N/A*/
851N/A#define HELPDIR "/accessx/"
551N/A#define ACCESSXHELP_FILE "accessx.hlp"
551N/A#define COMMENT '-'
551N/A
551N/A/************************************************************************/
551N/A/* */
551N/A/* Constant Declarations */
551N/A/* */
551N/A/************************************************************************/
551N/A
551N/A/* WIDGET INDEXING DECLARATIONS */
551N/A
551N/A/* Toggle Widgets */
551N/A#define ENABLE_ACCESSX_TGL 1
551N/A#define ONOFF_SOUND_TGL 2
551N/A#define TIME_OUT_TGL 3
551N/A
551N/A#define STICKY_KEYS_TGL 4
551N/A#define MOUSE_KEYS_TGL 5
551N/A#define TOGGLE_KEYS_TGL 6
551N/A#define REPEAT_KEYS_TGL 7
551N/A#define SLOW_KEYS_TGL 8
551N/A#define BOUNCE_KEYS_TGL 9
551N/A
551N/A#define STICKY_MOD_SOUND_TGL 10
551N/A#define STICKY_TWO_KEYS_TGL 11
551N/A
551N/A#define KRG_PRESS_SOUND_TGL 12
551N/A#define KRG_ACCEPT_SOUND_TGL 13
551N/A
551N/A#define MAIN_TOGGLE_WIDGETS_MIN 1
551N/A#define MAIN_TOGGLE_WIDGETS_MAX 9
551N/A
551N/A#define SETTINGS_TOGGLE_WIDGETS_MIN 10
551N/A#define SETTINGS_TOGGLE_WIDGETS_MAX 13
551N/A
551N/A#define TOGGLE_WIDGETS_MIN 1
551N/A#define TOGGLE_WIDGETS_MAX 13
551N/A
551N/A#define NUM_TOGGLE_WIDGETS 14 /* number plus one */
551N/A
551N/A/* Scale Widgets */
551N/A#define TIME_OUT_SCL 14
551N/A
551N/A#define MOUSE_MAX_SPEED_SCL 15
551N/A#define MOUSE_TIME_TO_MAX_SCL 16
551N/A#define MOUSE_DELAY_SCL 17
551N/A
551N/A#define KRG_REPEAT_DELAY_SCL 18
551N/A#define KRG_REPEAT_RATE_SCL 19
551N/A#define KRG_SLOW_DELAY_SCL 20
551N/A#define KRG_DEBOUNCE_SCL 21
551N/A
551N/A#define SCALE_WIDGETS_MIN 14
551N/A#define SCALE_WIDGETS_MAX 21
551N/A
551N/A/* Main Menu Push Button Items */
551N/A#define LOAD_BTN 22
551N/A#define SAVE_BTN 23
551N/A#define EXIT_BTN 24
551N/A#define STICKY_STATUS_BTN 25
551N/A#define MOUSE_STATUS_BTN 26
551N/A#define SETTINGS_BTN 27
551N/A
551N/A#define GENERAL_HELP_BTN 28
551N/A#define STICKY_HELP_BTN 29
551N/A#define MOUSE_HELP_BTN 30
551N/A#define TOGGLE_HELP_BTN 31
551N/A#define REPEAT_HELP_BTN 32
551N/A#define SLOW_HELP_BTN 33
551N/A#define BOUNCE_HELP_BTN 34
551N/A
551N/A/* Help Related Widgets */
551N/A#define HELP_TEXT 35
551N/A#define CLOSE_HELP_BTN 36
551N/A
551N/A/* Settings Window Related Widgets */
551N/A#define SETTINGS_OK_BTN 37
551N/A#define SETTINGS_RESET_BTN 38
551N/A#define SETTINGS_DEFAULTS_BTN 39
551N/A#define SETTINGS_CANCEL_BTN 40
551N/A#define SETTINGS_HELP_BTN 41
551N/A
551N/A/* Sticky Keys Status Widgets */
551N/A#define SHIFT_LATCHED_LBL 42
551N/A#define SHIFT_LOCKED_LBL 43
551N/A#define CONTROL_LATCHED_LBL 44
551N/A#define CONTROL_LOCKED_LBL 45
551N/A#define MOD1_LATCHED_LBL 46
551N/A#define MOD1_LOCKED_LBL 47
551N/A#define MOD2_LATCHED_LBL 48
551N/A#define MOD2_LOCKED_LBL 49
551N/A#define MOD3_LATCHED_LBL 50
551N/A#define MOD3_LOCKED_LBL 51
551N/A#define MOD4_LATCHED_LBL 52
551N/A#define MOD4_LOCKED_LBL 53
551N/A#define MOD5_LATCHED_LBL 54
551N/A#define MOD5_LOCKED_LBL 55
551N/A#define STICKY_CLOSE_BTN 56
551N/A
551N/A/* Mouse Keys Status Widgets */
551N/A#define CURRENT_BUTTON_LBL 57
551N/A#define MB1_PRESSED_LBL 58
551N/A#define MB1_RELEASED_LBL 59
551N/A#define MB2_PRESSED_LBL 60
551N/A#define MB2_RELEASED_LBL 61
551N/A#define MB3_PRESSED_LBL 62
551N/A#define MB3_RELEASED_LBL 63
551N/A#define MB4_PRESSED_LBL 64
551N/A#define MB4_RELEASED_LBL 65
551N/A#define MB5_PRESSED_LBL 66
551N/A#define MB5_RELEASED_LBL 67
551N/A#define MOUSE_CLOSE_BTN 68
551N/A
551N/A/* Load-Save Dialog Widgets */
551N/A#define SAVE_DONE_CANCEL_BTN 69
551N/A#define SAVE_DONE_OK_BTN 70
551N/A#define SAVE_DONE_HELP_BTN 71
551N/A
551N/A#define SAVE_ERR_CANCEL_BTN 72
551N/A#define SAVE_ERR_OK_BTN 73
551N/A#define SAVE_ERR_HELP_BTN 74
551N/A
551N/A#define LOAD_DONE_CANCEL_BTN 75
551N/A#define LOAD_DONE_OK_BTN 76
551N/A#define LOAD_DONE_HELP_BTN 77
551N/A
551N/A#define LOAD_ERR_CANCEL_BTN 78
551N/A#define LOAD_ERR_OK_BTN 79
551N/A#define LOAD_ERR_HELP_BTN 80
551N/A
551N/A#define HELP_ERR_CANCEL_BTN 81
551N/A#define HELP_ERR_OK_BTN 82
551N/A#define HELP_ERR_HELP_BTN 83
551N/A
551N/A/* This Should Reflect Current Designs */
551N/A#define NUM_WIDGETS 83
551N/A#define NUM_RES_WIDGETS 25 /* # of widgets which have resources */
551N/A
551N/A/* Application Class String */
551N/A#define ACCESSX_CLASS "AccessX"
551N/A#define ACCESSX_FILE ACCESSX_CLASS
551N/A
551N/A/************************************************************************/
551N/A/* */
551N/A/* Macro Definitions */
551N/A/* */
551N/A/************************************************************************/
551N/A#define SECSTOMILLIS(x) (int)((float)x * (float)1000)
551N/A#define MILLISTOSECS(x) (float)((float)x / (float)1000)
551N/A
551N/A
551N/Astatic Widget widgets[NUM_WIDGETS];
551N/Achar resStrings[NUM_RES_WIDGETS][256] = {
551N/A "",
551N/A "*EnableAccessXToggle.set",
551N/A "*SoundOnOffToggle.set",
551N/A "*TimeOutToggle.set",
551N/A "*StickyKeysToggle.set",
551N/A "*MouseKeysToggle.set",
551N/A "*ToggleKeysToggle.set",
551N/A "*RepeatKeysToggle.set",
551N/A "*SlowKeysToggle.set",
551N/A "*BounceKeysToggle.set",
551N/A "*StickyModSoundToggle.set",
551N/A "*StickyTwoKeysToggle.set",
551N/A "*SlowKeysOnPressToggle.set",
551N/A "*SlowKeysOnAcceptToggle.set",
551N/A "*TimeOutScale",
551N/A "*MouseMaxSpeedScale",
551N/A "*MouseTimeToMaxScale",
551N/A "*KRGRepeatDelayScale",
551N/A "*KRGRepeatRateScale",
551N/A "*KRGSlowKeysDelayScale",
551N/A "*KRGDebounceScale" };
551N/A
551N/Achar classStrings[NUM_RES_WIDGETS][80] = {
551N/A "",
551N/A "AccessX*ToggleButtonGadget.XmCSet",
551N/A "AccessX*ToggleButtonGadget.XmCSet",
551N/A "AccessX*ToggleButtonGadget.XmCSet",
551N/A "AccessX*ToggleButtonGadget.XmCSet",
551N/A "AccessX*ToggleButtonGadget.XmCSet",
551N/A "AccessX*ToggleButtonGadget.XmCSet",
551N/A "AccessX*ToggleButtonGadget.XmCSet",
551N/A "AccessX*ToggleButtonGadget.XmCSet",
551N/A "AccessX*ToggleButtonGadget.XmCSet",
551N/A "AccessX*ToggleButtonGadget.XmCSet",
551N/A "AccessX*ToggleButtonGadget.XmCSet",
551N/A "AccessX*ToggleButtonGadget.XmCSet",
551N/A "AccessX*ToggleButtonGadget.XmCSet",
551N/A "AccessX*XmScale",
551N/A "AccessX*XmScale",
551N/A "AccessX*XmScale",
551N/A "AccessX*XmScale",
551N/A "AccessX*XmScale",
551N/A "AccessX*XmScale",
551N/A "AccessX*XmScale" };
551N/A
551N/Aint toggleWidgetsMask[NUM_TOGGLE_WIDGETS] = {
551N/A 0,
551N/A ALLOW_ACCESSX_MASK,
551N/A STICKY_ONOFF_SOUND_MASK | MOUSE_ONOFF_SOUND_MASK | KRG_ONOFF_SOUND_MASK,
551N/A TIME_OUT_MASK,
551N/A STICKY_KEYS_MASK,
551N/A MOUSE_KEYS_MASK,
551N/A TOGGLE_KEYS_MASK,
551N/A REPEAT_KEYS_MASK,
551N/A SLOW_KEYS_MASK,
551N/A BOUNCE_KEYS_MASK,
551N/A STICKY_MOD_SOUND_MASK,
551N/A TWO_KEYS_MASK,
551N/A KRG_PRESS_SOUND_MASK,
551N/A KRG_ACCEPT_SOUND_MASK };
551N/A
551N/A
551N/A/************************************************************************/
551N/A/* */
551N/A/* Application Resources */
551N/A/* */
551N/A/************************************************************************/
551N/Atypedef struct
551N/A{
551N/A Boolean iconifyMain; /* Start main window iconified */
551N/A Boolean automaticPopup; /* For Sticky & Mouse status */
551N/A Boolean useServer; /* Use server settings */
551N/A} OptionsRec;
551N/A
551N/AOptionsRec options;
551N/A
551N/A#define Offset(field) XtOffsetOf(OptionsRec,field)
551N/AXtResource resources[] =
551N/A{
551N/A {"iconifyMain", "IconifyMain", XtRBoolean, sizeof(Boolean),
551N/A Offset(iconifyMain), "XtRImmediate", (XtPointer) False},
551N/A {"automaticPopup", "AutomaticPopup", XtRBoolean, sizeof(Boolean),
551N/A Offset(automaticPopup), "XtRImmediate", (XtPointer) False},
551N/A {"useServer", "UseServer", XtRBoolean, sizeof(Boolean),
551N/A Offset(useServer), XtRImmediate, (XtPointer) False}
551N/A};
551N/A#undef Offset
551N/A
551N/AXrmOptionDescRec optionDesc[] = {
551N/A {"-iconic", "*iconifyMain", XrmoptionNoArg, (XtPointer) "true"},
551N/A {"-auto", "*automaticPopup", XrmoptionNoArg, (XtPointer) "true"},
551N/A {"-noauto", "*automaticPopup", XrmoptionNoArg, (XtPointer) "false"},
551N/A {"-server", "*useServer", XrmoptionNoArg, (XtPointer) "true"},
551N/A {"-client", "*useServer", XrmoptionNoArg, (XtPointer) "false"}
551N/A};
551N/A
551N/A/* The fallback resources are used to define the default values for
551N/A * interface items such as the range/detail of the scales.
551N/A */
551N/Astatic String fallbackResources[] = {
551N/A "*EnableAccessXToggle.set: True",
551N/A "*SoundOnOffToggle.set: True",
551N/A "*ShowStatusToggle.set: False",
551N/A "*TimeOutToggle.set: False",
551N/A "*TimeOutScale.minimum: 1",
551N/A "*TimeOutScale.maximum: 10",
551N/A "*TimeOutScale.decimalPoints: 0",
551N/A "*TimeOutScale.value: 2",
551N/A "*StickyKeysToggle.set: False",
551N/A "*MouseKeysToggle.set: False",
551N/A "*ToggleKeysToggle.set: False",
551N/A "*RepeatKeysToggle.set: True",
551N/A "*SlowKeysToggle.set: False",
551N/A "*BounceKeysToggle.set: False",
551N/A "*StickyTwoKeysToggle.set: True",
551N/A "*StickyModSoundToggle.set: True",
551N/A "*MouseMaxSpeedScale.minimum: 1",
551N/A "*MouseMaxSpeedScale.maximum: 500",
551N/A "*MouseMaxSpeedScale.decimalPoints: 0",
551N/A "*MouseMaxSpeedScale.value: 300",
551N/A "*MouseAccelScale.minimum: 1",
551N/A "*MouseAccelScale.maximum: 40",
551N/A "*MouseAccelScale.decimalPoints: 1",
551N/A "*MouseAccelScale.value: 20",
551N/A "*MouseDelayScale.minimum: 1",
551N/A "*MouseDelayScale.maximum: 40",
551N/A "*MouseDelayScale.decimalPoints: 1",
551N/A "*MouseDelayScale.value: 3",
551N/A "*KRGRepeatRateScale.minimum: 1",
551N/A "*KRGRepeatRateScale.maximum: 400",
551N/A "*KRGRepeatRateScale.decimalPoints: 2",
551N/A "*KRGRepeatRateScale.value: 5",
551N/A "*KRGRepeatDelayScale.minimum: 1",
551N/A "*KRGRepeatDelayScale.maximum: 400",
551N/A "*KRGRepeatDelayScale.decimalPoints: 2",
551N/A "*KRGRepeatDelayScale.value: 66",
551N/A "*SlowKeysOnPressToggle.set: True",
551N/A "*SlowKeysOnAcceptToggle.set: True",
551N/A "*KRGSlowKeysDelayScale.minimum: 1",
551N/A "*KRGSlowKeysDelayScale.maximum: 40",
551N/A "*KRGSlowKeysDelayScale.decimalPoints: 1",
551N/A "*KRGSlowKeysDelayScale.value: 3",
551N/A "*KRGDebounceScale.minimum: 0",
551N/A "*KRGDebounceScale.maximum: 40",
551N/A "*KRGDebounceScale.decimalPoints: 1",
551N/A "*KRGDebounceScale.value: 3",
551N/A NULL
551N/A};
551N/A
551N/A
551N/A/************************************************************************/
551N/A/* */
551N/A/* AccessXEventHandler */
551N/A/* */
551N/A/* DESCRIPTION: */
551N/A/* */
551N/A/* Handle all events generated by the AccessX server extension. */
551N/A/* */
551N/A/************************************************************************/
551N/A#if NeedFunctionPrototypes
551N/Avoid AccessXEventHandler(XAccessXEvent *event)
551N/A#else
551N/Avoid AccessXEventHandler(event)
551N/A XAccessXEvent *event;
551N/A#endif
551N/A{
551N/A Arg argList[2];
551N/A
551N/A switch (event->detail) {
551N/A case X_AccessXStickyKeysOn:
551N/A XmToggleButtonSetState(widgets[STICKY_KEYS_TGL],True,False);
551N/A if (options.automaticPopup) {
551N/A CreateAndMapStickyStatusWindow();
551N/A }
551N/A
551N/A /*[[[should put a check in for sounds]]]*/
551N/A break;
551N/A
551N/A case X_AccessXStickyKeysOff:
551N/A XmToggleButtonSetState(widgets[STICKY_KEYS_TGL],False,False);
551N/A
551N/A XtSetArg(argList[0], XmNlabelString, shiftEmptyString);
551N/A XtSetValues(widgets[SHIFT_LATCHED_LBL], argList, 1);
551N/A XtSetValues(widgets[SHIFT_LOCKED_LBL], argList, 1);
551N/A
551N/A XtSetArg(argList[0], XmNlabelString, controlEmptyString);
551N/A XtSetValues(widgets[CONTROL_LATCHED_LBL], argList, 1);
551N/A XtSetValues(widgets[CONTROL_LOCKED_LBL], argList, 1);
551N/A
551N/A XtSetArg(argList[0], XmNlabelString, mod1EmptyString);
551N/A XtSetValues(widgets[MOD1_LATCHED_LBL], argList, 1);
551N/A XtSetValues(widgets[MOD1_LOCKED_LBL], argList, 1);
551N/A
551N/A XtSetArg(argList[0], XmNlabelString, mod2EmptyString);
551N/A XtSetValues(widgets[MOD2_LATCHED_LBL], argList, 1);
551N/A XtSetValues(widgets[MOD2_LOCKED_LBL], argList, 1);
551N/A
551N/A XtSetArg(argList[0], XmNlabelString, mod3EmptyString);
551N/A XtSetValues(widgets[MOD3_LATCHED_LBL], argList, 1);
551N/A XtSetValues(widgets[MOD3_LOCKED_LBL], argList, 1);
551N/A
551N/A XtSetArg(argList[0], XmNlabelString, mod4EmptyString);
551N/A XtSetValues(widgets[MOD4_LATCHED_LBL], argList, 1);
551N/A XtSetValues(widgets[MOD4_LOCKED_LBL], argList, 1);
551N/A
551N/A XtSetArg(argList[0], XmNlabelString, mod5EmptyString);
551N/A XtSetValues(widgets[MOD5_LATCHED_LBL], argList, 1);
551N/A XtSetValues(widgets[MOD5_LOCKED_LBL], argList, 1);
551N/A
551N/A if (options.automaticPopup) {
551N/A UnmapStickyStatusWindow();
551N/A }
551N/A
551N/A /*[[[should put a check in for sounds]]]*/
551N/A break;
551N/A
551N/A /*[[[MouseKeys On/Off has not been implemented in the server yet]]]*/
551N/A case X_AccessXMouseKeysOn:
551N/A XmToggleButtonSetState(widgets[MOUSE_KEYS_TGL], True, False);
551N/A
551N/A if (options.automaticPopup) {
551N/A CreateAndMapMouseStatusWindow();
551N/A }
551N/A
551N/A /*[[[should put a check in for sounds]]]*/
551N/A break;
551N/A
551N/A case X_AccessXMouseKeysOff:
551N/A XmToggleButtonSetState(widgets[MOUSE_KEYS_TGL],False,False);
551N/A
551N/A if (options.automaticPopup) {
551N/A UnmapMouseStatusWindow();
551N/A }
551N/A /*[[[should put a check in for sounds]]]*/
551N/A break;
551N/A
551N/A case X_AccessXKRGWarning:
551N/A /*[[[should put a check in for sounds]]]*/
551N/A break;
551N/A
551N/A case X_AccessXKRGOn:
551N/A if (event->control & REPEAT_KEYS_MASK)
551N/A XmToggleButtonSetState(widgets[REPEAT_KEYS_TGL],True,False);
551N/A if (event->control & SLOW_KEYS_MASK) {
551N/A XmToggleButtonSetState(widgets[SLOW_KEYS_TGL],True,False);
551N/A XmToggleButtonSetState(widgets[BOUNCE_KEYS_TGL],False,False);
551N/A }
551N/A if (event->control & BOUNCE_KEYS_MASK) {
551N/A XmToggleButtonSetState(widgets[SLOW_KEYS_TGL],False,False);
551N/A XmToggleButtonSetState(widgets[BOUNCE_KEYS_TGL],True,False);
551N/A }
551N/A
551N/A /*[[[should put a check in for sounds]]]*/
551N/A break;
551N/A
551N/A case X_AccessXKRGOff:
551N/A XmToggleButtonSetState(widgets[REPEAT_KEYS_TGL],False,False);
551N/A XmToggleButtonSetState(widgets[SLOW_KEYS_TGL],False,False);
551N/A XmToggleButtonSetState(widgets[BOUNCE_KEYS_TGL],False,False);
551N/A /*[[[should put a check in for sounds]]]*/
551N/A break;
551N/A
551N/A case X_AccessXToggleKeysOn:
551N/A XmToggleButtonSetState(widgets[TOGGLE_KEYS_TGL],True,False);
551N/A break;
551N/A
551N/A case X_AccessXToggleKeysOff:
551N/A XmToggleButtonSetState(widgets[TOGGLE_KEYS_TGL],False,False);
551N/A break;
551N/A
551N/A case X_AccessXToggleKeyDown:
551N/A /*[[[should put a check in for sounds]]]*/
551N/A break;
551N/A
551N/A case X_AccessXToggleKeyUp:
551N/A /*[[[should put a check in for sounds]]]*/
551N/A break;
551N/A
551N/A case X_AccessXModifierLatch:
551N/A if (event->modifier & ShiftMask) {
551N/A XtSetArg(argList[0],XmNlabelString,shiftString);
551N/A XtSetValues(widgets[SHIFT_LATCHED_LBL],argList,1);
551N/A }
551N/A else if (event->modifier & ControlMask) {
551N/A XtSetArg(argList[0],XmNlabelString,controlString);
551N/A XtSetValues(widgets[CONTROL_LATCHED_LBL],argList,1);
551N/A }
551N/A else if (event->modifier & Mod1Mask) {
551N/A XtSetArg(argList[0],XmNlabelString,mod1String);
551N/A XtSetValues(widgets[MOD1_LATCHED_LBL],argList,1);
551N/A }
551N/A else if (event->modifier & Mod2Mask) {
551N/A XtSetArg(argList[0],XmNlabelString,mod2String);
551N/A XtSetValues(widgets[MOD2_LATCHED_LBL],argList,1);
551N/A }
551N/A else if (event->modifier & Mod3Mask) {
551N/A XtSetArg(argList[0],XmNlabelString,mod3String);
551N/A XtSetValues(widgets[MOD3_LATCHED_LBL],argList,1);
551N/A }
551N/A else if (event->modifier & Mod4Mask) {
551N/A XtSetArg(argList[0],XmNlabelString,mod4String);
551N/A XtSetValues(widgets[MOD4_LATCHED_LBL],argList,1);
551N/A }
551N/A else if (event->modifier & Mod5Mask) {
551N/A XtSetArg(argList[0],XmNlabelString,mod5String);
551N/A XtSetValues(widgets[MOD5_LATCHED_LBL],argList,1);
551N/A }
551N/A
551N/A break;
551N/A
551N/A case X_AccessXModifierUnlatch:
551N/A if (event->modifier & ShiftMask) {
551N/A XtSetArg(argList[0], XmNlabelString, shiftEmptyString);
551N/A XtSetValues(widgets[SHIFT_LATCHED_LBL], argList, 1);
551N/A }
551N/A else if (event->modifier & ControlMask) {
551N/A XtSetArg(argList[0], XmNlabelString, controlEmptyString);
551N/A XtSetValues(widgets[CONTROL_LATCHED_LBL], argList, 1);
551N/A }
551N/A else if (event->modifier & Mod1Mask) {
551N/A XtSetArg(argList[0],XmNlabelString,mod1EmptyString);
551N/A XtSetValues(widgets[MOD1_LATCHED_LBL],argList,1);
551N/A }
551N/A else if (event->modifier & Mod2Mask) {
551N/A XtSetArg(argList[0],XmNlabelString,mod2EmptyString);
551N/A XtSetValues(widgets[MOD2_LATCHED_LBL],argList,1);
551N/A }
551N/A else if (event->modifier & Mod3Mask) {
551N/A XtSetArg(argList[0],XmNlabelString,mod3EmptyString);
551N/A XtSetValues(widgets[MOD3_LATCHED_LBL],argList,1);
551N/A }
551N/A else if (event->modifier & Mod4Mask) {
551N/A XtSetArg(argList[0],XmNlabelString,mod4EmptyString);
551N/A XtSetValues(widgets[MOD4_LATCHED_LBL],argList,1);
551N/A }
551N/A else if (event->modifier & Mod5Mask) {
551N/A XtSetArg(argList[0],XmNlabelString,mod5EmptyString);
551N/A XtSetValues(widgets[MOD5_LATCHED_LBL],argList,1);
551N/A }
551N/A
551N/A break;
551N/A
551N/A case X_AccessXModifierLock:
551N/A if (event->modifier & ShiftMask) {
551N/A XtSetArg(argList[0],XmNlabelString,shiftString);
551N/A XtSetValues(widgets[SHIFT_LOCKED_LBL],argList,1);
551N/A }
551N/A else if (event->modifier & ControlMask) {
551N/A XtSetArg(argList[0],XmNlabelString,controlString);
551N/A XtSetValues(widgets[CONTROL_LOCKED_LBL],argList,1);
551N/A }
551N/A else if (event->modifier & Mod1Mask) {
551N/A XtSetArg(argList[0],XmNlabelString,mod1String);
551N/A XtSetValues(widgets[MOD1_LOCKED_LBL],argList,1);
551N/A }
551N/A else if (event->modifier & Mod2Mask) {
551N/A XtSetArg(argList[0],XmNlabelString,mod2String);
551N/A XtSetValues(widgets[MOD2_LOCKED_LBL],argList,1);
551N/A }
551N/A else if (event->modifier & Mod3Mask) {
551N/A XtSetArg(argList[0],XmNlabelString,mod3String);
551N/A XtSetValues(widgets[MOD3_LOCKED_LBL],argList,1);
551N/A }
551N/A else if (event->modifier & Mod4Mask) {
551N/A XtSetArg(argList[0],XmNlabelString,mod4String);
551N/A XtSetValues(widgets[MOD4_LOCKED_LBL],argList,1);
551N/A }
551N/A else if (event->modifier & Mod5Mask) {
551N/A XtSetArg(argList[0],XmNlabelString,mod5String);
551N/A XtSetValues(widgets[MOD5_LOCKED_LBL],argList,1);
551N/A }
551N/A
551N/A break;
551N/A
551N/A case X_AccessXModifierUnlock:
551N/A if (event->modifier & ShiftMask) {
551N/A XtSetArg(argList[0],XmNlabelString,shiftEmptyString);
551N/A XtSetValues(widgets[SHIFT_LOCKED_LBL],argList,1);
551N/A }
551N/A else if (event->modifier & ControlMask) {
551N/A XtSetArg(argList[0],XmNlabelString,controlEmptyString);
551N/A XtSetValues(widgets[CONTROL_LOCKED_LBL],argList,1);
551N/A }
551N/A else if (event->modifier & Mod1Mask) {
551N/A XtSetArg(argList[0],XmNlabelString,mod1EmptyString);
551N/A XtSetValues(widgets[MOD1_LOCKED_LBL],argList,1);
551N/A }
551N/A else if (event->modifier & Mod2Mask) {
551N/A XtSetArg(argList[0],XmNlabelString,mod2EmptyString);
551N/A XtSetValues(widgets[MOD2_LOCKED_LBL],argList,1);
551N/A }
551N/A else if (event->modifier & Mod3Mask) {
551N/A XtSetArg(argList[0],XmNlabelString,mod3EmptyString);
551N/A XtSetValues(widgets[MOD3_LOCKED_LBL],argList,1);
551N/A }
551N/A else if (event->modifier & Mod4Mask) {
551N/A XtSetArg(argList[0],XmNlabelString,mod4EmptyString);
551N/A XtSetValues(widgets[MOD4_LOCKED_LBL],argList,1);
551N/A }
551N/A else if (event->modifier & Mod5Mask) {
551N/A XtSetArg(argList[0],XmNlabelString,mod5EmptyString);
551N/A XtSetValues(widgets[MOD5_LOCKED_LBL],argList,1);
551N/A }
551N/A
551N/A break;
551N/A
551N/A case X_AccessXPressSlowKey:
551N/A /*[[[should put a check in for sounds]]]*/
551N/A break;
551N/A
551N/A case X_AccessXAcceptSlowKey:
551N/A /*[[[should put a check in for sounds]]]*/
551N/A break;
551N/A
551N/A case X_AccessXChangeCurrentButton:
551N/A XtSetArg(argList[0],"empty" , "");
551N/A XtSetArg(argList[1],"empty" , "");
551N/A switch (event->keyOrButton) {
551N/A case 1:
551N/A XtSetArg(argList[0], XmNlabelString, mb1String);
551N/A break;
551N/A case 2:
551N/A XtSetArg(argList[0], XmNlabelString, mb2String);
551N/A break;
551N/A case 3:
551N/A XtSetArg(argList[0], XmNlabelString, mb3String);
551N/A break;
551N/A case 4:
551N/A XtSetArg(argList[0], XmNlabelString, mb4String);
551N/A break;
551N/A case 5:
551N/A XtSetArg(argList[0], XmNlabelString, mb5String);
551N/A break;
551N/A }
551N/A if (widgets[CURRENT_BUTTON_LBL]) {
551N/A XtSetValues(widgets[CURRENT_BUTTON_LBL], argList, 1);
551N/A }
551N/A break;
551N/A
551N/A case X_AccessXPressButton:
551N/A switch (event->keyOrButton) {
551N/A case 1:
551N/A XtSetArg(argList[0], XmNlabelString, mb1String);
551N/A XtSetValues(widgets[MB1_PRESSED_LBL], argList, 1);
551N/A XtSetArg(argList[0], XmNlabelString, mb1EmptyString);
551N/A XtSetValues(widgets[MB1_RELEASED_LBL], argList, 1);
551N/A break;
551N/A case 2:
551N/A XtSetArg(argList[0], XmNlabelString, mb2String);
551N/A XtSetValues(widgets[MB2_PRESSED_LBL], argList, 1);
551N/A XtSetArg(argList[0], XmNlabelString, mb2EmptyString);
551N/A XtSetValues(widgets[MB2_RELEASED_LBL], argList, 1);
551N/A break;
551N/A case 3:
551N/A XtSetArg(argList[0], XmNlabelString, mb3String);
551N/A XtSetValues(widgets[MB3_PRESSED_LBL], argList, 1);
551N/A XtSetArg(argList[0], XmNlabelString, mb3EmptyString);
551N/A XtSetValues(widgets[MB3_RELEASED_LBL], argList, 1);
551N/A break;
551N/A#ifdef SHOW_5_BUTTONS_IN_MOUSEKEYS_STATUS
551N/A case 4:
551N/A XtSetArg(argList[0], XmNlabelString, mb4String);
551N/A XtSetValues(widgets[MB4_PRESSED_LBL], argList, 1);
551N/A XtSetArg(argList[0], XmNlabelString, mb4EmptyString);
551N/A XtSetValues(widgets[MB4_RELEASED_LBL], argList, 1);
551N/A break;
551N/A case 5:
551N/A XtSetArg(argList[0], XmNlabelString, mb5String);
551N/A XtSetValues(widgets[MB5_PRESSED_LBL], argList, 1);
551N/A XtSetArg(argList[0], XmNlabelString, mb5EmptyString);
551N/A XtSetValues(widgets[MB5_RELEASED_LBL], argList, 1);
551N/A break;
551N/A#endif
551N/A }
551N/A break;
551N/A
551N/A case X_AccessXReleaseButton:
551N/A XtSetArg(argList[0], XmNshadowType, XmSHADOW_ETCHED_OUT);
551N/A switch (event->keyOrButton) {
551N/A case 1:
551N/A XtSetArg(argList[0], XmNlabelString, mb1String);
551N/A XtSetValues(widgets[MB1_RELEASED_LBL], argList, 1);
551N/A XtSetArg(argList[0], XmNlabelString, mb1EmptyString);
551N/A XtSetValues(widgets[MB1_PRESSED_LBL], argList, 1);
551N/A break;
551N/A case 2:
551N/A XtSetArg(argList[0], XmNlabelString, mb2String);
551N/A XtSetValues(widgets[MB2_RELEASED_LBL], argList, 1);
551N/A XtSetArg(argList[0], XmNlabelString, mb2EmptyString);
551N/A XtSetValues(widgets[MB2_PRESSED_LBL], argList, 1);
551N/A break;
551N/A case 3:
551N/A XtSetArg(argList[0], XmNlabelString, mb3String);
551N/A XtSetValues(widgets[MB3_RELEASED_LBL], argList, 1);
551N/A XtSetArg(argList[0], XmNlabelString, mb3EmptyString);
551N/A XtSetValues(widgets[MB3_PRESSED_LBL], argList, 1);
551N/A break;
551N/A#ifdef SHOW_5_BUTTONS_IN_MOUSEKEYS_STATUS
551N/A case 4:
551N/A XtSetArg(argList[0], XmNlabelString, mb4String);
551N/A XtSetValues(widgets[MB4_RELEASED_LBL], argList, 1);
551N/A XtSetArg(argList[0], XmNlabelString, mb4EmptyString);
551N/A XtSetValues(widgets[MB4_PRESSED_LBL], argList, 1);
551N/A break;
551N/A case 5:
551N/A XtSetArg(argList[0], XmNlabelString, mb5String);
551N/A XtSetValues(widgets[MB5_RELEASED_LBL], argList, 1);
551N/A XtSetArg(argList[0], XmNlabelString, mb5EmptyString);
551N/A XtSetValues(widgets[MB5_PRESSED_LBL], argList, 1);
551N/A break;
551N/A#endif
551N/A }
551N/A break;
551N/A
551N/A case X_AccessXChangeGain:
551N/A {
551N/A break;
551N/A }
551N/A }
551N/A} /* AccessXEventHandler */
551N/A
551N/A/************************************************************************/
551N/A/* */
551N/A/* ConvertScaleValueToUnits */
551N/A/* */
551N/A/* Take a scale reading and a decimal point reading and returns */
551N/A/* a floating point number which is the value the scale really */
551N/A/* represents. The purpose of this function is to easily convert */
551N/A/* between both representations independent of what the value */
551N/A/* actually represents. */
551N/A/* */
551N/A/************************************************************************/
551N/A#if NeedFunctionPrototypes
551N/Afloat ConvertScaleValueToUnits(int value, short decimalPoints)
551N/A#else
551N/Afloat ConvertScaleValueToUnits(value, decimalPoints)
551N/A int value;
551N/A short decimalPoints;
551N/A#endif
551N/A{
551N/A int i, j;
551N/A
551N/A j = 1;
551N/A for (i = 0; i < decimalPoints; i++) {
551N/A j *= 10;
551N/A }
551N/A
551N/A return ((float)value / (float)j);
551N/A}
551N/A
551N/A/************************************************************************/
551N/A/* */
551N/A/* ConvertUnitsToScaleValue */
551N/A/* */
551N/A/* Take a floating point value and a decimal points reading and */
551N/A/* returns an adjusted integer value which may be used as a value */
551N/A/* for a scale widget. The purpose of this function is to easily */
551N/A/* convert between both representation independent of what the */
551N/A/* value actually represents. */
551N/A/* */
551N/A/************************************************************************/
551N/A#if NeedFunctionPrototypes
551N/Aint ConvertUnitsToScaleValue(float value, short decimalPoints)
551N/A#else
551N/Aint ConvertUnitsToScaleValue(value, decimalPoints)
551N/A float value;
551N/A short decimalPoints;
551N/A#endif
551N/A{
551N/A int i, j;
551N/A
551N/A j = 1;
551N/A for (i = 0; i < decimalPoints; i++) {
551N/A j *= 10;
551N/A }
551N/A return ((int)(value * (float)j));
551N/A}
551N/A
551N/A/************************************************************************/
551N/A/* */
551N/A/* SetStateFromView */
551N/A/* */
551N/A/* Sets the state of the extension according to the state of the */
551N/A/* widgets in the interface. */
551N/A/* */
551N/A/************************************************************************/
551N/A#if NeedFunctionPrototypes
551N/Avoid SetStateFromView(void)
551N/A#else
551N/Avoid SetStateFromView()
551N/A#endif
551N/A{
551N/A if(XKBExtension)
551N/A SetStateFromViewXKB();
551N/A else
551N/A SetStateFromViewAX();
551N/A} /* SetStateFromView */
551N/A
551N/A
551N/A#if NeedFunctionPrototypes
551N/Avoid SetStateFromViewXKB(void)
551N/A#else
551N/Avoid SetStateFromViewXKB()
551N/A#endif
551N/A{
551N/A unsigned long which;
551N/A CARD32 enabled,changeEnabled;
551N/A XkbDescRec *desc;
551N/A Arg argList[2];
551N/A int scaleValue;
551N/A short decimalPoints;
551N/A
551N/A which = XkbAccessXKeysMask | XkbAccessXTimeoutMask |
551N/A XkbControlsEnabledMask |
551N/A XkbMouseKeysAccelMask |
551N/A XkbRepeatKeysMask | XkbSlowKeysMask | XkbBounceKeysMask;
551N/A
551N/A changeEnabled = XkbAccessXKeysMask |
551N/A XkbAccessXFeedbackMask |
551N/A XkbStickyKeysMask | XkbMouseKeysMask |
551N/A XkbRepeatKeysMask | XkbSlowKeysMask | XkbBounceKeysMask;
551N/A
551N/A enabled = XkbAccessXFeedbackMask;
551N/A
551N/A desc = XkbGetMap(dpy,0,XkbUseCoreKbd);
551N/A XkbGetControls(dpy,XkbAllControlsMask,desc);
551N/A
551N/A desc->ctrls->ax_options = XkbAX_LatchToLockMask;
551N/A
551N/A /********************************************************************/
551N/A /* */
551N/A /* Global values: Enable AccessX, Beep on Feature Use, TimeOut */
551N/A /* */
551N/A /********************************************************************/
551N/A if (XmToggleButtonGadgetGetState(widgets[ENABLE_ACCESSX_TGL]))
551N/A enabled |= XkbAccessXKeysMask;
551N/A
551N/A if (XmToggleButtonGadgetGetState(widgets[ONOFF_SOUND_TGL]))
551N/A desc->ctrls->ax_options |= XkbAX_FeatureFBMask | XkbAX_SlowWarnFBMask;
551N/A
551N/A if (XmToggleButtonGadgetGetState(widgets[TIME_OUT_TGL]))
551N/A {
551N/A XtSetArg(argList[0], XmNsensitive, True);
551N/A XtSetValues(widgets[TIME_OUT_SCL],argList,1);
551N/A enabled |= XkbAccessXTimeoutMask;
551N/A }
551N/A else
551N/A {
551N/A XtSetArg(argList[0], XmNsensitive, False);
551N/A XtSetValues(widgets[TIME_OUT_SCL],argList,1);
551N/A }
551N/A
551N/A XtSetArg(argList[0],XmNvalue,&scaleValue);
551N/A XtSetArg(argList[1],XmNdecimalPoints,&decimalPoints);
551N/A XtGetValues(widgets[TIME_OUT_SCL],argList,2);
551N/A desc->ctrls->ax_timeout = 60 * ConvertScaleValueToUnits(scaleValue,
551N/A decimalPoints);
551N/A
551N/A if(desc->ctrls->ax_timeout <= 0) desc->ctrls->ax_timeout = 1;
551N/A /********************************************************************/
551N/A /* */
551N/A /* Keyboard Control: StickyKeys, MouseKeys, ToggleKeys */
551N/A /* */
551N/A /********************************************************************/
551N/A if (XmToggleButtonGadgetGetState(widgets[STICKY_KEYS_TGL]))
551N/A {
551N/A enabled |= XkbStickyKeysMask;
551N/A }
551N/A
551N/A if (XmToggleButtonGadgetGetState(widgets[MOUSE_KEYS_TGL]))
551N/A {
551N/A enabled |= XkbMouseKeysMask;
551N/A }
551N/A
551N/A if (XmToggleButtonGadgetGetState(widgets[TOGGLE_KEYS_TGL]))
551N/A desc->ctrls->ax_options |= XkbAX_IndicatorFBMask;
551N/A
551N/A /********************************************************************/
551N/A /* */
551N/A /* Keyboard Response: RepeatKeys, SlowKeys, BounceKeys */
551N/A /* */
551N/A /********************************************************************/
551N/A if (XmToggleButtonGadgetGetState(widgets[REPEAT_KEYS_TGL]))
551N/A enabled |= XkbRepeatKeysMask;
551N/A
551N/A if (XmToggleButtonGadgetGetState(widgets[SLOW_KEYS_TGL]))
551N/A enabled |= XkbSlowKeysMask;
551N/A
551N/A if (XmToggleButtonGadgetGetState(widgets[BOUNCE_KEYS_TGL]))
551N/A enabled |= XkbBounceKeysMask;
551N/A
551N/A /********************************************************************/
551N/A /* */
551N/A /* StickyKeys Settings: Auto Off, Modifiers Beep */
551N/A /* */
551N/A /********************************************************************/
551N/A if (XmToggleButtonGadgetGetState(widgets[STICKY_TWO_KEYS_TGL]))
551N/A desc->ctrls->ax_options |= XkbAX_TwoKeysMask;
551N/A
551N/A if (XmToggleButtonGadgetGetState(widgets[STICKY_MOD_SOUND_TGL]))
551N/A desc->ctrls->ax_options |= XkbAX_StickyKeysFBMask;
551N/A
551N/A /********************************************************************/
551N/A /* */
551N/A /* MouseKeys Settings: Speed Delay, Max Speed */
551N/A /* */
551N/A /********************************************************************/
551N/A desc->ctrls->mk_interval = 10;
551N/A desc->ctrls->mk_curve = 50;
551N/A
551N/A XtSetArg(argList[0],XmNvalue,&scaleValue);
551N/A XtSetArg(argList[1],XmNdecimalPoints,&decimalPoints);
551N/A XtGetValues(widgets[MOUSE_MAX_SPEED_SCL],argList,2);
551N/A desc->ctrls->mk_max_speed =
551N/A ConvertScaleValueToUnits(scaleValue,decimalPoints);
551N/A if(desc->ctrls->mk_max_speed <=0 ) desc->ctrls->mk_max_speed = 1;
551N/A
551N/A XtSetArg(argList[0],XmNvalue,&scaleValue);
551N/A XtSetArg(argList[1],XmNdecimalPoints,&decimalPoints);
551N/A XtGetValues(widgets[MOUSE_TIME_TO_MAX_SCL],argList,2);
551N/A desc->ctrls->mk_time_to_max =
551N/A SECSTOMILLIS(ConvertScaleValueToUnits(scaleValue,decimalPoints));
551N/A if(desc->ctrls->mk_time_to_max <= 0) desc->ctrls->mk_time_to_max = 1;
551N/A
551N/A XtSetArg(argList[0],XmNvalue,&scaleValue);
551N/A XtSetArg(argList[1],XmNdecimalPoints,&decimalPoints);
551N/A XtGetValues(widgets[MOUSE_DELAY_SCL],argList,2);
551N/A desc->ctrls->mk_delay =
551N/A SECSTOMILLIS(ConvertScaleValueToUnits(scaleValue,decimalPoints));
551N/A if(desc->ctrls->mk_delay <= 0) desc->ctrls->mk_delay = 1;
551N/A
551N/A /********************************************************************/
551N/A /* */
551N/A /* RepeatKeys Settings: Delay, Rate */
551N/A /* */
551N/A /********************************************************************/
551N/A XtSetArg(argList[0],XmNvalue,&scaleValue);
551N/A XtSetArg(argList[1],XmNdecimalPoints,&decimalPoints);
551N/A XtGetValues(widgets[KRG_REPEAT_RATE_SCL],argList,2);
551N/A desc->ctrls->repeat_interval =
551N/A SECSTOMILLIS((float)1.0 / (float)ConvertScaleValueToUnits(scaleValue,decimalPoints));
551N/A if(desc->ctrls->repeat_interval <= 0) desc->ctrls->repeat_interval = 1;
551N/A
551N/A XtSetArg(argList[0],XmNvalue,&scaleValue);
551N/A XtSetArg(argList[1],XmNdecimalPoints,&decimalPoints);
551N/A XtGetValues(widgets[KRG_REPEAT_DELAY_SCL],argList,2);
551N/A desc->ctrls->repeat_delay =
551N/A SECSTOMILLIS(ConvertScaleValueToUnits(scaleValue,decimalPoints));
551N/A if(desc->ctrls->repeat_delay <= 0) desc->ctrls->repeat_delay = 1;
551N/A
551N/A /********************************************************************/
551N/A /* */
551N/A /* SlowKeys Settings: Beep On Press, Beep on Accept, Delay */
551N/A /* */
551N/A /********************************************************************/
551N/A if (XmToggleButtonGadgetGetState(widgets[KRG_PRESS_SOUND_TGL]))
551N/A desc->ctrls->ax_options |= XkbAX_SKPressFBMask;
551N/A
551N/A if (XmToggleButtonGadgetGetState(widgets[KRG_ACCEPT_SOUND_TGL]))
551N/A desc->ctrls->ax_options |= XkbAX_SKAcceptFBMask;
551N/A
551N/A XtSetArg(argList[0],XmNvalue,&scaleValue);
551N/A XtSetArg(argList[1],XmNdecimalPoints,&decimalPoints);
551N/A XtGetValues(widgets[KRG_SLOW_DELAY_SCL],argList,2);
551N/A desc->ctrls->slow_keys_delay =
551N/A SECSTOMILLIS(ConvertScaleValueToUnits(scaleValue,decimalPoints));
551N/A if(desc->ctrls->slow_keys_delay <= 0) desc->ctrls->slow_keys_delay = 1;
551N/A
551N/A /********************************************************************/
551N/A /* */
551N/A /* BounceKeys Settings: Delay */
551N/A /* */
551N/A /********************************************************************/
551N/A XtSetArg(argList[0],XmNvalue,&scaleValue);
551N/A XtSetArg(argList[1],XmNdecimalPoints,&decimalPoints);
551N/A XtGetValues(widgets[KRG_DEBOUNCE_SCL],argList,2);
551N/A desc->ctrls->debounce_delay =
551N/A SECSTOMILLIS(ConvertScaleValueToUnits(scaleValue,decimalPoints));
551N/A if(desc->ctrls->debounce_delay <= 0) desc->ctrls->debounce_delay = 1;
551N/A
551N/A /********************************************************************/
551N/A /* */
551N/A /* Set the values. */
551N/A /* */
551N/A /********************************************************************/
551N/A desc->ctrls->enabled_ctrls &= ~changeEnabled;
551N/A desc->ctrls->enabled_ctrls |= (changeEnabled & enabled);
551N/A XkbSetControls(dpy,which,desc);
551N/A
551N/A UpdateWidgetSensitivity();
551N/A} /* SetStateFromViewXKB */
551N/A
551N/A
551N/A#if NeedFunctionPrototypes
551N/Avoid SetStateFromViewAX(void)
551N/A#else
551N/Avoid SetStateFromViewAX()
551N/A#endif
551N/A{
551N/A int i;
551N/A AccessXStateRec req;
551N/A CARD16 mask;
551N/A
551N/A Arg argList[2];
551N/A int scaleValue;
551N/A short decimalPoints;
551N/A
551N/A mask = SET_CONTROL_MASK;
551N/A req.control = 0;
551N/A
551N/A for (i = TOGGLE_WIDGETS_MIN; i <= TOGGLE_WIDGETS_MAX; i++) {
551N/A if (XmToggleButtonGadgetGetState(widgets[i])) {
551N/A req.control |= toggleWidgetsMask[i];
551N/A }
551N/A }
551N/A
551N/A XtSetArg(argList[0],XmNvalue,&scaleValue);
551N/A XtSetArg(argList[1],XmNdecimalPoints,&decimalPoints);
551N/A XtGetValues(widgets[TIME_OUT_SCL],argList,2);
551N/A
551N/A /* Do a special case for the Time Out toggle */
551N/A req.control |= TIME_OUT_MASK;
551N/A mask |= SET_TIME_OUT_INTERVAL_MASK;
551N/A
551N/A if (XmToggleButtonGadgetGetState(widgets[TIME_OUT_TGL])) {
551N/A /* The scale reads "minutes" and we want to give the extension
551N/A * A timeout value in seconds.
551N/A */
551N/A req.timeOutInterval = 60 *
551N/A ConvertScaleValueToUnits(scaleValue,decimalPoints);
551N/A
551N/A XtSetArg(argList[0], XmNsensitive, True);
551N/A XtSetValues(widgets[TIME_OUT_SCL],argList,1);
551N/A }
551N/A else {
551N/A req.timeOutInterval = 0;
551N/A
551N/A XtSetArg(argList[0], XmNsensitive, False);
551N/A XtSetValues(widgets[TIME_OUT_SCL],argList,1);
551N/A }
551N/A
551N/A /* The only thing we want to do a GetValues on are the scale widgets,
551N/A * so we only need to set the argument list up once.
551N/A */
551N/A XtSetArg(argList[0],XmNvalue,&scaleValue);
551N/A XtSetArg(argList[1],XmNdecimalPoints,&decimalPoints);
551N/A
551N/A /* The scale reads "seconds" and we want to give the extension a
551N/A * value in milliseconds.
551N/A */
551N/A XtGetValues(widgets[KRG_REPEAT_DELAY_SCL],argList,2);
551N/A mask |= SET_REPEAT_DELAY_MASK;
551N/A req.repeatKeysDelay = SECSTOMILLIS(
551N/A ConvertScaleValueToUnits(scaleValue,decimalPoints));
551N/A
551N/A /* The scale reads "keys/second" and we want to give the extension a
551N/A * value in milliseconds/key.
551N/A */
551N/A XtGetValues(widgets[KRG_REPEAT_RATE_SCL],argList,2);
551N/A mask |= SET_REPEAT_RATE_MASK;
551N/A req.repeatKeysRate = SECSTOMILLIS((float)1.0 /
551N/A (float)ConvertScaleValueToUnits(scaleValue, decimalPoints));
551N/A
551N/A /* The scale reads "seconds" and we want to give the extension a
551N/A * value in milliseconds.
551N/A */
551N/A XtGetValues(widgets[KRG_SLOW_DELAY_SCL],argList,2);
551N/A mask |= SET_SLOW_KEYS_DELAY_MASK;
551N/A req.slowKeysDelay = SECSTOMILLIS(
551N/A ConvertScaleValueToUnits(scaleValue, decimalPoints));
551N/A
551N/A /* The scale reads "seconds" and we want to give the extension a
551N/A * value in milliseconds.
551N/A */
551N/A XtGetValues(widgets[KRG_DEBOUNCE_SCL],argList,2);
551N/A mask |= SET_DEBOUNCE_DELAY_MASK;
551N/A req.debounceDelay = SECSTOMILLIS(
551N/A ConvertScaleValueToUnits(scaleValue,decimalPoints));
551N/A
551N/A /* The scale reads "seconds" and we want to give the extension a
551N/A * value in seconds.
551N/A */
551N/A XtGetValues(widgets[MOUSE_TIME_TO_MAX_SCL],argList,2);
551N/A mask |= SET_MOUSE_KEYS_TIME_TO_MAX_MASK;
551N/A req.mouseKeysTimeToMax = ConvertScaleValueToUnits(scaleValue,decimalPoints);
551N/A
551N/A /* The scale reads "pixels/sec" and we want to give the extension a
551N/A * value in milliseconds/pixel.
551N/A */
551N/A XtGetValues(widgets[MOUSE_MAX_SPEED_SCL],argList,2);
551N/A mask |= SET_MOUSE_KEYS_INTERVAL_MASK;
551N/A req.mouseKeysInterval = (int)SECSTOMILLIS(1.0 /
551N/A (float)ConvertScaleValueToUnits(scaleValue, decimalPoints));
551N/A
551N/A XAccessXConfigure(dpy, &accessXClient, mask, &req);
551N/A UpdateWidgetSensitivity();
551N/A
551N/A} /* SetStateFromViewAX */
551N/A
551N/A/************************************************************************/
551N/A/* */
551N/A/* SetDefaults */
551N/A/* */
551N/A/* Sets the state of the extension to the below values */
551N/A/* */
551N/A/************************************************************************/
551N/A#if NeedFunctionPrototypes
551N/Avoid SetDefaults(void)
551N/A#else
551N/Avoid SetDefaults()
551N/A#endif
551N/A{
551N/A if(XKBExtension)
551N/A SetDefaultsXKB();
551N/A else
551N/A SetDefaultsAX();
551N/A} /* SetDefaults */
551N/A
551N/A#if NeedFunctionPrototypes
551N/Avoid SetDefaultsXKB(void)
551N/A#else
551N/Avoid SetDefaultsXKB()
551N/A#endif
551N/A{
551N/A unsigned long which;
551N/A XkbDescRec *desc;
551N/A
551N/A desc = XkbGetMap(dpy,0,XkbUseCoreKbd);
551N/A XkbGetControls(dpy,XkbAllControlsMask,desc);
551N/A
551N/A which = XkbAccessXKeysMask | XkbMouseKeysAccelMask | XkbRepeatKeysMask |
551N/A XkbSlowKeysMask | XkbBounceKeysMask;
551N/A
551N/A desc->ctrls->ax_options |= XkbAX_TwoKeysMask|XkbAX_StickyKeysFBMask|
551N/A XkbAX_SKPressFBMask|XkbAX_SKAcceptFBMask;
551N/A
551N/A desc->ctrls->mk_interval = 10;
551N/A desc->ctrls->mk_curve = 50;
551N/A desc->ctrls->mk_max_speed = 300;
551N/A desc->ctrls->mk_time_to_max = 2000;
551N/A desc->ctrls->mk_delay = 300;
551N/A desc->ctrls->repeat_interval = 40;
551N/A desc->ctrls->repeat_delay = 660;
551N/A desc->ctrls->slow_keys_delay = 300;
551N/A desc->ctrls->debounce_delay = 300;
551N/A XkbSetControls(dpy,which,desc);
551N/A} /* SetDefaultsXKB */
551N/A
551N/A#if NeedFunctionPrototypes
551N/Avoid SetDefaultsAX(void)
551N/A#else
551N/Avoid SetDefaultsAX()
551N/A#endif
551N/A{
551N/A int i;
551N/A short decimalPoints;
551N/A Arg argList[2];
551N/A
551N/A
551N/A /* We don't want to do it for TIME_OUT_TGL, but that's OK */
551N/A for (i = MAIN_TOGGLE_WIDGETS_MIN; i <= MAIN_TOGGLE_WIDGETS_MAX; i++) {
551N/A XmToggleButtonSetState(widgets[i], False, False);
551N/A XtSetArg(argList[0], XmNsensitive, False);
551N/A XtSetValues(widgets[TIME_OUT_SCL],argList,1);
551N/A }
551N/A XmToggleButtonSetState(widgets[ENABLE_ACCESSX_TGL], True, False);
551N/A /*XmToggleButtonSetState(widgets[TIME_OUT_TGL], False, False);*/
551N/A
551N/A
551N/A for (i = SETTINGS_TOGGLE_WIDGETS_MIN; i<=SETTINGS_TOGGLE_WIDGETS_MAX; i++)
551N/A XmToggleButtonSetState(widgets[i], False, False);
551N/A
551N/A /* The scale reads pixels per movement. */
551N/A XtSetArg(argList[0],XmNdecimalPoints,&decimalPoints);
551N/A
551N/A /* The scale reads "seconds" and the extension gives us time in seconds. */
551N/A XtGetValues(widgets[MOUSE_TIME_TO_MAX_SCL],argList,1);
551N/A XmScaleSetValue(widgets[MOUSE_TIME_TO_MAX_SCL], 2);
551N/A
551N/A /* The scale reads "pixels/sec" but the extension gives us time
551N/A in milliseconds/pixel. */
551N/A XtGetValues(widgets[MOUSE_MAX_SPEED_SCL],argList,1);
551N/A XmScaleSetValue(widgets[MOUSE_MAX_SPEED_SCL], 300);
551N/A
551N/A /* The scale reads "seconds" but the extension gives us time
551N/A * in milliseconds. */
551N/A XtGetValues(widgets[KRG_REPEAT_DELAY_SCL],argList,1);
551N/A XmScaleSetValue(widgets[KRG_REPEAT_DELAY_SCL], 6.6);
551N/A
551N/A /* The scale reads "keys/second" but the extension gives us time
551N/A * in milliseconds/key. */
551N/A XtGetValues(widgets[KRG_REPEAT_RATE_SCL],argList,1);
551N/A XmScaleSetValue(widgets[KRG_REPEAT_RATE_SCL], 90);
551N/A
551N/A /* The scale reads "seconds" but the extension gives us time
551N/A * in milliseconds. */
551N/A XtGetValues(widgets[KRG_SLOW_DELAY_SCL],argList,1);
551N/A XmScaleSetValue(widgets[KRG_SLOW_DELAY_SCL], 3);
551N/A
551N/A /* The scale reads "seconds" but the extension gives us time
551N/A * in milliseconds. */
551N/A XtGetValues(widgets[KRG_DEBOUNCE_SCL],argList,1);
551N/A XmScaleSetValue(widgets[KRG_DEBOUNCE_SCL], 3);
551N/A
551N/A SetStateFromView();
551N/A UpdateWidgetSensitivity();
551N/A
551N/A} /* SetDefaultsAX */
551N/A
551N/A/************************************************************************/
551N/A/* */
551N/A/* SetViewFromState */
551N/A/* */
551N/A/* Sets the user interface state from the state of the extension. */
551N/A/* */
551N/A/************************************************************************/
551N/A#if NeedFunctionPrototypes
551N/Avoid SetViewFromState(void)
551N/A#else
551N/Avoid SetViewFromState()
551N/A#endif
551N/A{
551N/A if(XKBExtension)
551N/A SetViewFromStateXKB();
551N/A else
551N/A SetViewFromStateAX();
551N/A}
551N/A
551N/A#if NeedFunctionPrototypes
551N/Avoid SetViewFromStateXKB(void)
551N/A#else
551N/Avoid SetViewFromStateXKB()
551N/A#endif
551N/A{
551N/A XkbDescRec *desc;
551N/A int minimum,maximum,scaleVal;
551N/A short decimalPoints;
551N/A Arg argList[3];
551N/A
551N/A desc = XkbGetMap(dpy,0,XkbUseCoreKbd);
551N/A XkbGetControls(dpy,XkbAllControlsMask,desc);
551N/A
551N/A /********************************************************************/
551N/A /* */
551N/A /* Global values: Enable AccessX, Beep on Feature Use, TimeOut */
551N/A /* */
551N/A /********************************************************************/
551N/A if (desc->ctrls->enabled_ctrls&XkbAccessXKeysMask)
551N/A XmToggleButtonSetState(widgets[ENABLE_ACCESSX_TGL], True, False);
551N/A else
551N/A XmToggleButtonSetState(widgets[ENABLE_ACCESSX_TGL], False, False);
551N/A
551N/A if (XkbAX_NeedFeedback(desc->ctrls,XkbAX_FeatureFBMask))
551N/A XmToggleButtonSetState(widgets[ONOFF_SOUND_TGL], True, False);
551N/A else
551N/A XmToggleButtonSetState(widgets[ONOFF_SOUND_TGL], False, False);
551N/A
551N/A if (desc->ctrls->enabled_ctrls&XkbAccessXTimeoutMask)
551N/A {
551N/A XtSetArg(argList[0], XmNsensitive, True);
551N/A XtSetValues(widgets[TIME_OUT_SCL],argList,1);
551N/A XmToggleButtonSetState(widgets[TIME_OUT_TGL], True, False);
551N/A }
551N/A else
551N/A {
551N/A XtSetArg(argList[0], XmNsensitive, False);
551N/A XtSetValues(widgets[TIME_OUT_SCL],argList,1);
551N/A XmToggleButtonSetState(widgets[TIME_OUT_TGL], False, False);
551N/A }
551N/A
551N/A XtSetArg(argList[0], XmNdecimalPoints,&decimalPoints);
551N/A XtSetArg(argList[1], XmNminimum, &minimum);
551N/A XtSetArg(argList[2], XmNmaximum, &maximum);
551N/A XtGetValues(widgets[TIME_OUT_SCL],argList,3);
551N/A scaleVal = ConvertUnitsToScaleValue(desc->ctrls->ax_timeout/60,
551N/A decimalPoints);
551N/A
551N/A if (scaleVal > maximum)
551N/A {
551N/A XtSetArg(argList[0], XmNmaximum, scaleVal);
551N/A XtSetValues(widgets[TIME_OUT_SCL],argList,1);
551N/A }
551N/A else if (scaleVal < minimum)
551N/A {
551N/A XtSetArg(argList[0], XmNminimum, scaleVal);
551N/A XtSetValues(widgets[TIME_OUT_SCL],argList,1);
551N/A }
551N/A XmScaleSetValue(widgets[TIME_OUT_SCL],scaleVal);
551N/A
551N/A /********************************************************************/
551N/A /* */
551N/A /* Keyboard Control: StickyKeys, MouseKeys, ToggleKeys */
551N/A /* */
551N/A /********************************************************************/
551N/A if (desc->ctrls->enabled_ctrls&XkbStickyKeysMask)
551N/A XmToggleButtonSetState(widgets[STICKY_KEYS_TGL], True, False);
551N/A else
551N/A XmToggleButtonSetState(widgets[STICKY_KEYS_TGL], False, False);
551N/A
551N/A if (desc->ctrls->enabled_ctrls&XkbMouseKeysMask)
551N/A XmToggleButtonSetState(widgets[MOUSE_KEYS_TGL], True, False);
551N/A else
551N/A XmToggleButtonSetState(widgets[MOUSE_KEYS_TGL], False, False);
551N/A
551N/A if (XkbAX_NeedFeedback(desc->ctrls,XkbAX_IndicatorFBMask))
551N/A XmToggleButtonSetState(widgets[TOGGLE_KEYS_TGL], True, False);
551N/A else
551N/A XmToggleButtonSetState(widgets[TOGGLE_KEYS_TGL], False, False);
551N/A
551N/A /********************************************************************/
551N/A /* */
551N/A /* Keyboard Response: RepeatKeys, SlowKeys, BounceKeys */
551N/A /* */
551N/A /********************************************************************/
551N/A if (desc->ctrls->enabled_ctrls&XkbRepeatKeysMask)
551N/A XmToggleButtonSetState(widgets[REPEAT_KEYS_TGL], True, False);
551N/A else
551N/A XmToggleButtonSetState(widgets[REPEAT_KEYS_TGL], False, False);
551N/A
551N/A if (desc->ctrls->enabled_ctrls&XkbSlowKeysMask)
551N/A XmToggleButtonSetState(widgets[SLOW_KEYS_TGL], True, False);
551N/A else
551N/A XmToggleButtonSetState(widgets[SLOW_KEYS_TGL], False, False);
551N/A
551N/A if (desc->ctrls->enabled_ctrls&XkbBounceKeysMask)
551N/A XmToggleButtonSetState(widgets[BOUNCE_KEYS_TGL], True, False);
551N/A else
551N/A XmToggleButtonSetState(widgets[BOUNCE_KEYS_TGL], False, False);
551N/A
551N/A /********************************************************************/
551N/A /* */
551N/A /* StickyKeys Settings: Auto Off, Modifiers Beep */
551N/A /* */
551N/A /********************************************************************/
551N/A if (XkbAX_NeedOption(desc->ctrls,XkbAX_TwoKeysMask))
551N/A XmToggleButtonSetState(widgets[STICKY_TWO_KEYS_TGL], True, False);
551N/A else
551N/A XmToggleButtonSetState(widgets[STICKY_TWO_KEYS_TGL], False, False);
551N/A
551N/A if (XkbAX_NeedFeedback(desc->ctrls,XkbAX_StickyKeysFBMask))
551N/A XmToggleButtonSetState(widgets[STICKY_MOD_SOUND_TGL], True, False);
551N/A else
551N/A XmToggleButtonSetState(widgets[STICKY_MOD_SOUND_TGL], False, False);
551N/A
551N/A /********************************************************************/
551N/A /* */
551N/A /* MouseKeys Settings: Max Speed, Acceleration, Delay */
551N/A /* */
551N/A /********************************************************************/
551N/A XtSetArg(argList[0], XmNdecimalPoints,&decimalPoints);
551N/A XtSetArg(argList[1], XmNminimum, &minimum);
551N/A XtSetArg(argList[2], XmNmaximum, &maximum);
551N/A XtGetValues(widgets[MOUSE_MAX_SPEED_SCL],argList,3);
551N/A scaleVal = ConvertUnitsToScaleValue(desc->ctrls->mk_max_speed,
551N/A decimalPoints);
551N/A
551N/A if (scaleVal > maximum)
551N/A {
551N/A XtSetArg(argList[0], XmNmaximum, scaleVal);
551N/A XtSetValues(widgets[MOUSE_MAX_SPEED_SCL],argList,1);
551N/A }
551N/A else if (scaleVal < minimum)
551N/A {
551N/A XtSetArg(argList[0], XmNminimum, scaleVal);
551N/A XtSetValues(widgets[MOUSE_MAX_SPEED_SCL],argList,1);
551N/A }
551N/A XmScaleSetValue(widgets[MOUSE_MAX_SPEED_SCL],scaleVal);
551N/A
551N/A XtSetArg(argList[0], XmNdecimalPoints,&decimalPoints);
551N/A XtSetArg(argList[1], XmNminimum, &minimum);
551N/A XtSetArg(argList[2], XmNmaximum, &maximum);
551N/A XtGetValues(widgets[MOUSE_TIME_TO_MAX_SCL],argList,3);
551N/A scaleVal = ConvertUnitsToScaleValue(MILLISTOSECS(desc->ctrls->mk_time_to_max),
551N/A decimalPoints);
551N/A
551N/A if (scaleVal > maximum)
551N/A {
551N/A XtSetArg(argList[0], XmNmaximum, scaleVal);
551N/A XtSetValues(widgets[MOUSE_TIME_TO_MAX_SCL],argList,1);
551N/A }
551N/A else if (scaleVal < minimum)
551N/A {
551N/A XtSetArg(argList[0], XmNminimum, scaleVal);
551N/A XtSetValues(widgets[MOUSE_TIME_TO_MAX_SCL],argList,1);
551N/A }
551N/A XmScaleSetValue(widgets[MOUSE_TIME_TO_MAX_SCL],scaleVal);
551N/A
551N/A XtSetArg(argList[0], XmNdecimalPoints,&decimalPoints);
551N/A XtSetArg(argList[1], XmNminimum, &minimum);
551N/A XtSetArg(argList[2], XmNmaximum, &maximum);
551N/A XtGetValues(widgets[MOUSE_DELAY_SCL],argList,3);
551N/A scaleVal = ConvertUnitsToScaleValue(MILLISTOSECS(desc->ctrls->mk_delay),
551N/A decimalPoints);
551N/A
551N/A if (scaleVal > maximum)
551N/A {
551N/A XtSetArg(argList[0], XmNmaximum, scaleVal);
551N/A XtSetValues(widgets[MOUSE_DELAY_SCL],argList,1);
551N/A }
551N/A else if (scaleVal < minimum)
551N/A {
551N/A XtSetArg(argList[0], XmNminimum, scaleVal);
551N/A XtSetValues(widgets[MOUSE_DELAY_SCL],argList,1);
551N/A }
551N/A XmScaleSetValue(widgets[MOUSE_DELAY_SCL],scaleVal);
551N/A
551N/A /********************************************************************/
551N/A /* */
551N/A /* RepeatKeys Settings: Delay, Rate */
551N/A /* */
551N/A /********************************************************************/
551N/A XtSetArg(argList[0], XmNdecimalPoints,&decimalPoints);
551N/A XtSetArg(argList[1], XmNminimum, &minimum);
551N/A XtSetArg(argList[2], XmNmaximum, &maximum);
551N/A XtGetValues(widgets[KRG_REPEAT_RATE_SCL],argList,3);
551N/A scaleVal = ConvertUnitsToScaleValue(((float)1.0 / (float)MILLISTOSECS(desc->ctrls->repeat_interval)),
551N/A decimalPoints);
551N/A
551N/A if (scaleVal > maximum)
551N/A {
551N/A XtSetArg(argList[0], XmNmaximum, scaleVal);
551N/A XtSetValues(widgets[KRG_REPEAT_RATE_SCL],argList,1);
551N/A }
551N/A else if (scaleVal < minimum)
551N/A {
551N/A XtSetArg(argList[0], XmNminimum, scaleVal);
551N/A XtSetValues(widgets[KRG_REPEAT_RATE_SCL],argList,1);
551N/A }
551N/A XmScaleSetValue(widgets[KRG_REPEAT_RATE_SCL],scaleVal);
551N/A
551N/A XtSetArg(argList[0], XmNdecimalPoints,&decimalPoints);
551N/A XtSetArg(argList[1], XmNminimum, &minimum);
551N/A XtSetArg(argList[2], XmNmaximum, &maximum);
551N/A XtGetValues(widgets[KRG_REPEAT_DELAY_SCL],argList,3);
551N/A scaleVal = ConvertUnitsToScaleValue(MILLISTOSECS(desc->ctrls->repeat_delay),
551N/A decimalPoints);
551N/A
551N/A if (scaleVal > maximum)
551N/A {
551N/A XtSetArg(argList[0], XmNmaximum, scaleVal);
551N/A XtSetValues(widgets[KRG_REPEAT_DELAY_SCL],argList,1);
551N/A }
551N/A else if (scaleVal < minimum)
551N/A {
551N/A XtSetArg(argList[0], XmNminimum, scaleVal);
551N/A XtSetValues(widgets[KRG_REPEAT_DELAY_SCL],argList,1);
551N/A }
551N/A XmScaleSetValue(widgets[KRG_REPEAT_DELAY_SCL],scaleVal);
551N/A
551N/A /********************************************************************/
551N/A /* */
551N/A /* SlowKeys Settings: Beep On Press, Beep on Accept, Delay */
551N/A /* */
551N/A /********************************************************************/
551N/A if (XkbAX_NeedFeedback(desc->ctrls,XkbAX_SKPressFBMask))
551N/A XmToggleButtonSetState(widgets[KRG_PRESS_SOUND_TGL], True, False);
551N/A else
551N/A XmToggleButtonSetState(widgets[KRG_PRESS_SOUND_TGL], False, False);
551N/A
551N/A if (XkbAX_NeedFeedback(desc->ctrls,XkbAX_SKAcceptFBMask))
551N/A XmToggleButtonSetState(widgets[KRG_ACCEPT_SOUND_TGL], True, False);
551N/A else
551N/A XmToggleButtonSetState(widgets[KRG_ACCEPT_SOUND_TGL], False, False);
551N/A
551N/A XtSetArg(argList[0], XmNdecimalPoints,&decimalPoints);
551N/A XtSetArg(argList[1], XmNminimum, &minimum);
551N/A XtSetArg(argList[2], XmNmaximum, &maximum);
551N/A XtGetValues(widgets[KRG_SLOW_DELAY_SCL],argList,3);
551N/A scaleVal = ConvertUnitsToScaleValue(MILLISTOSECS(desc->ctrls->slow_keys_delay),
551N/A decimalPoints);
551N/A
551N/A if (scaleVal > maximum)
551N/A {
551N/A XtSetArg(argList[0], XmNmaximum, scaleVal);
551N/A XtSetValues(widgets[KRG_SLOW_DELAY_SCL],argList,1);
551N/A }
551N/A else if (scaleVal < minimum)
551N/A {
551N/A XtSetArg(argList[0], XmNminimum, scaleVal);
551N/A XtSetValues(widgets[KRG_SLOW_DELAY_SCL],argList,1);
551N/A }
551N/A XmScaleSetValue(widgets[KRG_SLOW_DELAY_SCL],scaleVal);
551N/A
551N/A /********************************************************************/
551N/A /* */
551N/A /* BounceKeys Settings: Delay */
551N/A /* */
551N/A /********************************************************************/
551N/A XtSetArg(argList[0], XmNdecimalPoints,&decimalPoints);
551N/A XtSetArg(argList[1], XmNminimum, &minimum);
551N/A XtSetArg(argList[2], XmNmaximum, &maximum);
551N/A XtGetValues(widgets[KRG_DEBOUNCE_SCL],argList,3);
551N/A scaleVal = ConvertUnitsToScaleValue(MILLISTOSECS(desc->ctrls->debounce_delay),
551N/A decimalPoints);
551N/A
551N/A if (scaleVal > maximum)
551N/A {
551N/A XtSetArg(argList[0], XmNmaximum, scaleVal);
551N/A XtSetValues(widgets[KRG_DEBOUNCE_SCL],argList,1);
551N/A }
551N/A else if (scaleVal < minimum)
551N/A {
551N/A XtSetArg(argList[0], XmNminimum, scaleVal);
551N/A XtSetValues(widgets[KRG_DEBOUNCE_SCL],argList,1);
551N/A }
551N/A XmScaleSetValue(widgets[KRG_DEBOUNCE_SCL],scaleVal);
551N/A
551N/A UpdateWidgetSensitivity();
551N/A}
551N/A
551N/A#if NeedFunctionPrototypes
551N/Avoid SetViewFromStateAX(void)
551N/A#else
551N/Avoid SetViewFromStateAX()
551N/A#endif
551N/A{
551N/A int i, minimum;
551N/A short decimalPoints;
551N/A Arg argList[2];
551N/A AccessXStateRec state;
551N/A
551N/A XAccessXQueryState(dpy, &accessXClient, &state);
551N/A
551N/A /* We don't want to do it for TIME_OUT_TGL, but that's OK */
551N/A for (i = MAIN_TOGGLE_WIDGETS_MIN; i <= MAIN_TOGGLE_WIDGETS_MAX; i++) {
551N/A if (state.control & toggleWidgetsMask[i]) {
551N/A XmToggleButtonSetState(widgets[i], True, False);
551N/A XtSetArg(argList[0], XmNsensitive, True);
551N/A XtSetValues(widgets[TIME_OUT_SCL],argList,1);
551N/A }
551N/A else {
551N/A XmToggleButtonSetState(widgets[i], False, False);
551N/A XtSetArg(argList[0], XmNsensitive, False);
551N/A XtSetValues(widgets[TIME_OUT_SCL],argList,1);
551N/A }
551N/A }
551N/A
551N/A /* The scale reads "minutes" but the extension gives us time
551N/A * in seconds.
551N/A */
551N/A XtSetArg(argList[0],XmNdecimalPoints,&decimalPoints);
551N/A XtGetValues(widgets[TIME_OUT_SCL],argList,1);
551N/A if (state.timeOutInterval) {
551N/A XmScaleSetValue(widgets[TIME_OUT_SCL],
551N/A ConvertUnitsToScaleValue(state.timeOutInterval / 60, decimalPoints));
551N/A XmToggleButtonSetState(widgets[TIME_OUT_TGL], True, False);
551N/A }
551N/A else {
551N/A XtSetArg(argList[0], XmNminimum, &minimum);
551N/A XtGetValues(widgets[TIME_OUT_SCL], argList, 1);
551N/A XmScaleSetValue(widgets[TIME_OUT_SCL], minimum);
551N/A XmToggleButtonSetState(widgets[TIME_OUT_TGL], False, False);
551N/A }
551N/A
551N/A SetSettingsViewFromState(state);
551N/A UpdateWidgetSensitivity();
551N/A
551N/A} /* SetViewFromState */
551N/A
551N/A/************************************************************************/
551N/A/* */
551N/A/* SetSettingsViewFromState */
551N/A/* */
551N/A/************************************************************************/
551N/A#if NeedFunctionPrototypes
551N/Avoid SetSettingsViewFromState(AccessXStateRec state)
551N/A#else
551N/Avoid SetSettingsViewFromState(state)
551N/A AccessXStateRec state;
551N/A#endif
551N/A{
551N/A int i;
551N/A Arg argList[2];
551N/A short decimalPoints;
551N/A
551N/A for (i = SETTINGS_TOGGLE_WIDGETS_MIN; i<=SETTINGS_TOGGLE_WIDGETS_MAX; i++) {
551N/A if (state.control & toggleWidgetsMask[i]) {
551N/A XmToggleButtonSetState(widgets[i], True, False);
551N/A }
551N/A else {
551N/A XmToggleButtonSetState(widgets[i], False, False);
551N/A }
551N/A }
551N/A
551N/A /* The scale reads pixels per movement. */
551N/A XtSetArg(argList[0],XmNdecimalPoints,&decimalPoints);
551N/A
551N/A /* The scale reads "seconds" and the extension gives us time in seconds. */
551N/A XtGetValues(widgets[MOUSE_TIME_TO_MAX_SCL],argList,1);
551N/A XmScaleSetValue(widgets[MOUSE_TIME_TO_MAX_SCL],
551N/A ConvertUnitsToScaleValue(state.mouseKeysTimeToMax, decimalPoints));
551N/A
551N/A /* The scale reads "pixels/sec" but the extension gives us time
551N/A in milliseconds/pixel. */
551N/A XtGetValues(widgets[MOUSE_MAX_SPEED_SCL],argList,1);
551N/A XmScaleSetValue(widgets[MOUSE_MAX_SPEED_SCL],
551N/A ConvertUnitsToScaleValue((float)(1.0 /
551N/A (float)MILLISTOSECS(state.mouseKeysInterval)), decimalPoints));
551N/A
551N/A /* The scale reads "seconds" but the extension gives us time
551N/A * in milliseconds. */
551N/A XtSetArg(argList[0],XmNdecimalPoints,&decimalPoints);
551N/A XtGetValues(widgets[KRG_REPEAT_DELAY_SCL],argList,1);
551N/A XmScaleSetValue(widgets[KRG_REPEAT_DELAY_SCL],
551N/A ConvertUnitsToScaleValue(MILLISTOSECS(state.repeatKeysDelay),decimalPoints));
551N/A
551N/A /* The scale reads "keys/second" but the extension gives us time
551N/A * in milliseconds/key. */
551N/A XtGetValues(widgets[KRG_REPEAT_RATE_SCL],argList,1);
551N/A XmScaleSetValue(widgets[KRG_REPEAT_RATE_SCL], ConvertUnitsToScaleValue(
551N/A ((float)1.0 /
551N/A (float)MILLISTOSECS(state.repeatKeysRate)), decimalPoints));
551N/A
551N/A /* The scale reads "seconds" but the extension gives us time
551N/A * in milliseconds. */
551N/A XtGetValues(widgets[KRG_SLOW_DELAY_SCL],argList,1);
551N/A XmScaleSetValue(widgets[KRG_SLOW_DELAY_SCL],
551N/A ConvertUnitsToScaleValue(MILLISTOSECS(state.slowKeysDelay),decimalPoints));
551N/A
551N/A /* The scale reads "seconds" but the extension gives us time
551N/A * in milliseconds. */
551N/A XtGetValues(widgets[KRG_DEBOUNCE_SCL],argList,1);
551N/A XmScaleSetValue(widgets[KRG_DEBOUNCE_SCL],
551N/A ConvertUnitsToScaleValue(MILLISTOSECS(state.debounceDelay),decimalPoints));
551N/A}
551N/A
551N/A/************************************************************************/
551N/A/* */
551N/A/* SetStickyStatusViewFromState */
551N/A/* */
551N/A/************************************************************************/
551N/A#if NeedFunctionPrototypes
551N/Avoid SetStickyStatusViewFromState(void)
551N/A#else
551N/Avoid SetStickyStatusViewFromState()
551N/A#endif
551N/A{
551N/A if(XKBExtension)
551N/A SetStickyStatusViewFromStateXKB();
551N/A else
551N/A SetStickyStatusViewFromStateAX();
551N/A}/* SetStickyStatusViewFromState */
551N/A
551N/A#if NeedFunctionPrototypes
551N/Avoid SetStickyStatusViewFromStateXKB(void)
551N/A#else
551N/Avoid SetStickyStatusViewFromStateXKB()
551N/A#endif
551N/A{
551N/A XkbStateRec state;
551N/A XkbDescRec *desc;
551N/A Arg argList[2];
551N/A
551N/A
551N/A desc = XkbGetMap(dpy,0,XkbUseCoreKbd);
551N/A XkbGetControls(dpy,XkbAllControlsMask,desc);
551N/A XkbGetState(dpy,XkbUseCoreKbd,&state);
551N/A
551N/A /* Emtpy all mod settings first */
551N/A XtSetArg(argList[0],XmNlabelString,shiftEmptyString);
551N/A XtSetValues(widgets[SHIFT_LATCHED_LBL],argList,1);
551N/A XtSetValues(widgets[SHIFT_LOCKED_LBL],argList,1);
551N/A
551N/A XtSetArg(argList[0],XmNlabelString,controlEmptyString);
551N/A XtSetValues(widgets[CONTROL_LATCHED_LBL],argList,1);
551N/A XtSetValues(widgets[CONTROL_LOCKED_LBL],argList,1);
551N/A
551N/A XtSetArg(argList[0],XmNlabelString,mod1EmptyString);
551N/A XtSetValues(widgets[MOD1_LATCHED_LBL],argList,1);
551N/A XtSetValues(widgets[MOD1_LOCKED_LBL],argList,1);
551N/A
551N/A XtSetArg(argList[0],XmNlabelString,mod2EmptyString);
551N/A XtSetValues(widgets[MOD2_LATCHED_LBL],argList,1);
551N/A XtSetValues(widgets[MOD2_LOCKED_LBL],argList,1);
551N/A
551N/A XtSetArg(argList[0],XmNlabelString,mod3EmptyString);
551N/A XtSetValues(widgets[MOD3_LATCHED_LBL],argList,1);
551N/A XtSetValues(widgets[MOD3_LOCKED_LBL],argList,1);
551N/A
551N/A XtSetArg(argList[0],XmNlabelString,mod4EmptyString);
551N/A XtSetValues(widgets[MOD4_LATCHED_LBL],argList,1);
551N/A XtSetValues(widgets[MOD4_LOCKED_LBL],argList,1);
551N/A
551N/A XtSetArg(argList[0],XmNlabelString,mod5EmptyString);
551N/A XtSetValues(widgets[MOD5_LATCHED_LBL],argList,1);
551N/A XtSetValues(widgets[MOD5_LOCKED_LBL],argList,1);
551N/A
551N/A /* Now set all the mods */
551N/A if (state.latched_mods & ShiftMask) {
551N/A XtSetArg(argList[0],XmNlabelString,shiftString);
551N/A XtSetValues(widgets[SHIFT_LATCHED_LBL],argList,1);
551N/A } else if (state.locked_mods & ShiftMask) {
551N/A XtSetArg(argList[0],XmNlabelString,shiftString);
551N/A XtSetValues(widgets[SHIFT_LOCKED_LBL],argList,1);
551N/A }
551N/A
551N/A if (state.latched_mods & ControlMask) {
551N/A XtSetArg(argList[0],XmNlabelString,controlString);
551N/A XtSetValues(widgets[CONTROL_LATCHED_LBL],argList,1);
551N/A }
551N/A else if (state.locked_mods & ControlMask) {
551N/A XtSetArg(argList[0],XmNlabelString,controlString);
551N/A XtSetValues(widgets[CONTROL_LOCKED_LBL],argList,1);
551N/A }
551N/A
551N/A if (state.latched_mods & Mod1Mask) {
551N/A XtSetArg(argList[0],XmNlabelString,mod1String);
551N/A XtSetValues(widgets[MOD1_LATCHED_LBL],argList,1);
551N/A }
551N/A else if (state.locked_mods & Mod1Mask) {
551N/A XtSetArg(argList[0],XmNlabelString,mod1String);
551N/A XtSetValues(widgets[MOD1_LOCKED_LBL],argList,1);
551N/A }
551N/A
551N/A if (state.latched_mods & Mod2Mask) {
551N/A XtSetArg(argList[0],XmNlabelString,mod2String);
551N/A XtSetValues(widgets[MOD2_LATCHED_LBL],argList,1);
551N/A }
551N/A else if (state.locked_mods & Mod2Mask) {
551N/A XtSetArg(argList[0],XmNlabelString,mod2String);
551N/A XtSetValues(widgets[MOD2_LOCKED_LBL],argList,1);
551N/A }
551N/A
551N/A if (state.latched_mods & Mod3Mask) {
551N/A XtSetArg(argList[0],XmNlabelString,mod3String);
551N/A XtSetValues(widgets[MOD3_LATCHED_LBL],argList,1);
551N/A }
551N/A else if (state.locked_mods & Mod3Mask) {
551N/A XtSetArg(argList[0],XmNlabelString,mod3String);
551N/A XtSetValues(widgets[MOD3_LOCKED_LBL],argList,1);
551N/A }
551N/A
551N/A if (state.latched_mods & Mod4Mask) {
551N/A XtSetArg(argList[0],XmNlabelString,mod4String);
551N/A XtSetValues(widgets[MOD4_LATCHED_LBL],argList,1);
551N/A }
551N/A else if (state.locked_mods & Mod4Mask) {
551N/A XtSetArg(argList[0],XmNlabelString,mod4String);
551N/A XtSetValues(widgets[MOD4_LOCKED_LBL],argList,1);
551N/A }
551N/A
551N/A if (state.latched_mods & Mod5Mask) {
551N/A XtSetArg(argList[0],XmNlabelString,mod5String);
551N/A XtSetValues(widgets[MOD5_LATCHED_LBL],argList,1);
551N/A }
551N/A else if (state.locked_mods & Mod5Mask) {
551N/A XtSetArg(argList[0],XmNlabelString,mod5String);
551N/A XtSetValues(widgets[MOD5_LOCKED_LBL],argList,1);
551N/A }
551N/A
551N/A}/* SetStickyStatusViewFromStateXKB */
551N/A
551N/A#if NeedFunctionPrototypes
551N/Avoid SetStickyStatusViewFromStateAX(void)
551N/A#else
551N/Avoid SetStickyStatusViewFromStateAX()
551N/A#endif
551N/A{
551N/A Arg argList[2];
551N/A AccessXStateRec state;
551N/A
551N/A XAccessXQueryState(dpy, &accessXClient, &state);
551N/A
551N/A if (state.latchedModifiers & ShiftMask) {
551N/A XtSetArg(argList[0],XmNlabelString,shiftString);
551N/A XtSetValues(widgets[SHIFT_LATCHED_LBL],argList,1);
551N/A }
551N/A else {
551N/A XtSetArg(argList[0],XmNlabelString,shiftEmptyString);
551N/A XtSetValues(widgets[SHIFT_LATCHED_LBL],argList,1);
551N/A }
551N/A
551N/A if (state.lockedModifiers & ShiftMask) {
551N/A XtSetArg(argList[0],XmNlabelString,shiftString);
551N/A XtSetValues(widgets[SHIFT_LOCKED_LBL],argList,1);
551N/A }
551N/A else {
551N/A XtSetArg(argList[0],XmNlabelString,shiftEmptyString);
551N/A XtSetValues(widgets[SHIFT_LOCKED_LBL],argList,1);
551N/A }
551N/A
551N/A if (state.latchedModifiers & ControlMask) {
551N/A XtSetArg(argList[0],XmNlabelString,controlString);
551N/A XtSetValues(widgets[CONTROL_LATCHED_LBL],argList,1);
551N/A }
551N/A else {
551N/A XtSetArg(argList[0],XmNlabelString,controlEmptyString);
551N/A XtSetValues(widgets[CONTROL_LATCHED_LBL],argList,1);
551N/A }
551N/A
551N/A if (state.lockedModifiers & ControlMask) {
551N/A XtSetArg(argList[0],XmNlabelString,controlString);
551N/A XtSetValues(widgets[CONTROL_LOCKED_LBL],argList,1);
551N/A }
551N/A else {
551N/A XtSetArg(argList[0],XmNlabelString,controlEmptyString);
551N/A XtSetValues(widgets[CONTROL_LOCKED_LBL],argList,1);
551N/A }
551N/A
551N/A if (state.latchedModifiers & Mod1Mask) {
551N/A XtSetArg(argList[0],XmNlabelString,mod1String);
551N/A XtSetValues(widgets[MOD1_LATCHED_LBL],argList,1);
551N/A }
551N/A else {
551N/A XtSetArg(argList[0],XmNlabelString,mod1EmptyString);
551N/A XtSetValues(widgets[MOD1_LATCHED_LBL],argList,1);
551N/A }
551N/A
551N/A if (state.lockedModifiers & Mod1Mask) {
551N/A XtSetArg(argList[0],XmNlabelString,mod1String);
551N/A XtSetValues(widgets[MOD1_LOCKED_LBL],argList,1);
551N/A }
551N/A else {
551N/A XtSetArg(argList[0],XmNlabelString,mod1EmptyString);
551N/A XtSetValues(widgets[MOD1_LOCKED_LBL],argList,1);
551N/A }
551N/A
551N/A if (state.latchedModifiers & Mod2Mask) {
551N/A XtSetArg(argList[0],XmNlabelString,mod2String);
551N/A XtSetValues(widgets[MOD2_LATCHED_LBL],argList,1);
551N/A }
551N/A else {
551N/A XtSetArg(argList[0],XmNlabelString,mod2EmptyString);
551N/A XtSetValues(widgets[MOD2_LATCHED_LBL],argList,1);
551N/A }
551N/A
551N/A if (state.lockedModifiers & Mod2Mask) {
551N/A XtSetArg(argList[0],XmNlabelString,mod2String);
551N/A XtSetValues(widgets[MOD2_LOCKED_LBL],argList,1);
551N/A }
551N/A else {
551N/A XtSetArg(argList[0],XmNlabelString,mod2EmptyString);
551N/A XtSetValues(widgets[MOD2_LOCKED_LBL],argList,1);
551N/A }
551N/A
551N/A if (state.latchedModifiers & Mod3Mask) {
551N/A XtSetArg(argList[0],XmNlabelString,mod3String);
551N/A XtSetValues(widgets[MOD3_LATCHED_LBL],argList,1);
551N/A }
551N/A else {
551N/A XtSetArg(argList[0],XmNlabelString,mod3EmptyString);
551N/A XtSetValues(widgets[MOD3_LATCHED_LBL],argList,1);
551N/A }
551N/A
551N/A if (state.lockedModifiers & Mod3Mask) {
551N/A XtSetArg(argList[0],XmNlabelString,mod3String);
551N/A XtSetValues(widgets[MOD3_LOCKED_LBL],argList,1);
551N/A }
551N/A else {
551N/A XtSetArg(argList[0],XmNlabelString,mod3EmptyString);
551N/A XtSetValues(widgets[MOD3_LOCKED_LBL],argList,1);
551N/A }
551N/A
551N/A if (state.latchedModifiers & Mod4Mask) {
551N/A XtSetArg(argList[0],XmNlabelString,mod4String);
551N/A XtSetValues(widgets[MOD4_LATCHED_LBL],argList,1);
551N/A }
551N/A else {
551N/A XtSetArg(argList[0],XmNlabelString,mod4EmptyString);
551N/A XtSetValues(widgets[MOD4_LATCHED_LBL],argList,1);
551N/A }
551N/A
551N/A if (state.lockedModifiers & Mod4Mask) {
551N/A XtSetArg(argList[0],XmNlabelString,mod4String);
551N/A XtSetValues(widgets[MOD4_LOCKED_LBL],argList,1);
551N/A }
551N/A else {
551N/A XtSetArg(argList[0],XmNlabelString,mod4EmptyString);
551N/A XtSetValues(widgets[MOD4_LOCKED_LBL],argList,1);
551N/A }
551N/A
551N/A if (state.latchedModifiers & Mod5Mask) {
551N/A XtSetArg(argList[0],XmNlabelString,mod5String);
551N/A XtSetValues(widgets[MOD5_LATCHED_LBL],argList,1);
551N/A }
551N/A else {
551N/A XtSetArg(argList[0],XmNlabelString,mod5EmptyString);
551N/A XtSetValues(widgets[MOD5_LATCHED_LBL],argList,1);
551N/A }
551N/A
551N/A if (state.lockedModifiers & Mod5Mask) {
551N/A XtSetArg(argList[0],XmNlabelString,mod5String);
551N/A XtSetValues(widgets[MOD5_LOCKED_LBL],argList,1);
551N/A }
551N/A else {
551N/A XtSetArg(argList[0],XmNlabelString,mod5EmptyString);
551N/A XtSetValues(widgets[MOD5_LOCKED_LBL],argList,1);
551N/A }
551N/A} /* SetStickyStatusViewFromStateAX */
551N/A
551N/A/************************************************************************/
551N/A/* */
551N/A/* SetMouseStatusViewFromState */
551N/A/* */
551N/A/************************************************************************/
551N/A#if NeedFunctionPrototypes
551N/Avoid SetMouseStatusViewFromState(void)
551N/A#else
551N/Avoid SetMouseStatusViewFromState()
551N/A#endif
551N/A{
551N/A if(XKBExtension)
551N/A SetMouseStatusViewFromStateXKB();
551N/A else
551N/A SetMouseStatusViewFromStateAX();
551N/A} /* SetMouseStatusViewFromState */
551N/A
551N/A#if NeedFunctionPrototypes
551N/Avoid SetMouseStatusViewFromStateXKB(void)
551N/A#else
551N/Avoid SetMouseStatusViewFromStateXKB()
551N/A#endif
551N/A{
551N/A Window rootWindow,childWindow;
551N/A int rootX,rootY,windowX,windowY;
551N/A unsigned long mask;
551N/A XkbStateRec state;
551N/A XkbDescRec *desc;
551N/A Arg argList[2];
551N/A XmString currentButtonString = NULL;
551N/A
551N/A desc = XkbGetMap(dpy,0,XkbUseCoreKbd);
551N/A XkbGetControls(dpy,XkbAllControlsMask,desc);
551N/A XkbGetState(dpy,XkbUseCoreKbd,&state);
551N/A
551N/A switch (desc->ctrls->mk_dflt_btn) {
551N/A case 1:
551N/A currentButtonString = mb1String;
551N/A break;
551N/A case 2:
551N/A currentButtonString = mb2String;
551N/A break;
551N/A case 3:
551N/A currentButtonString = mb3String;
551N/A break;
551N/A case 4:
551N/A currentButtonString = mb4String;
551N/A break;
551N/A case 5:
551N/A currentButtonString = mb5String;
551N/A break;
551N/A }
551N/A if (currentButtonString != NULL) {
551N/A XtSetArg(argList[0], XmNlabelString, currentButtonString);
551N/A XtSetValues(widgets[CURRENT_BUTTON_LBL], argList, 1);
551N/A }
551N/A
551N/A XQueryPointer(dpy,
551N/A XDefaultRootWindow(dpy),
551N/A &rootWindow,
551N/A &childWindow,
551N/A &rootX,&rootY,
551N/A &windowX,&windowY,
551N/A (unsigned int*)&mask);
551N/A
551N/A if (mask & Button1Mask) {
551N/A XtSetArg(argList[0], XmNlabelString, mb1String);
551N/A XtSetValues(widgets[MB1_PRESSED_LBL], argList, 1);
551N/A XtSetArg(argList[0], XmNlabelString, mb1EmptyString);
551N/A XtSetValues(widgets[MB1_RELEASED_LBL], argList, 1);
551N/A }
551N/A else {
551N/A XtSetArg(argList[0], XmNlabelString, mb1EmptyString);
551N/A XtSetValues(widgets[MB1_PRESSED_LBL], argList, 1);
551N/A XtSetArg(argList[0], XmNlabelString, mb1String);
551N/A XtSetValues(widgets[MB1_RELEASED_LBL], argList, 1);
551N/A }
551N/A
551N/A if (mask & Button2Mask) {
551N/A XtSetArg(argList[0], XmNlabelString, mb2String);
551N/A XtSetValues(widgets[MB2_PRESSED_LBL], argList, 1);
551N/A XtSetArg(argList[0], XmNlabelString, mb2EmptyString);
551N/A XtSetValues(widgets[MB2_RELEASED_LBL], argList, 1);
551N/A }
551N/A else {
551N/A XtSetArg(argList[0], XmNlabelString, mb2EmptyString);
551N/A XtSetValues(widgets[MB2_PRESSED_LBL], argList, 1);
551N/A XtSetArg(argList[0], XmNlabelString, mb2String);
551N/A XtSetValues(widgets[MB2_RELEASED_LBL], argList, 1);
551N/A }
551N/A
551N/A if (mask & Button3Mask) {
551N/A XtSetArg(argList[0], XmNlabelString, mb3String);
551N/A XtSetValues(widgets[MB3_PRESSED_LBL], argList, 1);
551N/A XtSetArg(argList[0], XmNlabelString, mb3EmptyString);
551N/A XtSetValues(widgets[MB3_RELEASED_LBL], argList, 1);
551N/A }
551N/A else {
551N/A XtSetArg(argList[0], XmNlabelString, mb3EmptyString);
551N/A XtSetValues(widgets[MB3_PRESSED_LBL], argList, 1);
551N/A XtSetArg(argList[0], XmNlabelString, mb3String);
551N/A XtSetValues(widgets[MB3_RELEASED_LBL], argList, 1);
551N/A }
551N/A
551N/A
551N/A} /* SetMouseStatusViewFromStateXKB */
551N/A
551N/A#if NeedFunctionPrototypes
551N/Avoid SetMouseStatusViewFromStateAX(void)
551N/A#else
551N/Avoid SetMouseStatusViewFromStateAX()
551N/A#endif
551N/A{
551N/A Arg argList[2];
551N/A AccessXStateRec state;
551N/A Window rootWindow,childWindow;
551N/A int rootX,rootY,windowX,windowY;
551N/A unsigned long mask;
551N/A
551N/A XAccessXQueryState(dpy, &accessXClient, &state);
551N/A
551N/A switch (state.currentMouseButton) {
551N/A case 1:
551N/A XtSetArg(argList[0], XmNlabelString, mb1String);
551N/A break;
551N/A case 2:
551N/A XtSetArg(argList[0], XmNlabelString, mb2String);
551N/A break;
551N/A case 3:
551N/A XtSetArg(argList[0], XmNlabelString, mb3String);
551N/A break;
551N/A case 4:
551N/A XtSetArg(argList[0], XmNlabelString, mb4String);
551N/A break;
551N/A case 5:
551N/A XtSetArg(argList[0], XmNlabelString, mb5String);
551N/A break;
551N/A }
551N/A XtSetValues(widgets[CURRENT_BUTTON_LBL], argList, 1);
551N/A
551N/A XQueryPointer(dpy,
551N/A XDefaultRootWindow(dpy),
551N/A &rootWindow,
551N/A &childWindow,
551N/A &rootX,&rootY,
551N/A &windowX,&windowY,
551N/A (unsigned int*)&mask);
551N/A
551N/A if (mask & Button1Mask) {
551N/A XtSetArg(argList[0], XmNlabelString, mb1String);
551N/A XtSetValues(widgets[MB1_PRESSED_LBL], argList, 1);
551N/A XtSetArg(argList[0], XmNlabelString, mb1EmptyString);
551N/A XtSetValues(widgets[MB1_RELEASED_LBL], argList, 1);
551N/A }
551N/A else {
551N/A XtSetArg(argList[0], XmNlabelString, mb1EmptyString);
551N/A XtSetValues(widgets[MB1_PRESSED_LBL], argList, 1);
551N/A XtSetArg(argList[0], XmNlabelString, mb1String);
551N/A XtSetValues(widgets[MB1_RELEASED_LBL], argList, 1);
551N/A }
551N/A
551N/A if (mask & Button2Mask) {
551N/A XtSetArg(argList[0], XmNlabelString, mb2String);
551N/A XtSetValues(widgets[MB2_PRESSED_LBL], argList, 1);
551N/A XtSetArg(argList[0], XmNlabelString, mb2EmptyString);
551N/A XtSetValues(widgets[MB2_RELEASED_LBL], argList, 1);
551N/A }
551N/A else {
551N/A XtSetArg(argList[0], XmNlabelString, mb2EmptyString);
551N/A XtSetValues(widgets[MB2_PRESSED_LBL], argList, 1);
551N/A XtSetArg(argList[0], XmNlabelString, mb2String);
551N/A XtSetValues(widgets[MB2_RELEASED_LBL], argList, 1);
551N/A }
551N/A
551N/A if (mask & Button3Mask) {
551N/A XtSetArg(argList[0], XmNlabelString, mb3String);
551N/A XtSetValues(widgets[MB3_PRESSED_LBL], argList, 1);
551N/A XtSetArg(argList[0], XmNlabelString, mb3EmptyString);
551N/A XtSetValues(widgets[MB3_RELEASED_LBL], argList, 1);
551N/A }
551N/A else {
551N/A XtSetArg(argList[0], XmNlabelString, mb3EmptyString);
551N/A XtSetValues(widgets[MB3_PRESSED_LBL], argList, 1);
551N/A XtSetArg(argList[0], XmNlabelString, mb3String);
551N/A XtSetValues(widgets[MB3_RELEASED_LBL], argList, 1);
551N/A }
551N/A
551N/A#ifdef SHOW_5_BUTTONS_IN_MOUSEKEYS_STATUS
551N/A if (mask & Button4Mask) {
551N/A XtSetArg(argList[0], XmNlabelString, mb4String);
551N/A XtSetValues(widgets[MB4_PRESSED_LBL], argList, 1);
551N/A XtSetArg(argList[0], XmNlabelString, mb4EmptyString);
551N/A XtSetValues(widgets[MB4_RELEASED_LBL], argList, 1);
551N/A }
551N/A else {
551N/A XtSetArg(argList[0], XmNlabelString, mb4EmptyString);
551N/A XtSetValues(widgets[MB4_PRESSED_LBL], argList, 1);
551N/A XtSetArg(argList[0], XmNlabelString, mb4String);
551N/A XtSetValues(widgets[MB4_RELEASED_LBL], argList, 1);
551N/A }
551N/A
551N/A if (mask & Button5Mask) {
551N/A XtSetArg(argList[0], XmNlabelString, mb5String);
551N/A XtSetValues(widgets[MB5_PRESSED_LBL], argList, 1);
551N/A XtSetArg(argList[0], XmNlabelString, mb5EmptyString);
551N/A XtSetValues(widgets[MB5_RELEASED_LBL], argList, 1);
551N/A }
551N/A else {
551N/A XtSetArg(argList[0], XmNlabelString, mb5EmptyString);
551N/A XtSetValues(widgets[MB5_PRESSED_LBL], argList, 1);
551N/A XtSetArg(argList[0], XmNlabelString, mb5String);
551N/A XtSetValues(widgets[MB5_RELEASED_LBL], argList, 1);
551N/A }
551N/A#endif
551N/A} /* SetMouseStatusViewFromStateAX */
551N/A
551N/A/************************************************************************/
551N/A/* */
551N/A/* UpdateWidgetSensitivity */
551N/A/* */
551N/A/************************************************************************/
551N/A#if NeedFunctionPrototypes
551N/Avoid UpdateWidgetSensitivity(void)
551N/A#else
551N/Avoid UpdateWidgetSensitivity()
551N/A#endif
551N/A{
551N/A int i;
551N/A Arg argList[2];
551N/A
551N/A /* If the enable toggle is turned of then grey out everything */
551N/A if (XmToggleButtonGadgetGetState(widgets[ENABLE_ACCESSX_TGL])) {
551N/A XtSetArg(argList[0], XmNsensitive, True);
551N/A }
551N/A else {
551N/A XtSetArg(argList[0], XmNsensitive, False);
551N/A }
551N/A
551N/A for (i = TOGGLE_WIDGETS_MIN; i <= TOGGLE_WIDGETS_MAX; i++) {
551N/A if (i != ENABLE_ACCESSX_TGL) {
551N/A XtSetValues(widgets[i], argList, 1);
551N/A }
551N/A }
551N/A
551N/A for (i = SCALE_WIDGETS_MIN; i <= SCALE_WIDGETS_MAX; i++) {
551N/A XtSetValues(widgets[i], argList, 1);
551N/A }
551N/A
551N/A /* Toggle Sensitivity of TimeOut Scale based upon ENABLE_ACCESS
551N/A * as well as the TimeOut Toggle.
551N/A */
551N/A if (XmToggleButtonGadgetGetState(widgets[TIME_OUT_TGL]) &&
551N/A XmToggleButtonGadgetGetState(widgets[ENABLE_ACCESSX_TGL])) {
551N/A XtSetArg(argList[0], XmNsensitive, True);
551N/A XtSetValues(widgets[TIME_OUT_SCL],argList,1);
551N/A }
551N/A else {
551N/A XtSetArg(argList[0], XmNsensitive, False);
551N/A XtSetValues(widgets[TIME_OUT_SCL],argList,1);
551N/A }
551N/A
551N/A /* Always grey out the mouse delay scale with the old AccessX extension */
551N/A if(!XKBExtension) {
551N/A XtSetArg(argList[0], XmNsensitive, False);
551N/A XtSetValues(widgets[MOUSE_DELAY_SCL],argList,1);
551N/A }
551N/A
551N/A}
551N/A
551N/A/************************************************************************/
551N/A/* */
551N/A/* CreateProc */
551N/A/* */
551N/A/* Procedure called when a widget is fetched from Mrm. */
551N/A/* */
551N/A/************************************************************************/
551N/A#if NeedFunctionPrototypes
551N/Avoid CreateProc(Widget widget,
551N/A int *id,
551N/A unsigned long reason)
551N/A#else
551N/Avoid CreateProc(widget,id,reason)
551N/A Widget widget;
551N/A int *id;
551N/A unsigned long reason;
551N/A#endif
551N/A{
551N/A widgets[*id] = widget;
551N/A
551N/A} /* CreateProc */
551N/A
551N/A/************************************************************************/
551N/A/* */
551N/A/* ActivateProc */
551N/A/* */
551N/A/* Procedure called when a widget is activated. [[[Right now it */
551N/A/* merely handles the pushbuttons in the interface. Things like */
551N/A/* saving the current state when bringing up a dialog box and */
551N/A/* restoring the prvious state when the user hits "Cancel" need */
551N/A/* to be added. In addition, the whole help mechanism needs to be */
551N/A/* defined.]]] */
551N/A/* */
551N/A/************************************************************************/
551N/A#if NeedFunctionPrototypes
551N/Avoid ActivateProc(Widget widget,
551N/A int *id,
551N/A XmAnyCallbackStruct *callbackData)
551N/A#else
551N/Avoid ActivateProc(widget,id,callbackData)
551N/A Widget widget;
551N/A int *id;
551N/A XmAnyCallbackStruct *callbackData;
551N/A#endif
551N/A{
551N/A switch (*id) {
551N/A case EXIT_BTN:
551N/A XAccessXSelectInput(dpy,&accessXClient,False);
551N/A exit(0);
551N/A
551N/A case LOAD_BTN:
551N/A LoadSettingsFromFile();
551N/A break;
551N/A
551N/A case SAVE_BTN:
551N/A SaveSettingsToFile();
551N/A break;
551N/A
551N/A case SETTINGS_BTN:
551N/A StoreSettingsWindowToDatabase();
551N/A XtManageChild(settingsDialog);
551N/A break;
551N/A
551N/A case SETTINGS_RESET_BTN:
551N/A RestoreSettingsWindowFromDatabase();
551N/A SetStateFromView();
551N/A break;
551N/A
551N/A case SETTINGS_DEFAULTS_BTN:
551N/A SetDefaults();
551N/A break;
551N/A
551N/A case SETTINGS_OK_BTN:
551N/A XtUnmanageChild(settingsDialog);
551N/A SaveSettingsToFile();
551N/A break;
551N/A
551N/A case SETTINGS_CANCEL_BTN:
551N/A RestoreSettingsWindowFromDatabase();
551N/A SetStateFromView();
551N/A XtUnmanageChild(settingsDialog);
551N/A break;
551N/A
551N/A case MOUSE_STATUS_BTN:
551N/A CreateAndMapMouseStatusWindow();
551N/A break;
551N/A
551N/A case STICKY_STATUS_BTN:
551N/A CreateAndMapStickyStatusWindow();
551N/A break;
551N/A
551N/A case MOUSE_CLOSE_BTN:
551N/A UnmapMouseStatusWindow();
551N/A break;
551N/A
551N/A case STICKY_CLOSE_BTN:
551N/A UnmapStickyStatusWindow();
551N/A break;
551N/A
551N/A case SAVE_DONE_OK_BTN:
551N/A case SAVE_DONE_CANCEL_BTN:
551N/A XtUnmanageChild(saveDoneDialog);
551N/A break;
551N/A
551N/A case SAVE_ERR_OK_BTN:
551N/A case SAVE_ERR_CANCEL_BTN:
551N/A XtUnmanageChild(saveErrDialog);
551N/A break;
551N/A
551N/A case LOAD_DONE_OK_BTN:
551N/A case LOAD_DONE_CANCEL_BTN:
551N/A XtUnmanageChild(loadDoneDialog);
551N/A break;
551N/A
551N/A case LOAD_ERR_OK_BTN:
551N/A case LOAD_ERR_CANCEL_BTN:
551N/A XtUnmanageChild(loadErrDialog);
551N/A break;
551N/A
551N/A case CLOSE_HELP_BTN:
551N/A XtUnmanageChild(helpDialog);
551N/A XtFree(textString);
551N/A break;
551N/A
551N/A case GENERAL_HELP_BTN:
551N/A case STICKY_HELP_BTN:
551N/A case MOUSE_HELP_BTN:
551N/A case TOGGLE_HELP_BTN:
551N/A case REPEAT_HELP_BTN:
551N/A case SLOW_HELP_BTN:
551N/A case BOUNCE_HELP_BTN:
551N/A case SETTINGS_HELP_BTN:
551N/A XtManageChild(helpDialog);
551N/A if (!SetHelpText(*id)) {
551N/A break;
551N/A }
551N/A XmTextSetString(widgets[HELP_TEXT], textString);
551N/A break;
551N/A }
551N/A} /* ActivateProc */
551N/A
551N/A/************************************************************************/
551N/A/* */
551N/A/* GetSizeOfHelpText */
551N/A/* */
551N/A/************************************************************************/
551N/A#if NeedFunctionPrototypes
551N/Aint GetSizeOfHelpText(int type)
551N/A#else
551N/Aint GetSizeOfHelpText(type)
551N/A int type;
551N/A#endif
551N/A{
551N/A int size;
551N/A
551N/A size = 0;
551N/A
551N/A switch (type) {
551N/A case GENERAL_HELP_BTN:
551N/A size += strlen(generalHelpString);
551N/A break;
551N/A
551N/A case STICKY_HELP_BTN:
551N/A size += strlen(stickyHelpString);
551N/A break;
551N/A
551N/A case MOUSE_HELP_BTN:
551N/A size += strlen(mouseHelpString);
551N/A break;
551N/A
551N/A case TOGGLE_HELP_BTN:
551N/A size += strlen(toggleHelpString);
551N/A break;
551N/A
551N/A case REPEAT_HELP_BTN:
551N/A size += strlen(repeatHelpString);
551N/A break;
551N/A
551N/A case SLOW_HELP_BTN:
551N/A size += strlen(slowHelpString);
551N/A break;
551N/A
551N/A case BOUNCE_HELP_BTN:
551N/A size += strlen(bounceHelpString);
551N/A break;
551N/A }
551N/A
551N/A return(size);
551N/A} /* GetSizeOfHelpText */
551N/A
551N/A/************************************************************************/
551N/A/* */
551N/A/* AllocateHelpTextMemory */
551N/A/* */
551N/A/************************************************************************/
551N/A#if NeedFunctionPrototypes
551N/ABool AllocateHelpTextMemory(int size)
551N/A#else
551N/ABool AllocateHelpTextMemory(size)
551N/A int size;
551N/A#endif
551N/A{
551N/A if ((textString = XtMalloc(size)) == NULL) {
551N/A return(False);
551N/A }
551N/A
551N/A return(True);
551N/A} /* AllocateHelpTextMemory */
551N/A
551N/A/************************************************************************/
551N/A/* */
551N/A/* InitHelp */
551N/A/* */
551N/A/************************************************************************/
551N/A#if NeedFunctionPrototypes
551N/ABool InitHelp(void)
551N/A#else
551N/ABool InitHelp()
551N/A#endif
551N/A{
551N/A
551N/A char *locale = setlocale(LC_MESSAGES, NULL);
551N/A char *helpfile;
551N/A FILE *helpfilefp;
551N/A Bool i;
551N/A
551N/A helpfile = XtMalloc(strlen(ACCESSXHELP_DIRECTORY) + strlen(locale) +
551N/A strlen(HELPDIR) +
551N/A strlen(ACCESSXHELP_FILE) + 10);
551N/A if (!helpfile) {
551N/A return(False);
551N/A }
551N/A
551N/A sprintf(helpfile,"%s%s%s%s", ACCESSXHELP_DIRECTORY, locale,
551N/A HELPDIR,
551N/A ACCESSXHELP_FILE);
551N/A
551N/A helpfilefp = fopen(helpfile, "r");
551N/A if (!helpfilefp) {
551N/A /* 4340632: accessx application should show C locale help
551N/A if localized help not available */
551N/A sprintf(helpfile,"%s%s%s%s", ACCESSXHELP_DIRECTORY, "C",
551N/A HELPDIR,ACCESSXHELP_FILE);
551N/A helpfilefp = fopen(helpfile, "r");
551N/A if (!helpfilefp) {
551N/A return(False);
551N/A }
551N/A }
551N/A i = ReadHelpFile(helpfilefp);
551N/A fclose(helpfilefp);
551N/A XtFree(helpfile);
551N/A return(i);
551N/A
551N/A}
551N/A/************************************************************************/
551N/A/* */
551N/A/* ReadHelpFile */
551N/A/* */
551N/A/************************************************************************/
551N/A
551N/A
551N/A#define MEMORYCHUNKS 4096
551N/A
551N/A#if NeedFunctionPrototypes
551N/ABool ReadHelpFile(FILE *fp)
551N/A#else
551N/ABool ReadHelpFile(fp)
551N/A FILE * fp;
551N/A#endif
551N/A{
551N/A
551N/A char line[256];
551N/A char *ptr;
551N/A int size = sizeof(line);
551N/A int reallocsize = 1;
551N/A int currentmemsize = 0;
551N/A
551N/A/* char *getaline(); */
551N/A
551N/A ptr = fgets(line, size, fp);
551N/A if (!ptr)
551N/A return(False);
551N/A
551N/A while (*ptr == COMMENT) {
551N/A ptr = fgets(line, size, fp);
551N/A if (!ptr)
551N/A return(False);
551N/A }
551N/A
551N/A generalHelpString = (char *)malloc(MEMORYCHUNKS);
551N/A if (!generalHelpString) {
551N/A return(False);
551N/A }
551N/A
551N/A generalHelpString[0] = '\0';
551N/A currentmemsize = MEMORYCHUNKS - 1;
551N/A
551N/A /* it is general help */
551N/A while (*ptr != COMMENT) {
551N/A reallocsize += strlen(line);
551N/A if (reallocsize >= currentmemsize) {
551N/A currentmemsize += MEMORYCHUNKS;
551N/A generalHelpString = XtRealloc (generalHelpString,
551N/A currentmemsize);
551N/A if (!generalHelpString) {
551N/A return(False);
551N/A }
551N/A }
551N/A
551N/A strcat (generalHelpString, line);
551N/A ptr = fgets(line, size, fp);
551N/A if (!ptr) {
551N/A return(False);
551N/A }
551N/A
551N/A }
551N/A
551N/A /* remove the comment line */
551N/A ptr = fgets(line, size, fp);
551N/A if (!ptr) {
551N/A return(False);
551N/A }
551N/A
551N/A stickyHelpString = (char *)malloc(MEMORYCHUNKS);
551N/A if (!stickyHelpString) {
551N/A return(False);
551N/A }
551N/A
551N/A stickyHelpString[0] = '\0';
551N/A currentmemsize = MEMORYCHUNKS - 1;
551N/A
551N/A /* it is Sticky Key help */
551N/A reallocsize = 1;
551N/A while (*ptr != COMMENT) {
551N/A reallocsize += strlen(line);
551N/A if (reallocsize >= currentmemsize) {
551N/A currentmemsize += MEMORYCHUNKS;
551N/A stickyHelpString = XtRealloc (stickyHelpString,
551N/A currentmemsize);
551N/A if (!stickyHelpString) {
551N/A return(False);
551N/A }
551N/A }
551N/A
551N/A
551N/A strcat (stickyHelpString, line);
551N/A ptr = fgets(line, size, fp);
551N/A if (!ptr) {
551N/A return(False);
551N/A }
551N/A
551N/A }
551N/A
551N/A /* remove the comment line */
551N/A ptr = fgets(line, size, fp);
551N/A if (!ptr) {
551N/A return(False);
551N/A }
551N/A
551N/A mouseHelpString = (char *)malloc(MEMORYCHUNKS);
551N/A if (!mouseHelpString) {
551N/A return(False);
551N/A }
551N/A
551N/A mouseHelpString[0] = '\0';
551N/A currentmemsize = MEMORYCHUNKS - 1;
551N/A
551N/A /* it is Mouse Key help */
551N/A reallocsize = 1;
551N/A while (*ptr != COMMENT) {
551N/A reallocsize += strlen(line);
551N/A if (reallocsize >= currentmemsize) {
551N/A currentmemsize += MEMORYCHUNKS;
551N/A mouseHelpString = XtRealloc (mouseHelpString,
551N/A currentmemsize);
551N/A if (!mouseHelpString) {
551N/A return(False);
551N/A }
551N/A }
551N/A
551N/A
551N/A strcat (mouseHelpString, line);
551N/A ptr = fgets(line, size, fp);
551N/A if (!ptr) {
551N/A return(False);
551N/A }
551N/A
551N/A }
551N/A
551N/A /* remove the comment line */
551N/A ptr = fgets(line, size, fp);
551N/A if (!ptr) {
551N/A return(False);
551N/A }
551N/A
551N/A toggleHelpString = (char *)malloc(MEMORYCHUNKS);
551N/A if (!toggleHelpString) {
551N/A return(False);
551N/A }
551N/A
551N/A toggleHelpString[0] = '\0';
551N/A currentmemsize = MEMORYCHUNKS - 1;
551N/A
551N/A /* it is Toggle Key help */
551N/A reallocsize = 1;
551N/A while (*ptr != COMMENT) {
551N/A reallocsize += strlen(line);
551N/A if (reallocsize >= currentmemsize) {
551N/A currentmemsize += MEMORYCHUNKS;
551N/A toggleHelpString = XtRealloc (toggleHelpString,
551N/A currentmemsize);
551N/A if (!toggleHelpString) {
551N/A return(False);
551N/A }
551N/A }
551N/A
551N/A
551N/A strcat (toggleHelpString, line);
551N/A ptr = fgets(line, size, fp);
551N/A if (!ptr) {
551N/A return(False);
551N/A }
551N/A
551N/A }
551N/A
551N/A /* remove the comment line */
551N/A ptr = fgets(line, size, fp);
551N/A if (!ptr) {
551N/A return(False);
551N/A }
551N/A
551N/A repeatHelpString = (char *)malloc(MEMORYCHUNKS);
551N/A if (!repeatHelpString) {
551N/A return(False);
551N/A }
551N/A
551N/A repeatHelpString[0] = '\0';
551N/A currentmemsize = MEMORYCHUNKS;
551N/A
551N/A /* it is Repeat Key help */
551N/A reallocsize = 1;
551N/A while (*ptr != COMMENT) {
551N/A reallocsize += strlen(line);
551N/A if (reallocsize >= currentmemsize) {
551N/A currentmemsize += MEMORYCHUNKS;
551N/A repeatHelpString = XtRealloc (repeatHelpString,
551N/A currentmemsize);
551N/A if (!repeatHelpString) {
551N/A return(False);
551N/A }
551N/A }
551N/A
551N/A
551N/A strcat (repeatHelpString, line);
551N/A ptr = fgets(line, size, fp);
551N/A if (!ptr) {
551N/A return(False);
551N/A }
551N/A
551N/A }
551N/A
551N/A /* remove the comment line */
551N/A ptr = fgets(line, size, fp);
551N/A if (!ptr) {
551N/A return(False);
551N/A }
551N/A
551N/A slowHelpString = (char *)malloc(MEMORYCHUNKS);
551N/A if (!slowHelpString) {
551N/A return(False);
551N/A }
551N/A
551N/A slowHelpString[0] = '\0';
551N/A currentmemsize = MEMORYCHUNKS;
551N/A
551N/A /* it is Slow Key help */
551N/A reallocsize = 1;
551N/A while (*ptr != COMMENT) {
551N/A reallocsize += strlen(line);
551N/A if (reallocsize >= currentmemsize) {
551N/A currentmemsize += MEMORYCHUNKS;
551N/A slowHelpString = XtRealloc (slowHelpString,
551N/A currentmemsize);
551N/A if (!slowHelpString) {
551N/A return(False);
551N/A }
551N/A }
551N/A
551N/A
551N/A strcat (slowHelpString, line);
551N/A ptr = fgets(line, size, fp);
551N/A if (!ptr) {
551N/A return(False);
551N/A }
551N/A
551N/A }
551N/A
551N/A /* remove the comment line */
551N/A ptr = fgets(line, size, fp);
551N/A if (!ptr) {
551N/A return(False);
551N/A }
551N/A
551N/A bounceHelpString = (char *)malloc(MEMORYCHUNKS);
551N/A if (!bounceHelpString) {
551N/A return(False);
551N/A }
551N/A
551N/A bounceHelpString[0] = '\0';
551N/A currentmemsize = MEMORYCHUNKS;
551N/A
551N/A /* it is Bounce Key help */
551N/A reallocsize = 1;
551N/A while (*ptr != COMMENT) {
551N/A reallocsize += strlen(line);
551N/A if (reallocsize >= currentmemsize) {
551N/A currentmemsize += MEMORYCHUNKS;
551N/A bounceHelpString = XtRealloc (bounceHelpString,
551N/A currentmemsize);
551N/A if (!bounceHelpString) {
551N/A return(False);
551N/A }
551N/A }
551N/A
551N/A
551N/A strcat (bounceHelpString, line);
551N/A ptr = fgets(line, size, fp);
551N/A if (!ptr) {
551N/A return(True);
551N/A }
551N/A
551N/A }
551N/A return(True);
551N/A}
551N/A
551N/A/************************************************************************/
551N/A/* */
551N/A/* SetHelpText */
551N/A/* */
551N/A/************************************************************************/
551N/A#if NeedFunctionPrototypes
551N/ABool SetHelpText(int id)
551N/A#else
551N/ABool SetHelpText(id)
551N/A int id;
551N/A#endif
551N/A{
551N/A int result;
551N/A static int inited = 0; /* initialization flag */
551N/A
551N/A if (!inited) {
551N/A if (InitHelp() == False) {
851N/A fprintf(stderr, "The help file \n"
851N/A "[" ACCESSXHELP_DIRECTORY "<locale>" HELPDIR ACCESSXHELP_FILE "] is not installed.\n"
851N/A "Please contact your system administrator\n");
551N/A return(False);
551N/A }
551N/A inited = 1;
551N/A }
551N/A
551N/A if (id == SETTINGS_HELP_BTN) {
551N/A result = AllocateHelpTextMemory(GetSizeOfHelpText(STICKY_HELP_BTN) +
551N/A GetSizeOfHelpText(MOUSE_HELP_BTN) +
551N/A GetSizeOfHelpText(TOGGLE_HELP_BTN) +
551N/A GetSizeOfHelpText(REPEAT_HELP_BTN) +
551N/A GetSizeOfHelpText(SLOW_HELP_BTN) +
551N/A GetSizeOfHelpText(BOUNCE_HELP_BTN) + 1);
551N/A }
551N/A else {
551N/A result = AllocateHelpTextMemory(GetSizeOfHelpText(id) + 1);
551N/A }
551N/A if (!result) {
551N/A return(False);
551N/A }
551N/A
551N/A strcpy(textString, "");
551N/A
551N/A switch (id) {
551N/A case GENERAL_HELP_BTN:
551N/A strcat(textString, generalHelpString);
551N/A break;
551N/A
551N/A case STICKY_HELP_BTN:
551N/A strcat(textString, stickyHelpString);
551N/A break;
551N/A
551N/A case MOUSE_HELP_BTN:
551N/A strcat(textString, mouseHelpString);
551N/A break;
551N/A
551N/A case TOGGLE_HELP_BTN:
551N/A strcat(textString, toggleHelpString);
551N/A break;
551N/A
551N/A case REPEAT_HELP_BTN:
551N/A strcat(textString, repeatHelpString);
551N/A break;
551N/A
551N/A case SLOW_HELP_BTN:
551N/A strcat(textString, slowHelpString);
551N/A break;
551N/A
551N/A case BOUNCE_HELP_BTN:
551N/A strcat(textString, bounceHelpString);
551N/A break;
551N/A
551N/A case SETTINGS_HELP_BTN:
551N/A strcat(textString, stickyHelpString);
551N/A strcat(textString, mouseHelpString);
551N/A strcat(textString, toggleHelpString);
551N/A strcat(textString, repeatHelpString);
551N/A strcat(textString, slowHelpString);
551N/A strcat(textString, bounceHelpString);
551N/A break;
551N/A }
551N/A
551N/A return(True);
551N/A}
551N/A
551N/A/************************************************************************/
551N/A/* */
551N/A/* SpaceAndSizeButtons */
551N/A/* */
551N/A/************************************************************************/
551N/A#if NeedFunctionPrototypes
551N/Avoid SpaceAndSizeButtons(Widget *widgets,
551N/A int numWidgets)
551N/A#else
551N/Avoid SpaceAndSizeButtons(widgets, numWidgets)
551N/A Widget *widgets;
551N/A int numWidgets;
551N/A#endif
551N/A{
551N/A Arg argList[5];
551N/A int i;
551N/A int widest = 0;
551N/A
551N/A /* Find the widest button.
551N/A */
551N/A for (i = 0; i < numWidgets; i++)
551N/A {
551N/A if (XtWidth(widgets[i]) > widest)
551N/A widest = XtWidth(widgets[i]);
551N/A }
551N/A
551N/A /* Equally space the buttons.
551N/A */
551N/A XtSetArg(argList[0], XmNwidth, widest);
551N/A XtSetArg(argList[1], XmNleftOffset, 0);
551N/A XtSetArg(argList[2], XmNleftAttachment, XmATTACH_POSITION);
551N/A XtSetArg(argList[3], XmNleftPosition, 0);
551N/A for (i = 0; i < numWidgets; i++)
551N/A {
551N/A argList[1].value = widest * (i - numWidgets) / (numWidgets + 1);
551N/A argList[3].value = 100 * (i + 1) / (numWidgets + 1);
551N/A XtSetValues (widgets[i], argList, 4);
551N/A }
551N/A
551N/A} /* SpaceAndSizeButtons */
551N/A
551N/A/************************************************************************/
551N/A/* */
551N/A/* CreateAndMapStickyStatusWindow */
551N/A/* */
551N/A/************************************************************************/
551N/A#if NeedFunctionPrototypes
551N/Avoid CreateAndMapStickyStatusWindow(void)
551N/A#else
551N/Avoid CreateAndMapStickyStatusWindow()
551N/A#endif
551N/A{
551N/A XtManageChild(statusStickyKeysDialog);
551N/A XtRealizeWidget(stickyTopLevel);
551N/A
551N/A XtVaSetValues ( stickyTopLevel,
551N/A XmNtransientFor, NULL,
551N/A XmNwindowGroup, XtUnspecifiedWindowGroup,
551N/A NULL );
551N/A
551N/A XtMapWidget(stickyTopLevel);
551N/A SetStickyStatusViewFromState();
551N/A
551N/A} /* CreateAndMapStickyStatusWindow */
551N/A
551N/A/************************************************************************/
551N/A/* */
551N/A/* UnmapStickyStatusWindow */
551N/A/* */
551N/A/************************************************************************/
551N/A#if NeedFunctionPrototypes
551N/Avoid UnmapStickyStatusWindow(void)
551N/A#else
551N/Avoid UnmapStickyStatusWindow()
551N/A#endif
551N/A{
551N/A if (stickyTopLevel != NULL)
551N/A XtUnmapWidget(stickyTopLevel);
551N/A
551N/A
551N/A} /* UnmapStickyStatusWindow */
551N/A
551N/A/************************************************************************/
551N/A/* */
551N/A/* CreateAndMapMouseStatusWindow */
551N/A/* */
551N/A/************************************************************************/
551N/A#if NeedFunctionPrototypes
551N/Avoid CreateAndMapMouseStatusWindow(void)
551N/A#else
551N/Avoid CreateAndMapMouseStatusWindow()
551N/A#endif
551N/A{
551N/A XtManageChild(statusMouseKeysDialog);
551N/A XtRealizeWidget(mouseTopLevel);
551N/A
551N/A XtVaSetValues ( mouseTopLevel,
551N/A XmNtransientFor, NULL,
551N/A XmNwindowGroup, XtUnspecifiedWindowGroup,
551N/A NULL );
551N/A
551N/A XtMapWidget(mouseTopLevel);
551N/A SetMouseStatusViewFromState();
551N/A
551N/A} /* CreateAndMapMouseStatusWindow */
551N/A
551N/A/************************************************************************/
551N/A/* */
551N/A/* UnmapMouseStatusWindow */
551N/A/* */
551N/A/************************************************************************/
551N/A#if NeedFunctionPrototypes
551N/Avoid UnmapMouseStatusWindow(void)
551N/A#else
551N/Avoid UnmapMouseStatusWindow()
551N/A#endif
551N/A{
551N/A if (mouseTopLevel != NULL)
551N/A XtUnmapWidget(mouseTopLevel);
551N/A
551N/A} /* UnmapMouseStatusWindow */
551N/A
551N/A/************************************************************************/
551N/A/* */
551N/A/* ChangeControlProc */
551N/A/* */
551N/A/* Procedure called when one of the widgets indicating the AccessX */
551N/A/* state is activated. */
551N/A/* */
551N/A/************************************************************************/
551N/A#if NeedFunctionPrototypes
551N/Avoid ChangeControlProc(Widget widget,
551N/A int *id,
551N/A XmToggleButtonCallbackStruct *callbackData)
551N/A#else
551N/Avoid ChangeControlProc(widget,id,callbackData)
551N/A Widget widget;
551N/A int *id;
551N/A XmToggleButtonCallbackStruct *callbackData;
551N/A#endif
551N/A{
551N/A /* Before we do anything, make sure we emulate the radio behavior
551N/A of the SlowKeys and BounceKeys buttons. */
551N/A if ((*id == SLOW_KEYS_TGL) && (callbackData->set)) {
551N/A XmToggleButtonGadgetSetState(widgets[BOUNCE_KEYS_TGL],False,False);
551N/A }
551N/A else if ((*id == BOUNCE_KEYS_TGL) && (callbackData->set)) {
551N/A XmToggleButtonGadgetSetState(widgets[SLOW_KEYS_TGL],False,False);
551N/A }
551N/A
551N/A /* Set the repeat state and keysym mappings of the mouse keys if
551N/A this is the MouseKeys toggle buttons. */
551N/A if (*id == MOUSE_KEYS_TGL) {
551N/A if (callbackData->set) {
551N/A if (options.automaticPopup) {
551N/A CreateAndMapMouseStatusWindow();
551N/A }
551N/A }
551N/A else {
551N/A if (options.automaticPopup) {
551N/A UnmapMouseStatusWindow();
551N/A }
551N/A }
551N/A }
551N/A
551N/A SetStateFromView();
551N/A
551N/A /* Save To A File IF Needed */
551N/A SaveSettingsToFile();
551N/A
551N/A} /* ChangeControlProc */
551N/A
551N/A/************************************************************************/
551N/A/* */
551N/A/* ResolveResourceFileName */
551N/A/* */
551N/A/************************************************************************/
551N/A#if NeedFunctionPrototypes
551N/Achar *ResolveResourceFileName(void)
551N/A#else
551N/Achar *ResolveResourceFileName()
551N/A#endif
551N/A{
551N/A static char *homeDirectory, fullPath[MAXPATHLEN];
551N/A
551N/A if ((homeDirectory = getenv("HOME")) == NULL) {
551N/A return(NULL);
551N/A }
551N/A sprintf(fullPath, "%s/%s", homeDirectory, ACCESSX_FILE);
551N/A
551N/A return(fullPath);
551N/A
551N/A} /* ResolveResourceFileName */
551N/A
551N/A/************************************************************************/
551N/A/* */
551N/A/* LoadSettingsFromFile */
551N/A/* */
551N/A/************************************************************************/
551N/A#if NeedFunctionPrototypes
551N/Avoid LoadSettingsFromFile(void)
551N/A#else
551N/Avoid LoadSettingsFromFile()
551N/A#endif
551N/A{
551N/A int i, value;
551N/A short decimalPoints;
551N/A XrmDatabase accessXDatabase;
551N/A char *res, classValueString[256], classDecimalPointsString[256];
551N/A XrmValue resourceValue;
551N/A Arg argList[2];
551N/A
551N/A accessXDatabase = XrmGetFileDatabase(ResolveResourceFileName());
551N/A if (accessXDatabase == NULL) {
551N/A XtManageChild(loadErrDialog);
551N/A return;
551N/A }
551N/A
551N/A for (i = TOGGLE_WIDGETS_MIN; i <= TOGGLE_WIDGETS_MAX; i++) {
551N/A XrmGetResource(accessXDatabase, resStrings[i], classStrings[i],
551N/A &res, &resourceValue);
551N/A if (strcmp(resourceValue.addr, "True") == 0) {
551N/A XmToggleButtonGadgetSetState(widgets[i], True, False);
551N/A }
551N/A else {
551N/A XmToggleButtonGadgetSetState(widgets[i], False, False);
551N/A }
551N/A }
551N/A
551N/A for (i = SCALE_WIDGETS_MIN; i <= SCALE_WIDGETS_MAX; i++) {
551N/A sprintf(classValueString, "%s.value", resStrings[i]);
551N/A sprintf(classDecimalPointsString, "%s.decimalPoints", resStrings[i]);
551N/A
551N/A XrmGetResource(accessXDatabase, classValueString, classStrings[i],
551N/A &res, &resourceValue);
551N/A if (resourceValue.addr == NULL)
551N/A continue;
551N/A value = atoi(resourceValue.addr);
551N/A XrmGetResource(accessXDatabase, classDecimalPointsString, classStrings[i],
551N/A &res, &resourceValue);
551N/A if (resourceValue.addr == NULL)
551N/A continue;
551N/A decimalPoints = atoi(resourceValue.addr);
551N/A
551N/A XtSetArg(argList[0], XmNvalue, value);
551N/A XtSetArg(argList[1], XmNdecimalPoints, decimalPoints);
551N/A XtSetValues(widgets[i], argList, 2);
551N/A }
551N/A
551N/A SetStateFromView();
551N/A /* XtManageChild(loadDoneDialog); */
551N/A
551N/A} /* LoadSettingsFromFile */
551N/A
551N/A/************************************************************************/
551N/A/* */
551N/A/* SaveSettingsToFile */
551N/A/* */
551N/A/************************************************************************/
551N/A#if NeedFunctionPrototypes
551N/Avoid SaveSettingsToFile(void)
551N/A#else
551N/Avoid SaveSettingsToFile()
551N/A#endif
551N/A{
551N/A int i, scaleValue;
551N/A short decimalPoints;
551N/A Arg argList[2];
551N/A char scaleValueString[32], decimalPointsString[32];
551N/A char scaleValueRes[256], decimalPointsRes[256];
551N/A char *fname;
551N/A XrmDatabase accessXDatabase = NULL, fileDatabase;
551N/A
551N/A for (i = TOGGLE_WIDGETS_MIN; i <= TOGGLE_WIDGETS_MAX; i++) {
551N/A if (XmToggleButtonGadgetGetState(widgets[i])) {
551N/A XrmPutStringResource(&accessXDatabase, resStrings[i], "True");
551N/A }
551N/A else {
551N/A XrmPutStringResource(&accessXDatabase, resStrings[i], "False");
551N/A }
551N/A }
551N/A
551N/A for (i = SCALE_WIDGETS_MIN; i <= SCALE_WIDGETS_MAX; i++) {
551N/A XtSetArg(argList[0], XmNvalue, &scaleValue);
551N/A XtSetArg(argList[1], XmNdecimalPoints, &decimalPoints);
551N/A XtGetValues(widgets[i], argList, 2);
551N/A
551N/A sprintf(scaleValueString, "%d", scaleValue);
551N/A sprintf(decimalPointsString, "%d", decimalPoints);
551N/A
551N/A sprintf(scaleValueRes, "%s.%s", resStrings[i], "value");
551N/A sprintf(decimalPointsRes, "%s.%s", resStrings[i], "decimalPoints");
551N/A
551N/A XrmPutStringResource(&accessXDatabase, scaleValueRes, scaleValueString);
551N/A XrmPutStringResource(&accessXDatabase, decimalPointsRes,
551N/A decimalPointsString);
551N/A }
551N/A
551N/A if ((fname = ResolveResourceFileName()) == NULL) {
551N/A XtManageChild(saveErrDialog);
551N/A return;
551N/A }
551N/A fileDatabase = XrmGetFileDatabase(fname);
551N/A
551N/A XrmCombineDatabase(accessXDatabase, &fileDatabase, True);
551N/A XrmPutFileDatabase(fileDatabase, fname);
551N/A
551N/A} /* SaveSettingsToFile */
551N/A
551N/A/************************************************************************/
551N/A/* */
551N/A/* StoreSettingsWindowToDatabase */
551N/A/* */
551N/A/************************************************************************/
551N/A#if NeedFunctionPrototypes
551N/Avoid StoreSettingsWindowToDatabase(void)
551N/A#else
551N/Avoid StoreSettingsWindowToDatabase()
551N/A#endif
551N/A{
551N/A int i, scaleValue;
551N/A short decimalPoints;
551N/A Arg argList[2];
551N/A char scaleValueString[32], decimalPointsString[32];
551N/A char scaleValueRes[256], decimalPointsRes[256];
551N/A
551N/A settingsWindowDatabase = NULL;
551N/A
551N/A for (i = SETTINGS_TOGGLE_WIDGETS_MIN; i<=SETTINGS_TOGGLE_WIDGETS_MAX; i++) {
551N/A if (XmToggleButtonGadgetGetState(widgets[i])) {
551N/A XrmPutStringResource(&settingsWindowDatabase, resStrings[i], "True");
551N/A }
551N/A else {
551N/A XrmPutStringResource(&settingsWindowDatabase, resStrings[i], "False");
551N/A }
551N/A }
551N/A
551N/A for (i = SCALE_WIDGETS_MIN; i <= SCALE_WIDGETS_MAX; i++) {
551N/A if (i == TIME_OUT_SCL) { /* special case the time out scale here */
551N/A continue;
551N/A }
551N/A XtSetArg(argList[0], XmNvalue, &scaleValue);
551N/A XtSetArg(argList[1], XmNdecimalPoints, &decimalPoints);
551N/A XtGetValues(widgets[i], argList, 2);
551N/A
551N/A sprintf(scaleValueString, "%d", scaleValue);
551N/A sprintf(decimalPointsString, "%d", decimalPoints);
551N/A
551N/A sprintf(scaleValueRes, "%s.%s", resStrings[i], "value");
551N/A sprintf(decimalPointsRes, "%s.%s", resStrings[i], "decimalPoints");
551N/A
551N/A XrmPutStringResource(&settingsWindowDatabase, scaleValueRes,
551N/A scaleValueString);
551N/A XrmPutStringResource(&settingsWindowDatabase, decimalPointsRes,
551N/A decimalPointsString);
551N/A }
551N/A
551N/A} /* StoreSettingsWindowToDatabase */
551N/A
551N/A/************************************************************************/
551N/A/* */
551N/A/* RestoreSettingsWindowFromDatabase */
551N/A/* */
551N/A/************************************************************************/
551N/A#if NeedFunctionPrototypes
551N/Avoid RestoreSettingsWindowFromDatabase(void)
551N/A#else
551N/Avoid RestoreSettingsWindowFromDatabase()
551N/A#endif
551N/A{
551N/A int i, value;
551N/A short decimalPoints;
551N/A char *res, classValueString[256], classDecimalPointsString[256];
551N/A XrmValue resourceValue;
551N/A Arg argList[2];
551N/A
551N/A for (i = SETTINGS_TOGGLE_WIDGETS_MIN; i<=SETTINGS_TOGGLE_WIDGETS_MAX; i++) {
551N/A XrmGetResource(settingsWindowDatabase, resStrings[i], classStrings[i],
551N/A &res, &resourceValue);
551N/A if (strcmp(resourceValue.addr, "True") == 0) {
551N/A XmToggleButtonGadgetSetState(widgets[i], True, False);
551N/A }
551N/A else {
551N/A XmToggleButtonGadgetSetState(widgets[i], False, False);
551N/A }
551N/A }
551N/A
551N/A for (i = SCALE_WIDGETS_MIN; i <= SCALE_WIDGETS_MAX; i++) {
551N/A if (i == TIME_OUT_SCL) { /* special case the time out scale */
551N/A continue;
551N/A }
551N/A sprintf(classValueString, "%s.value", resStrings[i]);
551N/A sprintf(classDecimalPointsString, "%s.decimalPoints", resStrings[i]);
551N/A
551N/A XrmGetResource(settingsWindowDatabase, classValueString, classStrings[i],
551N/A &res, &resourceValue);
551N/A value = atoi(resourceValue.addr);
551N/A XrmGetResource(settingsWindowDatabase, classDecimalPointsString,
551N/A classStrings[i], &res, &resourceValue);
551N/A decimalPoints = atoi(resourceValue.addr);
551N/A
551N/A XtSetArg(argList[0], XmNvalue, value);
551N/A XtSetArg(argList[1], XmNdecimalPoints, decimalPoints);
551N/A XtSetValues(widgets[i], argList, 2);
551N/A }
551N/A
551N/A} /* RestoreSettingsWindowFromDatabase */
551N/A
551N/A/************************************************************************/
551N/A/* */
551N/A/* DisplayStatusDialogsIfNeeded */
551N/A/* */
551N/A/************************************************************************/
551N/A#if NeedFunctionPrototypes
551N/Avoid DisplayStatusDialogsIfNeeded(void)
551N/A#else
551N/Avoid DisplayStatusDialogsIfNeeded()
551N/A#endif
551N/A{
551N/A if (!options.automaticPopup)
551N/A return;
551N/A
551N/A if (XmToggleButtonGetState(widgets[STICKY_KEYS_TGL])) {
551N/A CreateAndMapStickyStatusWindow();
551N/A }
551N/A
551N/A if (XmToggleButtonGetState(widgets[MOUSE_KEYS_TGL])) {
551N/A CreateAndMapMouseStatusWindow();
551N/A }
551N/A
551N/A} /* DisplayStatusDialogsIfNeeded */
551N/A
551N/A/************************************************************************/
551N/A/* */
551N/A/* InitializeInterface */
551N/A/* */
551N/A/************************************************************************/
551N/A#if NeedFunctionPrototypes
551N/Avoid InitializeInterface(unsigned int argc,
551N/A char *argv[])
551N/A#else
551N/Avoid InitializeInterface(argc,argv)
551N/A unsigned int argc;
551N/A char *argv[];
551N/A#endif
551N/A{
551N/A Arg argList[3];
551N/A int n;
551N/A Widget mainWindow,foo;
551N/A Pixmap bitmap;
551N/A
551N/A
551N/A /* Initialize the toolkit and Mrm */
551N/A MrmInitialize();
551N/A topLevel = XtAppInitialize(&appContext, ACCESSX_CLASS, optionDesc,
551N/A XtNumber(optionDesc), (int *)&argc, argv, fallbackResources,
551N/A NULL, 0);
551N/A
551N/A XtGetApplicationResources(topLevel, (XtPointer)&options, resources,
551N/A XtNumber(resources), NULL, 0);
551N/A
551N/A dpy = XtDisplay(topLevel);
551N/A
551N/A /* Find which extension to use */
551N/A XKBExtension = InitXkb(dpy) ? 1 : 0;
551N/A
551N/A /* Initialize widget array to all NULLS */
551N/A for (n = 0; n < NUM_WIDGETS; n++) {
551N/A widgets[n] = NULL;
551N/A }
551N/A
551N/A bitmap = XCreatePixmapFromBitmapData(XtDisplay(topLevel),
551N/A RootWindowOfScreen(XtScreen(topLevel)), (char *)accessXIcon_bits,
551N/A accessXIcon_width, accessXIcon_height, 1, 0, 1);
551N/A
551N/A XtSetArg(argList[0], XmNallowShellResize, True);
551N/A XtSetArg(argList[1], XmNiconPixmap, bitmap);
551N/A if (options.iconifyMain) {
551N/A XtSetArg(argList[2], XmNinitialState, IconicState);
551N/A }
551N/A else {
551N/A XtSetArg(argList[2], XmNinitialState, NormalState);
551N/A }
551N/A XtSetValues(topLevel,argList,3);
551N/A
551N/A /* Open up the UID database and fetch/manage the main window */
551N/A if (MrmOpenHierarchy(dbFilenameNum, dbFilenameVec, NULL, &mrmHierarchy)
551N/A !=MrmSUCCESS) {
551N/A printf("Could not open hierarchy.\n");
551N/A exit(1);
551N/A }
551N/A
551N/A MrmRegisterNames(regList, regListNum);
551N/A MrmFetchWidget(mrmHierarchy, "AccessXMainWindow", topLevel,
551N/A &mainWindow, &dummyClass);
551N/A SpaceAndSizeButtons(&widgets[SETTINGS_BTN],1);
551N/A XtManageChild(mainWindow);
551N/A
551N/A MrmFetchWidget(mrmHierarchy, "HelpDialog", topLevel, &helpDialog,
551N/A &dummyClass);
551N/A SpaceAndSizeButtons(&widgets[CLOSE_HELP_BTN],1);
551N/A
551N/A MrmFetchWidget(mrmHierarchy, "HelpErrorDialog", topLevel, &helpErrDialog,
551N/A &dummyClass);
551N/A MrmFetchWidget(mrmHierarchy, "HelpErrorBox", topLevel, &helpErrBox,
551N/A &dummyClass);
551N/A
551N/A MrmFetchWidget(mrmHierarchy, "SettingsDialog", topLevel, &settingsDialog,
551N/A &dummyClass);
551N/A SpaceAndSizeButtons(&widgets[SETTINGS_OK_BTN],5);
551N/A
551N/A n = 0;
551N/A XtSetArg (argList[n], XmNtransientFor, NULL); n++;
551N/A XtSetArg (argList[n], XmNwindowGroup, XtUnspecifiedWindowGroup); n++;
551N/A stickyTopLevel = XmCreateDialogShell(topLevel,
551N/A "stickyTopLevel", argList, n);
551N/A
551N/A MrmFetchWidget(mrmHierarchy, "StickyKeysStatusDialog",
551N/A stickyTopLevel, &statusStickyKeysDialog, &dummyClass);
551N/A
551N/A n = 0;
551N/A XtSetArg (argList[n], XmNtransientFor, NULL); n++;
551N/A XtSetArg (argList[n], XmNwindowGroup, XtUnspecifiedWindowGroup); n++;
551N/A mouseTopLevel = XmCreateDialogShell(topLevel,
551N/A "mouseTopLevel", argList, n);
551N/A
551N/A MrmFetchWidget(mrmHierarchy, "MouseKeysStatusDialog", mouseTopLevel,
551N/A &statusMouseKeysDialog, &dummyClass);
551N/A
551N/A
551N/A MrmFetchWidget(mrmHierarchy, "SaveDoneDialog", topLevel, &saveDoneDialog,
551N/A &dummyClass);
551N/A MrmFetchWidget(mrmHierarchy, "SaveDoneBox", saveDoneDialog,
551N/A &saveDoneBox, &dummyClass);
551N/A
551N/A MrmFetchWidget(mrmHierarchy, "SaveErrorDialog", topLevel, &saveErrDialog,
551N/A &dummyClass);
551N/A MrmFetchWidget(mrmHierarchy, "SaveErrorBox", saveErrDialog, &saveErrBox,
551N/A &dummyClass);
551N/A
551N/A MrmFetchWidget(mrmHierarchy, "LoadDoneDialog", topLevel, &loadDoneDialog,
551N/A &dummyClass);
551N/A MrmFetchWidget(mrmHierarchy, "LoadDoneBox", loadDoneDialog, &loadDoneBox,
551N/A &dummyClass);
551N/A
551N/A MrmFetchWidget(mrmHierarchy, "LoadErrorDialog", topLevel, &loadErrDialog,
551N/A &dummyClass);
551N/A MrmFetchWidget(mrmHierarchy, "LoadErrorBox", loadErrDialog, &loadErrBox,
551N/A &dummyClass);
551N/A
551N/A /* Realize the topLevel widget and Initialize the AccessX extension.
551N/A */
551N/A XtRealizeWidget(topLevel);
551N/A
551N/A foo = XmMessageBoxGetChild(helpErrBox, XmDIALOG_CANCEL_BUTTON);
551N/A XtUnmanageChild(XmMessageBoxGetChild(helpErrBox, XmDIALOG_CANCEL_BUTTON));
551N/A XtUnmanageChild(XmMessageBoxGetChild(helpErrBox, XmDIALOG_HELP_BUTTON));
551N/A XtUnmanageChild(XmMessageBoxGetChild(saveDoneBox, XmDIALOG_CANCEL_BUTTON));
551N/A XtUnmanageChild(XmMessageBoxGetChild(saveDoneBox, XmDIALOG_HELP_BUTTON));
551N/A XtUnmanageChild(XmMessageBoxGetChild(saveErrBox, XmDIALOG_CANCEL_BUTTON));
551N/A XtUnmanageChild(XmMessageBoxGetChild(saveErrBox, XmDIALOG_HELP_BUTTON));
551N/A XtUnmanageChild(XmMessageBoxGetChild(loadDoneBox, XmDIALOG_CANCEL_BUTTON));
551N/A XtUnmanageChild(XmMessageBoxGetChild(loadDoneBox, XmDIALOG_HELP_BUTTON));
551N/A XtUnmanageChild(XmMessageBoxGetChild(loadErrBox, XmDIALOG_CANCEL_BUTTON));
551N/A XtUnmanageChild(XmMessageBoxGetChild(loadErrBox, XmDIALOG_HELP_BUTTON));
551N/A
551N/A MrmFetchLiteral(mrmHierarchy, "StickyString", dpy,
551N/A (XtPointer *)&stickyKeysString, &dummyClass);
551N/A MrmFetchLiteral(mrmHierarchy, "MouseString", dpy,
551N/A (XtPointer *)&mouseKeysString, &dummyClass);
551N/A
551N/A MrmFetchLiteral(mrmHierarchy, "ShiftString", dpy,
551N/A (XtPointer *)&shiftString, &dummyClass);
551N/A MrmFetchLiteral(mrmHierarchy, "ShiftEmptyString", dpy,
551N/A (XtPointer *)&shiftEmptyString, &dummyClass);
551N/A
551N/A MrmFetchLiteral(mrmHierarchy, "ControlString", dpy,
551N/A (XtPointer *)&controlString, &dummyClass);
551N/A MrmFetchLiteral(mrmHierarchy, "ControlEmptyString", dpy,
551N/A (XtPointer *)&controlEmptyString, &dummyClass);
551N/A
551N/A MrmFetchLiteral(mrmHierarchy, "Mod1String", dpy,
551N/A (XtPointer *)&mod1String, &dummyClass);
551N/A MrmFetchLiteral(mrmHierarchy, "Mod1EmptyString", dpy,
551N/A (XtPointer *)&mod1EmptyString, &dummyClass);
551N/A
551N/A MrmFetchLiteral(mrmHierarchy, "Mod2String", dpy,
551N/A (XtPointer *)&mod2String, &dummyClass);
551N/A MrmFetchLiteral(mrmHierarchy, "Mod2EmptyString", dpy,
551N/A (XtPointer *)&mod2EmptyString, &dummyClass);
551N/A
551N/A MrmFetchLiteral(mrmHierarchy, "Mod3String", dpy,
551N/A (XtPointer *)&mod3String, &dummyClass);
551N/A MrmFetchLiteral(mrmHierarchy, "Mod3EmptyString", dpy,
551N/A (XtPointer *)&mod3EmptyString, &dummyClass);
551N/A
551N/A MrmFetchLiteral(mrmHierarchy, "Mod4String", dpy,
551N/A (XtPointer *)&mod4String, &dummyClass);
551N/A MrmFetchLiteral(mrmHierarchy, "Mod4EmptyString", dpy,
551N/A (XtPointer *)&mod4EmptyString, &dummyClass);
551N/A
551N/A MrmFetchLiteral(mrmHierarchy, "Mod5String", dpy,
551N/A (XtPointer *)&mod5String, &dummyClass);
551N/A MrmFetchLiteral(mrmHierarchy, "Mod5EmptyString", dpy,
551N/A (XtPointer *)&mod5EmptyString, &dummyClass);
551N/A
551N/A MrmFetchLiteral(mrmHierarchy, "MB1String", dpy,
551N/A (XtPointer *)&mb1String, &dummyClass);
551N/A MrmFetchLiteral(mrmHierarchy, "MB1EmptyString", dpy,
551N/A (XtPointer *)&mb1EmptyString, &dummyClass);
551N/A
551N/A MrmFetchLiteral(mrmHierarchy, "MB2String", dpy,
551N/A (XtPointer *)&mb2String, &dummyClass);
551N/A MrmFetchLiteral(mrmHierarchy, "MB2EmptyString", dpy,
551N/A (XtPointer *)&mb2EmptyString, &dummyClass);
551N/A
551N/A MrmFetchLiteral(mrmHierarchy, "MB3String", dpy,
551N/A (XtPointer *)&mb3String, &dummyClass);
551N/A MrmFetchLiteral(mrmHierarchy, "MB3EmptyString", dpy,
551N/A (XtPointer *)&mb3EmptyString, &dummyClass);
551N/A
551N/A MrmFetchLiteral(mrmHierarchy, "MB4String", dpy,
551N/A (XtPointer *)&mb4String, &dummyClass);
551N/A MrmFetchLiteral(mrmHierarchy, "MB4EmptyString", dpy,
551N/A (XtPointer *)&mb4EmptyString, &dummyClass);
551N/A
551N/A MrmFetchLiteral(mrmHierarchy, "MB5String", dpy,
551N/A (XtPointer *)&mb5String, &dummyClass);
551N/A MrmFetchLiteral(mrmHierarchy, "MB5EmptyString", dpy,
551N/A (XtPointer *)&mb5EmptyString, &dummyClass);
551N/A
551N/A MrmFetchLiteral(mrmHierarchy, "HelpWindowString", dpy,
551N/A (XtPointer *)&helpWindowString, &dummyClass);
551N/A
551N/A /* Initialize the accessx extention */
551N/A if(!XKBExtension)
551N/A {
551N/A accessXClient.eventHandler = AccessXEventHandler;
551N/A XAccessXInit(dpy, &accessXClient);
551N/A XAccessXSelectInput(dpy,&accessXClient,True);
551N/A }
551N/A
551N/A if (options.useServer) {
551N/A SetViewFromState();
551N/A }
551N/A else {
551N/A SetStateFromView();
551N/A }
551N/A
551N/A DisplayStatusDialogsIfNeeded();
551N/A
551N/A} /* InitializeInterface */
551N/A
551N/A/************************************************************************/
551N/A/* */
551N/A/* XkbEventHandler */
551N/A/* */
551N/A/* DESCRIPTION: */
551N/A/* */
551N/A/* Handles events generated by the Xkb server extension. */
551N/A/* */
551N/A/************************************************************************/
551N/ABoolean XkbEventHandler(XEvent *event)
551N/A{
551N/A XkbEvent *xkbEv = (XkbEvent *) event;
551N/A
551N/A switch(xkbEv->any.xkb_type)
551N/A {
551N/A case XkbStateNotify:
551N/A SetStickyStatusViewFromState();
551N/A SetMouseStatusViewFromState();
551N/A break;
551N/A
551N/A case XkbControlsNotify:
551N/A SetViewFromState();
551N/A SetMouseStatusViewFromState();
551N/A break;
551N/A
551N/A default: break;
551N/A }
551N/A
551N/A return True;
551N/A
551N/A} /* XkbEventHandler */
551N/A
551N/A/************************************************************************/
551N/A/* */
551N/A/* InitXkb */
551N/A/* */
551N/A/************************************************************************/
551N/ABoolean InitXkb(Display *theDisplay)
551N/A{
551N/A int opcode,errorBase,major,minor;
551N/A
551N/A if (!XkbQueryExtension(theDisplay,
551N/A &opcode,
551N/A &xkbEventBase,
551N/A &errorBase,
551N/A &major,
551N/A &minor))
551N/A return False;
551N/A
551N/A if (!XkbUseExtension(theDisplay,&major,&minor))
551N/A return False;
551N/A
551N/A XkbSelectEvents(theDisplay,
551N/A XkbUseCoreKbd,
551N/A XkbAllEventsMask,
551N/A XkbAllEventsMask);
551N/A
551N/A XtSetEventDispatcher(theDisplay,
551N/A xkbEventBase+XkbEventCode,
551N/A XkbEventHandler);
551N/A
551N/A
551N/A return True;
551N/A
551N/A} /* InitXkb */
551N/A/************************************************************************/
551N/A/* */
551N/A/* main */
551N/A/* */
551N/A/************************************************************************/
551N/A#if NeedFunctionPrototypes
551N/Aint main( int argc,
551N/A char *argv[])
551N/A#else
551N/Aint main(argc, argv)
551N/A int argc;
551N/A char *argv[];
551N/A#endif
551N/A{
851N/A char *uidpathstr = "UIDPATH=/usr/share/X11/locale/%L/accessx/accessx.uid:/usr/share/X11/locale/C/accessx/accessx.uid";
851N/A char *xfilesearchpathstr = "XFILESEARCHPATH=/usr/dt/app-defaults/%L/%N:/usr/dt/app-defaults/C/%N:/usr/share/X11/app-defaults/%L/%N:/usr/share/X11/app-defaults/C/%N";
551N/A char *tmpstr;
551N/A
551N/A if ((tmpstr = getenv("UIDPATH")) == NULL) {
551N/A (void)putenv(uidpathstr);
551N/A }
551N/A
551N/A if ((tmpstr = getenv("XFILESEARCHPATH")) == NULL) {
551N/A (void)putenv(xfilesearchpathstr);
551N/A }
551N/A
551N/A /* set locale */
551N/A XtSetLanguageProc((XtAppContext)NULL, (XtLanguageProc)NULL, (XtPointer)NULL);
551N/A
551N/A /* Initialize the Interface */
551N/A InitializeInterface(argc, argv);
551N/A
551N/A /* Automatically load the users settings */
551N/A LoadSettingsFromFile();
551N/A
551N/A /* First try initalizing XKB, if that fails then try the old AccessX extension. */
551N/A if(XKBExtension)
551N/A XtAppMainLoop(appContext);
551N/A else
551N/A XAccessXAppMainLoop(appContext, &accessXClient);
551N/A
551N/A return(0L);
551N/A}