TWin: Add active corner support to quick tiling

Signed-off-by: Mavridis Philippe <mavridisf@gmail.com>
(cherry picked from commit 5b1934dd5d)
r14.1.x
Mavridis Philippe 10 months ago
parent 87b9269efb
commit e4d35cab44
No known key found for this signature in database
GPG Key ID: F8D2D7E2F989A494

@ -771,7 +771,7 @@ Use the slider widget to configure the delay.
<varlistentry>
<term><guilabel>Tile window</guilabel></term>
<listitem>
<para>Dragging a window into a desktop border will tile that window at that side of the screen. This feature is also known as <quote>Aerosnap</quote> or <quote>Quick Tile</quote>.</para>
<para>Dragging a window into a desktop border will tile that window at that side or corner of the screen. This feature is also known as <quote>Aerosnap</quote> or <quote>Quick Tile</quote>.</para>
<para><guilabel>Maximize windows by dragging them to the top of the screen</guilabel> changes the behaviour of the top border of the desktop. If this option is enabled, dragging a window into the top border will not result in tiling, but the window will become maximized instead.</para>
<para>By default dragging a tiled window does not reset its original size. This behaviour is controlled by an option in the <link linkend="moving">Moving</link> tab of this control module.</para>
</listitem>

@ -233,7 +233,9 @@ class Client : public TQObject, public KDecorationDefines
void resizeWithChecks( const TQSize& s, ForceGeometry_t force = NormalGeometrySet );
void keepInArea( TQRect area, bool partial = false );
void setActiveBorderMode( ActiveMaximizingMode mode );
void setActiveBorder( ActiveBorder border);
ActiveMaximizingMode activeBorderMode() const;
ActiveBorder activeBorder() const;
void setActiveBorderMaximizing(bool maximizing);
bool isActiveBorderMaximizing() const;
TQRect activeBorderMaximizeGeometry();
@ -609,6 +611,7 @@ class Client : public TQObject, public KDecorationDefines
bool activeTiled;
TQRect activeTiledOrigGeom;
ActiveMaximizingMode activeMode;
ActiveBorder currentActiveBorder;
friend bool performTransiencyCheck();
bool minimized_before_suspend;

@ -2718,6 +2718,14 @@ ActiveMaximizingMode Client::activeBorderMode() const
return activeMode;
}
void Client::setActiveBorder(ActiveBorder border) {
currentActiveBorder = border;
}
ActiveBorder Client::activeBorder() const {
return currentActiveBorder;
}
bool Client::isActiveBorderMaximizing() const
{
return activeMaximizing;
@ -2740,7 +2748,7 @@ TQRect Client::activeBorderMaximizeGeometry()
{
TQRect ret;
TQRect max = workspace()->clientArea(MaximizeArea, TQCursor::pos(), workspace()->currentDesktop());
switch (activeMode)
switch (activeBorderMode())
{
case ActiveMaximizeMode:
{
@ -2750,25 +2758,52 @@ TQRect Client::activeBorderMaximizeGeometry()
ret = max;
break;
}
case ActiveLeftMode:
{
ret = TQRect( max.x(), max.y(), max.width()/2, max.height() );
break;
}
case ActiveRightMode:
{
ret = TQRect( max.x() + max.width()/2, max.y(), max.width()/2, max.height() );
break;
}
case ActiveTopMode:
{
ret = TQRect( max.x(), max.y(), max.width(), max.height()/2 );
break;
}
case ActiveBottomMode:
case ActiveTilingMode:
{
ret = TQRect( max.x(), max.y() + max.height()/2, max.width(), max.height()/2 );
break;
switch (activeBorder())
{
case ActiveLeft:
{
ret = TQRect( max.x(), max.y(), max.width()/2, max.height() );
break;
}
case ActiveRight:
{
ret = TQRect( max.x() + max.width()/2, max.y(), max.width()/2, max.height() );
break;
}
case ActiveTop:
{
ret = TQRect( max.x(), max.y(), max.width(), max.height()/2 );
break;
}
case ActiveBottom:
{
ret = TQRect( max.x(), max.y() + max.height()/2, max.width(), max.height()/2 );
break;
}
case ActiveTopLeft:
{
ret = TQRect( max.x(), max.y(), max.width()/2, max.height()/2 );
break;
}
case ActiveTopRight:
{
ret = TQRect( max.x() + max.width()/2, max.y(), max.width()/2, max.height()/2 );
break;
}
case ActiveBottomLeft:
{
ret = TQRect( max.x(), max.y() + max.height()/2, max.width()/2, max.height()/2 );
break;
}
case ActiveBottomRight:
{
ret = TQRect( max.x() + max.width()/2, max.y() + max.height()/2, max.width()/2, max.height()/2);
break;
}
}
}
}
return ret;

@ -56,33 +56,34 @@
// twin config keywords
#define KWIN_FOCUS "FocusPolicy"
#define KWIN_PLACEMENT "Placement"
#define KWIN_MOVE "MoveMode"
#define KWIN_MINIMIZE_ANIM "AnimateMinimize"
#define KWIN_MINIMIZE_ANIM_SPEED "AnimateMinimizeSpeed"
#define KWIN_RESIZE_OPAQUE "ResizeMode"
#define KWIN_GEOMETRY "GeometryTip"
#define KWIN_AUTORAISE_INTERVAL "AutoRaiseInterval"
#define KWIN_AUTORAISE "AutoRaise"
#define KWIN_DELAYFOCUS_INTERVAL "DelayFocusInterval"
#define KWIN_DELAYFOCUS "DelayFocus"
#define KWIN_CLICKRAISE "ClickRaise"
#define KWIN_ANIMSHADE "AnimateShade"
#define KWIN_MOVE_RESIZE_MAXIMIZED "MoveResizeMaximizedWindows"
#define KWIN_RESET_MAX_WIN_GEOM "ResetMaximizedWindowGeometry"
#define KWIN_ALTTABMODE "AltTabStyle"
#define KWIN_TRAVERSE_ALL "TraverseAll"
#define KWIN_SHOW_POPUP "ShowPopup"
#define KWIN_ROLL_OVER_DESKTOPS "RollOverDesktops"
#define KWIN_SHADEHOVER "ShadeHover"
#define KWIN_SHADEHOVER_INTERVAL "ShadeHoverInterval"
#define KWIN_FOCUS_STEALING "FocusStealingPreventionLevel"
#define KWIN_HIDE_UTILITY "HideUtilityWindowsForInactive"
#define KWIN_SEPARATE_SCREEN_FOCUS "SeparateScreenFocus"
#define KWIN_ACTIVE_MOUSE_SCREEN "ActiveMouseScreen"
#define KWIN_ACTIVE_BORDERS "ActiveBorders"
#define KWIN_ACTIVE_BORDER_DELAY "ActiveBorderDelay"
#define KWIN_FOCUS "FocusPolicy"
#define KWIN_PLACEMENT "Placement"
#define KWIN_MOVE "MoveMode"
#define KWIN_MINIMIZE_ANIM "AnimateMinimize"
#define KWIN_MINIMIZE_ANIM_SPEED "AnimateMinimizeSpeed"
#define KWIN_RESIZE_OPAQUE "ResizeMode"
#define KWIN_GEOMETRY "GeometryTip"
#define KWIN_AUTORAISE_INTERVAL "AutoRaiseInterval"
#define KWIN_AUTORAISE "AutoRaise"
#define KWIN_DELAYFOCUS_INTERVAL "DelayFocusInterval"
#define KWIN_DELAYFOCUS "DelayFocus"
#define KWIN_CLICKRAISE "ClickRaise"
#define KWIN_ANIMSHADE "AnimateShade"
#define KWIN_MOVE_RESIZE_MAXIMIZED "MoveResizeMaximizedWindows"
#define KWIN_RESET_MAX_WIN_GEOM "ResetMaximizedWindowGeometry"
#define KWIN_ALTTABMODE "AltTabStyle"
#define KWIN_TRAVERSE_ALL "TraverseAll"
#define KWIN_SHOW_POPUP "ShowPopup"
#define KWIN_ROLL_OVER_DESKTOPS "RollOverDesktops"
#define KWIN_SHADEHOVER "ShadeHover"
#define KWIN_SHADEHOVER_INTERVAL "ShadeHoverInterval"
#define KWIN_FOCUS_STEALING "FocusStealingPreventionLevel"
#define KWIN_HIDE_UTILITY "HideUtilityWindowsForInactive"
#define KWIN_SEPARATE_SCREEN_FOCUS "SeparateScreenFocus"
#define KWIN_ACTIVE_MOUSE_SCREEN "ActiveMouseScreen"
#define KWIN_ACTIVE_BORDERS "ActiveBorders"
#define KWIN_ACTIVE_BORDER_DELAY "ActiveBorderDelay"
#define KWIN_ACTIVE_BORDER_DISTANCE "ActiveBorderDistance"
// legacy options
#define KWIN_OLD_ACTIVE_BORDERS "ElectricBorders"
@ -700,6 +701,16 @@ KAdvancedConfig::KAdvancedConfig (bool _standAlone, TDEConfig *_config, TQWidget
" active borders feature. The selected action will be performed after the mouse "
" has been pushed against a screen border for the specified number of milliseconds.") );
distance = new KIntNumInput(10, active_box);
distance->setRange(1, 100, 1, true);
distance->setSuffix(i18n(" px"));
distance->setLabel(i18n("Border &activation distance:"));
TQWhatsThis::add( distance, i18n("The distance from which an active border can"
" be activated. A lower value requires you to push repeatedly into the edge."
" Setting this to a higher value (e.g. 30) activates the borders when the"
" mouse is close enough, making them easier to activate but also more prone"
" to false activations."));
active_vbox->addSpacing(10);
active_vbox->addWidget(active_func_label);
active_vbox->addWidget(active_disable);
@ -709,6 +720,7 @@ KAdvancedConfig::KAdvancedConfig (bool _standAlone, TDEConfig *_config, TQWidget
active_vbox->addWidget(active_tile_conf);
active_vbox->addSpacing(15);
active_vbox->addWidget(delays);
active_vbox->addWidget(distance);
connect(active_box, TQT_SIGNAL(clicked(int)), this, TQT_SLOT(setEBorders()));
@ -716,7 +728,8 @@ KAdvancedConfig::KAdvancedConfig (bool _standAlone, TDEConfig *_config, TQWidget
connect(active_box, TQT_SIGNAL(clicked(int)), this, TQT_SLOT(changed()));
connect(active_move, TQT_SIGNAL(clicked()), this, TQT_SLOT(changed()));
connect(active_maximize, TQT_SIGNAL(clicked()), this, TQT_SLOT(changed()));
connect(delays, TQT_SIGNAL(valueChanged(int)), this, TQT_SLOT(changed()));
connect(delays, TQT_SIGNAL(valueChanged(int)), this, TQT_SLOT(changed()));
connect(distance, TQT_SIGNAL(valueChanged(int)), this, TQT_SLOT(changed()));
lay->addWidget(active_box);
@ -781,6 +794,7 @@ void KAdvancedConfig::load( void )
setActiveBorders(active_borders);
setActiveBorderDelay(active_borders_delay);
setActiveBorderDistance(config->readNumEntry(KWIN_ACTIVE_BORDER_DISTANCE, 10));
setHideUtilityWindowsForInactive( config->readBoolEntry( KWIN_HIDE_UTILITY, true ));
@ -804,6 +818,7 @@ void KAdvancedConfig::save( void )
config->writeEntry(KWIN_ACTIVE_BORDERS, getActiveBorders());
config->writeEntry(KWIN_ACTIVE_BORDER_DELAY, getActiveBorderDelay());
config->writeEntry(KWIN_ACTIVE_BORDER_DISTANCE, getActiveBorderDistance());
config->writeEntry(KWIN_HIDE_UTILITY, hideUtilityWindowsForInactive->isChecked());
@ -828,6 +843,7 @@ void KAdvancedConfig::defaults()
setShadeHoverInterval(250);
setActiveBorders(0);
setActiveBorderDelay(150);
setActiveBorderDistance(10);
setHideUtilityWindowsForInactive( true );
emit TDECModule::changed(true);
}
@ -858,6 +874,10 @@ int KAdvancedConfig::getActiveBorderDelay()
return delays->value();
}
int KAdvancedConfig::getActiveBorderDistance() {
return distance->value();
}
void KAdvancedConfig::setActiveBorders(int i){
switch(i)
{
@ -883,6 +903,9 @@ void KAdvancedConfig::setActiveBorderDelay(int delay)
delays->setValue(delay);
}
void KAdvancedConfig::setActiveBorderDistance(int d) {
distance->setValue(d);
}
KMovingConfig::~KMovingConfig ()
{

@ -228,8 +228,10 @@ private:
int getActiveBorders( void );
int getActiveBorderDelay();
int getActiveBorderDistance();
void setActiveBorders( int );
void setActiveBorderDelay( int );
void setActiveBorderDistance( int );
TQButtonGroup *active_box;
TQRadioButton *active_disable;
@ -238,6 +240,7 @@ private:
TQRadioButton *active_tile;
TQCheckBox *active_maximize;
KIntNumInput *delays;
KIntNumInput *distance;
TQWidget *active_desktop_conf;
TQWidget *active_tile_conf;

@ -136,6 +136,7 @@ unsigned long Options::updateSettings()
if (active_border_delay == -1) {
active_border_delay = config->readNumEntry("ElectricBorderDelay", 150);
}
active_border_distance = config->readNumEntry("ActiveBorderDistance", 10);
OpTitlebarDblClick = windowOperation( config->readEntry("TitlebarDoubleClickCommand", "Shade"), true );
d->OpMaxButtonLeftClick = windowOperation( config->readEntry("MaximizeButtonLeftClickCommand", "Maximize"), true );
@ -397,6 +398,11 @@ int Options::activeBorderDelay()
return active_border_delay;
}
int Options::borderActivationDistance()
{
return active_border_distance;
}
bool Options::checkIgnoreFocusStealing( const Client* c )
{
return ignoreFocusStealingClasses.contains(TQString::fromLatin1(c->resourceClass()));

@ -326,6 +326,8 @@ class Options : public KDecorationOptions
*/
int activeBorders();
int borderActivationDistance();
/**
* @returns the activation delay for active borders in milliseconds.
*/
@ -386,6 +388,7 @@ class Options : public KDecorationOptions
int active_borders;
int active_border_delay;
int active_border_distance;
bool show_geometry_tip;
bool reset_maximized_window_geometry;
bool topmenus;

@ -124,11 +124,9 @@ enum ActiveBorder
enum ActiveMaximizingMode
{
ActiveMaximizeMode,
ActiveLeftMode,
ActiveRightMode,
ActiveTopMode,
ActiveBottomMode
ActiveNoMode,
ActiveTilingMode,
ActiveMaximizeMode
};
class Shape

@ -2524,54 +2524,65 @@ void Workspace::checkActiveBorder(const TQPoint &pos, Time now)
Time treshold_set = options->activeBorderDelay(); // set timeout
Time treshold_trigger = 250; // Minimum time between triggers
Time treshold_reset = 250; // reset timeout
int distance_reset = 30; // Mouse should not move more than this many pixels
int activation_distance = options->borderActivationDistance();
if ((pos.x() > activeLeft + distance_reset) &&
(pos.x() < activeRight - distance_reset) &&
(pos.y() > activeTop + distance_reset) &&
(pos.y() < activeBottom - distance_reset))
bool have_borders = false;
for (int i = 0; i < ACTIVE_BORDER_COUNT; ++i)
{
if (active_windows[ i ] != None)
{
have_borders = true;
}
}
if( !have_borders )
return;
// Mouse should not move more than this many pixels
int distance_reset = activation_distance + 10;
// Leave active maximizing mode when window moved away
if (active_current_border != ActiveNone &&
(pos.x() > activeLeft + distance_reset) &&
(pos.x() < activeRight - distance_reset) &&
(pos.y() > activeTop + distance_reset) &&
(pos.y() < activeBottom - distance_reset))
{
if (movingClient &&
(options->activeBorders() == Options::ActiveTileMaximize ||
options->activeBorders() == Options::ActiveTileOnly))
{
movingClient->setActiveBorderMaximizing(false);
return;
}
}
if ((pos.x() != activeLeft) &&
(pos.x() != activeRight) &&
(pos.y() != activeTop) &&
(pos.y() != activeBottom))
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;
if (!active_left && !active_right && !active_top && !active_bottom)
return;
bool have_borders = false;
for (int i = 0; i < ACTIVE_BORDER_COUNT; ++i)
{
if (active_windows[ i ] != None)
{
have_borders = true;
}
}
if( !have_borders )
return;
kdDebug() << "active border activated "
<< pos.x() << ":" << pos.y() << endl;
ActiveBorder border;
if( pos.x() == activeLeft && pos.y() == activeTop )
ActiveBorder border = ActiveNone;
if (active_left && active_top)
border = ActiveTopLeft;
else if( pos.x() == activeRight && pos.y() == activeTop )
else if (active_right && active_top)
border = ActiveTopRight;
else if( pos.x() == activeLeft && pos.y() == activeBottom )
else if (active_left && active_bottom)
border = ActiveBottomLeft;
else if( pos.x() == activeRight && pos.y() == activeBottom )
else if (active_right && active_bottom)
border = ActiveBottomRight;
else if( pos.x() == activeLeft )
else if (active_left)
border = ActiveLeft;
else if( pos.x() == activeRight )
else if (active_right)
border = ActiveRight;
else if( pos.y() == activeTop )
else if (active_top)
border = ActiveTop;
else if( pos.y() == activeBottom )
else if (active_bottom)
border = ActiveBottom;
else
abort();
@ -2586,6 +2597,9 @@ void Workspace::checkActiveBorder(const TQPoint &pos, Time now)
{
active_time_last = now;
kdDebug() << "time diff between first time and now is: "
<< timestampDiff(active_time_first, now)
<< " vs threshold " << treshold_set << endl;
if (timestampDiff(active_time_first, now) > treshold_set)
{
active_time_last_trigger = now;
@ -2608,43 +2622,19 @@ void Workspace::checkActiveBorder(const TQPoint &pos, Time now)
border == ActiveTop && movingClient->isMaximizable())
{
if (!movingClient->isResizable()) return;
bool enable = !movingClient->isActiveBorderMaximizing();
movingClient->setActiveBorderMode(ActiveMaximizeMode);
movingClient->setActiveBorderMaximizing(enable);
movingClient->setActiveBorder(ActiveNone);
movingClient->setActiveBorderMaximizing(true);
}
// Tiling
else if ((options->activeBorders() == Options::ActiveTileMaximize ||
options->activeBorders() == Options::ActiveTileOnly) && isSide)
options->activeBorders() == Options::ActiveTileOnly))
{
if (!movingClient->isResizable()) return;
bool enable = !movingClient->isActiveBorderMaximizing();
bool activate = false;
if (border == ActiveLeft)
{
movingClient->setActiveBorderMode( ActiveLeftMode );
activate = true;
}
else if (border == ActiveRight)
{
movingClient->setActiveBorderMode( ActiveRightMode );
activate = true;
}
else if (border == ActiveTop)
{
movingClient->setActiveBorderMode( ActiveTopMode );
activate = true;
}
else if (border == ActiveBottom)
{
movingClient->setActiveBorderMode( ActiveBottomMode );
activate = true;
}
if (activate)
{
movingClient->setActiveBorderMaximizing(enable);
}
movingClient->setActiveBorderMode(ActiveTilingMode);
movingClient->setActiveBorder(border);
movingClient->setActiveBorderMaximizing(true);
}
else
@ -2671,13 +2661,16 @@ void Workspace::checkActiveBorder(const TQPoint &pos, Time now)
active_push_point = pos;
}
// reset the pointer to find out wether the user is really pushing
// (the direction back from which it came, starting from top clockwise)
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]);
if ((options->activeBorders() == Options::ActiveSwitchAlways && !movingClient) ||
activation_distance < 2)
{
// reset the pointer to find out whether the user is really pushing
// (the direction back from which it came, starting from top clockwise)
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]);
}
}
void Workspace::activeBorderSwitchDesktop(ActiveBorder border, const TQPoint& _pos)
{

Loading…
Cancel
Save