Patch from Thomas Luebking
Adds (secret) opaque resize mode. It sure would be nice if it was documented.... The relevant init file resources and their default values are: session.screen0.opaqueResize: False session.screen0.opaqueResizeDelay: 40
This commit is contained in:
parent
43ae328658
commit
0279936d83
5 changed files with 56 additions and 32 deletions
|
@ -100,6 +100,8 @@ public:
|
|||
bool doAutoRaise() const { return *resource.auto_raise; }
|
||||
bool clickRaises() const { return *resource.click_raises; }
|
||||
bool doOpaqueMove() const { return *resource.opaque_move; }
|
||||
bool doOpaqueResize() const { return *resource.opaque_resize; }
|
||||
unsigned int opaqueResizeDelay() const { return *resource.opaque_resize_delay; }
|
||||
bool doFullMax() const { return *resource.full_max; }
|
||||
bool getMaxIgnoreIncrement() const { return *resource.max_ignore_inc; }
|
||||
bool getMaxDisableMove() const { return *resource.max_disable_move; }
|
||||
|
|
|
@ -83,6 +83,7 @@ ScreenResource::ScreenResource(FbTk::ResourceManager& rm,
|
|||
const std::string& scrname,
|
||||
const std::string& altscrname):
|
||||
opaque_move(rm, true, scrname + ".opaqueMove", altscrname+".OpaqueMove"),
|
||||
opaque_resize(rm, false, scrname + ".opaqueResize", altscrname+".OpaqueResize"),
|
||||
full_max(rm, false, scrname+".fullMaximization", altscrname+".FullMaximization"),
|
||||
max_ignore_inc(rm, true, scrname+".maxIgnoreIncrement", altscrname+".MaxIgnoreIncrement"),
|
||||
max_disable_move(rm, false, scrname+".maxDisableMove", altscrname+".MaxDisableMove"),
|
||||
|
@ -110,6 +111,7 @@ ScreenResource::ScreenResource(FbTk::ResourceManager& rm,
|
|||
clientmenu_use_pixmap(rm, true, scrname+".clientMenu.usePixmap", altscrname+".ClientMenu.UsePixmap"),
|
||||
tabs_use_pixmap(rm, true, scrname+".tabs.usePixmap", altscrname+".Tabs.UsePixmap"),
|
||||
max_over_tabs(rm, false, scrname+".tabs.maxOver", altscrname+".Tabs.MaxOver"),
|
||||
default_internal_tabs(rm, true /* TODO: autoconf option? */ , scrname+".tabs.intitlebar", altscrname+".Tabs.InTitlebar") {
|
||||
default_internal_tabs(rm, true /* TODO: autoconf option? */ , scrname+".tabs.intitlebar", altscrname+".Tabs.InTitlebar"),
|
||||
opaque_resize_delay(rm, 50, scrname + ".opaqueResizeDelay", altscrname+".OpaqueResizeDelay") {
|
||||
|
||||
}
|
||||
|
|
|
@ -32,6 +32,7 @@ struct ScreenResource {
|
|||
const std::string &scrname, const std::string &altscrname);
|
||||
|
||||
FbTk::Resource<bool> opaque_move,
|
||||
opaque_resize,
|
||||
full_max,
|
||||
max_ignore_inc,
|
||||
max_disable_move,
|
||||
|
@ -61,6 +62,7 @@ struct ScreenResource {
|
|||
FbTk::Resource<bool> tabs_use_pixmap;
|
||||
FbTk::Resource<bool> max_over_tabs;
|
||||
FbTk::Resource<bool> default_internal_tabs;
|
||||
FbTk::Resource<unsigned int> opaque_resize_delay;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -449,6 +449,12 @@ void FluxboxWindow::init() {
|
|||
m_tabActivationTimer.setCommand(activate_tab_cmd);
|
||||
m_tabActivationTimer.fireOnce(true);
|
||||
|
||||
m_resizeTimer.setTimeout(screen().opaqueResizeDelay() * FbTk::FbTime::IN_MILLISECONDS);
|
||||
FbTk::RefCount<FbTk::Command<void> > resize_cmd(new FbTk::SimpleCommand<FluxboxWindow>(*this,
|
||||
&FluxboxWindow::updateResize));
|
||||
m_resizeTimer.setCommand(resize_cmd);
|
||||
m_resizeTimer.fireOnce(true);
|
||||
|
||||
m_reposLabels_timer.setTimeout(IconButton::updateLaziness());
|
||||
m_reposLabels_timer.fireOnce(true);
|
||||
FbTk::RefCount<FbTk::Command<void> > elrs(new FbTk::SimpleCommand<FluxboxWindow>(*this, &FluxboxWindow::emitLabelReposSig));
|
||||
|
@ -2663,36 +2669,36 @@ void FluxboxWindow::motionNotifyEvent(XMotionEvent &me) {
|
|||
int old_resize_w = m_last_resize_w;
|
||||
int old_resize_h = m_last_resize_h;
|
||||
|
||||
int dx = me.x - m_button_grab_x;
|
||||
int dy = me.y - m_button_grab_y;
|
||||
int dx = me.x_root - m_button_grab_x;
|
||||
int dy = me.y_root - m_button_grab_y;
|
||||
|
||||
if (m_resize_corner == LEFTTOP || m_resize_corner == LEFTBOTTOM ||
|
||||
m_resize_corner == LEFT) {
|
||||
m_last_resize_w = frame().width() - dx;
|
||||
m_last_resize_x = frame().x() + dx;
|
||||
m_last_resize_w = resize_base_w - dx;
|
||||
m_last_resize_x = resize_base_x + dx;
|
||||
}
|
||||
if (m_resize_corner == LEFTTOP || m_resize_corner == RIGHTTOP ||
|
||||
m_resize_corner == TOP) {
|
||||
m_last_resize_h = frame().height() - dy;
|
||||
m_last_resize_y = frame().y() + dy;
|
||||
m_last_resize_h = resize_base_h - dy;
|
||||
m_last_resize_y = resize_base_y + dy;
|
||||
}
|
||||
if (m_resize_corner == LEFTBOTTOM || m_resize_corner == BOTTOM ||
|
||||
m_resize_corner == RIGHTBOTTOM)
|
||||
m_last_resize_h = frame().height() + dy;
|
||||
m_last_resize_h = resize_base_h + dy;
|
||||
if (m_resize_corner == RIGHTBOTTOM || m_resize_corner == RIGHTTOP ||
|
||||
m_resize_corner == RIGHT)
|
||||
m_last_resize_w = frame().width() + dx;
|
||||
m_last_resize_w = resize_base_w + dx;
|
||||
if (m_resize_corner == CENTER) {
|
||||
// dx or dy must be at least 2
|
||||
if (abs(dx) >= 2 || abs(dy) >= 2) {
|
||||
// take max and make it even
|
||||
int diff = 2 * (max(dx, dy) / 2);
|
||||
|
||||
m_last_resize_h = frame().height() + diff;
|
||||
m_last_resize_h = resize_base_h + diff;
|
||||
|
||||
m_last_resize_w = frame().width() + diff;
|
||||
m_last_resize_x = frame().x() - diff/2;
|
||||
m_last_resize_y = frame().y() - diff/2;
|
||||
m_last_resize_w = resize_base_w + diff;
|
||||
m_last_resize_x = resize_base_x - diff/2;
|
||||
m_last_resize_y = resize_base_y - diff/2;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2780,18 +2786,23 @@ void FluxboxWindow::motionNotifyEvent(XMotionEvent &me) {
|
|||
}
|
||||
}
|
||||
|
||||
// draw over old rect
|
||||
parent().drawRectangle(screen().rootTheme()->opGC(),
|
||||
old_resize_x, old_resize_y,
|
||||
old_resize_w - 1 + 2 * frame().window().borderWidth(),
|
||||
old_resize_h - 1 + 2 * frame().window().borderWidth());
|
||||
|
||||
// draw resize rectangle
|
||||
parent().drawRectangle(screen().rootTheme()->opGC(),
|
||||
m_last_resize_x, m_last_resize_y,
|
||||
m_last_resize_w - 1 + 2 * frame().window().borderWidth(),
|
||||
m_last_resize_h - 1 + 2 * frame().window().borderWidth());
|
||||
if (m_last_resize_w != old_resize_w || m_last_resize_h != old_resize_h) {
|
||||
if (screen().doOpaqueResize()) {
|
||||
m_resizeTimer.start();
|
||||
} else {
|
||||
// draw over old rect
|
||||
parent().drawRectangle(screen().rootTheme()->opGC(),
|
||||
old_resize_x, old_resize_y,
|
||||
old_resize_w - 1 + 2 * frame().window().borderWidth(),
|
||||
old_resize_h - 1 + 2 * frame().window().borderWidth());
|
||||
|
||||
// draw resize rectangle
|
||||
parent().drawRectangle(screen().rootTheme()->opGC(),
|
||||
m_last_resize_x, m_last_resize_y,
|
||||
m_last_resize_w - 1 + 2 * frame().window().borderWidth(),
|
||||
m_last_resize_h - 1 + 2 * frame().window().borderWidth());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3320,29 +3331,33 @@ void FluxboxWindow::startResizing(int x, int y, ReferenceCorner dir) {
|
|||
false, ButtonMotionMask | ButtonReleaseMask,
|
||||
GrabModeAsync, GrabModeAsync, None, cursor, CurrentTime);
|
||||
|
||||
m_button_grab_x = x;
|
||||
m_button_grab_y = y;
|
||||
m_last_resize_x = frame().x();
|
||||
m_last_resize_y = frame().y();
|
||||
m_last_resize_w = frame().width();
|
||||
m_last_resize_h = frame().height();
|
||||
m_button_grab_x = x + frame().x();
|
||||
m_button_grab_y = y + frame().y();
|
||||
resize_base_x = m_last_resize_x = frame().x();
|
||||
resize_base_y = m_last_resize_y = frame().y();
|
||||
resize_base_w = m_last_resize_w = frame().width();
|
||||
resize_base_h = m_last_resize_h = frame().height();
|
||||
|
||||
fixSize();
|
||||
frame().displaySize(m_last_resize_w, m_last_resize_h);
|
||||
|
||||
parent().drawRectangle(screen().rootTheme()->opGC(),
|
||||
if (!screen().doOpaqueResize()) {
|
||||
parent().drawRectangle(screen().rootTheme()->opGC(),
|
||||
m_last_resize_x, m_last_resize_y,
|
||||
m_last_resize_w - 1 + 2 * frame().window().borderWidth(),
|
||||
m_last_resize_h - 1 + 2 * frame().window().borderWidth());
|
||||
}
|
||||
}
|
||||
|
||||
void FluxboxWindow::stopResizing(bool interrupted) {
|
||||
resizing = false;
|
||||
|
||||
parent().drawRectangle(screen().rootTheme()->opGC(),
|
||||
if (!screen().doOpaqueResize()) {
|
||||
parent().drawRectangle(screen().rootTheme()->opGC(),
|
||||
m_last_resize_x, m_last_resize_y,
|
||||
m_last_resize_w - 1 + 2 * frame().window().borderWidth(),
|
||||
m_last_resize_h - 1 + 2 * frame().window().borderWidth());
|
||||
}
|
||||
|
||||
screen().hideGeometry();
|
||||
|
||||
|
|
|
@ -528,6 +528,7 @@ private:
|
|||
void moveResizeClient(WinClient &client);
|
||||
/// sends configurenotify to all clients
|
||||
void sendConfigureNotify();
|
||||
void updateResize() { moveResize(m_last_resize_x, m_last_resize_y, m_last_resize_w, m_last_resize_h); }
|
||||
|
||||
static void grabPointer(Window grab_window,
|
||||
Bool owner_events,
|
||||
|
@ -553,6 +554,7 @@ private:
|
|||
uint64_t m_last_keypress_time;
|
||||
FbTk::Timer m_timer;
|
||||
FbTk::Timer m_tabActivationTimer;
|
||||
FbTk::Timer m_resizeTimer;
|
||||
|
||||
// Window states
|
||||
bool moving, resizing, m_initialized;
|
||||
|
@ -565,6 +567,7 @@ private:
|
|||
int m_last_resize_x, m_last_resize_y; // handles last button press event for resize
|
||||
int m_last_move_x, m_last_move_y; // handles last pos for non opaque moving
|
||||
int m_last_resize_h, m_last_resize_w; // handles height/width for resize "window"
|
||||
int resize_base_x, resize_base_y, resize_base_w, resize_base_h; // opaque and transparent resize alignment
|
||||
int m_last_pressed_button;
|
||||
|
||||
unsigned int m_workspace_number;
|
||||
|
|
Loading…
Reference in a new issue