fix initialisation of state when a window is first mapped

This commit is contained in:
rathnor 2004-06-19 15:04:28 +00:00
parent e68a7a4e72
commit 4589ecdbbc
4 changed files with 38 additions and 55 deletions

View file

@ -1,5 +1,8 @@
(Format: Year/Month/Day)
Changes for 0.9.10:
*04/06/20:
* Fix honouring of initial state on window open (Simon)
Window.hh/cc Screen.cc
*04/06/18:
* background xmessage in fbsetbg so it doesn't block anything
also set the "okay" button to default so you can just press enter

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: Screen.cc,v 1.281 2004/06/14 12:25:31 fluxgen Exp $
// $Id: Screen.cc,v 1.282 2004/06/19 15:04:27 rathnor Exp $
#include "Screen.hh"
@ -1186,10 +1186,6 @@ FluxboxWindow *BScreen::createWindow(Window client) {
win->attachClient(otherwin->winClient());
}
if (!win->isIconic() && (win->workspaceNumber() == currentWorkspaceID() || win->isStuck())) {
win->show();
}
m_clientlist_sig.notify();
FbTk::App::instance()->sync(false);
@ -1229,9 +1225,6 @@ FluxboxWindow *BScreen::createWindow(WinClient &client) {
// WinClient already exists).
Fluxbox::instance()->attachSignals(*win);
// winclient actions should have been setup when the WinClient was created
if (win->workspaceNumber() == currentWorkspaceID() || win->isStuck())
win->show();
m_clientlist_sig.notify();

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.289 2004/06/07 21:48:14 fluxgen Exp $
// $Id: Window.cc,v 1.290 2004/06/19 15:04:27 rathnor Exp $
#include "Window.hh"
@ -558,8 +558,6 @@ void FluxboxWindow::init() {
deiconify(); //we're omnipresent and visible
}
setState(m_current_state);
sendConfigureNotify();
// no focus default
setFocusFlag(false);
@ -1285,7 +1283,7 @@ void FluxboxWindow::iconify() {
iconic = true;
setState(IconicState);
setState(IconicState, false);
hide(true);
@ -1332,7 +1330,7 @@ void FluxboxWindow::deiconify(bool reassoc, bool do_raise) {
bool was_iconic = iconic;
iconic = false;
setState(NormalState);
setState(NormalState, false);
ClientList::iterator client_it = clientList().begin();
ClientList::iterator client_it_end = clientList().end();
@ -1522,13 +1520,13 @@ void FluxboxWindow::shade() {
m_blackbox_attrib.flags ^= ATTRIB_SHADED;
m_blackbox_attrib.attrib ^= ATTRIB_SHADED;
setState(NormalState);
setState(NormalState, false);
} else {
shaded = true;
m_blackbox_attrib.flags |= ATTRIB_SHADED;
m_blackbox_attrib.attrib |= ATTRIB_SHADED;
// shading is the same as iconic
setState(IconicState);
setState(IconicState, false);
}
}
@ -1550,7 +1548,7 @@ void FluxboxWindow::stick() {
}
setState(m_current_state);
setState(m_current_state, false);
// notify since some things consider "stuck" to be a pseudo-workspace
m_workspacesig.notify();
@ -1811,28 +1809,31 @@ void FluxboxWindow::saveBlackboxAttribs() {
/**
Sets state on each client in our list
Use setting_up for setting startup state - it may not be committed yet
That'll happen when its mapped
*/
void FluxboxWindow::setState(unsigned long new_state) {
void FluxboxWindow::setState(unsigned long new_state, bool setting_up) {
if (numClients() == 0)
return;
m_current_state = new_state;
unsigned long state[2];
state[0] = (unsigned long) m_current_state;
state[1] = (unsigned long) None;
if (!setting_up) {
unsigned long state[2];
state[0] = (unsigned long) m_current_state;
state[1] = (unsigned long) None;
for_each(m_clientlist.begin(), m_clientlist.end(),
FbTk::ChangeProperty(display, FbAtoms::instance()->getWMStateAtom(),
PropModeReplace,
(unsigned char *)state, 2));
for_each(m_clientlist.begin(), m_clientlist.end(),
FbTk::ChangeProperty(display, FbAtoms::instance()->getWMStateAtom(),
PropModeReplace,
(unsigned char *)state, 2));
saveBlackboxAttribs();
//notify state changed
m_statesig.notify();
saveBlackboxAttribs();
//notify state changed
m_statesig.notify();
}
}
bool FluxboxWindow::getState() {
m_current_state = 0;
Atom atom_return;
bool ret = false;
@ -1863,7 +1864,7 @@ bool FluxboxWindow::getState() {
*/
void FluxboxWindow::restoreAttributes() {
if (!getState())
m_current_state = NormalState;
m_current_state = m_client->initial_state;
Atom atom_return;
int foo;
@ -1894,30 +1895,17 @@ void FluxboxWindow::restoreAttributes() {
return;
if (m_blackbox_attrib.flags & ATTRIB_SHADED &&
m_blackbox_attrib.attrib & ATTRIB_SHADED) {
int save_state =
((m_current_state == IconicState) ? NormalState : m_current_state);
m_blackbox_attrib.attrib & ATTRIB_SHADED)
shaded = true;
m_current_state = save_state;
}
if (( m_blackbox_attrib.workspace != screen().currentWorkspaceID()) &&
( m_blackbox_attrib.workspace < screen().getCount())) {
( m_blackbox_attrib.workspace < screen().getCount()))
m_workspace_number = m_blackbox_attrib.workspace;
if (m_current_state == NormalState) m_current_state = WithdrawnState;
} else if (m_current_state == WithdrawnState)
m_current_state = NormalState;
if (m_blackbox_attrib.flags & ATTRIB_OMNIPRESENT &&
m_blackbox_attrib.attrib & ATTRIB_OMNIPRESENT) {
m_blackbox_attrib.attrib & ATTRIB_OMNIPRESENT)
stuck = true;
m_current_state = NormalState;
}
if (m_blackbox_attrib.flags & ATTRIB_STACK) {
//!! TODO check value?
m_layernum = m_blackbox_attrib.stack;
@ -1942,7 +1930,6 @@ void FluxboxWindow::restoreAttributes() {
m_blackbox_attrib.premax_h = h;
}
setState(m_current_state);
}
/**
@ -2062,14 +2049,14 @@ void FluxboxWindow::mapRequestEvent(XMapRequestEvent &re) {
bool get_state_ret = getState();
if (! (get_state_ret && fluxbox->isStartup())) {
if ((m_client->wm_hint_flags & StateHint) &&
(! (m_current_state == NormalState || m_current_state == IconicState))) {
if ((m_client->wm_hint_flags & StateHint) && m_current_state == 0) {// &&
m_current_state = m_client->initial_state;
} else
m_current_state = NormalState;
}
} else if (iconic)
m_current_state = NormalState;
setState(m_current_state, false);
switch (m_current_state) {
case IconicState:
iconify();
@ -2091,7 +2078,7 @@ void FluxboxWindow::mapRequestEvent(XMapRequestEvent &re) {
if (wsp != 0 && isGroupable())
destroyed = wsp->checkGrouping(*this);
// if we wasn't grouped with another window we deiconify ourself
// if we weren't grouped with another window we deiconify ourself
if (!destroyed)
deiconify(false);
@ -2118,7 +2105,7 @@ void FluxboxWindow::mapNotifyEvent(XMapEvent &ne) {
if (! client->validateClient())
return;
setState(NormalState);
setState(NormalState, false);
if (client->isTransient() || screen().doFocusNew())
setCurrentClient(*client, true);

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.114 2004/05/13 01:48:18 rathnor Exp $
// $Id: Window.hh,v 1.115 2004/06/19 15:04:28 rathnor Exp $
#ifndef WINDOW_HH
#define WINDOW_HH
@ -404,7 +404,7 @@ private:
void restoreGravity();
void setGravityOffsets();
void setState(unsigned long stateval);
void setState(unsigned long stateval, bool setting_up);
void upsize();
void downsize();