aboutsummaryrefslogtreecommitdiff
path: root/src/Window.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/Window.cc')
-rw-r--r--src/Window.cc116
1 files changed, 82 insertions, 34 deletions
diff --git a/src/Window.cc b/src/Window.cc
index 5d9404d..898111d 100644
--- a/src/Window.cc
+++ b/src/Window.cc
@@ -453,6 +453,8 @@ void FluxboxWindow::init() {
453 wattrib.width, wattrib.height, 453 wattrib.width, wattrib.height,
454 m_client->gravity(), m_client->old_bw); 454 m_client->gravity(), m_client->old_bw);
455 455
456 setWindowType(m_client->getWindowType());
457
456 if (fluxbox.isStartup()) 458 if (fluxbox.isStartup())
457 m_placed = true; 459 m_placed = true;
458 else if (m_client->isTransient() || 460 else if (m_client->isTransient() ||
@@ -1021,7 +1023,6 @@ void FluxboxWindow::associateClientWindow(bool use_attrs,
1021 unsigned int width, unsigned int height, 1023 unsigned int width, unsigned int height,
1022 int gravity, unsigned int client_bw) { 1024 int gravity, unsigned int client_bw) {
1023 m_client->updateTitle(); 1025 m_client->updateTitle();
1024 m_client->updateIconTitle();
1025 1026
1026 frame().setShapingClient(m_client, false); 1027 frame().setShapingClient(m_client, false);
1027 1028
@@ -1353,26 +1354,7 @@ bool FluxboxWindow::focus() {
1353 if (m_client->isModal()) 1354 if (m_client->isModal())
1354 return false; 1355 return false;
1355 1356
1356 bool ret = false; 1357 return m_client->sendFocus();
1357
1358 if (m_client->acceptsFocus()) {
1359
1360 m_client->setInputFocus(RevertToParent, CurrentTime);
1361
1362 FbTk::App *app = FbTk::App::instance();
1363
1364 XFlush(app->display());
1365
1366 m_client->sendFocus();
1367
1368 app->sync(false);
1369
1370 ret = true;
1371 } else {
1372 ret = m_client->sendFocus();
1373 }
1374
1375 return ret;
1376} 1358}
1377 1359
1378// don't hide the frame directly, use this function 1360// don't hide the frame directly, use this function
@@ -2129,14 +2111,6 @@ void FluxboxWindow::restoreAttributes() {
2129 m_layernum = m_blackbox_attrib.stack; 2111 m_layernum = m_blackbox_attrib.stack;
2130 } 2112 }
2131 2113
2132 if ((m_blackbox_attrib.flags & ATTRIB_MAXHORIZ) ||
2133 (m_blackbox_attrib.flags & ATTRIB_MAXVERT)) {
2134 m_blackbox_attrib.premax_x = m_blackbox_attrib.premax_x;
2135 m_blackbox_attrib.premax_y = m_blackbox_attrib.premax_y;
2136 m_blackbox_attrib.premax_w = m_blackbox_attrib.premax_w;
2137 m_blackbox_attrib.premax_h = m_blackbox_attrib.premax_h;
2138 }
2139
2140} 2114}
2141 2115
2142/** 2116/**
@@ -2369,8 +2343,9 @@ void FluxboxWindow::propertyNotifyEvent(WinClient &client, Atom atom) {
2369 break; 2343 break;
2370 2344
2371 case XA_WM_ICON_NAME: 2345 case XA_WM_ICON_NAME:
2372 // update icon title and then do normal XA_WM_NAME stuff 2346 // we don't use icon title, since many apps don't update it,
2373 client.updateIconTitle(); 2347 // and we don't show icons anyway
2348 break;
2374 case XA_WM_NAME: 2349 case XA_WM_NAME:
2375 client.updateTitle(); 2350 client.updateTitle();
2376 break; 2351 break;
@@ -2610,7 +2585,7 @@ void FluxboxWindow::buttonPressEvent(XButtonEvent &be) {
2610 frame().buttonPressEvent(be); 2585 frame().buttonPressEvent(be);
2611 2586
2612 if (be.button == 1) { 2587 if (be.button == 1) {
2613 if (!m_focused) //check focus 2588 if (!m_focused && acceptsFocus()) //check focus
2614 focus(); 2589 focus();
2615 2590
2616 if (frame().window().window() == be.window || frame().tabcontainer().window() == be.window) { 2591 if (frame().window().window() == be.window || frame().tabcontainer().window() == be.window) {
@@ -2968,7 +2943,8 @@ void FluxboxWindow::enterNotifyEvent(XCrossingEvent &ev) {
2968 ev.window == m_client->window() || 2943 ev.window == m_client->window() ||
2969 client) { 2944 client) {
2970 2945
2971 if (screen().focusControl().isMouseFocus() && !isFocused()) { 2946 if (screen().focusControl().isMouseFocus() && !isFocused() &&
2947 acceptsFocus() && getWindowType() != Focusable::TYPE_DESKTOP) {
2972 2948
2973 // check that there aren't any subsequent leave notify events in the 2949 // check that there aren't any subsequent leave notify events in the
2974 // X event queue 2950 // X event queue
@@ -3138,7 +3114,6 @@ void FluxboxWindow::startMoving(int x, int y) {
3138 m_button_grab_y = y - frame().y() - frame().window().borderWidth(); 3114 m_button_grab_y = y - frame().y() - frame().window().borderWidth();
3139 3115
3140 moving = true; 3116 moving = true;
3141 maximized = MAX_NONE;
3142 3117
3143 Fluxbox *fluxbox = Fluxbox::instance(); 3118 Fluxbox *fluxbox = Fluxbox::instance();
3144 // grabbing (and masking) on the root window allows us to 3119 // grabbing (and masking) on the root window allows us to
@@ -3674,6 +3649,10 @@ std::string FluxboxWindow::getWMRole() const {
3674 return (m_client ? m_client->getWMRole() : "FluxboxWindow"); 3649 return (m_client ? m_client->getWMRole() : "FluxboxWindow");
3675} 3650}
3676 3651
3652Focusable::WindowType FluxboxWindow::getWindowType() const {
3653 return (m_client ? m_client->getWindowType() : Focusable::TYPE_NORMAL);
3654}
3655
3677bool FluxboxWindow::isTransient() const { 3656bool FluxboxWindow::isTransient() const {
3678 return (m_client && m_client->isTransient()); 3657 return (m_client && m_client->isTransient());
3679} 3658}
@@ -4139,3 +4118,72 @@ void FluxboxWindow::placeWindow(int head) {
4139 screen().placementStrategy().placeWindow(*this, head, place_x, place_y); 4118 screen().placementStrategy().placeWindow(*this, head, place_x, place_y);
4140 move(place_x, place_y); 4119 move(place_x, place_y);
4141} 4120}
4121
4122void FluxboxWindow::setWindowType(Focusable::WindowType type) {
4123 switch (type) {
4124 case Focusable::TYPE_DOCK:
4125 /* From Extended Window Manager Hints, draft 1.3:
4126 *
4127 * _NET_WM_WINDOW_TYPE_DOCK indicates a dock or panel feature.
4128 * Typically a Window Manager would keep such windows on top
4129 * of all other windows.
4130 *
4131 */
4132 setFocusHidden(true);
4133 setIconHidden(true);
4134 setDecorationMask(DECOR_NONE);
4135 moveToLayer(::Layer::DOCK);
4136 break;
4137 case Focusable::TYPE_DESKTOP:
4138 /*
4139 * _NET_WM_WINDOW_TYPE_DESKTOP indicates a "false desktop" window
4140 * We let it be the size it wants, but it gets no decoration,
4141 * is hidden in the toolbar and window cycling list, plus
4142 * windows don't tab with it and is right on the bottom.
4143 */
4144 setFocusHidden(true);
4145 setIconHidden(true);
4146 moveToLayer(::Layer::DESKTOP);
4147 setDecorationMask(DECOR_NONE);
4148 setTabable(false);
4149 setMovable(false);
4150 setResizable(false);
4151 stick();
4152 break;
4153 case Focusable::TYPE_SPLASH:
4154 /*
4155 * _NET_WM_WINDOW_TYPE_SPLASH indicates that the
4156 * window is a splash screen displayed as an application
4157 * is starting up.
4158 */
4159 setDecorationMask(DECOR_NONE);
4160 setFocusHidden(true);
4161 setIconHidden(true);
4162 setMovable(false);
4163 break;
4164 case Focusable::TYPE_DIALOG:
4165 setTabable(false);
4166 break;
4167 case Focusable::TYPE_MENU:
4168 case Focusable::TYPE_TOOLBAR:
4169 /*
4170 * _NET_WM_WINDOW_TYPE_TOOLBAR and _NET_WM_WINDOW_TYPE_MENU
4171 * indicate toolbar and pinnable menu windows, respectively
4172 * (i.e. toolbars and menus "torn off" from the main
4173 * application). Windows of this type may set the
4174 * WM_TRANSIENT_FOR hint indicating the main application window.
4175 */
4176 setDecorationMask(DECOR_TOOL);
4177 setIconHidden(true);
4178 moveToLayer(::Layer::ABOVE_DOCK);
4179 break;
4180 case Focusable::TYPE_NORMAL:
4181 default:
4182 break;
4183 }
4184
4185 /*
4186 * NOT YET IMPLEMENTED:
4187 * _NET_WM_WINDOW_TYPE_UTILITY
4188 */
4189}