155
static void add_shortcuts(Gtk::MenuItem* menu_item,
156
const std::vector<std::string> &modifiers,
157
const std::vector<std::string> &shortcuts)
159
std::string modifier;
161
for (std::vector<std::string>::const_iterator iter = modifiers.begin(); iter != modifiers.end(); ++iter)
163
std::string current_modifier = *iter;
164
std::transform(current_modifier.begin(), current_modifier.end(), current_modifier.begin(), (int(*)(int))std::tolower);
166
if (current_modifier == "modifier")
167
current_modifier = "control";
169
modifier += "<" + current_modifier + ">";
173
for (std::vector<std::string>::const_iterator iter = shortcuts.begin(); iter != shortcuts.end(); ++iter)
175
std::string shortcut = modifier + *iter;
176
Gdk::ModifierType accel_mods = (Gdk::ModifierType)0;
179
Gtk::AccelGroup::parse(shortcut, accel_key, accel_mods);
182
menu_item->add_accelerator("activate", accel_group, accel_key, accel_mods, Gtk::ACCEL_VISIBLE);
184
log_error("Accelerator key not found for %s.\n", shortcut.c_str());
155
189
//------------------------------------------------------------------------------
156
190
void mforms::gtk::MenuItemImpl::set_shortcut(mforms::MenuItem *item, const std::string& item_shortcut)
158
if (!item_shortcut.empty())
160
Gdk::ModifierType accel_mods = (Gdk::ModifierType)0;
163
// convert the accelerator format from Control+X to <control>x which is recognized by gtk
164
std::vector<std::string> parts(base::split(item_shortcut, "+"));
166
if (parts.size() > 0)
168
std::string shortcut = parts.back();
171
if (shortcut == "Space")
173
else if (shortcut == "PageUp")
174
shortcut = "Page_Up";
175
else if (shortcut == "PageDown")
176
shortcut = "Page_Down";
177
else if (shortcut == "Slash")
179
else if (shortcut == "Minus")
181
else if (shortcut == "Plus")
184
while (parts.size() > 0)
186
std::string mod = parts.back();
188
std::transform(mod.begin(), mod.end(), mod.begin(), (int(*)(int))std::tolower);
189
if ("modifier" == mod)
191
shortcut = "<"+mod+">"+shortcut;
194
if (!shortcut.empty())
195
Gtk::AccelGroup::parse(shortcut, accel_key, accel_mods);
198
Gtk::MenuItem* mi = cast<Gtk::MenuItem*>(item->get_data_ptr());
199
if (accel_key != 0 && mi)
202
mi->add_accelerator("activate", accel_group, accel_key, accel_mods, Gtk::ACCEL_VISIBLE);
204
log_error("AccelGroup was not set for menubar\n");
192
if (item_shortcut.empty())
194
log_warning("Shortcut is empty\n");
198
Gtk::MenuItem* menu_item = cast<Gtk::MenuItem*>(item->get_data_ptr());
200
if (menu_item == NULL)
202
log_error("Menu item was not defined (%s)\n", item_shortcut.c_str());
206
if (accel_group == 0)
208
log_error("AccelGroup was not set for menubar (%s)\n", item_shortcut.c_str());
212
// convert the accelerator format from Control+X to <control>x which is recognized by gtk
213
std::vector<std::string> parts(base::split(item_shortcut, "+"));
215
std::vector<std::string> keys;
216
std::string key = parts.back();
220
keys.push_back("space");
221
else if (key == "PageUp")
223
keys.push_back("Page_Up");
224
keys.push_back("KP_Page_Up");
226
else if (key == "PageDown")
228
keys.push_back("Page_Down");
229
keys.push_back("KP_Page_Down");
231
else if (key == "Slash")
233
keys.push_back("slash");
234
keys.push_back("KP_Divide");
236
else if (key == "Minus")
238
keys.push_back("minus");
239
keys.push_back("KP_Subtract");
241
else if (key == "Plus")
243
keys.push_back("plus");
244
keys.push_back("KP_Add");
246
else if (key == "Asterisk")
248
keys.push_back("multiply");
249
keys.push_back("KP_Multiply");
251
else if (key == "Period")
253
keys.push_back("period");
254
keys.push_back("KP_Decimal");
256
else if (key == "Return")
258
keys.push_back("Return");
259
keys.push_back("KP_Enter");
261
else if (key == "Home")
263
keys.push_back("Home");
264
keys.push_back("KP_Home");
266
else if (key == "End")
268
keys.push_back("End");
269
keys.push_back("KP_End");
271
else if (key == "Insert")
273
keys.push_back("Insert");
274
keys.push_back("KP_Insert");
276
else if (key == "Delete")
278
keys.push_back("Delete");
279
keys.push_back("KP_Delete");
281
else if (key == "Up")
283
keys.push_back("Up");
284
keys.push_back("KP_Up");
286
else if (key == "Down")
288
keys.push_back("Down");
289
keys.push_back("KP_Down");
291
else if (key == "Left")
293
keys.push_back("Left");
294
keys.push_back("KP_Left");
296
else if (key == "Right")
298
keys.push_back("Right");
299
keys.push_back("KP_Right");
304
keys.push_back("KP_0");
309
keys.push_back("KP_1");
314
keys.push_back("KP_2");
319
keys.push_back("KP_3");
324
keys.push_back("KP_4");
329
keys.push_back("KP_5");
334
keys.push_back("KP_6");
339
keys.push_back("KP_7");
344
keys.push_back("KP_8");
349
keys.push_back("KP_9");
354
add_shortcuts(menu_item, parts, keys);
209
357
//------------------------------------------------------------------------------