2 Copyright © 1995-2013, The AROS Development Team. All rights reserved.
3 Copyright © 2001-2013, The MorphOS Development Team. All Rights Reserved.
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>
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
;
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 /*****************************************************************************
33 #include <proto/intuition.h>
35 AROS_LH3(struct Preferences
*, SetPrefs
,
38 AROS_LHA(struct Preferences
* , prefbuffer
, A0
),
39 AROS_LHA(LONG
, size
, D0
),
40 AROS_LHA(BOOL
, inform
, D1
),
43 struct IntuitionBase
*, IntuitionBase
, 54, Intuition
)
46 Sets the current Preferences structure.
49 prefbuffer - The buffer which contains your settings for the
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.
56 Returns your parameter buffer.
65 GetDefPrefs(), GetPrefs()
69 *****************************************************************************/
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)
85 if (size
> offsetof(struct Preferences
, color17
))
87 if (memcmp(&prefbuffer
->color17
, &GetPrivIBase(IntuitionBase
)->ActivePreferences
.color17
, sizeof(UWORD
) * 3) != 0)
92 &GetPrivIBase(IntuitionBase
)->ActivePreferences
,
93 size
<= sizeof(struct Preferences
) ? size
: sizeof(struct Preferences
));
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
=
109 if (size
> offsetof(struct Preferences
, KeyRptDelay
))
112 /* No need to setup a reply port, this command is guaranteed to support
116 struct MsgPort
*port
= CreateMsgPort();
120 req
.tr_node
.io_Message
.mn_ReplyPort
= port
;
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
;
138 if (size
> offsetof(struct Preferences
, KeyRptSpeed
))
141 /* No need to setup a reply port, this command is guaranteed to support
143 * TODO: Implement the same for AROS, useful.
146 struct MsgPort
*port
= CreateMsgPort();
150 req
.tr_node
.io_Message
.mn_ReplyPort
= port
;
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
;
171 DEBUG_SETPREFS(dprintf("SetPrefs: no InputIO..don't set Key prefs\n"));
178 SetColors(&GetPrivIBase(IntuitionBase
)->ActivePreferences
.color17
, 8, 3, IntuitionBase
);
179 pointer
= MakePointerFromPrefs(IntuitionBase
, &GetPrivIBase(IntuitionBase
)->ActivePreferences
);
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
199 struct MsgPort
*port
= CreateMsgPort();
201 DEBUG_SETPREFS(dprintf("SetPrefs: Send NEWPREFS event\n"));
205 struct InputEvent ie
;
208 ie
.ie_NextEvent
= NULL
;
209 ie
.ie_Class
= IECLASS_NEWPREFS
;
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
);
222 DoIO((struct IORequest
*)&req
);
229 /* TODO: Is there any further immediate action to be taken when the prefences are updated? */