[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