Hint added.
[AROS.git] / workbench / c / iprefs / inputprefs.c
blob7260c2749d609abba14c6df2984804d9a933bf12
1 /*
2 Copyright © 1995-2011, The AROS Development Team. All rights reserved.
3 $Id$
5 Desc:
6 Lang: English
7 */
9 /*********************************************************************************************/
11 #include "global.h"
13 #include <prefs/prefhdr.h>
14 #include <prefs/input.h>
15 #include <devices/input.h>
16 #include <devices/keymap.h>
18 #include <string.h>
20 #define DEBUG 0
21 #include <aros/debug.h>
23 /*********************************************************************************************/
25 struct FileInputPrefs
27 char ip_Keymap[16];
28 UBYTE ip_PointerTicks[2];
29 UBYTE ip_DoubleClick_secs[4];
30 UBYTE ip_DoubleClick_micro[4];
31 UBYTE ip_KeyRptDelay_secs[4];
32 UBYTE ip_KeyRptDelay_micro[4];
33 UBYTE ip_KeyRptSpeed_secs[4];
34 UBYTE ip_KeyRptSpeed_micro[4];
35 UBYTE ip_MouseAccel[2];
36 UBYTE ip_ClassicKeyboard[4];
37 char ip_KeymapName[64];
38 UBYTE ip_SwitchMouseButtons[4];
41 /*********************************************************************************************/
43 static LONG stopchunks[] =
45 ID_PREF, ID_INPT,
46 ID_PREF, ID_KMSW
49 /*********************************************************************************************/
51 static void SetInputPrefs(struct FileInputPrefs *prefs)
53 struct KeyMapNode *kmn;
54 struct Preferences p;
55 struct IOStdReq ioreq;
57 char *keymap = prefs->ip_KeymapName;
59 if (!keymap[0])
60 keymap = prefs->ip_Keymap;
61 D(bug("[InputPrefs] Keymap name: %s\n", keymap));
63 kmn = OpenKeymap(keymap);
64 if (kmn)
65 SetKeyMapDefault(&kmn->kn_KeyMap);
67 GetPrefs(&p, sizeof(p));
69 #define GETLONG(x) ((x[0] << 24) | (x[1] << 16) | (x[2] << 8) | x[3])
70 #define GETWORD(x) ((x[0] << 8) | x[1])
72 p.PointerTicks = GETWORD(prefs->ip_PointerTicks);
73 p.DoubleClick.tv_secs = GETLONG(prefs->ip_DoubleClick_secs);
74 p.DoubleClick.tv_micro = GETLONG(prefs->ip_DoubleClick_micro);
75 p.KeyRptDelay.tv_secs = GETLONG(prefs->ip_KeyRptDelay_secs);
76 p.KeyRptDelay.tv_micro = GETLONG(prefs->ip_KeyRptDelay_micro);
77 p.KeyRptSpeed.tv_secs = GETLONG(prefs->ip_KeyRptSpeed_secs);
78 p.KeyRptSpeed.tv_micro = GETLONG(prefs->ip_KeyRptSpeed_micro);
79 if (GETWORD(prefs->ip_MouseAccel))
81 p.EnableCLI |= MOUSE_ACCEL;
83 else
85 p.EnableCLI &= ~MOUSE_ACCEL;
88 SetPrefs(&p, sizeof(p), FALSE);
90 memset(&ioreq, 0, sizeof(ioreq));
91 ioreq.io_Message.mn_Length = sizeof(ioreq);
93 if (!OpenDevice("input.device", 0, (struct IORequest *)&ioreq, 0))
95 struct InputDevice *InputBase = (struct InputDevice *)ioreq.io_Device;
97 D(bug("[InputPrefs] Opened input.device v%d.%d\n", InputBase->id_Device.dd_Library.lib_Version,
98 InputBase->id_Device.dd_Library.lib_Revision));
99 /* AROS input.device support this since v41.3 */
100 if ((InputBase->id_Device.dd_Library.lib_Version >= 41) &&
101 (InputBase->id_Device.dd_Library.lib_Revision >= 3))
103 InputBase->id_Flags = prefs->ip_SwitchMouseButtons[3] ? IDF_SWAP_BUTTONS : 0;
104 D(bug("[InputPrefs] Flags set to 0x%08lX\n", InputBase->id_Flags));
107 CloseDevice((struct IORequest *)&ioreq);
111 /*********************************************************************************************/
113 void InputPrefs_Handler(STRPTR filename)
115 struct IFFHandle *iff;
117 D(bug("In IPrefs:InputPrefs_Handler\n"));
119 if ((iff = CreateIFF(filename, stopchunks, 2)))
122 * Disable keymap switcher.
123 * It will stay disabled if the file does not contain KMSW chunk.
124 * This is done for backwards compatibility.
126 KMSBase->kms_SwitchQual = KMS_QUAL_DISABLE;
128 while(ParseIFF(iff, IFFPARSE_SCAN) == 0)
130 struct ContextNode *cn;
131 struct FileInputPrefs *inputprefs;
132 struct KMSPrefs *kmsprefs;
134 D(bug("InputPrefs_Handler: ParseIFF okay\n"));
135 cn = CurrentChunk(iff);
137 switch (cn->cn_ID)
139 case ID_INPT:
140 D(bug("InputPrefs_Handler: INPT chunk\n"));
142 inputprefs = LoadChunk(iff, sizeof(struct FileInputPrefs), MEMF_ANY);
143 if (inputprefs)
145 SetInputPrefs(inputprefs);
146 FreeVec(inputprefs);
148 break;
150 case ID_KMSW:
151 D(bug("InputPrefs_Handler: KMSW chunk\n"));
153 kmsprefs = LoadChunk(iff, sizeof(struct KMSPrefs), MEMF_ANY);
154 if (kmsprefs)
156 if (kmsprefs->kms_Enabled)
158 struct KeyMapNode *alt_km = OpenKeymap(kmsprefs->kms_AltKeymap);
160 if (alt_km)
162 KMSBase->kms_SwitchQual = AROS_BE2WORD(kmsprefs->kms_SwitchQual);
163 KMSBase->kms_SwitchCode = AROS_BE2WORD(kmsprefs->kms_SwitchCode);
164 KMSBase->kms_AltKeymap = &alt_km->kn_KeyMap;
168 FreeVec(kmsprefs);
170 break;
172 } /* while(ParseIFF(iff, IFFPARSE_SCAN) == 0) */
174 KillIFF(iff);
176 } /* if ((iff = CreateIFF(filename))) */
179 D(bug("In IPrefs:InputPrefs_Handler. Done.\n", filename));
182 /*********************************************************************************************/