sync with bb-cvs
This commit is contained in:
parent
cd6c4ebcb2
commit
83b6c9bfa0
6 changed files with 247 additions and 120 deletions
|
@ -283,7 +283,7 @@ BScreen::BScreen(Blackbox *bb, unsigned int scrn) : ScreenInfo(bb, scrn) {
|
||||||
|
|
||||||
// manage shown windows
|
// manage shown windows
|
||||||
for (i = 0; i < nchild; ++i) {
|
for (i = 0; i < nchild; ++i) {
|
||||||
if (children[i] == None || (! blackbox->validateWindow(children[i])))
|
if (children[i] == None || ! blackbox->validateWindow(children[i]))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
XWindowAttributes attrib;
|
XWindowAttributes attrib;
|
||||||
|
@ -1232,6 +1232,14 @@ void BScreen::manageWindow(Window w) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// is the window a docking app
|
||||||
|
XWMHints *wmhint = XGetWMHints(blackbox->getXDisplay(), w);
|
||||||
|
if (wmhint && (wmhint->flags & StateHint) &&
|
||||||
|
wmhint->initial_state == WithdrawnState) {
|
||||||
|
slit->addClient(w);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
new BlackboxWindow(blackbox, w, this);
|
new BlackboxWindow(blackbox, w, this);
|
||||||
|
|
||||||
BlackboxWindow *win = blackbox->searchWindow(w);
|
BlackboxWindow *win = blackbox->searchWindow(w);
|
||||||
|
@ -1763,7 +1771,7 @@ bool BScreen::parseMenuFile(FILE *file, Rootmenu *menu) {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 421: // exec
|
case 421: // exec
|
||||||
if ((! *label) && (! *command)) {
|
if (! (*label || *command)) {
|
||||||
fprintf(stderr, i18n(ScreenSet, ScreenEXECError,
|
fprintf(stderr, i18n(ScreenSet, ScreenEXECError,
|
||||||
"BScreen::parseMenuFile: [exec] error, "
|
"BScreen::parseMenuFile: [exec] error, "
|
||||||
"no menu label and/or command defined\n"));
|
"no menu label and/or command defined\n"));
|
||||||
|
@ -1786,21 +1794,19 @@ bool BScreen::parseMenuFile(FILE *file, Rootmenu *menu) {
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 561: // style
|
case 561: { // style
|
||||||
{
|
if (! (*label && *command)) {
|
||||||
if ((! *label) || (! *command)) {
|
fprintf(stderr,
|
||||||
fprintf(stderr,
|
i18n(ScreenSet, ScreenSTYLEError,
|
||||||
i18n(ScreenSet, ScreenSTYLEError,
|
"BScreen::parseMenuFile: [style] error, "
|
||||||
"BScreen::parseMenuFile: [style] error, "
|
"no menu label and/or filename defined\n"));
|
||||||
"no menu label and/or filename defined\n"));
|
continue;
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
string style = expandTilde(command);
|
|
||||||
|
|
||||||
menu->insert(label, BScreen::SetStyle, style.c_str());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string style = expandTilde(command);
|
||||||
|
|
||||||
|
menu->insert(label, BScreen::SetStyle, style.c_str());
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 630: // config
|
case 630: // config
|
||||||
|
@ -1830,7 +1836,7 @@ bool BScreen::parseMenuFile(FILE *file, Rootmenu *menu) {
|
||||||
if (submenufile) {
|
if (submenufile) {
|
||||||
struct stat buf;
|
struct stat buf;
|
||||||
if (fstat(fileno(submenufile), &buf) ||
|
if (fstat(fileno(submenufile), &buf) ||
|
||||||
(! S_ISREG(buf.st_mode))) {
|
! S_ISREG(buf.st_mode)) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
i18n(ScreenSet, ScreenINCLUDEErrorReg,
|
i18n(ScreenSet, ScreenINCLUDEErrorReg,
|
||||||
"BScreen::parseMenuFile: [include] error: "
|
"BScreen::parseMenuFile: [include] error: "
|
||||||
|
@ -1912,7 +1918,7 @@ bool BScreen::parseMenuFile(FILE *file, Rootmenu *menu) {
|
||||||
{
|
{
|
||||||
bool newmenu = ((key == 1113) ? True : False);
|
bool newmenu = ((key == 1113) ? True : False);
|
||||||
|
|
||||||
if ((! *label) || ((! *command) && newmenu)) {
|
if (! *label || (! *command && newmenu)) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
i18n(ScreenSet, ScreenSTYLESDIRError,
|
i18n(ScreenSet, ScreenSTYLESDIRError,
|
||||||
"BScreen::parseMenuFile: [stylesdir/stylesmenu]"
|
"BScreen::parseMenuFile: [stylesdir/stylesmenu]"
|
||||||
|
@ -1958,7 +1964,7 @@ bool BScreen::parseMenuFile(FILE *file, Rootmenu *menu) {
|
||||||
style += '/';
|
style += '/';
|
||||||
style += fname;
|
style += fname;
|
||||||
|
|
||||||
if ((! stat(style.c_str(), &statbuf)) &&
|
if (! stat(style.c_str(), &statbuf) &&
|
||||||
S_ISREG(statbuf.st_mode))
|
S_ISREG(statbuf.st_mode))
|
||||||
stylesmenu->insert(fname, BScreen::SetStyle, style);
|
stylesmenu->insert(fname, BScreen::SetStyle, style);
|
||||||
}
|
}
|
||||||
|
|
20
src/Slit.cc
20
src/Slit.cc
|
@ -133,6 +133,17 @@ void Slit::addClient(Window w) {
|
||||||
client->rect.setSize(64, 64);
|
client->rect.setSize(64, 64);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Atom *proto;
|
||||||
|
int num_return = 0;
|
||||||
|
if (XGetWMProtocols(display, client->window, &proto, &num_return)) {
|
||||||
|
for (int i = 0; i < num_return; ++i) {
|
||||||
|
if (proto[i] ==
|
||||||
|
blackbox->getXAtom()->getAtom(XAtom::blackbox_structure_messages)) {
|
||||||
|
screen->addNetizen(new Netizen(screen, client->window));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
XSetWindowBorderWidth(display, client->window, 0);
|
XSetWindowBorderWidth(display, client->window, 0);
|
||||||
|
|
||||||
XGrabServer(display);
|
XGrabServer(display);
|
||||||
|
@ -466,12 +477,17 @@ void Slit::updateStrut(void) {
|
||||||
case TopCenter:
|
case TopCenter:
|
||||||
case TopLeft:
|
case TopLeft:
|
||||||
case TopRight:
|
case TopRight:
|
||||||
strut.top = getExposedHeight() + border_width;
|
strut.top = frame.rect.top() + getExposedHeight() + border_width;
|
||||||
break;
|
break;
|
||||||
case BottomCenter:
|
case BottomCenter:
|
||||||
case BottomLeft:
|
case BottomLeft:
|
||||||
case BottomRight:
|
case BottomRight:
|
||||||
strut.bottom = getExposedHeight() + border_width;
|
int pos;
|
||||||
|
if (do_auto_hide)
|
||||||
|
pos = frame.y_hidden;
|
||||||
|
else
|
||||||
|
pos = frame.rect.y();
|
||||||
|
strut.bottom = (screen->getRect().bottom() - pos);
|
||||||
break;
|
break;
|
||||||
case CenterLeft:
|
case CenterLeft:
|
||||||
strut.left = getExposedWidth() + border_width;
|
strut.left = getExposedWidth() + border_width;
|
||||||
|
|
18
src/Util.cc
18
src/Util.cc
|
@ -26,6 +26,8 @@
|
||||||
#endif // HAVE_CONFIG_H
|
#endif // HAVE_CONFIG_H
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
#include <X11/Xatom.h>
|
||||||
|
|
||||||
#ifdef HAVE_STRING_H
|
#ifdef HAVE_STRING_H
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -48,11 +50,9 @@ extern "C" {
|
||||||
#if defined(HAVE_PROCESS_H) && defined(__EMX__)
|
#if defined(HAVE_PROCESS_H) && defined(__EMX__)
|
||||||
# include <process.h>
|
# include <process.h>
|
||||||
#endif // HAVE_PROCESS_H __EMX__
|
#endif // HAVE_PROCESS_H __EMX__
|
||||||
}
|
|
||||||
|
|
||||||
#include <X11/Xatom.h>
|
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
}
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
|
@ -171,8 +171,8 @@ void bexec(const string& command, const string& displaystring) {
|
||||||
assert(ret != -1);
|
assert(ret != -1);
|
||||||
string cmd = "exec ";
|
string cmd = "exec ";
|
||||||
cmd += command;
|
cmd += command;
|
||||||
execl("/bin/sh", "/bin/sh", "-c", cmd.c_str(), NULL);
|
ret = execl("/bin/sh", "/bin/sh", "-c", cmd.c_str(), NULL);
|
||||||
exit(0);
|
exit(ret);
|
||||||
}
|
}
|
||||||
#else // __EMX__
|
#else // __EMX__
|
||||||
spawnlp(P_NOWAIT, "cmd.exe", "cmd.exe", "/c", command, NULL);
|
spawnlp(P_NOWAIT, "cmd.exe", "cmd.exe", "/c", command, NULL);
|
||||||
|
@ -249,10 +249,8 @@ string itostring(unsigned long i) {
|
||||||
|
|
||||||
|
|
||||||
string itostring(long i) {
|
string itostring(long i) {
|
||||||
if (i < 0) {
|
std::string tmp = itostring( (unsigned long) std::abs(i));
|
||||||
std::string tmp = itostring( (unsigned long) -i);
|
if (i < 0)
|
||||||
tmp.insert(tmp.begin(), '-');
|
tmp.insert(tmp.begin(), '-');
|
||||||
return tmp;
|
return tmp;
|
||||||
} else
|
|
||||||
return itostring( (unsigned long) i);
|
|
||||||
}
|
}
|
||||||
|
|
271
src/Window.cc
271
src/Window.cc
|
@ -38,9 +38,11 @@ extern "C" {
|
||||||
# include <stdio.h>
|
# include <stdio.h>
|
||||||
# endif // HAVE_STDIO_H
|
# endif // HAVE_STDIO_H
|
||||||
#endif // DEBUG
|
#endif // DEBUG
|
||||||
}
|
|
||||||
|
|
||||||
#include <cstdlib>
|
#ifdef HAVE_STDLIB_H
|
||||||
|
#include <stdlib.h>
|
||||||
|
#endif // HAVE_STDLIB_H
|
||||||
|
}
|
||||||
|
|
||||||
#include "i18n.hh"
|
#include "i18n.hh"
|
||||||
#include "blackbox.hh"
|
#include "blackbox.hh"
|
||||||
|
@ -55,9 +57,9 @@ extern "C" {
|
||||||
#include "Window.hh"
|
#include "Window.hh"
|
||||||
#include "Windowmenu.hh"
|
#include "Windowmenu.hh"
|
||||||
#include "Workspace.hh"
|
#include "Workspace.hh"
|
||||||
#include "Slit.hh"
|
|
||||||
|
|
||||||
using std::string;
|
using std::string;
|
||||||
|
using std::abs;
|
||||||
|
|
||||||
// change this to change what modifier keys openbox uses for mouse bindings
|
// change this to change what modifier keys openbox uses for mouse bindings
|
||||||
// for example: Mod1Mask | ControlMask
|
// for example: Mod1Mask | ControlMask
|
||||||
|
@ -91,6 +93,25 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// fetch client size and placement
|
||||||
|
XWindowAttributes wattrib;
|
||||||
|
if (! XGetWindowAttributes(blackbox->getXDisplay(),
|
||||||
|
client.window, &wattrib) ||
|
||||||
|
! wattrib.screen || wattrib.override_redirect) {
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr,
|
||||||
|
"BlackboxWindow::BlackboxWindow(): XGetWindowAttributes failed\n");
|
||||||
|
#endif // DEBUG
|
||||||
|
|
||||||
|
delete this;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "0x%lx: initial (%d, %d) w: %d, h: %d\n", client.window,
|
||||||
|
wattrib.x, wattrib.y, wattrib.width, wattrib.height);
|
||||||
|
#endif // DEBUG
|
||||||
|
|
||||||
// set the eventmask early in the game so that we make sure we get
|
// set the eventmask early in the game so that we make sure we get
|
||||||
// all the events we are interested in
|
// all the events we are interested in
|
||||||
XSetWindowAttributes attrib_set;
|
XSetWindowAttributes attrib_set;
|
||||||
|
@ -101,20 +122,6 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
|
||||||
XChangeWindowAttributes(blackbox->getXDisplay(), client.window,
|
XChangeWindowAttributes(blackbox->getXDisplay(), client.window,
|
||||||
CWEventMask|CWDontPropagate, &attrib_set);
|
CWEventMask|CWDontPropagate, &attrib_set);
|
||||||
|
|
||||||
// fetch client size and placement
|
|
||||||
XWindowAttributes wattrib;
|
|
||||||
if ((! XGetWindowAttributes(blackbox->getXDisplay(),
|
|
||||||
client.window, &wattrib)) ||
|
|
||||||
(! wattrib.screen) || wattrib.override_redirect) {
|
|
||||||
#ifdef DEBUG
|
|
||||||
fprintf(stderr,
|
|
||||||
"BlackboxWindow::BlackboxWindow(): XGetWindowAttributes failed\n");
|
|
||||||
#endif // DEBUG
|
|
||||||
|
|
||||||
delete this;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
flags.moving = flags.resizing = flags.shaded = flags.visible =
|
flags.moving = flags.resizing = flags.shaded = flags.visible =
|
||||||
flags.iconic = flags.focused = flags.stuck = flags.modal =
|
flags.iconic = flags.focused = flags.stuck = flags.modal =
|
||||||
flags.send_focus_message = flags.shaped = flags.skip_taskbar =
|
flags.send_focus_message = flags.shaped = flags.skip_taskbar =
|
||||||
|
@ -146,10 +153,12 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
|
||||||
Decor_Iconify | Decor_Maximize;
|
Decor_Iconify | Decor_Maximize;
|
||||||
functions = Func_Resize | Func_Move | Func_Iconify | Func_Maximize;
|
functions = Func_Resize | Func_Move | Func_Iconify | Func_Maximize;
|
||||||
|
|
||||||
client.wm_hint_flags = client.normal_hint_flags = 0;
|
client.normal_hint_flags = 0;
|
||||||
client.window_group = None;
|
client.window_group = None;
|
||||||
client.transient_for = 0;
|
client.transient_for = 0;
|
||||||
|
|
||||||
|
current_state = NormalState;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
get the initial size and location of client window (relative to the
|
get the initial size and location of client window (relative to the
|
||||||
_root window_). This position is the reference point used with the
|
_root window_). This position is the reference point used with the
|
||||||
|
@ -175,11 +184,11 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
|
||||||
getWMHints();
|
getWMHints();
|
||||||
getWMNormalHints();
|
getWMNormalHints();
|
||||||
|
|
||||||
if (client.initial_state == WithdrawnState) {
|
#ifdef DEBUG
|
||||||
screen->getSlit()->addClient(client.window);
|
fprintf(stderr, "0x%lx: after hints (%d, %d) w: %d, h: %d\n", client.window,
|
||||||
delete this;
|
client.rect.x(), client.rect.y(),
|
||||||
return;
|
client.rect.width(), client.rect.height());
|
||||||
}
|
#endif // DEBUG
|
||||||
|
|
||||||
frame.window = createToplevelWindow();
|
frame.window = createToplevelWindow();
|
||||||
frame.plate = createChildWindow(frame.window);
|
frame.plate = createChildWindow(frame.window);
|
||||||
|
@ -232,6 +241,14 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
|
||||||
}
|
}
|
||||||
upsize();
|
upsize();
|
||||||
|
|
||||||
|
#ifdef DFEBUG
|
||||||
|
fprintf(stderr, "0x%lx: sizes reflect the frame from now on\n",
|
||||||
|
client.window);
|
||||||
|
fprintf(stderr, "0x%lx: after upsize (%d, %d) w: %d, h: %d\n", client.window,
|
||||||
|
frame.rect.x(), frame.rect.y(),
|
||||||
|
frame.rect.width(), frame.rect.height());
|
||||||
|
#endif // DEBUG
|
||||||
|
|
||||||
setAllowedActions();
|
setAllowedActions();
|
||||||
|
|
||||||
bool place_window = True;
|
bool place_window = True;
|
||||||
|
@ -243,6 +260,13 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
|
||||||
place_window = False;
|
place_window = False;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "0x%lx: after gravity (%d, %d) w: %d, h: %d\n",
|
||||||
|
client.window,
|
||||||
|
frame.rect.x(), frame.rect.y(),
|
||||||
|
frame.rect.width(), frame.rect.height());
|
||||||
|
#endif // DEBUG
|
||||||
|
|
||||||
// add the window's strut. note this is done *after* placing the window.
|
// add the window's strut. note this is done *after* placing the window.
|
||||||
screen->addStrut(&client.strut);
|
screen->addStrut(&client.strut);
|
||||||
updateStrut();
|
updateStrut();
|
||||||
|
@ -272,16 +296,20 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
|
||||||
// place the window
|
// place the window
|
||||||
configure(frame.rect.x(), frame.rect.y(),
|
configure(frame.rect.x(), frame.rect.y(),
|
||||||
frame.rect.width(), frame.rect.height());
|
frame.rect.width(), frame.rect.height());
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "0x%lx: after configure (%d, %d) w: %d, h: %d\n",
|
||||||
|
client.window,
|
||||||
|
frame.rect.x(), frame.rect.y(),
|
||||||
|
frame.rect.width(), frame.rect.height());
|
||||||
|
#endif // DEBUG
|
||||||
}
|
}
|
||||||
|
|
||||||
// preserve the window's initial state on first map, and its current state
|
// preserve the window's initial state on first map, and its current state
|
||||||
// across a restart
|
// across a restart
|
||||||
if (! getState()) {
|
unsigned long initial_state = current_state;
|
||||||
if (client.wm_hint_flags & StateHint)
|
if (! getState())
|
||||||
current_state = client.initial_state;
|
current_state = initial_state;
|
||||||
else
|
|
||||||
current_state = NormalState;
|
|
||||||
}
|
|
||||||
|
|
||||||
// get sticky state from our parent window if we've got one
|
// get sticky state from our parent window if we've got one
|
||||||
if (isTransient() && client.transient_for != (BlackboxWindow *) ~0ul &&
|
if (isTransient() && client.transient_for != (BlackboxWindow *) ~0ul &&
|
||||||
|
@ -290,14 +318,14 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
|
||||||
|
|
||||||
if (flags.shaded) {
|
if (flags.shaded) {
|
||||||
flags.shaded = False;
|
flags.shaded = False;
|
||||||
unsigned long orig_state = current_state;
|
initial_state = current_state;
|
||||||
shade();
|
shade();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
At this point in the life of a window, current_state should only be set
|
At this point in the life of a window, current_state should only be set
|
||||||
to IconicState if the window was an *icon*, not if it was shaded.
|
to IconicState if the window was an *icon*, not if it was shaded.
|
||||||
*/
|
*/
|
||||||
if (orig_state != IconicState)
|
if (initial_state != IconicState)
|
||||||
current_state = NormalState;
|
current_state = NormalState;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -306,9 +334,8 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
|
||||||
stick();
|
stick();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flags.maximized && (functions & Func_Maximize)) {
|
if (flags.maximized && (functions & Func_Maximize))
|
||||||
remaximize();
|
remaximize();
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
When the window is mapped (and also when its attributes are restored), the
|
When the window is mapped (and also when its attributes are restored), the
|
||||||
|
@ -327,6 +354,13 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
|
||||||
XMapSubwindows(blackbox->getXDisplay(), frame.window);
|
XMapSubwindows(blackbox->getXDisplay(), frame.window);
|
||||||
|
|
||||||
redrawWindowFrame();
|
redrawWindowFrame();
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "0x%lx: end of constructor (%d, %d) w: %d, h: %d\n",
|
||||||
|
client.window,
|
||||||
|
frame.rect.x(), frame.rect.y(),
|
||||||
|
frame.rect.width(), frame.rect.height());
|
||||||
|
#endif // DEBUG
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -849,7 +883,7 @@ void BlackboxWindow::grabButtons(void) {
|
||||||
|
|
||||||
|
|
||||||
void BlackboxWindow::ungrabButtons(void) {
|
void BlackboxWindow::ungrabButtons(void) {
|
||||||
if ((! screen->isSloppyFocus()) || screen->doClickRaise())
|
if (! screen->isSloppyFocus() || screen->doClickRaise())
|
||||||
blackbox->ungrabButton(Button1, 0, frame.plate);
|
blackbox->ungrabButton(Button1, 0, frame.plate);
|
||||||
|
|
||||||
blackbox->ungrabButton(Button1, ModMask, frame.window);
|
blackbox->ungrabButton(Button1, ModMask, frame.window);
|
||||||
|
@ -1033,10 +1067,9 @@ void BlackboxWindow::getWMProtocols(void) {
|
||||||
if (proto[i] == xatom->getAtom(XAtom::wm_delete_window)) {
|
if (proto[i] == xatom->getAtom(XAtom::wm_delete_window)) {
|
||||||
decorations |= Decor_Close;
|
decorations |= Decor_Close;
|
||||||
functions |= Func_Close;
|
functions |= Func_Close;
|
||||||
} else if (proto[i] == xatom->getAtom(XAtom::wm_take_focus))
|
} else if (proto[i] == xatom->getAtom(XAtom::wm_take_focus)) {
|
||||||
flags.send_focus_message = True;
|
flags.send_focus_message = True;
|
||||||
else if (proto[i] == xatom->getAtom(XAtom::blackbox_structure_messages))
|
}
|
||||||
screen->addNetizen(new Netizen(screen, client.window));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
XFree(proto);
|
XFree(proto);
|
||||||
|
@ -1050,7 +1083,6 @@ void BlackboxWindow::getWMProtocols(void) {
|
||||||
*/
|
*/
|
||||||
void BlackboxWindow::getWMHints(void) {
|
void BlackboxWindow::getWMHints(void) {
|
||||||
focus_mode = F_Passive;
|
focus_mode = F_Passive;
|
||||||
client.initial_state = NormalState;
|
|
||||||
|
|
||||||
// remove from current window group
|
// remove from current window group
|
||||||
if (client.window_group) {
|
if (client.window_group) {
|
||||||
|
@ -1077,7 +1109,7 @@ void BlackboxWindow::getWMHints(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wmhint->flags & StateHint)
|
if (wmhint->flags & StateHint)
|
||||||
client.initial_state = wmhint->initial_state;
|
current_state = wmhint->initial_state;
|
||||||
|
|
||||||
if (wmhint->flags & WindowGroupHint) {
|
if (wmhint->flags & WindowGroupHint) {
|
||||||
client.window_group = wmhint->window_group;
|
client.window_group = wmhint->window_group;
|
||||||
|
@ -1092,7 +1124,6 @@ void BlackboxWindow::getWMHints(void) {
|
||||||
group->addWindow(this);
|
group->addWindow(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
client.wm_hint_flags = wmhint->flags;
|
|
||||||
XFree(wmhint);
|
XFree(wmhint);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1332,17 +1363,12 @@ bool BlackboxWindow::getBlackboxHints(void) {
|
||||||
if (blackbox_hint->flags & AttribDecoration) {
|
if (blackbox_hint->flags & AttribDecoration) {
|
||||||
switch (blackbox_hint->decoration) {
|
switch (blackbox_hint->decoration) {
|
||||||
case DecorNone:
|
case DecorNone:
|
||||||
// clear all decorations except close
|
decorations = 0;
|
||||||
decorations &= Decor_Close;
|
|
||||||
// clear all functions except close
|
|
||||||
functions &= Func_Close;
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DecorTiny:
|
case DecorTiny:
|
||||||
decorations |= Decor_Titlebar | Decor_Iconify;
|
decorations |= Decor_Titlebar | Decor_Iconify;
|
||||||
decorations &= ~(Decor_Border | Decor_Handle | Decor_Maximize);
|
decorations &= ~(Decor_Border | Decor_Handle | Decor_Maximize);
|
||||||
functions |= Func_Move | Func_Iconify;
|
|
||||||
functions &= ~(Func_Resize | Func_Maximize);
|
functions &= ~(Func_Resize | Func_Maximize);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@ -1350,7 +1376,6 @@ bool BlackboxWindow::getBlackboxHints(void) {
|
||||||
case DecorTool:
|
case DecorTool:
|
||||||
decorations |= Decor_Titlebar;
|
decorations |= Decor_Titlebar;
|
||||||
decorations &= ~(Decor_Iconify | Decor_Border | Decor_Handle);
|
decorations &= ~(Decor_Iconify | Decor_Border | Decor_Handle);
|
||||||
functions |= Func_Move;
|
|
||||||
functions &= ~(Func_Resize | Func_Maximize | Func_Iconify);
|
functions &= ~(Func_Resize | Func_Maximize | Func_Iconify);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@ -1359,8 +1384,6 @@ bool BlackboxWindow::getBlackboxHints(void) {
|
||||||
default:
|
default:
|
||||||
decorations |= Decor_Titlebar | Decor_Border | Decor_Handle |
|
decorations |= Decor_Titlebar | Decor_Border | Decor_Handle |
|
||||||
Decor_Iconify | Decor_Maximize;
|
Decor_Iconify | Decor_Maximize;
|
||||||
functions |= Func_Resize | Func_Move | Func_Iconify | Func_Maximize;
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1376,8 +1399,7 @@ bool BlackboxWindow::getBlackboxHints(void) {
|
||||||
void BlackboxWindow::getTransientInfo(void) {
|
void BlackboxWindow::getTransientInfo(void) {
|
||||||
if (client.transient_for &&
|
if (client.transient_for &&
|
||||||
client.transient_for != (BlackboxWindow *) ~0ul) {
|
client.transient_for != (BlackboxWindow *) ~0ul) {
|
||||||
// the transient for hint was removed, so we need to tell our
|
// reset transient_for in preparation of looking for a new owner
|
||||||
// previous transient_for that we are going away
|
|
||||||
client.transient_for->client.transientList.remove(this);
|
client.transient_for->client.transientList.remove(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1548,15 +1570,7 @@ bool BlackboxWindow::setInputFocus(void) {
|
||||||
assert(! flags.iconic &&
|
assert(! flags.iconic &&
|
||||||
(flags.stuck || // window must be on the current workspace or sticky
|
(flags.stuck || // window must be on the current workspace or sticky
|
||||||
blackbox_attrib.workspace == screen->getCurrentWorkspaceID()));
|
blackbox_attrib.workspace == screen->getCurrentWorkspaceID()));
|
||||||
#if 0
|
|
||||||
// if the window is not visible, mark the window as wanting focus rather
|
|
||||||
// than give it focus.
|
|
||||||
if (! flags.visible) {
|
|
||||||
Workspace *wkspc = screen->getWorkspace(blackbox_attrib.workspace);
|
|
||||||
wkspc->setLastFocusedWindow(this);
|
|
||||||
return True;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
/*
|
/*
|
||||||
We only do this check for normal windows and dialogs because other windows
|
We only do this check for normal windows and dialogs because other windows
|
||||||
do this on purpose, such as kde's kicker, and we don't want to go moving
|
do this on purpose, such as kde's kicker, and we don't want to go moving
|
||||||
|
@ -1855,6 +1869,27 @@ void BlackboxWindow::maximize(unsigned int button) {
|
||||||
|
|
||||||
// re-maximizes the window to take into account availableArea changes
|
// re-maximizes the window to take into account availableArea changes
|
||||||
void BlackboxWindow::remaximize(void) {
|
void BlackboxWindow::remaximize(void) {
|
||||||
|
if (flags.shaded) {
|
||||||
|
// we only update the window's attributes otherwise we lose the shade bit
|
||||||
|
switch(flags.maximized) {
|
||||||
|
case 1:
|
||||||
|
blackbox_attrib.flags |= AttribMaxHoriz | AttribMaxVert;
|
||||||
|
blackbox_attrib.attrib |= AttribMaxHoriz | AttribMaxVert;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
blackbox_attrib.flags |= AttribMaxVert;
|
||||||
|
blackbox_attrib.attrib |= AttribMaxVert;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
blackbox_attrib.flags |= AttribMaxHoriz;
|
||||||
|
blackbox_attrib.attrib |= AttribMaxHoriz;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// save the original dimensions because maximize will wipe them out
|
// save the original dimensions because maximize will wipe them out
|
||||||
int premax_x = blackbox_attrib.premax_x,
|
int premax_x = blackbox_attrib.premax_x,
|
||||||
premax_y = blackbox_attrib.premax_y,
|
premax_y = blackbox_attrib.premax_y,
|
||||||
|
@ -2236,6 +2271,56 @@ void BlackboxWindow::restoreAttributes(void) {
|
||||||
blackbox_attrib.premax_h = h;
|
blackbox_attrib.premax_h = h;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (net->flags & AttribDecoration) {
|
||||||
|
switch (net->decoration) {
|
||||||
|
case DecorNone:
|
||||||
|
decorations = 0;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
case DecorNormal:
|
||||||
|
decorations |= Decor_Titlebar | Decor_Handle | Decor_Border |
|
||||||
|
Decor_Iconify | Decor_Maximize;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DecorTiny:
|
||||||
|
decorations |= Decor_Titlebar | Decor_Iconify;
|
||||||
|
decorations &= ~(Decor_Border | Decor_Handle | Decor_Maximize);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DecorTool:
|
||||||
|
decorations |= Decor_Titlebar;
|
||||||
|
decorations &= ~(Decor_Iconify | Decor_Border | Decor_Handle);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// sanity check the new decor
|
||||||
|
if (! (functions & Func_Resize) || isTransient())
|
||||||
|
decorations &= ~(Decor_Maximize | Decor_Handle);
|
||||||
|
if (! (functions & Func_Maximize))
|
||||||
|
decorations &= ~Decor_Maximize;
|
||||||
|
|
||||||
|
if (decorations & Decor_Titlebar) {
|
||||||
|
if (functions & Func_Close) // close button is controlled by function
|
||||||
|
decorations |= Decor_Close; // not decor type
|
||||||
|
} else {
|
||||||
|
if (flags.shaded) // we can not be shaded if we lack a titlebar
|
||||||
|
shade();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags.visible && frame.window) {
|
||||||
|
XMapSubwindows(blackbox->getXDisplay(), frame.window);
|
||||||
|
XMapWindow(blackbox->getXDisplay(), frame.window);
|
||||||
|
}
|
||||||
|
|
||||||
|
reconfigure();
|
||||||
|
setState(current_state);
|
||||||
|
}
|
||||||
|
|
||||||
// with the state set it will then be the map event's job to read the
|
// with the state set it will then be the map event's job to read the
|
||||||
// window's state and behave accordingly
|
// window's state and behave accordingly
|
||||||
|
|
||||||
|
@ -2531,6 +2616,12 @@ void BlackboxWindow::mapRequestEvent(const XMapRequestEvent *re) {
|
||||||
case InactiveState:
|
case InactiveState:
|
||||||
case ZoomState:
|
case ZoomState:
|
||||||
default:
|
default:
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "0x%lx: just before show (%d, %d) w: %d, h: %d\n",
|
||||||
|
client.window,
|
||||||
|
frame.rect.x(), frame.rect.y(),
|
||||||
|
frame.rect.width(), frame.rect.height());
|
||||||
|
#endif // DEBUG
|
||||||
show();
|
show();
|
||||||
screen->getWorkspace(blackbox_attrib.workspace)->raiseWindow(this);
|
screen->getWorkspace(blackbox_attrib.workspace)->raiseWindow(this);
|
||||||
if (isNormal()) {
|
if (isNormal()) {
|
||||||
|
@ -2624,6 +2715,12 @@ void BlackboxWindow::propertyNotifyEvent(const XPropertyEvent *pe) {
|
||||||
}
|
}
|
||||||
|
|
||||||
reconfigure();
|
reconfigure();
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "0x%lx: transient hint (%d, %d) w: %d, h: %d\n",
|
||||||
|
client.window,
|
||||||
|
frame.rect.x(), frame.rect.y(),
|
||||||
|
frame.rect.width(), frame.rect.height());
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -2676,6 +2773,12 @@ void BlackboxWindow::propertyNotifyEvent(const XPropertyEvent *pe) {
|
||||||
if (old_rect != frame.rect)
|
if (old_rect != frame.rect)
|
||||||
reconfigure();
|
reconfigure();
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "0x%lx: normal hint (%d, %d) w: %d, h: %d\n",
|
||||||
|
client.window,
|
||||||
|
frame.rect.x(), frame.rect.y(),
|
||||||
|
frame.rect.width(), frame.rect.height());
|
||||||
|
#endif // DEBUG
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2735,11 +2838,19 @@ void BlackboxWindow::configureRequestEvent(const XConfigureRequestEvent *cr) {
|
||||||
applyGravity(req);
|
applyGravity(req);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cr->value_mask & CWWidth)
|
if (cr->value_mask & CWWidth) {
|
||||||
req.setWidth(cr->width + frame.margin.left + frame.margin.right);
|
req.setWidth(cr->width + frame.margin.left + frame.margin.right);
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "0x%lx: new width - %d\n", client.window, cr->width);
|
||||||
|
#endif // DEBUG
|
||||||
|
}
|
||||||
|
|
||||||
if (cr->value_mask & CWHeight)
|
if (cr->value_mask & CWHeight) {
|
||||||
req.setHeight(cr->height + frame.margin.top + frame.margin.bottom);
|
req.setHeight(cr->height + frame.margin.top + frame.margin.bottom);
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "0x%lx: new height - %d\n", client.window, cr->height);
|
||||||
|
#endif // DEBUG
|
||||||
|
}
|
||||||
|
|
||||||
configure(req.x(), req.y(), req.width(), req.height());
|
configure(req.x(), req.y(), req.width(), req.height());
|
||||||
}
|
}
|
||||||
|
@ -2758,6 +2869,13 @@ void BlackboxWindow::configureRequestEvent(const XConfigureRequestEvent *cr) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "0x%lx: change request (%d, %d) w: %d, h: %d\n",
|
||||||
|
client.window,
|
||||||
|
frame.rect.x(), frame.rect.y(),
|
||||||
|
frame.rect.width(), frame.rect.height());
|
||||||
|
#endif // DEBUG
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -3030,10 +3148,10 @@ void BlackboxWindow::doMove(int x_root, int y_root) {
|
||||||
bool snapped = False;
|
bool snapped = False;
|
||||||
|
|
||||||
const Rect &winrect = snapwin->frameRect();
|
const Rect &winrect = snapwin->frameRect();
|
||||||
int dleft = std::abs(wright - winrect.left()),
|
int dleft = abs(wright - winrect.left()),
|
||||||
dright = std::abs(wleft - winrect.right()),
|
dright = abs(wleft - winrect.right()),
|
||||||
dtop = std::abs(wbottom - winrect.top()),
|
dtop = abs(wbottom - winrect.top()),
|
||||||
dbottom = std::abs(wtop - winrect.bottom());
|
dbottom = abs(wtop - winrect.bottom());
|
||||||
|
|
||||||
if (wtop >= (signed)(winrect.y() - frame.rect.height() + 1) &&
|
if (wtop >= (signed)(winrect.y() - frame.rect.height() + 1) &&
|
||||||
wtop < (signed)(winrect.y() + winrect.height() - 1)) {
|
wtop < (signed)(winrect.y() + winrect.height() - 1)) {
|
||||||
|
@ -3052,8 +3170,8 @@ void BlackboxWindow::doMove(int x_root, int y_root) {
|
||||||
if (snapped) {
|
if (snapped) {
|
||||||
if (screen->getWindowCornerSnap()) {
|
if (screen->getWindowCornerSnap()) {
|
||||||
// try corner-snap to its other sides
|
// try corner-snap to its other sides
|
||||||
dtop = std::abs(wtop - winrect.top());
|
dtop = abs(wtop - winrect.top());
|
||||||
dbottom = std::abs(wbottom - winrect.bottom());
|
dbottom = abs(wbottom - winrect.bottom());
|
||||||
if (dtop < snap_distance && dtop <= dbottom)
|
if (dtop < snap_distance && dtop <= dbottom)
|
||||||
dy = winrect.top();
|
dy = winrect.top();
|
||||||
else if (dbottom < snap_distance)
|
else if (dbottom < snap_distance)
|
||||||
|
@ -3081,8 +3199,8 @@ void BlackboxWindow::doMove(int x_root, int y_root) {
|
||||||
if (snapped) {
|
if (snapped) {
|
||||||
if (screen->getWindowCornerSnap()) {
|
if (screen->getWindowCornerSnap()) {
|
||||||
// try corner-snap to its other sides
|
// try corner-snap to its other sides
|
||||||
dleft = std::abs(wleft - winrect.left());
|
dleft = abs(wleft - winrect.left());
|
||||||
dright = std::abs(wright - winrect.right());
|
dright = abs(wright - winrect.right());
|
||||||
if (dleft < snap_distance && dleft <= dright)
|
if (dleft < snap_distance && dleft <= dright)
|
||||||
dx = winrect.left();
|
dx = winrect.left();
|
||||||
else if (dright < snap_distance)
|
else if (dright < snap_distance)
|
||||||
|
@ -3128,10 +3246,10 @@ void BlackboxWindow::doMove(int x_root, int y_root) {
|
||||||
frame.rect.height())))
|
frame.rect.height())))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
int dleft = std::abs(wleft - srect.left()),
|
int dleft = abs(wleft - srect.left()),
|
||||||
dright = std::abs(wright - srect.right()),
|
dright = abs(wright - srect.right()),
|
||||||
dtop = std::abs(wtop - srect.top()),
|
dtop = abs(wtop - srect.top()),
|
||||||
dbottom = std::abs(wbottom - srect.bottom());
|
dbottom = abs(wbottom - srect.bottom());
|
||||||
|
|
||||||
// snap left?
|
// snap left?
|
||||||
if (dleft < snap_distance && dleft <= dright)
|
if (dleft < snap_distance && dleft <= dright)
|
||||||
|
@ -3466,7 +3584,7 @@ void BlackboxWindow::timeout(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void BlackboxWindow::changeBlackboxHints(BlackboxHints *net) {
|
void BlackboxWindow::changeBlackboxHints(const BlackboxHints *net) {
|
||||||
if ((net->flags & AttribShaded) &&
|
if ((net->flags & AttribShaded) &&
|
||||||
((blackbox_attrib.attrib & AttribShaded) !=
|
((blackbox_attrib.attrib & AttribShaded) !=
|
||||||
(net->attrib & AttribShaded)))
|
(net->attrib & AttribShaded)))
|
||||||
|
@ -3512,8 +3630,7 @@ void BlackboxWindow::changeBlackboxHints(BlackboxHints *net) {
|
||||||
if (net->flags & AttribDecoration) {
|
if (net->flags & AttribDecoration) {
|
||||||
switch (net->decoration) {
|
switch (net->decoration) {
|
||||||
case DecorNone:
|
case DecorNone:
|
||||||
// clear all decorations except close
|
decorations = 0;
|
||||||
decorations &= Decor_Close;
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -183,7 +183,7 @@ private:
|
||||||
base_width, base_height,
|
base_width, base_height,
|
||||||
win_gravity;
|
win_gravity;
|
||||||
|
|
||||||
unsigned long initial_state, normal_hint_flags, wm_hint_flags;
|
unsigned long initial_state, normal_hint_flags;
|
||||||
} client;
|
} client;
|
||||||
|
|
||||||
FunctionFlags functions;
|
FunctionFlags functions;
|
||||||
|
@ -390,7 +390,7 @@ public:
|
||||||
void restore(bool remap);
|
void restore(bool remap);
|
||||||
void configure(int dx, int dy, unsigned int dw, unsigned int dh);
|
void configure(int dx, int dy, unsigned int dw, unsigned int dh);
|
||||||
void setWorkspace(unsigned int n);
|
void setWorkspace(unsigned int n);
|
||||||
void changeBlackboxHints(BlackboxHints *net);
|
void changeBlackboxHints(const BlackboxHints *net);
|
||||||
void restoreAttributes(void);
|
void restoreAttributes(void);
|
||||||
|
|
||||||
void buttonPressEvent(const XButtonEvent *be);
|
void buttonPressEvent(const XButtonEvent *be);
|
||||||
|
|
|
@ -282,16 +282,6 @@ void Blackbox::process_event(XEvent *e) {
|
||||||
}
|
}
|
||||||
|
|
||||||
case ConfigureRequest: {
|
case ConfigureRequest: {
|
||||||
// compress configure requests...
|
|
||||||
XEvent realevent;
|
|
||||||
unsigned int i = 0;
|
|
||||||
while(XCheckTypedWindowEvent(getXDisplay(), e->xconfigurerequest.window,
|
|
||||||
ConfigureRequest, &realevent)) {
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
if ( i > 0 )
|
|
||||||
e = &realevent;
|
|
||||||
|
|
||||||
BlackboxWindow *win = (BlackboxWindow *) 0;
|
BlackboxWindow *win = (BlackboxWindow *) 0;
|
||||||
Slit *slit = (Slit *) 0;
|
Slit *slit = (Slit *) 0;
|
||||||
|
|
||||||
|
@ -496,7 +486,7 @@ void Blackbox::process_event(XEvent *e) {
|
||||||
if (win->getScreen()->isSloppyFocus() &&
|
if (win->getScreen()->isSloppyFocus() &&
|
||||||
(! win->isFocused()) && (! no_focus) &&
|
(! win->isFocused()) && (! no_focus) &&
|
||||||
win->isNormal()) { // don't focus non-normal windows with mouseover
|
win->isNormal()) { // don't focus non-normal windows with mouseover
|
||||||
if (((! sa.leave) || sa.inferior) && win->isVisible()) {
|
if ((! sa.leave || sa.inferior) && win->isVisible()) {
|
||||||
if (win->setInputFocus())
|
if (win->setInputFocus())
|
||||||
win->installColormap(True); // XXX: shouldnt we honour no install?
|
win->installColormap(True); // XXX: shouldnt we honour no install?
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue