[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-devel
Subject: [Proposal + WIP (but working) patches]: Present Windows feature -
From: Kelvie Wong <kelvie () ieee ! org>
Date: 2008-06-26 3:11:47
Message-ID: 200806252011.48047.kelvie () ieee ! org
[Download RAW message or body]
I sent this to the kwin mailing list, but I don't think many people subscribe to \
that, so I'll repost it here :)
---------- Forwarded Message ----------
Subject: [Proposal + WIP (but working) patches]: Present Windows feature - move \
window to current desktop.
Date: Saturday, June 21, 2008
From: Kelvie Wong <kelvie@ieee.org>
To: kwin@kde.org
---
Attached is a couple of rough patches I've been using (on top of the KDE-svn) that \
enable me to do something that I do very often: move a window to the current \
desktop. I no longer use a taskbar (with too many tasks across too many desktops, \
it becomes much harder to find the window I want without a fullscreen solution), so I \
managed to find some time to quickly read some of the API and hack this up.
Description
===========
What this patch does is that when the user holds down Alt and left click on a window \
(such is the default for moving the window with the mouse) inside Present Windows, \
the window will be moved to the current desktop (the effect is then disabled, and \
the user returns back to the desktop they were at), and the window will be attached \
to the mouse as if the user had used Alt+Left Click on a normal window.
This gives the user the illusion that the window is being dragged from the Present \
Windows effect into the current desktop.
The mouse position inside the window thumbnail is also taken into account (e.g. if \
you drag the window by its top left corner, the top left corner of the window will \
be attached to the mouse when it is un-thumbnailed).
Use Cases
=========
Again, this was done to scratch my own itch (and match my workflow), but here are \
some use cases:
1. The user is working on something, and sees that he received an instant message; \
kopete is in another desktop. He also has about 20 other windows open, scattered \
around his desktops. He hits the shortcut key for Present Windows, and quickly \
finds kopete, uses Alt-click to quickly move kopete to the current desktop, and \
answers the message, and does not need to switch desktops to go back to work.
2. The user is quietly watching a streaming video, and notices that his CPU is doing \
something; rather than stopping the video, he can use Present Windows to find a \
terminal or KSysGuard quickly (either by looking or using the filter), and Alt-click \
to move the window to the current desktop with minimal interruption.
3. The user has 20-30 windows open (with multi-top level window applications like \
Gimp and Qt Designer, this isn't tough to do). He wants to find a specific window \
to move to this desktop. The task bar is a mess, and the windows stack over \
themselves too much in the Desktop Grid. The quickest way to move a window to the \
current desktop would be Present Windows, as the user gets an overall view of _all_ \
windows, and also the ability to filter them.
API Additions
=============
This change required a new function in kwineffects to expose the mouseCommand \
functionality that is available (currently) only in the internal client libraries.
Improvements
============
As I've mentioned, this was a patch I quickly made to scratch my own
1. The global KWin settings should be queried to find out the right key combination \
for "move window".
For me (and I would imagine, most other people), this is Alt+Left click, but this may \
change; it would probably be better to respect the user's choice in their "mouse \
move" shortcut. This was beyond my knowledge w.r.t. how to implement this correctly \
(e.g., do I check the settings every time on a mouseEvent? or should I store it \
during initialization? if so, how do I change it?).
2. Maybe the windowMouseMove handler should be more generic to allow for more mouse \
commands later, such as a windowMouseCommand function that takes an enum telling it \
what to do.
3. Actions for Left, Right, Middle (and perhaps scroll wheel, as well) + modifiers \
should probably be customizable in the Present Windows settings box; and this could \
be one of the actions (To Current Desktop + mouse move).
Anyways, without further ado, the patches.
--
Kelvie Wong
---
workspace/kwin/effects.cpp | 7 +++++++
workspace/kwin/effects.h | 1 +
workspace/kwin/effects/presentwindows.cpp | 20 ++++++++++++++++++--
workspace/kwin/lib/kwineffects.h | 1 +
4 files changed, 27 insertions(+), 2 deletions(-)
diff --git a/workspace/kwin/effects.cpp b/workspace/kwin/effects.cpp
index 4db4c6f..8edd998 100644
--- a/workspace/kwin/effects.cpp
+++ b/workspace/kwin/effects.cpp
@@ -369,6 +369,13 @@ void EffectsHandlerImpl::windowToDesktop( EffectWindow* w, int \
desktop ) Workspace::self()->sendClientToDesktop( cl, desktop, true );
}
+void EffectsHandlerImpl::windowMouseMove( EffectWindow* w, const QPoint& pos )
+ {
+ Client* cl = dynamic_cast< Client* >( \
static_cast<EffectWindowImpl*>(w)->window()); + if( cl && !cl->isDesktop() && \
!cl->isDock() && !cl->isTopMenu()) + cl->performMouseCommand( \
Options::MouseMove, pos ); + }
+
int EffectsHandlerImpl::currentDesktop() const
{
return Workspace::self()->currentDesktop();
diff --git a/workspace/kwin/effects.h b/workspace/kwin/effects.h
index d14ee3e..d9cfaf7 100644
--- a/workspace/kwin/effects.h
+++ b/workspace/kwin/effects.h
@@ -53,6 +53,7 @@ class EffectsHandlerImpl : public EffectsHandler
virtual EffectWindow* activeWindow() const;
virtual void moveWindow( EffectWindow* w, const QPoint& pos );
virtual void windowToDesktop( EffectWindow* w, int desktop );
+ virtual void windowMouseMove( EffectWindow* w, const QPoint& pos );
virtual int currentDesktop() const;
virtual int numberOfDesktops() const;
diff --git a/workspace/kwin/effects/presentwindows.cpp \
b/workspace/kwin/effects/presentwindows.cpp index 6e9134e..aed0be0 100644
--- a/workspace/kwin/effects/presentwindows.cpp
+++ b/workspace/kwin/effects/presentwindows.cpp
@@ -265,13 +265,29 @@ void PresentWindowsEffect::windowInputMouseEvent( Window w, \
QEvent* e ) }
// Find out which window (if any) was clicked and activate it
- QPoint pos = static_cast< QMouseEvent* >( e )->pos();
+ QMouseEvent *me = static_cast< QMouseEvent* >( e );
+ QPoint pos = me->pos();
for( DataHash::iterator it = mWindowData.begin();
it != mWindowData.end(); ++it )
{
if( it.value().area.contains(pos) )
+ {
+ if( me->modifiers() & Qt::AltModifier )
{
- effects->activateWindow( it.key() );
+ EffectWindow *ew = it.key();
+ QRectF areaF(it.value().area);
+ QPointF posF(pos);
+ posF -= areaF.topLeft();
+ qreal x_ratio = posF.x() / areaF.width();
+ qreal y_ratio = posF.y() / areaF.height();
+
+ QPointF newPos(pos);
+ newPos -= QPointF( x_ratio * ew->width(), y_ratio * ew->height() );
+ effects->windowToDesktop( it.key(), effects->currentDesktop() );
+ effects->moveWindow( ew, newPos.toPoint() );
+ effects->windowMouseMove( ew, cursorPos() );
+ }
+ effects->activateWindow( it.key() );
// mWindowData gets cleared and rebuilt when a window is
// activated, so it's dangerous (and unnecessary) to continue
break;
diff --git a/workspace/kwin/lib/kwineffects.h b/workspace/kwin/lib/kwineffects.h
index 32397b7..b86b2a0 100644
--- a/workspace/kwin/lib/kwineffects.h
+++ b/workspace/kwin/lib/kwineffects.h
@@ -470,6 +470,7 @@ class KWIN_EXPORT EffectsHandler
virtual EffectWindow* activeWindow() const = 0 ;
virtual void moveWindow( EffectWindow* w, const QPoint& pos ) = 0;
virtual void windowToDesktop( EffectWindow* w, int desktop ) = 0;
+ virtual void windowMouseMove( EffectWindow* w, const QPoint& pos) = 0;
//
virtual int currentDesktop() const = 0;
virtual int numberOfDesktops() const = 0;
--
1.5.6.GIT
-------------------------------------------------------
--
Kelvie Wong
> > Visit http://mail.kde.org/mailman/listinfo/kde-devel#unsub to unsubscribe <<
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic