]> git.sur5r.net Git - i3/i3/blobdiff - src/floating.c
s/DLOG/LOG (Thanks ccount)
[i3/i3] / src / floating.c
index b79c0756e8c1d4b572e291c84590c9783884e16b..dd6c86e760f367b32cb04e002b26d374ab1ac448 100644 (file)
@@ -41,6 +41,11 @@ void toggle_floating_mode(xcb_connection_t *conn, Client *client, bool automatic
         Container *con = client->container;
         i3Font *font = load_font(conn, config.font);
 
+        if (client->dock) {
+                LOG("Not putting dock client into floating mode\n");
+                return;
+        }
+
         if (con == NULL) {
                 LOG("This client is already in floating (container == NULL), re-inserting\n");
                 Client *next_tiling;
@@ -271,13 +276,13 @@ void floating_resize_window(xcb_connection_t *conn, Client *client, xcb_button_p
         void resize_window_callback(Rect *old_rect, uint32_t new_x, uint32_t new_y) {
                 int32_t new_width = old_rect->width + (new_x - event->root_x);
                 int32_t new_height = old_rect->height + (new_y - event->root_y);
-                /* Obey minimum window size */
-                if (new_width < 75 || new_height < 50)
-                        return;
 
-                /* Reposition the client correctly while moving */
-                client->rect.width = new_width;
-                client->rect.height = new_height;
+                /* Obey minimum window size and reposition the client */
+                if (new_width >= 50)
+                        client->rect.width = new_width;
+
+                if (new_height >= 20)
+                        client->rect.height = new_height;
 
                 /* resize_client flushes */
                 resize_client(conn, client);
@@ -406,28 +411,37 @@ void floating_focus_direction(xcb_connection_t *conn, Client *currently_focused,
 void floating_move(xcb_connection_t *conn, Client *currently_focused, direction_t direction) {
         LOG("floating move\n");
 
+        Rect destination = currently_focused->rect;
+        Rect *screen = &(currently_focused->workspace->screen->rect);
+
         switch (direction) {
                 case D_LEFT:
-                        if (currently_focused->rect.x < 10)
-                                return;
-                        currently_focused->rect.x -= 10;
+                        destination.x -= 10;
                         break;
                 case D_RIGHT:
-                        currently_focused->rect.x += 10;
+                        destination.x += 10;
                         break;
                 case D_UP:
-                        if (currently_focused->rect.y < 10)
-                                return;
-                        currently_focused->rect.y -= 10;
+                        destination.y -= 10;
                         break;
                 case D_DOWN:
-                        currently_focused->rect.y += 10;
+                        destination.y += 10;
                         break;
                 /* to make static analyzers happy */
                 default:
                         break;
         }
 
+        /* Prevent windows from vanishing completely */
+        if ((int32_t)(destination.x + destination.width - 5) <= (int32_t)screen->x ||
+            (int32_t)(destination.x + 5) >= (int32_t)(screen->x + screen->width) ||
+            (int32_t)(destination.y + destination.height - 5) <= (int32_t)screen->y ||
+            (int32_t)(destination.y + 5) >= (int32_t)(screen->y + screen->height)) {
+                LOG("boundary check failed, not moving\n");
+                return;
+        }
+
+        currently_focused->rect = destination;
         reposition_client(conn, currently_focused);
 
         /* Because reposition_client does not send a faked configure event (only resize does),