Fix twin crash when starting with 'Switch desktop' option set. This

resolves issue #455.

Signed-off-by: Michele Calgaro <michele.calgaro@yahoo.it>
pull/464/head
Michele Calgaro 2 months ago
parent c70d6de201
commit 7e7c3b4d5f
Signed by: MicheleC
GPG Key ID: 2A75B7CA8ADED5CF

@ -110,19 +110,16 @@ enum ShadeMode
enum ActiveBorder
{
ActiveNone = 0,
ActiveLeft = 1,
ActiveRight = 2,
ActiveTop = 4,
ActiveBottom = 8,
ActiveTopLeft = ActiveTop | ActiveLeft,
ActiveTopRight = ActiveTop | ActiveRight,
ActiveBottomLeft = ActiveBottom | ActiveLeft,
ActiveBottomRight = ActiveBottom | ActiveRight,
ACTIVE_BORDER_COUNT
ActiveTop = 0,
ActiveTopRight,
ActiveRight,
ActiveBottomRight,
ActiveBottom,
ActiveBottomLeft,
ActiveLeft,
ActiveTopLeft,
ACTIVE_BORDER_COUNT,
ActiveNone
};
enum ActiveMaximizingMode

@ -2559,53 +2559,77 @@ void Workspace::checkActiveBorder(const TQPoint &pos, Time now)
// These checks take activation distance into account, creating a
// virtual "activation band" for easier border/corner activation.
bool active_left = pos.x() < activeLeft + activation_distance,
active_right = pos.x() > activeRight - activation_distance,
active_top = pos.y() < activeTop + activation_distance,
active_bottom = pos.y() > activeBottom - activation_distance;
bool active_left = pos.x() < activeLeft + activation_distance;
bool active_right = pos.x() > activeRight - activation_distance;
bool active_top = pos.y() < activeTop + activation_distance;
bool active_bottom = pos.y() > activeBottom - activation_distance;
if (!active_left && !active_right && !active_top && !active_bottom)
return;
// These checks are used to make corner activation easier: we assume
// a 25% zone on the edge of each border where instead of half size
// tiling we perform quarter size tiling. The rest 50% is left for
// normal half size tiling.
uint active_width_quart = activeRight / 4,
active_height_quart = activeBottom / 4;
bool active_qleft = pos.x() < activeLeft + active_width_quart,
active_qright = pos.x() > activeRight - active_width_quart,
active_qtop = pos.y() < activeTop + active_height_quart,
active_qbottom = pos.y() > activeBottom - active_height_quart;
int border = ActiveNone;
if (active_left) border |= ActiveLeft;
if (active_right) border |= ActiveRight;
if (active_top) border |= ActiveTop;
if (active_bottom) border |= ActiveBottom;
// These options make sense only for the tiling mode.
int active_width_quart = (activeRight - activeLeft) / 4;
int active_height_quart = (activeBottom - activeTop) / 4;
if (border == ActiveLeft || border == ActiveRight) {
if (active_qtop) border |= ActiveTop;
if (active_qbottom) border |= ActiveBottom;
bool active_qleft = false;
bool active_qright = false;
bool active_qtop = false;
bool active_qbottom = false;
if (options->activeBorders() == Options::ActiveTileMaximize ||
options->activeBorders() == Options::ActiveTileOnly)
{
active_qleft = pos.x() < activeLeft + active_width_quart;
active_qright = pos.x() > activeRight - active_width_quart;
active_qtop = pos.y() < activeTop + active_height_quart;
active_qbottom = pos.y() > activeBottom - active_height_quart;
}
else if (border == ActiveTop || border == ActiveBottom) {
if (active_qleft) border |= ActiveLeft;
if (active_qright) border |= ActiveRight;
ActiveBorder border = ActiveNone;
if ((active_left && active_qtop) || (active_top && active_qleft))
{
border = ActiveTopLeft;
}
bool border_valid = false;
for (int i = 0; i < ACTIVE_BORDER_COUNT; ++i) {
if (border == (ActiveBorder)i) {
border_valid = true;
}
else if ((active_right && active_qtop) || (active_top && active_qright))
{
border = ActiveTopRight;
}
if (!border_valid) {
abort();
else if ((active_left && active_qbottom) || (active_bottom && active_qleft))
{
border = ActiveBottomLeft;
}
else if ((active_right && active_qbottom) || (active_bottom && active_qright))
{
border = ActiveBottomRight;
}
else if (active_left)
{
border = ActiveLeft;
}
else if (active_right)
{
border = ActiveRight;
}
else if (active_top)
{
border = ActiveTop;
}
else if (active_bottom)
{
border = ActiveBottom;
}
else
{
// Should never happen
abort();
}
if (border == ActiveNone || active_windows[border] == None) {
return;
if( active_windows[border] == None )
{
return;
}
if ((active_current_border == border) &&
@ -2627,7 +2651,7 @@ void Workspace::checkActiveBorder(const TQPoint &pos, Time now)
if (options->activeBorders() == Options::ActiveSwitchAlways ||
options->activeBorders() == Options::ActiveSwitchOnMove)
{
activeBorderSwitchDesktop((ActiveBorder)border, pos);
activeBorderSwitchDesktop(border, pos);
return; // Don't reset cursor position
}
@ -2647,7 +2671,7 @@ void Workspace::checkActiveBorder(const TQPoint &pos, Time now)
{
if (!movingClient->isResizable()) return;
movingClient->setActiveBorderMode(ActiveTilingMode);
movingClient->setActiveBorder((ActiveBorder)border);
movingClient->setActiveBorder(border);
movingClient->setActiveBorderMaximizing(true);
}
@ -2661,7 +2685,7 @@ void Workspace::checkActiveBorder(const TQPoint &pos, Time now)
// Desktop switching
if (options->activeBorders() == Options::ActiveSwitchAlways && isSide)
{
activeBorderSwitchDesktop((ActiveBorder)border, pos);
activeBorderSwitchDesktop(border, pos);
return; // Don't reset cursor position
}
}
@ -2669,7 +2693,7 @@ void Workspace::checkActiveBorder(const TQPoint &pos, Time now)
}
else
{
active_current_border = (ActiveBorder)border;
active_current_border = border;
active_time_first = now;
active_time_last = now;
active_push_point = pos;
@ -2680,9 +2704,9 @@ void Workspace::checkActiveBorder(const TQPoint &pos, Time now)
{
// Reset the pointer to find out whether the user is really pushing
// (ordered according to enum ActiveBorder minus ActiveNone)
const int xdiff[ACTIVE_BORDER_COUNT] = {1, -1, 0, 0, 1, -1, 1, -1};
const int ydiff[ACTIVE_BORDER_COUNT] = {0, 0, 1, -1, 1, 1, -1, -1};
TQCursor::setPos(pos.x() + xdiff[border - 1], pos.y() + ydiff[border - 1]);
const int xdiff[ ACTIVE_BORDER_COUNT ] = { 0, -1, -1, -1, 0, 1, 1, 1 };
const int ydiff[ ACTIVE_BORDER_COUNT ] = { 1, 1, 0, -1, -1, -1, 0, 1 };
TQCursor::setPos(pos.x() + xdiff[border], pos.y() + ydiff[border]);
}
}
@ -3099,7 +3123,6 @@ void Workspace::handleKompmgrOutput( TDEProcess* , char *buffer, int buflen)
}
}
void Workspace::setOpacity(unsigned long winId, unsigned int opacityPercent)
{
if (opacityPercent > 100) opacityPercent = 100;

Loading…
Cancel
Save