diff options
Diffstat (limited to 'src/Window.cc')
-rw-r--r-- | src/Window.cc | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/src/Window.cc b/src/Window.cc index 079126b..ebc5923 100644 --- a/src/Window.cc +++ b/src/Window.cc | |||
@@ -2188,7 +2188,7 @@ void FluxboxWindow::restoreAttributes() { | |||
2188 | /** | 2188 | /** |
2189 | Show the window menu at pos mx, my | 2189 | Show the window menu at pos mx, my |
2190 | */ | 2190 | */ |
2191 | void FluxboxWindow::showMenu(int menu_x, int menu_y) { | 2191 | void FluxboxWindow::showMenu(int menu_x, int menu_y, WinClient *client) { |
2192 | // move menu directly under titlebar | 2192 | // move menu directly under titlebar |
2193 | 2193 | ||
2194 | int head = screen().getHead(menu_x, menu_y); | 2194 | int head = screen().getHead(menu_x, menu_y); |
@@ -2204,7 +2204,11 @@ void FluxboxWindow::showMenu(int menu_x, int menu_y) { | |||
2204 | else if (menu_x + static_cast<signed>(menu().width()) >= static_cast<signed>(screen().maxRight(head))) | 2204 | else if (menu_x + static_cast<signed>(menu().width()) >= static_cast<signed>(screen().maxRight(head))) |
2205 | menu_x = screen().maxRight(head) - menu().width() - 1; | 2205 | menu_x = screen().maxRight(head) - menu().width() - 1; |
2206 | 2206 | ||
2207 | WindowCmd<void>::setWindow(this); | 2207 | if (client && (client->fbwindow() == this)) |
2208 | WindowCmd<void>::setClient(client); | ||
2209 | else | ||
2210 | WindowCmd<void>::setWindow(this); | ||
2211 | |||
2208 | menu().move(menu_x, menu_y); | 2212 | menu().move(menu_x, menu_y); |
2209 | menu().show(); | 2213 | menu().show(); |
2210 | menu().raise(); | 2214 | menu().raise(); |
@@ -2223,13 +2227,34 @@ void FluxboxWindow::popupMenu() { | |||
2223 | return; | 2227 | return; |
2224 | } | 2228 | } |
2225 | 2229 | ||
2230 | /* Check if we're on a tab, we should make the menu for that tab */ | ||
2231 | WinClient *client = 0; | ||
2232 | Window labelbutton = 0; | ||
2233 | int dest_x = 0, dest_y = 0; | ||
2234 | if (XTranslateCoordinates(FbTk::App::instance()->display(), | ||
2235 | parent().window(), frame().tabcontainer().window(), | ||
2236 | m_last_button_x, m_last_button_y, &dest_x, &dest_y, | ||
2237 | &labelbutton)) { | ||
2238 | |||
2239 | Client2ButtonMap::iterator it = | ||
2240 | find_if(m_labelbuttons.begin(), | ||
2241 | m_labelbuttons.end(), | ||
2242 | Compose(bind2nd(equal_to<Window>(), labelbutton), | ||
2243 | Compose(mem_fun(&TextButton::window), | ||
2244 | Select2nd<Client2ButtonMap::value_type>()))); | ||
2245 | |||
2246 | // label button not found | ||
2247 | if (it != m_labelbuttons.end()) | ||
2248 | client = it->first; | ||
2249 | } | ||
2250 | |||
2226 | menu().disableTitle(); | 2251 | menu().disableTitle(); |
2227 | int menu_y = frame().titlebar().height() + frame().titlebar().borderWidth(); | 2252 | int menu_y = frame().titlebar().height() + frame().titlebar().borderWidth(); |
2228 | if (!decorations.titlebar) // if we don't have any titlebar | 2253 | if (!decorations.titlebar) // if we don't have any titlebar |
2229 | menu_y = 0; | 2254 | menu_y = 0; |
2230 | if (m_last_button_x < x() || m_last_button_x > x() + static_cast<signed>(width())) | 2255 | if (m_last_button_x < x() || m_last_button_x > x() + static_cast<signed>(width())) |
2231 | m_last_button_x = x(); | 2256 | m_last_button_x = x(); |
2232 | showMenu(m_last_button_x, menu_y + frame().y()); | 2257 | showMenu(m_last_button_x, menu_y + frame().y(), client); |
2233 | } | 2258 | } |
2234 | 2259 | ||
2235 | 2260 | ||