add move-to-screen shortcuts
[kwingrid.git] / kwingrid.cc
index 06a1580..64bbd2c 100644 (file)
 #include "kwingrid.moc"
 
 KWinGrid::KWinGrid(int hgap__, int vgap__, int hsplit__, int vsplit__, int split__,
-                   int ignorestruts__, int reserveNorth__, int reserveSouth__,
-                   int reserveWest__, int reserveEast__)
+                   int ignorestruts__, int reserveNorth__, int reserveSouth__, int reserveWest__, int reserveEast__,
+                   int southstrut__, int strutscreen__)
   : split_(split__), ignorestruts_(ignorestruts__), reserveNorth_(reserveNorth__),
     reserveSouth_(reserveSouth__), reserveEast_(reserveEast__), reserveWest_(reserveWest__),
-    hgap_(hgap__), vgap_(vgap__), hsplit_(hsplit__), vsplit_(vsplit__)
+    hgap_(hgap__), vgap_(vgap__), hsplit_(hsplit__), vsplit_(vsplit__),
+    southstrut_(southstrut__), strutscreen_(strutscreen__)
 {
     connect(KWindowSystem::self(),SIGNAL(activeWindowChanged(WId)),
             this,SLOT(activeWindowChanged(WId)));
@@ -73,7 +74,7 @@ void KWinGrid::activeWindowChanged(WId id)
 
     deltaMSecs += deltaDays * 1000*(60*60*24);
 
-    if (deltaMSecs <= 1000 && deltaMSecs > 0)
+    if (deltaMSecs <= 500 && deltaMSecs > 0)
         KWindowSystem::forceActiveWindow(activeWindow_);
     else
         activeWindow_ = 0;
@@ -148,6 +149,33 @@ void KWinGrid::resizeRelative(int __xdiff, int __ydiff)
     }
 }
 
+void KWinGrid::toScreen(int screen)
+{
+    initGeometry();
+    if (activeWindow_) {
+        int xSize = (outer_.width()+hsize_/2)/hsize_;
+        if (xSize<1) xSize = 1;
+        if (xSize>hsplit_) xSize = hsplit_;
+
+        int ySize = (outer_.height()+vsize_/2)/vsize_;
+        if (ySize<1) ySize = 1;
+        if (ySize>vsplit_) ySize = vsplit_;
+
+        int xSlot = (outer_.left()-region_.left()+hsize_/2)/hsize_;
+        if (xSlot<0) xSlot = 0;
+        if (xSlot>=hsplit_) xSlot = hsplit_-1;
+
+        int ySlot = (outer_.top()-region_.top()+vsize_/2)/vsize_;
+        if (ySlot<0) ySlot = 0;
+        if (ySlot>=vsplit_) ySlot = vsplit_-1;
+
+        initGeometry(screen);
+        QRect newGeometry = doMoveResize(xSlot,ySlot,xSize,ySize);
+        updateGeometry(newGeometry);
+        applyGeometry();
+    }
+}
+
 QRect KWinGrid::doMoveResize(int __xslot, int __yslot,
                              int __xsize, int __ysize)
 {
@@ -227,12 +255,16 @@ void KWinGrid::initGeometry(int __forceScreen)
             else
                 screen_ = __forceScreen;
             region_ = QApplication::desktop()->screenGeometry(screen_);
+            // region_ = QApplication::desktop()->availableGeometry(screen_);
             numScreens_ = QApplication::desktop()->numScreens();
         }
-        if (screen_ != ignorestruts_) {
+        if (screen_ != ignorestruts_ && ignorestruts_ != -1) {
             QRect wa = KWindowSystem::workArea();
             region_ = region_ & wa;
         }
+        if (screen_ == strutscreen_ || strutscreen_ == -1) {
+            region_.setHeight(region_.height() - southstrut_);
+        }
 
         hsize_ = (region_.width()-hgap_)/hsplit_;
         vsize_ = (region_.height()-vgap_)/vsplit_;
@@ -287,6 +319,7 @@ void KWinGrid::updateGeometry(QRect& __new)
 void KWinGrid::applyGeometry()
 {
     updateTimestamp();
+    KWindowSystem::clearState(activeWindow_, NET::MaxVert | NET::MaxHoriz | NET::FullScreen);
     if (orig_.topLeft() == outer_.topLeft())
         // If the position of the window did not change,
         // XMoveResizeWindow sometimes still moves the window a little
@@ -308,85 +341,75 @@ void KWinGrid::applyGeometry()
     }
 }
 
