diff -u xfwm4-4.6.2/src//client.c xfwm4-4.6.2-modified/src//client.c --- xfwm4-4.6.2/src//client.c 2010-05-21 20:02:40.000000000 +0300 +++ xfwm4-4.6.2-modified/src//client.c 2010-08-19 16:57:41.902412889 +0300 @@ -3180,7 +3180,7 @@ wc->height = c->old_height; } -static void +void clientNewMaxSize (Client * c, XWindowChanges *wc) { ScreenInfo *screen_info; @@ -3207,7 +3207,7 @@ full_h = MIN (screen_info->height - screen_info->params->xfwm_margins[STRUTS_BOTTOM], rect.y + rect.height) - full_y; - if (FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED)) + if (FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED) || FLAG_TEST (c->flags, CLIENT_FLAG_TILED)) { /* Adjust size to the largest size available, not covering struts */ clientMaxSpace (screen_info, &full_x, &full_y, &full_w, &full_h); diff -u xfwm4-4.6.2/src//client.h xfwm4-4.6.2-modified/src//client.h --- xfwm4-4.6.2/src//client.h 2010-05-21 20:02:40.000000000 +0300 +++ xfwm4-4.6.2-modified/src//client.h 2010-08-19 17:00:25.636144949 +0300 @@ -160,6 +160,8 @@ #define CLIENT_FLAG_HAS_SHAPE (1L<<18) #define CLIENT_FLAG_FULLSCREN_MONITORS (1L<<19) +#define CLIENT_FLAG_TILED (1L<<20) + #define WM_FLAG_DELETE (1L<<0) #define WM_FLAG_INPUT (1L<<1) #define WM_FLAG_TAKEFOCUS (1L<<2) @@ -336,6 +338,9 @@ extern Client *clients; extern unsigned int client_count; +void clientNewMaxSize (Client * c, + XWindowChanges *wc); + Display *clientGetXDisplay (Client *); void clientClearLastOpTime (Client *); void clientUpdateWinState (Client *, Только в xfwm4-4.6.2-modified/src/: .deps Только в xfwm4-4.6.2-modified/src/: .libs Только в xfwm4-4.6.2-modified/src/: Makefile diff -u xfwm4-4.6.2/src//moveresize.c xfwm4-4.6.2-modified/src//moveresize.c --- xfwm4-4.6.2/src//moveresize.c 2010-05-21 20:02:40.000000000 +0300 +++ xfwm4-4.6.2-modified/src//moveresize.c 2010-08-19 19:16:56.916391699 +0300 @@ -35,7 +35,8 @@ #include #include #include -# + +#include "moveresize.h" #include "client.h" #include "focus.h" #include "frame.h" @@ -809,6 +810,92 @@ c->x = passdata->ox + (xevent->xmotion.x_root - passdata->mx); c->y = passdata->oy + (xevent->xmotion.y_root - passdata->my); + if (!FLAG_TEST_ALL(c->flags, CLIENT_FLAG_MAXIMIZED)) + { + if (xevent->xmotion.x_root < TILING_EDGE + || xevent->xmotion.x_root > screen_info->width - TILING_EDGE + || xevent->xmotion.y_root < TILING_EDGE + || xevent->xmotion.y_root > screen_info->height - TILING_EDGE) + { + XWindowChanges wc; + wc.x = c->x; + wc.y = c->y; + wc.width = c->width; + wc.height = c->height; + + if (c->old_width == -1) + c->old_width = c->width; + if (c->old_height == -1) + c->old_height = c->height; + + FLAG_SET (c->flags, CLIENT_FLAG_TILED); + clientNewMaxSize(c, &wc); + + if (xevent->xmotion.x_root < TILING_EDGE) + { + c->x = wc.x; + c->y = wc.y; + c->width = (wc.width - frameRight(c) - frameLeft(c))/2; + c->height = wc.height; + } + else if (xevent->xmotion.x_root > screen_info->width - TILING_EDGE) + { + c->width = (wc.width - frameRight(c) - frameLeft(c))/2; + c->height = wc.height; + c->x = wc.x + c->width + frameRight(c) + frameLeft(c); + c->y = wc.y; + } + else if (xevent->xmotion.y_root < TILING_EDGE) + { + c->x = wc.x; + c->y = wc.y; + c->width = wc.width; + c->height = (wc.height - frameBottom(c) - frameTop(c))/2; + } + else + { + c->width = wc.width; + c->height = (wc.height - frameBottom(c) - frameTop(c))/2; + c->x = wc.x; + c->y = wc.y + c->height + frameBottom(c) + frameTop(c); + } + } + else + { + if (c->old_width != -1) + { + c->width = c->old_width; + c->old_width = -1; + + int tmp_x = xevent->xbutton.x_root; + if (tmp_x < c->x || tmp_x > c->x + c->width) + tmp_x = c->x + c->width/2; + + passdata->mx = tmp_x; + passdata->ox = c->x; + } + + if (c->old_height != -1) + { + c->height = c->old_height; + c->old_height = -1; + + int tmp_y = xevent->xbutton.y_root; + if (tmp_y < c->y || tmp_y > c->y + c->height) + tmp_y = c->y + c->height/2; + + passdata->my = tmp_y; + passdata->oy = c->y; + + + } + + FLAG_UNSET (c->flags, CLIENT_FLAG_TILED); + + } + passdata->move_resized = 1; + } + clientSnapPosition (c, prev_x, prev_y); if (screen_info->params->restore_on_move) { @@ -1123,6 +1210,11 @@ status = EVENT_FILTER_STOP; resizing = TRUE; + if (xevent->xmotion.x_root > TILING_EDGE || xevent->xmotion.x_root < screen_info->width - TILING_EDGE) + { + /* c->old_x = c->old_y =*/ c->old_width = c->old_height = -1; + } + frame_x = frameX (c); frame_y = frameY (c); frame_height = frameHeight (c); diff -u xfwm4-4.6.2/src//moveresize.h xfwm4-4.6.2-modified/src//moveresize.h --- xfwm4-4.6.2/src//moveresize.h 2010-05-21 20:02:40.000000000 +0300 +++ xfwm4-4.6.2-modified/src//moveresize.h 2010-08-19 19:20:49.531552317 +0300 @@ -31,8 +31,11 @@ #include "screen.h" #include "client.h" +#define TILING_EDGE 10 + #ifndef INC_MOVERESIZE_H #define INC_MOVERESIZE_H + void clientSetWidth (Client *, int); void clientSetHeight (Client *, diff -u xfwm4-4.6.2/src//placement.c xfwm4-4.6.2-modified/src//placement.c --- xfwm4-4.6.2/src//placement.c 2010-05-21 20:02:40.000000000 +0300 +++ xfwm4-4.6.2-modified/src//placement.c 2010-08-19 17:08:20.463672751 +0300 @@ -740,6 +740,8 @@ { clientAutoMaximize (c, full_w, full_h); } + c->old_width = -1; + c->old_height = -1; }