make client windows only reparented one below toplevel - i.e. not into

clientarea
This commit is contained in:
rathnor 2003-10-28 02:17:03 +00:00
parent 6b9b0e89e4
commit f5f979ef37
6 changed files with 80 additions and 58 deletions

View file

@ -1,5 +1,14 @@
(Format: Year/Month/Day)
Changes for 0.9.6:
*03/10/27:
* Change FbWinFrame to NOT reparent client windows into clientarea (Simon)
- fixes (I think) java bug with missing drawing bits of window
- allows us to remove some dodgy "and for parent" hacks (not done in
this patch, but will be in new action system which depends on this)
- clientarea still exists for future implementation of improved
sizing, particularly to provide a backing to clients that don't
take up the whole area.
FbWinFrame.hh/cc Window.hh/cc fluxbox.cc
*03/10/26:
* Fixed bug in FbWindow::setNew (Henrik)
It didn't update member variables

View file

@ -19,7 +19,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
// $Id: FbWinFrame.cc,v 1.59 2003/10/09 16:48:09 rathnor Exp $
// $Id: FbWinFrame.cc,v 1.60 2003/10/28 02:17:02 rathnor Exp $
#include "FbWinFrame.hh"
@ -368,14 +368,16 @@ void FbWinFrame::setClientWindow(Window win) {
XChangeSaveSet(display, win, SetModeInsert);
XSelectInput(display, m_clientarea.window(), NoEventMask);
XSelectInput(display, m_window.window(), NoEventMask);
// we need to mask this so we don't get unmap event
XSelectInput(display, win, NoEventMask);
XReparentWindow(display, win, m_clientarea.window(), 0, 0);
XReparentWindow(display, win, m_window.window(), 0, m_clientarea.y());
// remask window so we get events
XSelectInput(display, win, PropertyChangeMask | StructureNotifyMask |
FocusChangeMask);
XSelectInput(display, m_clientarea.window(), SubstructureRedirectMask);
XSelectInput(display, m_window.window(), ButtonPressMask | ButtonReleaseMask |
ButtonMotionMask | EnterWindowMask | SubstructureRedirectMask);
XFlush(display);
@ -387,8 +389,8 @@ void FbWinFrame::setClientWindow(Window win) {
XChangeWindowAttributes(display, win, CWEventMask|CWDontPropagate, &attrib_set);
m_clientarea.raise();
m_clientarea.showSubwindows();
XRaiseWindow(display, win);
m_window.showSubwindows();
}
bool FbWinFrame::hideTitlebar() {
@ -397,7 +399,6 @@ bool FbWinFrame::hideTitlebar() {
m_titlebar.hide();
m_use_titlebar = false;
m_clientarea.raise();
// only take away one borderwidth (as the other border is still the "top" border)
m_window.resize(m_window.width(), m_window.height() - m_titlebar.height() -
@ -623,8 +624,12 @@ void FbWinFrame::reconfigure() {
gripLeft().height());
// align titlebar and render it
if (m_use_titlebar)
if (m_use_titlebar) {
reconfigureTitlebar();
m_titlebar.raise();
} else
m_titlebar.lower();
// leave client+grips alone if we're shaded (it'll get fixed when we unshade)
if (!m_shaded) {
@ -644,10 +649,8 @@ void FbWinFrame::reconfigure() {
m_clientarea.moveResize(0, client_top,
m_window.width(), client_height);
if (m_use_handle) {
// align handle and grips
const int grip_height = m_handle.height();
const int grip_width = 20; //TODO
@ -662,9 +665,13 @@ void FbWinFrame::reconfigure() {
m_grip_right.moveResize(m_handle.width() - grip_width - handle_bw, -handle_bw,
grip_width, grip_height);
m_handle.raise();
} else {
m_handle.lower();
}
}
// render the theme
renderButtons();
if (!m_shaded)

View file

@ -19,7 +19,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
// $Id: FbWinFrame.hh,v 1.23 2003/10/05 09:03:43 rathnor Exp $
// $Id: FbWinFrame.hh,v 1.24 2003/10/28 02:17:02 rathnor Exp $
#ifndef FBWINFRAME_HH
#define FBWINFRAME_HH
@ -228,7 +228,7 @@ private:
FbTk::FbWindow m_handle; ///< handle between grips
FbTk::FbWindow m_grip_right, ///< rightgrip
m_grip_left; ///< left grip
FbTk::FbWindow m_clientarea; ///< window that holds client window @see setClientWindow
FbTk::FbWindow m_clientarea; ///< window that sits behind client window to fill gaps @see setClientWindow
//@}
typedef std::vector<FbTk::Button *> ButtonList;
ButtonList m_buttons_left, ///< buttons to the left

View file

@ -22,7 +22,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
// $Id: Window.cc,v 1.242 2003/10/26 20:59:07 fluxgen Exp $
// $Id: Window.cc,v 1.243 2003/10/28 02:17:02 rathnor Exp $
#include "Window.hh"
@ -467,12 +467,12 @@ void FluxboxWindow::init() {
upsize();
associateClientWindow();
applyDecorations(true);
associateClientWindow(true, wattrib.x, wattrib.y, wattrib.width, wattrib.height);
grabButtons();
applyDecorations(true);
if (m_workspace_number < 0 || m_workspace_number >= screen().getCount())
m_workspace_number = screen().currentWorkspaceID();
@ -504,9 +504,6 @@ void FluxboxWindow::init() {
if (wattrib.height <= 0)
wattrib.height = 1;
frame().moveResizeForClient(wattrib.x, wattrib.y,
wattrib.width, wattrib.height);
// if we're a transient then we should be on the same layer as our parent
if (m_client->isTransient() &&
m_client->transientFor()->fbwindow() &&
@ -558,7 +555,7 @@ void FluxboxWindow::init() {
if (m_shaped)
shape();
XSync(display, false);
}
/// apply shape to this window
@ -607,7 +604,9 @@ void FluxboxWindow::attachClient(WinClient &client) {
// reparent window to this
frame().setClientWindow(**client_it);
resizeClient(**client_it,
moveResizeClient(**client_it,
frame().clientArea().x(),
frame().clientArea().y(),
frame().clientArea().width(),
frame().clientArea().height());
@ -910,22 +909,27 @@ bool FluxboxWindow::isGroupable() const {
return false;
}
void FluxboxWindow::associateClientWindow() {
void FluxboxWindow::associateClientWindow(bool use_attrs, int x, int y, unsigned int width, unsigned int height) {
m_client->setBorderWidth(0);
updateTitleFromClient(*m_client);
updateIconNameFromClient(*m_client);
frame().setClientWindow(*m_client);
if (use_attrs)
frame().moveResizeForClient(x, y,
width, height);
else
frame().resizeForClient(m_client->width(), m_client->height());
frame().setClientWindow(*m_client);
}
void FluxboxWindow::grabButtons() {
XGrabButton(display, Button1, AnyModifier,
frame().clientArea().window(), True, ButtonPressMask,
frame().window().window(), True, ButtonPressMask,
GrabModeSync, GrabModeSync, None, None);
XUngrabButton(display, Button1, Mod1Mask|Mod2Mask|Mod3Mask, frame().clientArea().window());
XUngrabButton(display, Button1, Mod1Mask|Mod2Mask|Mod3Mask, frame().window().window());
XGrabButton(display, Button1, Mod1Mask, frame().window().window(), True,
@ -2268,11 +2272,11 @@ void FluxboxWindow::buttonPressEvent(XButtonEvent &be) {
setInputFocus();
}
if (frame().clientArea() == be.window) {
if (frame().window().window() == be.window) {
if (screen().clickRaises())
raise();
XAllowEvents(display, ReplayPointer, be.time);
} else {
m_button_grab_x = be.x_root - frame().x() - frame().window().borderWidth();
m_button_grab_y = be.y_root - frame().y() - frame().window().borderWidth();
}
@ -2668,7 +2672,7 @@ void FluxboxWindow::applyDecorations(bool initial) {
}
frame().reconfigure();
if (client_move)
if (!initial && client_move)
sendConfigureNotify();
}
@ -3234,9 +3238,10 @@ void FluxboxWindow::fixsize(int *user_w, int *user_h) {
}
void FluxboxWindow::resizeClient(WinClient &client,
void FluxboxWindow::moveResizeClient(WinClient &client, int x, int y,
unsigned int height, unsigned int width) {
client.resize(frame().clientArea().width(),
client.moveResize(x, y,
frame().clientArea().width(),
frame().clientArea().height());
client.updateRect(frame().x() + frame().clientArea().x(),
frame().y() + frame().clientArea().y(),
@ -3256,11 +3261,13 @@ void FluxboxWindow::sendConfigureNotify(bool send_to_netizens) {
//!!
client.x = frame().x();
client.y = frame().y();
resizeClient(client,
moveResizeClient(client,
frame().clientArea().x(),
frame().clientArea().y(),
frame().clientArea().width(),
frame().clientArea().height());
if (send_to_netizens) {
XEvent event;
event.type = ConfigureNotify;
@ -3275,10 +3282,8 @@ void FluxboxWindow::sendConfigureNotify(bool send_to_netizens) {
event.xconfigure.above = frame().window().window();
event.xconfigure.override_redirect = false;
XSendEvent(display, client.window(), False, StructureNotifyMask, &event);
if (send_to_netizens)
screen().updateNetizenConfigNotify(event);
}
} // end for
}

View file

@ -22,7 +22,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
// $Id: Window.hh,v 1.99 2003/10/06 06:22:43 rathnor Exp $
// $Id: Window.hh,v 1.100 2003/10/28 02:17:03 rathnor Exp $
#ifndef WINDOW_HH
#define WINDOW_HH
@ -388,7 +388,7 @@ private:
void updateBlackboxHintsFromClient(WinClient &client);
void saveBlackboxAttribs();
void setNetWMAttributes();
void associateClientWindow();
void associateClientWindow(bool use_attrs = false, int x = 0, int y = 0, unsigned int width = 1, unsigned int height = 1);
void restoreGravity();
void setGravityOffsets();
@ -400,7 +400,7 @@ private:
void doSnapping(int &left, int &top);
// user_w/h return the values that should be shown to the user
void fixsize(int *user_w = 0, int *user_h = 0);
void resizeClient(WinClient &client, unsigned int width, unsigned int height);
void moveResizeClient(WinClient &client, int x, int y, unsigned int width, unsigned int height);
/// sends configurenotify to all clients
void sendConfigureNotify(bool send_to_netizens = true);
// state and hint signals

View file

@ -22,7 +22,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
// $Id: fluxbox.cc,v 1.200 2003/10/14 16:23:15 rathnor Exp $
// $Id: fluxbox.cc,v 1.201 2003/10/28 02:17:03 rathnor Exp $
#include "fluxbox.hh"
@ -565,6 +565,7 @@ Fluxbox::Fluxbox(int argc, char **argv, const char *dpy_name, const char *rcfile
for (size_t atomh=0; atomh<m_atomhandler.size(); ++atomh) {
m_atomhandler[atomh]->initForScreen(*screen);
}
revertFocus(*screen, false); // make sure focus style is correct
}
m_keyscreen = m_mousescreen = m_screen_list.front();