-// slots
-
-void KWinGrid::move_TL()
-{
-    move(reserveWest_,reserveNorth_);
-}
-
-void KWinGrid::move_TR()
-{
-    move((hsplit_-reserveWest_-reserveEast_)/2+reserveWest_,reserveNorth_);
-}
-
-void KWinGrid::move_BL()
-{
-    move(reserveWest_,(vsplit_-reserveNorth_-reserveSouth_)/2+reserveNorth_);
-}
-
-void KWinGrid::move_BR()
-{
-    move((hsplit_-reserveWest_-reserveEast_)/2+reserveWest_,
-         (vsplit_-reserveNorth_-reserveSouth_)/2+reserveNorth_);
-}
-
-void KWinGrid::resize_Q()
-{
-    resize((hsplit_-reserveWest_-reserveEast_)/2,(vsplit_-reserveNorth_-reserveSouth_)/2);
-}
-
-void KWinGrid::resize_H()
-{
-    resize((hsplit_-reserveWest_-reserveEast_),(vsplit_-reserveNorth_-reserveSouth_)/2);
-}
-
-void KWinGrid::resize_V()
-{
-    resize((hsplit_-reserveWest_-reserveEast_)/2,vsplit_-reserveNorth_-reserveSouth_);
-}
-
-void KWinGrid::resize_F()
-{
-    resize(hsplit_-reserveWest_-reserveEast_,vsplit_-reserveNorth_-reserveSouth_);
-}
-
-void KWinGrid::move_L()
-{
-    moveRelative(-1,0);
-}
-
-void KWinGrid::move_R()
-{
-    moveRelative(1,0);
-}
-
-void KWinGrid::move_U()
+void KWinGrid::moveSlot(int nx, int ny, int posx, int posy)
 {
-    moveRelative(0,-1);
+    move((hsplit_-reserveWest_-reserveEast_)/nx * posx + reserveWest_,
+         (vsplit_-reserveNorth_-reserveSouth_)/ny * posy + reserveNorth_);
 }
 
-void KWinGrid::move_D()
+void KWinGrid::resizeSlot(int nx, int ny, int szx, int szy)
 {
-    moveRelative(0,1);
+    resize((hsplit_-reserveWest_-reserveEast_)/nx * (szx+1),
+           (vsplit_-reserveNorth_-reserveSouth_)/ny * (szy+1));
 }
 
-void KWinGrid::resize_IH()
-{
-    resizeRelative(1,0);
-}
-
-void KWinGrid::resize_DH()
-{
-    resizeRelative(-1,0);
-}
-
-void KWinGrid::resize_IV()
-{
-    resizeRelative(0,1);
-}
+// slots
 
