moveresizekbd.c (3673B)
1 #if !INFINITE_TAGS 2 void 3 moveresize(const Arg *arg) 4 { 5 if (selmon->sel && selmon->sel->isfullscreen) 6 return; 7 XEvent ev; 8 Monitor *m = selmon; 9 10 if(!(m->sel && arg && arg->v && m->sel->isfloating)) { 11 12 #if DIRECTIONAL_MOVE 13 if (((int *)arg->v)[0] != 0 || ((int *)arg->v)[1] != 0) { 14 if (((int *)arg->v)[1] > 0) movedir(&(Arg){.i = 3}); // Down 15 if (((int *)arg->v)[1] < 0) movedir(&(Arg){.i = 2}); // Up 16 if (((int *)arg->v)[0] > 0) movedir(&(Arg){.i = 1}); // Right 17 if (((int *)arg->v)[0] < 0) movedir(&(Arg){.i = 0}); // Left 18 } 19 #endif 20 return; 21 } 22 23 XRaiseWindow(dpy, m->sel->win); 24 25 resize(m->sel, m->sel->x + ((int *)arg->v)[0], 26 m->sel->y + ((int *)arg->v)[1], 27 m->sel->w + ((int *)arg->v)[2], 28 m->sel->h + ((int *)arg->v)[3], 29 True); 30 31 #if ENHANCED_TOGGLE_FLOATING && RESTORE_SIZE_AND_POS_ETF 32 if (m->sel->isfloating) { 33 m->sel->wasmanuallyedited = 1; 34 m->sel->sfx = m->sel->x; 35 m->sel->sfy = m->sel->y; 36 m->sel->sfw = m->sel->w; 37 m->sel->sfh = m->sel->h; 38 } 39 #endif 40 41 focus(m->sel); 42 43 #if WARP_TO_CLIENT && WARP_TO_CENTER_OF_WINDOW_MOVED_BY_KEYBOARD 44 warptoclient(m->sel); 45 #endif 46 47 while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); 48 } 49 50 #else 51 52 53 void 54 moveresize(const Arg *arg) 55 { 56 if (selmon->sel && selmon->sel->isfullscreen) 57 return; 58 int dx = ((int *)arg->v)[0]; 59 int dy = ((int *)arg->v)[1]; 60 int dw = ((int *)arg->v)[2]; 61 int dh = ((int *)arg->v)[3]; 62 63 XEvent ev; 64 Monitor *m = selmon; 65 66 if (!m->sel || !arg || !arg->v) 67 return; 68 69 if (!m->sel->isfloating) { 70 #if DIRECTIONAL_MOVE 71 if (selmon->lt[selmon->sellt]->arrange != NULL && (dx || dy)) { 72 if (dy > 0) movedir(&(Arg){.i = 3}); // Down 73 if (dy < 0) movedir(&(Arg){.i = 2}); // Up 74 if (dx > 0) movedir(&(Arg){.i = 1}); // Right 75 if (dx < 0) movedir(&(Arg){.i = 0}); // Left 76 } 77 #endif 78 return; 79 } 80 81 82 Client *c = m->sel; 83 84 XRaiseWindow(dpy, c->win); 85 86 if (selmon->lt[selmon->sellt]->arrange != NULL) { 87 resize(c, 88 c->x + dx, 89 c->y + dy, 90 c->w + dw, 91 c->h + dh, 92 True); 93 } 94 else { 95 int nx = c->x + dx; 96 int ny = c->y + dy; 97 int nw = c->w + dw; 98 int nh = c->h + dh; 99 int canvas_dx = 0, canvas_dy = 0; 100 int tagidx = getcurrenttag(m); 101 102 if (dx || dy) { 103 if (nx < m->wx) { 104 canvas_dx = nx - m->wx; 105 nx = m->wx; 106 } else if (nx + nw + 2 * c->bw > m->wx + m->ww) { 107 canvas_dx = (nx + nw + 2 * c->bw) - (m->wx + m->ww); 108 nx = m->wx + m->ww - nw - 2 * c->bw; 109 } 110 111 if (ny < m->wy) { 112 canvas_dy = ny - m->wy; 113 ny = m->wy; 114 } else if (ny + nh + 2 * c->bw > m->wy + m->wh) { 115 canvas_dy = (ny + nh + 2 * c->bw) - (m->wy + m->wh); 116 ny = m->wy + m->wh - nh - 2 * c->bw; 117 } 118 119 if (canvas_dx || canvas_dy) { 120 m->canvas[tagidx].cx -= canvas_dx; 121 m->canvas[tagidx].cy -= canvas_dy; 122 123 Client *tmp; 124 for (tmp = m->clients; tmp; tmp = tmp->next) { 125 if (ISVISIBLE(tmp) && tmp != c) { 126 tmp->x -= canvas_dx; 127 tmp->y -= canvas_dy; 128 XMoveWindow(dpy, tmp->win, tmp->x, tmp->y); 129 } 130 } 131 } 132 } 133 134 resize(c, nx, ny, nw, nh, True); 135 } 136 137 #if ENHANCED_TOGGLE_FLOATING && RESTORE_SIZE_AND_POS_ETF 138 if (c->isfloating) { 139 c->wasmanuallyedited = 1; 140 c->sfx = c->x; 141 c->sfy = c->y; 142 c->sfw = c->w; 143 c->sfh = c->h; 144 } 145 #endif 146 147 focus(c); 148 149 #if WARP_TO_CLIENT && WARP_TO_CENTER_OF_WINDOW_MOVED_BY_KEYBOARD 150 warptoclient(c); 151 #endif 152 153 while (XCheckMaskEvent(dpy, EnterWindowMask, &ev)); 154 155 #if IT_SHOW_COORDINATES_IN_BAR 156 drawbar(m); 157 #endif 158 159 } 160 #endif