use the cached method id's to improve performance.
[AROS.git] / rom / intuition / setprefs.c
blob3d87fe38a0bd2bdbdfa6aa77b886a8568767af7b
1 /*
2 Copyright © 1995-2013, The AROS Development Team. All rights reserved.
3 Copyright © 2001-2013, The MorphOS Development Team. All Rights Reserved.
4 $Id$
5 */
7 #include <proto/exec.h>
8 #include <proto/graphics.h>
9 #include "intuition_intern.h"
10 #include <intuition/preferences.h>
11 #include <devices/input.h>
12 #include <devices/inputevent.h>
13 #include <prefs/pointer.h>
15 #include <stddef.h>
17 /* Palette update is AROS addition. Keep while backporting. */
18 static void SetColors(UWORD *p, UBYTE first, UBYTE cnt, struct IntuitionBase *IntuitionBase)
20 struct Color32 *q = GetPrivIBase(IntuitionBase)->Colors;
21 UBYTE i;
23 for (i = 0; i < cnt; i++) {
24 q[i + first].red = ((p[i] >> 8) & 0x0F) * 0x11111111;
25 q[i + first].green = ((p[i] >> 4) & 0x0F) * 0x11111111;
26 q[i + first].blue = (p[i] & 0x0F) * 0x11111111;
30 /*****************************************************************************
32 NAME */
33 #include <proto/intuition.h>
35 AROS_LH3(struct Preferences *, SetPrefs,
37 /* SYNOPSIS */
38 AROS_LHA(struct Preferences * , prefbuffer, A0),
39 AROS_LHA(LONG , size, D0),
40 AROS_LHA(BOOL , inform, D1),
42 /* LOCATION */
43 struct IntuitionBase *, IntuitionBase, 54, Intuition)
45 /* FUNCTION
46 Sets the current Preferences structure.
48 INPUTS
49 prefbuffer - The buffer which contains your settings for the
50 preferences.
51 size - The number of bytes of the buffer you want to be copied.
52 inform - If TRUE, all windows with IDCMP_NEWPREFS IDCMPFlags set
53 get an IDCMP_NEWPREFS message.
55 RESULT
56 Returns your parameter buffer.
58 NOTES
60 EXAMPLE
62 BUGS
64 SEE ALSO
65 GetDefPrefs(), GetPrefs()
67 INTERNALS
69 *****************************************************************************/
71 AROS_LIBFUNC_INIT
73 DEBUG_SETPREFS(dprintf("SetPrefs: Buffer 0x%p Size 0x%d Inform %d\n", prefbuffer, size, inform));
74 if (size > 0 && NULL != prefbuffer)
76 ULONG lock = LockIBase(0);
77 BOOL changepointer = FALSE;
79 if (size > offsetof(struct Preferences, PointerMatrix))
81 if (memcmp(&prefbuffer->PointerMatrix,&GetPrivIBase(IntuitionBase)->ActivePreferences.PointerMatrix,POINTERSIZE) != 0)
82 changepointer = TRUE;
85 if (size > offsetof(struct Preferences, color17))
87 if (memcmp(&prefbuffer->color17, &GetPrivIBase(IntuitionBase)->ActivePreferences.color17, sizeof(UWORD) * 3) != 0)
88 changepointer = TRUE;
91 CopyMem(prefbuffer,
92 &GetPrivIBase(IntuitionBase)->ActivePreferences,
93 size <= sizeof(struct Preferences) ? size : sizeof(struct Preferences));
95 UnlockIBase(lock);
97 DEBUG_SETPREFS(dprintf("SetPrefs: DoubleClick %ld.%ld\n",
98 GetPrivIBase(IntuitionBase)->ActivePreferences.DoubleClick.tv_secs,
99 GetPrivIBase(IntuitionBase)->ActivePreferences.DoubleClick.tv_micro));
101 if (GetPrivIBase(IntuitionBase)->InputIO)
103 struct timerequest req =
105 {{{0}, 0}, 0},
106 {{0}}
109 if (size > offsetof(struct Preferences, KeyRptDelay))
111 #ifdef __MORPHOS__
112 /* No need to setup a reply port, this command is guaranteed to support
113 * quick I/O.
115 #else
116 struct MsgPort *port = CreateMsgPort();
118 if (port)
120 req.tr_node.io_Message.mn_ReplyPort = port;
122 #endif
123 DEBUG_SETPREFS(dprintf("SetPrefs: KeyRptDelay %ld secs micros %ld\n",
124 GetPrivIBase(IntuitionBase)->ActivePreferences.KeyRptDelay.tv_secs,
125 GetPrivIBase(IntuitionBase)->ActivePreferences.KeyRptDelay.tv_micro));
126 req.tr_node.io_Device = GetPrivIBase(IntuitionBase)->InputIO->io_Device;
127 req.tr_node.io_Unit = GetPrivIBase(IntuitionBase)->InputIO->io_Unit;
128 req.tr_node.io_Command = IND_SETTHRESH;
129 req.tr_time = GetPrivIBase(IntuitionBase)->ActivePreferences.KeyRptDelay;
130 DoIO(&req.tr_node);
132 #ifndef __MORPHOS__
133 DeleteMsgPort(port);
135 #endif
138 if (size > offsetof(struct Preferences, KeyRptSpeed))
140 #ifdef __MORPHOS__
141 /* No need to setup a reply port, this command is guaranteed to support
142 * quick I/O.
143 * TODO: Implement the same for AROS, useful.
145 #else
146 struct MsgPort *port = CreateMsgPort();
148 if (port)
150 req.tr_node.io_Message.mn_ReplyPort = port;
151 #endif
153 DEBUG_SETPREFS(dprintf("SetPrefs: KeyRptSpeed secs %ld micros %ld\n",
154 GetPrivIBase(IntuitionBase)->ActivePreferences.KeyRptSpeed.tv_secs,
155 GetPrivIBase(IntuitionBase)->ActivePreferences.KeyRptSpeed.tv_micro));
157 req.tr_node.io_Device = GetPrivIBase(IntuitionBase)->InputIO->io_Device;
158 req.tr_node.io_Unit = GetPrivIBase(IntuitionBase)->InputIO->io_Unit;
159 req.tr_node.io_Command = IND_SETPERIOD;
160 req.tr_time = GetPrivIBase(IntuitionBase)->ActivePreferences.KeyRptSpeed;
161 DoIO(&req.tr_node);
163 #ifndef __MORPHOS__
164 DeleteMsgPort(port);
166 #endif
169 else
171 DEBUG_SETPREFS(dprintf("SetPrefs: no InputIO..don't set Key prefs\n"));
174 if (changepointer)
176 Object *pointer;
178 SetColors(&GetPrivIBase(IntuitionBase)->ActivePreferences.color17, 8, 3, IntuitionBase);
179 pointer = MakePointerFromPrefs(IntuitionBase, &GetPrivIBase(IntuitionBase)->ActivePreferences);
180 if (pointer)
182 InstallPointer(IntuitionBase, WBP_NORMAL, &GetPrivIBase(IntuitionBase)->DefaultPointer, pointer);
185 if (size > offsetof(struct Preferences, color3))
186 SetColors(&GetPrivIBase(IntuitionBase)->ActivePreferences.color0, 0, 4, IntuitionBase);
189 ** If inform == TRUE then notify all windows that want to know about
190 ** an update on the preferences.
191 ** Do that by creating an inputevent, that will be handled by our
192 ** handler and converted to idcmp messages, as well as by all other
193 ** input handlers (not sure it should be that way, but that shouldn't
194 ** do any harm).
197 if (inform)
199 struct MsgPort *port = CreateMsgPort();
201 DEBUG_SETPREFS(dprintf("SetPrefs: Send NEWPREFS event\n"));
203 if (port)
205 struct InputEvent ie;
206 struct IOStdReq req;
208 ie.ie_NextEvent = NULL;
209 ie.ie_Class = IECLASS_NEWPREFS;
210 ie.ie_SubClass = 0;
211 ie.ie_Code = 0;
212 ie.ie_Qualifier = 0;
213 ie.ie_EventAddress = NULL;
215 req.io_Message.mn_ReplyPort = port;
216 req.io_Device = GetPrivIBase(IntuitionBase)->InputIO->io_Device;
217 req.io_Unit = GetPrivIBase(IntuitionBase)->InputIO->io_Unit;
218 req.io_Command = IND_WRITEEVENT;
219 req.io_Length = sizeof(ie);
220 req.io_Data = &ie;
222 DoIO((struct IORequest *)&req);
224 DeleteMsgPort(port);
229 /* TODO: Is there any further immediate action to be taken when the prefences are updated? */
231 return prefbuffer;
233 AROS_LIBFUNC_EXIT
234 } /* SetPrefs() */