-void KWinGrid::resize_DV()
-{
-    resizeRelative(0,-1);
-}
+void KWinGrid::move_TL()        { moveSlot(2, 2, 0, 0); }
+void KWinGrid::move_TR()        { moveSlot(2, 2, 1, 0); }
+void KWinGrid::move_BL()        { moveSlot(2, 2, 0, 1); }
+void KWinGrid::move_BR()        { moveSlot(2, 2, 1, 1); }
+void KWinGrid::resize_Q()       { resizeSlot(2, 2, 0, 0); }
+void KWinGrid::resize_H()       { resizeSlot(2, 2, 1, 0); }
+void KWinGrid::resize_V()       { resizeSlot(2, 2, 0, 1); }
+void KWinGrid::resize_F()       { resizeSlot(2, 2, 1, 1); }
+
+void KWinGrid::move32_00()      { moveSlot(3, 2, 0, 0); }
+void KWinGrid::move32_10()      { moveSlot(3, 2, 1, 0); }
+void KWinGrid::move32_20()      { moveSlot(3, 2, 2, 0); }
+void KWinGrid::move32_01()      { moveSlot(3, 2, 0, 1); }
+void KWinGrid::move32_11()      { moveSlot(3, 2, 1, 1); }
+void KWinGrid::move32_21()      { moveSlot(3, 2, 2, 1); }
+void KWinGrid::resize32_00()    { resizeSlot(3, 2, 0, 0); }
+void KWinGrid::resize32_10()    { resizeSlot(3, 2, 1, 0); }
+void KWinGrid::resize32_20()    { resizeSlot(3, 2, 2, 0); }
+void KWinGrid::resize32_01()    { resizeSlot(3, 2, 0, 1); }
+void KWinGrid::resize32_11()    { resizeSlot(3, 2, 1, 1); }
+void KWinGrid::resize32_21()    { resizeSlot(3, 2, 2, 1); }
+
+void KWinGrid::move43_00()      { moveSlot(4, 3, 0, 0); }
+void KWinGrid::move43_10()      { moveSlot(4, 3, 1, 0); }
+void KWinGrid::move43_20()      { moveSlot(4, 3, 2, 0); }
+void KWinGrid::move43_30()      { moveSlot(4, 3, 3, 0); }
+void KWinGrid::move43_01()      { moveSlot(4, 3, 0, 1); }
+void KWinGrid::move43_11()      { moveSlot(4, 3, 1, 1); }
+void KWinGrid::move43_21()      { moveSlot(4, 3, 2, 1); }
+void KWinGrid::move43_31()      { moveSlot(4, 3, 3, 1); }
+void KWinGrid::move43_02()      { moveSlot(4, 3, 0, 2); }
+void KWinGrid::move43_12()      { moveSlot(4, 3, 1, 2); }
+void KWinGrid::move43_22()      { moveSlot(4, 3, 2, 2); }
+void KWinGrid::move43_32()      { moveSlot(4, 3, 3, 2); }
+void KWinGrid::resize43_00()    { resizeSlot(4, 3, 0, 0); }
+void KWinGrid::resize43_10()    { resizeSlot(4, 3, 1, 0); }
+void KWinGrid::resize43_20()    { resizeSlot(4, 3, 2, 0); }
+void KWinGrid::resize43_30()    { resizeSlot(4, 3, 3, 0); }
+void KWinGrid::resize43_01()    { resizeSlot(4, 3, 0, 1); }
+void KWinGrid::resize43_11()    { resizeSlot(4, 3, 1, 1); }
+void KWinGrid::resize43_21()    { resizeSlot(4, 3, 2, 1); }
+void KWinGrid::resize43_31()    { resizeSlot(4, 3, 3, 1); }
+void KWinGrid::resize43_02()    { resizeSlot(4, 3, 0, 2); }
+void KWinGrid::resize43_12()    { resizeSlot(4, 3, 1, 2); }
+void KWinGrid::resize43_22()    { resizeSlot(4, 3, 2, 2); }
+void KWinGrid::resize43_32()    { resizeSlot(4, 3, 3, 2); }
+
+void KWinGrid::move_L()         { moveRelative(-1,0); }
+void KWinGrid::move_R()         { moveRelative(1,0); }
+void KWinGrid::move_U()         { moveRelative(0,-1); }
+void KWinGrid::move_D()         { moveRelative(0,1); }
+void KWinGrid::resize_IH()      { resizeRelative(1,0); }
+void KWinGrid::resize_DH()      { resizeRelative(-1,0); }
+void KWinGrid::resize_IV()      { resizeRelative(0,1); }
+void KWinGrid::resize_DV()      { resizeRelative(0,-1); }
+
+void KWinGrid::move_Screen0()   { toScreen(0); }
+void KWinGrid::move_Screen1()   { toScreen(1); }