vfs: check userland buffers before reading them.
[haiku.git] / src / preferences / appearance / MenuView.cpp
blobbbce4fa79ade7fcd54b160929feb9da0f90bb7c9
1 /*
2 * Copyright 2005-2008, Haiku Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
5 * Authors:
6 * <unknown, please fill in who knows>
7 */
9 #include "MenuView.h"
10 #include <Roster.h>
11 #include <Message.h>
12 #include <stdio.h>
13 #include <malloc.h>
15 #define TOGGLE_TRIGGERS 'tgtr'
16 #define ALT_COMMAND 'acmd'
17 #define CTRL_COMMAND 'ccmd'
18 #define SET_FONT_SIZE 'sfsz'
19 #define SET_DEFAULTS 'sdef'
20 #define REVERT_SETTINGS 'rvst'
23 MenuView::MenuView(BRect frame, const char *name, int32 resize, int32 flags)
24 : BView(frame, name, resize, flags)
26 SetViewUIColor(B_PANEL_BACKGROUND_COLOR);
28 get_menu_info(&menuinfo);
29 revertinfo = menuinfo;
30 revert = false;
32 fontmenu = new FontMenu;
33 fontmenu->SetLabelFromMarked(true);
34 fontmenu->GetFonts();
35 fontmenu->Update();
37 fontsizemenu = new BMenu("");
38 fontsizemenu->SetLabelFromMarked(true);
40 BMenuItem *item;
41 BMessage *msg;
43 msg = new BMessage(SET_FONT_SIZE);
44 msg->AddInt32("size", 10);
45 item = new BMenuItem("10", msg);
46 fontsizemenu->AddItem(item);
48 msg = new BMessage(SET_FONT_SIZE);
49 msg->AddInt32("size", 11);
50 item = new BMenuItem("11", msg);
51 fontsizemenu->AddItem(item);
53 msg = new BMessage(SET_FONT_SIZE);
54 msg->AddInt32("size", 12);
55 item = new BMenuItem("12", msg);
56 fontsizemenu->AddItem(item);
58 msg = new BMessage(SET_FONT_SIZE);
59 msg->AddInt32("size", 14);
60 item = new BMenuItem("14", msg);
61 fontsizemenu->AddItem(item);
63 msg = new BMessage(SET_FONT_SIZE);
64 msg->AddInt32("size", 18);
65 item = new BMenuItem("18", msg);
66 fontsizemenu->AddItem(item);
68 msg = new BMessage(SET_FONT_SIZE);
69 msg->AddInt32("size", 20);
70 item = new BMenuItem("20", msg);
71 fontsizemenu->AddItem(item);
73 msg = new BMessage(SET_FONT_SIZE);
74 msg->AddInt32("size", 22);
75 item = new BMenuItem("22", msg);
76 fontsizemenu->AddItem(item);
78 msg = new BMessage(SET_FONT_SIZE);
79 msg->AddInt32("size", 24);
80 item = new BMenuItem("24", msg);
81 fontsizemenu->AddItem(item);
83 switch((int32)menuinfo.font_size)
85 case 10:
86 item = fontsizemenu->FindItem("10");
87 break;
89 case 11:
90 item = fontsizemenu->FindItem("11");
91 break;
93 case 12:
94 item = fontsizemenu->FindItem("12");
95 break;
97 case 14:
98 item = fontsizemenu->FindItem("14");
99 break;
101 case 18:
102 item = fontsizemenu->FindItem("18");
103 break;
105 case 20:
106 item = fontsizemenu->FindItem("20");
107 break;
109 case 22:
110 item = fontsizemenu->FindItem("22");
111 break;
113 case 24:
114 item = fontsizemenu->FindItem("24");
115 break;
117 default:
119 char fontsizestr[10];
120 sprintf(fontsizestr, "%ld", (int32)menuinfo.font_size);
121 msg = new BMessage(SET_FONT_SIZE);
122 msg->AddInt32("size", (int32)menuinfo.font_size);
123 item = new BMenuItem(fontsizestr,msg);
124 fontsizemenu->AddItem(item);
125 break;
128 item->SetMarked(true);
130 BRect r(10, 10, 210, 40);
131 r.OffsetTo((Bounds().Width() - r.Width()) / 2, 10);
132 fontfield=new BMenuField(r, "fontfield", "", fontmenu);
133 fontfield->SetLabel("Font:");
134 fontfield->SetDivider(StringWidth("Font:") + 5);
135 AddChild(fontfield);
137 r.OffsetTo((Bounds().Width() - r.Width()) / 2, fontfield->Frame().bottom + 10);
138 fontsizefield=new BMenuField(r, "fontsizefield", "", fontsizemenu);
139 fontsizefield->SetLabel("Font Size:");
140 fontsizefield->SetDivider(StringWidth("Font Size:") + 5);
141 AddChild(fontsizefield);
143 r.OffsetTo(10, fontsizefield->Frame().bottom + 10);
144 r.right += 20;
145 showtriggers = new BCheckBox(r, "showtriggers", "Always Show Triggers",
146 new BMessage(TOGGLE_TRIGGERS));
147 showtriggers->ResizeToPreferred();
148 showtriggers->MoveTo((Bounds().Width() - showtriggers->Bounds().Width()) / 2, r.top);
149 AddChild(showtriggers);
150 if (menuinfo.triggers_always_shown)
151 showtriggers->SetValue(B_CONTROL_ON);
153 r.bottom = r.top + 75;
154 r.OffsetTo((Bounds().Width() - r.Width()) / 2, showtriggers->Frame().bottom + 10);
155 BBox *radiobox = new BBox(r, "radiobox");
156 radiobox->SetLabel("Shortcut Key");
157 AddChild(radiobox);
159 r.Set(10, 20, 50, 30);
160 altcmd = new BRadioButton(r, "altcommand", "Alt", new BMessage(ALT_COMMAND));
161 altcmd->ResizeToPreferred();
162 radiobox->AddChild(altcmd);
164 r.OffsetBy(0, 25);
165 ctrlcmd = new BRadioButton(r, "ctrlcommand", "Control", new BMessage(CTRL_COMMAND));
166 ctrlcmd->ResizeToPreferred();
167 radiobox->AddChild(ctrlcmd);
169 MarkCommandKey();
170 revertaltcmd = altcommand;
172 defaultsbutton = new BButton(r, "defaultsbutton", "Defaults", new BMessage(SET_DEFAULTS));
173 defaultsbutton->ResizeToPreferred();
175 revertbutton = new BButton(r, "revertbutton", "Revert", new BMessage(REVERT_SETTINGS));
176 revertbutton->ResizeToPreferred();
178 defaultsbutton->MoveTo( (Bounds().Width() -
179 (defaultsbutton->Bounds().Width() + revertbutton->Bounds().Width() + 10)) / 2,
180 radiobox->Frame().bottom + 20);
181 revertbutton->MoveTo(defaultsbutton->Frame().right + 10, radiobox->Frame().bottom + 20);
183 AddChild(defaultsbutton);
184 AddChild(revertbutton);
185 revertbutton->SetEnabled(false);
189 MenuView::~MenuView(void)
194 void
195 MenuView::AttachedToWindow(void)
197 for(int32 i = 0; i < fontmenu->CountItems(); i++) {
198 BMenu *menu = fontmenu->SubmenuAt(i);
199 if (menu)
200 menu->SetTargetForItems(this);
202 fontmenu->SetTargetForItems(this);
203 fontsizemenu->SetTargetForItems(this);
204 showtriggers->SetTarget(this);
205 altcmd->SetTarget(this);
206 ctrlcmd->SetTarget(this);
207 defaultsbutton->SetTarget(this);
208 revertbutton->SetTarget(this);
212 void
213 MenuView::MessageReceived(BMessage *msg)
215 switch(msg->what) {
216 case B_MODIFIERS_CHANGED:
217 MarkCommandKey();
218 break;
220 case MENU_FONT_FAMILY:
221 case MENU_FONT_STYLE:
223 if (!revert)
224 revertbutton->SetEnabled(true);
225 revert = true;
226 font_family *family;
227 msg->FindPointer("family", (void**)&family);
228 font_style *style;
229 msg->FindPointer("style", (void**)&style);
230 menuinfo.f_family = *family;
231 menuinfo.f_style = *style;
232 set_menu_info(&menuinfo);
234 fontmenu->Update();
235 break;
237 case SET_FONT_SIZE:
239 if (!revert)
240 revertbutton->SetEnabled(true);
241 revert=true;
242 int32 size;
243 msg->FindInt32("size", &size);
244 menuinfo.font_size = size;
245 set_menu_info(&menuinfo);
246 fontmenu->Update();
247 break;
249 case ALT_COMMAND:
250 if (!revert)
251 revertbutton->SetEnabled(true);
252 revert = true;
253 altcommand = true;
254 SetCommandKey(altcommand);
255 break;
257 case CTRL_COMMAND:
258 if (!revert)
259 revertbutton->SetEnabled(true);
260 revert = true;
261 altcommand = false;
262 SetCommandKey(altcommand);
263 break;
265 case TOGGLE_TRIGGERS:
266 if (!revert)
267 revertbutton->SetEnabled(true);
268 revert = true;
269 menuinfo.triggers_always_shown = (showtriggers->Value() == B_CONTROL_ON);
270 set_menu_info(&menuinfo);
271 break;
273 case REVERT_SETTINGS:
274 revert = false;
275 revertbutton->SetEnabled(false);
276 SetCommandKey(revertaltcmd);
277 altcommand = revertaltcmd;
278 MarkCommandKey();
279 menuinfo = revertinfo;
280 fontmenu->Update();
281 showtriggers->SetValue(menuinfo.triggers_always_shown ? B_CONTROL_ON : B_CONTROL_OFF);
282 set_menu_info(&revertinfo);
283 break;
285 case SET_DEFAULTS:
286 if (!revert)
287 revertbutton->SetEnabled(true);
288 revert = true;
290 menuinfo.triggers_always_shown = false;
291 menuinfo.font_size = 12.0;
292 sprintf(menuinfo.f_family, "%s", "Swis721 BT");
293 sprintf(menuinfo.f_style, "%s", "Roman");
294 set_menu_info(&menuinfo);
296 fontmenu->Update();
297 altcommand = true;
298 SetCommandKey(altcommand);
299 MarkCommandKey();
300 showtriggers->SetValue(menuinfo.triggers_always_shown ? B_CONTROL_ON : B_CONTROL_OFF);
301 break;
303 default:
304 BView::MessageReceived(msg);
305 break;
310 void
311 MenuView::MarkCommandKey(void)
313 key_map *keys;
314 char *chars;
316 get_key_map(&keys, &chars);
318 bool altAsShortcut = (keys->left_command_key == 0x5d)
319 && (keys->left_control_key == 0x5c);
321 free(chars);
322 free(keys);
324 if (altAsShortcut)
325 altcmd->SetValue(B_CONTROL_ON);
326 else
327 ctrlcmd->SetValue(B_CONTROL_ON);
331 void
332 MenuView::SetCommandKey(bool useAlt)
334 if (useAlt) {
335 set_modifier_key(B_LEFT_COMMAND_KEY, 0x5d);
336 set_modifier_key(B_LEFT_CONTROL_KEY, 0x5c);
337 } else {
338 set_modifier_key(B_LEFT_COMMAND_KEY, 0x5c);
339 set_modifier_key(B_LEFT_CONTROL_KEY, 0x5d);
341 be_roster->Broadcast(new BMessage(B_MODIFIERS_CHANGED));