aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMathias Gumz <akira at fluxbox dot org>2011-02-25 10:55:06 (GMT)
committerPaul Tagliamonte <paultag@ubuntu.com>2011-11-28 19:19:13 (GMT)
commit1583beb95327e2f04fe293ce598f2714db66861b (patch)
tree32958e422a35f75ef2ae963a8c6d4de87039f671
parent2223c879bf41d2b4f40fa43db478ba1bce8523de (diff)
downloadfluxbox_paul-single-shot.zip
fluxbox_paul-single-shot.tar.bz2
first draft of the 'SingleTrigger' feature for menussingle-shot
using the type-a-head feature of the fluxbox-menu creates a number of matches (if there are any). with enabled 'SingleTrigger' the user triggers that match instantly without any further ado. a menu inherits the 'SingleTrigger' setting of its parent. new resources for .fluxbox/init: menu.window.singleTrigger: true|false menu.root.singleTrigger: true|false menu.workspace.singleTrigger: true|false
-rw-r--r--src/FbTk/Menu.cc58
-rw-r--r--src/FbTk/Menu.hh4
-rw-r--r--src/Screen.cc26
-rw-r--r--src/Screen.hh20
4 files changed, 72 insertions, 36 deletions
diff --git a/src/FbTk/Menu.cc b/src/FbTk/Menu.cc
index 40f81c8..7128152 100644
--- a/src/FbTk/Menu.cc
+++ b/src/FbTk/Menu.cc
@@ -109,7 +109,8 @@ Menu::Menu(FbTk::ThemeProxy<MenuTheme> &tm, ImageControl &imgctrl):
109 m_alignment(ALIGNDONTCARE), 109 m_alignment(ALIGNDONTCARE),
110 m_active_index(-1), 110 m_active_index(-1),
111 m_shape(0), 111 m_shape(0),
112 m_need_update(true) { 112 m_need_update(true),
113 m_single_trigger(false) {
113 // setup timers 114 // setup timers
114 115
115 RefCount<Command<void> > show_cmd(new SimpleCommand<Menu>(*this, &Menu::openSubmenu)); 116 RefCount<Command<void> > show_cmd(new SimpleCommand<Menu>(*this, &Menu::openSubmenu));
@@ -861,6 +862,10 @@ bool Menu::isItemSelectable(unsigned int index) const {
861 return (!item || !item->isEnabled()) ? false : true; 862 return (!item || !item->isEnabled()) ? false : true;
862} 863}
863 864
865bool Menu::isSingleTrigger() const {
866
867 return m_single_trigger || (parent() && parent()->isSingleTrigger());
868}
864 869
865void Menu::handleEvent(XEvent &event) { 870void Menu::handleEvent(XEvent &event) {
866 if (event.type == FocusOut) { 871 if (event.type == FocusOut) {
@@ -1123,19 +1128,7 @@ void Menu::keyPressEvent(XKeyEvent &event) {
1123 break; 1128 break;
1124 case XK_KP_Enter: 1129 case XK_KP_Enter:
1125 case XK_Return: 1130 case XK_Return:
1126 resetTypeAhead(); 1131 goto click_on_item;
1127 if (validIndex(m_active_index) &&
1128 isItemEnabled(m_active_index)) {
1129 // send fake button click
1130 int button = (event.state & ShiftMask) ? 3 : 1;
1131 if (menuitems[m_active_index]->submenu() != 0 && button == 1)
1132 enterSubmenu();
1133 else {
1134 find(m_active_index)->click(button, event.time, event.state);
1135 m_need_update = true;
1136 updateMenu();
1137 }
1138 }
1139 break; 1132 break;
1140 case XK_Tab: 1133 case XK_Tab:
1141 case XK_ISO_Left_Tab: 1134 case XK_ISO_Left_Tab:
@@ -1150,15 +1143,38 @@ void Menu::keyPressEvent(XKeyEvent &event) {
1150 drawTypeAheadItems(); 1143 drawTypeAheadItems();
1151 break; 1144 break;
1152 default: 1145 default:
1153 m_type_ahead.putCharacter(keychar[0]); 1146 {
1154 // if current item doesn't match new search string, find the next one 1147 m_type_ahead.putCharacter(keychar[0]);
1155 drawTypeAheadItems(); 1148 drawTypeAheadItems();
1156 if (!m_matches.empty() && (!validIndex(m_active_index) || 1149 // if current item doesn't match new search string, find the next one
1157 std::find(m_matches.begin(), m_matches.end(), 1150 if (!m_matches.empty() && (!validIndex(m_active_index) ||
1158 find(m_active_index)) == m_matches.end())) 1151 std::find(m_matches.begin(), m_matches.end(),
1159 cycleItems(false); 1152 find(m_active_index)) == m_matches.end()))
1153 cycleItems(false);
1154
1155 if (isSingleTrigger() && m_matches.size() == 1) {
1156 goto click_on_item;
1157 }
1158 }
1160 break; 1159 break;
1161 } 1160 }
1161 return;
1162
1163// TODO: 'goto' is just the temporary solution to this code sharing
1164click_on_item:
1165 resetTypeAhead();
1166 if (validIndex(m_active_index) &&
1167 isItemEnabled(m_active_index)) {
1168 // send fake button click
1169 int button = (event.state & ShiftMask) ? 3 : 1;
1170 if (menuitems[m_active_index]->submenu() != 0 && button == 1)
1171 enterSubmenu();
1172 else {
1173 find(m_active_index)->click(button, event.time, event.state);
1174 m_need_update = true;
1175 updateMenu();
1176 }
1177 }
1162} 1178}
1163 1179
1164void Menu::leaveNotifyEvent(XCrossingEvent &ce) { 1180void Menu::leaveNotifyEvent(XCrossingEvent &ce) {
diff --git a/src/FbTk/Menu.hh b/src/FbTk/Menu.hh
index bd830b4..114872b 100644
--- a/src/FbTk/Menu.hh
+++ b/src/FbTk/Menu.hh
@@ -91,6 +91,9 @@ public:
91 91
92 void setScreen(int x, int y, int w, int h); 92 void setScreen(int x, int y, int w, int h);
93 93
94 void setSingleTrigger(bool flag) { m_single_trigger = flag; };
95 bool isSingleTrigger() const;
96
94 /** 97 /**
95 @name event handlers 98 @name event handlers
96 */ 99 */
@@ -201,6 +204,7 @@ private:
201 Menuitems menuitems; 204 Menuitems menuitems;
202 TypeAhead<Menuitems, MenuItem *> m_type_ahead; 205 TypeAhead<Menuitems, MenuItem *> m_type_ahead;
203 Menuitems m_matches; 206 Menuitems m_matches;
207 bool m_single_trigger;
204 208
205 void resetTypeAhead(); 209 void resetTypeAhead();
206 void drawTypeAheadItems(); 210 void drawTypeAheadItems();
diff --git a/src/Screen.cc b/src/Screen.cc
index 86799da..a35a7eb 100644
--- a/src/Screen.cc
+++ b/src/Screen.cc
@@ -276,22 +276,30 @@ BScreen::ScreenResource::ScreenResource(FbTk::ResourceManager &rm,
276 auto_raise(rm, true, scrname+".autoRaise", altscrname+".AutoRaise"), 276 auto_raise(rm, true, scrname+".autoRaise", altscrname+".AutoRaise"),
277 click_raises(rm, true, scrname+".clickRaises", altscrname+".ClickRaises"), 277 click_raises(rm, true, scrname+".clickRaises", altscrname+".ClickRaises"),
278 default_deco(rm, "NORMAL", scrname+".defaultDeco", altscrname+".DefaultDeco"), 278 default_deco(rm, "NORMAL", scrname+".defaultDeco", altscrname+".DefaultDeco"),
279 tab_placement(rm, FbWinFrame::TOPLEFT, scrname+".tab.placement", altscrname+".Tab.Placement"),
280 windowmenufile(rm, Fluxbox::instance()->getDefaultDataFilename("windowmenu"), scrname+".windowMenu", altscrname+".WindowMenu"),
281 typing_delay(rm, 0, scrname+".noFocusWhileTypingDelay", altscrname+".NoFocusWhileTypingDelay"), 279 typing_delay(rm, 0, scrname+".noFocusWhileTypingDelay", altscrname+".NoFocusWhileTypingDelay"),
282 workspaces(rm, 4, scrname+".workspaces", altscrname+".Workspaces"), 280 workspaces(rm, 4, scrname+".workspaces", altscrname+".Workspaces"),
283 edge_snap_threshold(rm, 10, scrname+".edgeSnapThreshold", altscrname+".EdgeSnapThreshold"), 281 edge_snap_threshold(rm, 10, scrname+".edgeSnapThreshold", altscrname+".EdgeSnapThreshold"),
284 focused_alpha(rm, 255, scrname+".window.focus.alpha", altscrname+".Window.Focus.Alpha"), 282 focused_alpha(rm, 255, scrname+".window.focus.alpha", altscrname+".Window.Focus.Alpha"),
285 unfocused_alpha(rm, 255, scrname+".window.unfocus.alpha", altscrname+".Window.Unfocus.Alpha"), 283 unfocused_alpha(rm, 255, scrname+".window.unfocus.alpha", altscrname+".Window.Unfocus.Alpha"),
284
285 tooltip_delay(rm, 500, scrname + ".tooltipDelay", altscrname+".TooltipDelay"),
286
286 menu_alpha(rm, 255, scrname+".menu.alpha", altscrname+".Menu.Alpha"), 287 menu_alpha(rm, 255, scrname+".menu.alpha", altscrname+".Menu.Alpha"),
287 menu_delay(rm, 200, scrname + ".menuDelay", altscrname+".MenuDelay"), 288 menu_delay(rm, 200, scrname + ".menuDelay", altscrname+".MenuDelay"),
288 tab_width(rm, 64, scrname + ".tab.width", altscrname+".Tab.Width"),
289 tooltip_delay(rm, 500, scrname + ".tooltipDelay", altscrname+".TooltipDelay"),
290 allow_remote_actions(rm, false, scrname+".allowRemoteActions", altscrname+".AllowRemoteActions"),
291 clientmenu_use_pixmap(rm, true, scrname+".clientMenu.usePixmap", altscrname+".ClientMenu.UsePixmap"), 289 clientmenu_use_pixmap(rm, true, scrname+".clientMenu.usePixmap", altscrname+".ClientMenu.UsePixmap"),
290 windowmenufile(rm, Fluxbox::instance()->getDefaultDataFilename("windowmenu"), scrname+".windowMenu", altscrname+".WindowMenu"),
291 windowmenu_singletrigger(rm, false, scrname+".menu.window.singleTrigger", altscrname+".Menu.Window.SingleTrigger"),
292 rootmenu_singletrigger(rm, false, scrname+".menu.root.singleTrigger", altscrname+".Menu.Root.SingleTrigger"),
293 workspacemenu_singletrigger(rm, false, scrname+".menu.workspace.singleTrigger", altscrname+".Menu.Workspace.SingleTrigger"),
294
295 tab_placement(rm, FbWinFrame::TOPLEFT, scrname+".tab.placement", altscrname+".Tab.Placement"),
296 tab_width(rm, 64, scrname + ".tab.width", altscrname+".Tab.Width"),
292 tabs_use_pixmap(rm, true, scrname+".tabs.usePixmap", altscrname+".Tabs.UsePixmap"), 297 tabs_use_pixmap(rm, true, scrname+".tabs.usePixmap", altscrname+".Tabs.UsePixmap"),
293 max_over_tabs(rm, false, scrname+".tabs.maxOver", altscrname+".Tabs.MaxOver"), 298 max_over_tabs(rm, false, scrname+".tabs.maxOver", altscrname+".Tabs.MaxOver"),
294 default_internal_tabs(rm, true /* TODO: autoconf option? */ , scrname+".tabs.intitlebar", altscrname+".Tabs.InTitlebar") { 299 default_internal_tabs(rm, true /* TODO: autoconf option? */ , scrname+".tabs.intitlebar", altscrname+".Tabs.InTitlebar"),
300
301 allow_remote_actions(rm, false, scrname+".allowRemoteActions", altscrname+".AllowRemoteActions")
302{
295 303
296 304
297} 305}
@@ -335,8 +343,7 @@ BScreen::BScreen(FbTk::ResourceManager &rm,
335 // TODO fluxgen: check if this is the right place (it was not -lis) 343 // TODO fluxgen: check if this is the right place (it was not -lis)
336 // 344 //
337 // Create the first one, initXinerama will expand this if needed. 345 // Create the first one, initXinerama will expand this if needed.
338 m_head_areas.resize(1); 346 m_head_areas.push_back(new HeadArea());
339 m_head_areas[0] = new HeadArea();
340 347
341 initXinerama(); 348 initXinerama();
342 349
@@ -1413,8 +1420,11 @@ void BScreen::reassociateWindow(FluxboxWindow *w, unsigned int wkspc_id,
1413 1420
1414void BScreen::initMenus() { 1421void BScreen::initMenus() {
1415 m_workspacemenu.reset(MenuCreator::createMenuType("workspacemenu", screenNumber())); 1422 m_workspacemenu.reset(MenuCreator::createMenuType("workspacemenu", screenNumber()));
1423 m_workspacemenu->setSingleTrigger(*resource.workspacemenu_singletrigger);
1416 m_rootmenu->reloadHelper()->setMainFile(Fluxbox::instance()->getMenuFilename()); 1424 m_rootmenu->reloadHelper()->setMainFile(Fluxbox::instance()->getMenuFilename());
1425 m_rootmenu->setSingleTrigger(*resource.rootmenu_singletrigger);
1417 m_windowmenu->reloadHelper()->setMainFile(windowMenuFilename()); 1426 m_windowmenu->reloadHelper()->setMainFile(windowMenuFilename());
1427 m_windowmenu->setSingleTrigger(*resource.windowmenu_singletrigger);
1418} 1428}
1419 1429
1420 1430
diff --git a/src/Screen.hh b/src/Screen.hh
index de3a5a1..52b075b 100644
--- a/src/Screen.hh
+++ b/src/Screen.hh
@@ -517,19 +517,25 @@ private:
517 max_ignore_inc, max_disable_move, max_disable_resize, 517 max_ignore_inc, max_disable_move, max_disable_resize,
518 workspace_warping, show_window_pos, auto_raise, click_raises; 518 workspace_warping, show_window_pos, auto_raise, click_raises;
519 FbTk::Resource<std::string> default_deco; 519 FbTk::Resource<std::string> default_deco;
520 FbTk::Resource<FbWinFrame::TabPlacement> tab_placement;
521 FbTk::Resource<std::string> windowmenufile;
522 FbTk::Resource<unsigned int> typing_delay; 520 FbTk::Resource<unsigned int> typing_delay;
523 FbTk::Resource<int> workspaces, edge_snap_threshold, focused_alpha, 521 FbTk::Resource<int> workspaces, edge_snap_threshold,
524 unfocused_alpha, menu_alpha, menu_delay, 522 focused_alpha, unfocused_alpha, tooltip_delay;
525 tab_width, tooltip_delay; 523
526 FbTk::Resource<bool> allow_remote_actions; 524 FbTk::Resource<int> menu_alpha;
525 FbTk::Resource<int> menu_delay;
527 FbTk::Resource<bool> clientmenu_use_pixmap; 526 FbTk::Resource<bool> clientmenu_use_pixmap;
527 FbTk::Resource<std::string> windowmenufile;
528 FbTk::Resource<bool> windowmenu_singletrigger;
529 FbTk::Resource<bool> rootmenu_singletrigger;
530 FbTk::Resource<bool> workspacemenu_singletrigger;
531
532 FbTk::Resource<FbWinFrame::TabPlacement> tab_placement;
533 FbTk::Resource<int> tab_width;
528 FbTk::Resource<bool> tabs_use_pixmap; 534 FbTk::Resource<bool> tabs_use_pixmap;
529 FbTk::Resource<bool> max_over_tabs; 535 FbTk::Resource<bool> max_over_tabs;
530 FbTk::Resource<bool> default_internal_tabs; 536 FbTk::Resource<bool> default_internal_tabs;
531 537
532 538 FbTk::Resource<bool> allow_remote_actions;
533 } resource; 539 } resource;
534 540
535 /// Holds manage resources that screen destroys 541 /// Holds manage resources that screen destroys