Add window indicating size and position on move and resize (FS#107)
Signed-off-by: Julien Danjou <julien@danjou.info>
This commit is contained in:
parent
f00b0b850e
commit
e9dbf302be
81
mouse.c
81
mouse.c
|
@ -110,6 +110,21 @@ mouse_snapclient(Client *c, area_t geometry)
|
||||||
return titlebar_geometry_remove(&c->titlebar, geometry);
|
return titlebar_geometry_remove(&c->titlebar, geometry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
mouse_resizebar_update(DrawCtx *ctx, style_t style, SimpleWindow *sw, area_t geometry, int border)
|
||||||
|
{
|
||||||
|
area_t draw_geometry = { 0, 0, ctx->width, ctx->height, NULL, NULL };
|
||||||
|
char size[64];
|
||||||
|
|
||||||
|
snprintf(size, sizeof(size), "%dx%d+%d+%d",
|
||||||
|
geometry.x, geometry.y, geometry.width, geometry.height);
|
||||||
|
draw_text(ctx, draw_geometry, AlignCenter, style.font->height / 2, size, style);
|
||||||
|
simplewindow_move(sw,
|
||||||
|
geometry.x + ((2 * border + geometry.width) - sw->geometry.width) / 2,
|
||||||
|
geometry.y + ((2 * border + geometry.height) - sw->geometry.height) / 2);
|
||||||
|
simplewindow_refresh_drawable(sw, sw->phys_screen);
|
||||||
|
}
|
||||||
|
|
||||||
/** Move client with mouse
|
/** Move client with mouse
|
||||||
* \param screen Screen ID
|
* \param screen Screen ID
|
||||||
* \param arg Unused
|
* \param arg Unused
|
||||||
|
@ -125,24 +140,44 @@ uicb_client_movemouse(int screen, char *arg __attribute__ ((unused)))
|
||||||
area_t geometry;
|
area_t geometry;
|
||||||
Client *c = globalconf.focus->client, *target;
|
Client *c = globalconf.focus->client, *target;
|
||||||
Layout *layout = layout_get_current(screen);
|
Layout *layout = layout_get_current(screen);
|
||||||
|
SimpleWindow *sw = NULL;
|
||||||
|
DrawCtx *ctx;
|
||||||
|
style_t style;
|
||||||
|
|
||||||
if(!c)
|
if(!c
|
||||||
return;
|
|| XGrabPointer(globalconf.display,
|
||||||
|
|
||||||
geometry = c->geometry;
|
|
||||||
ocx = geometry.x;
|
|
||||||
ocy = geometry.y;
|
|
||||||
|
|
||||||
if(XGrabPointer(globalconf.display,
|
|
||||||
RootWindow(globalconf.display, c->phys_screen),
|
RootWindow(globalconf.display, c->phys_screen),
|
||||||
False, MOUSEMASK, GrabModeAsync, GrabModeAsync,
|
False, MOUSEMASK, GrabModeAsync, GrabModeAsync,
|
||||||
RootWindow(globalconf.display, c->phys_screen),
|
RootWindow(globalconf.display, c->phys_screen),
|
||||||
globalconf.cursor[CurMove], CurrentTime) != GrabSuccess)
|
globalconf.cursor[CurMove], CurrentTime) != GrabSuccess)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
XQueryPointer(globalconf.display,
|
XQueryPointer(globalconf.display,
|
||||||
RootWindow(globalconf.display, c->phys_screen),
|
RootWindow(globalconf.display, c->phys_screen),
|
||||||
&dummy, &dummy, &x, &y, &di, &di, &dui);
|
&dummy, &dummy, &x, &y, &di, &di, &dui);
|
||||||
|
|
||||||
|
geometry = c->geometry;
|
||||||
|
ocx = geometry.x;
|
||||||
|
ocy = geometry.y;
|
||||||
c->ismax = False;
|
c->ismax = False;
|
||||||
|
|
||||||
|
if(c->isfloating || layout->arrange == layout_floating)
|
||||||
|
{
|
||||||
|
style = globalconf.screens[c->screen].styles.focus;
|
||||||
|
|
||||||
|
sw = simplewindow_new(globalconf.display, c->phys_screen, 0, 0,
|
||||||
|
draw_textwidth(globalconf.display,
|
||||||
|
globalconf.screens[c->screen].styles.focus.font,
|
||||||
|
"0000x0000+0000+0000") + style.font->height,
|
||||||
|
1.5 * style.font->height, 0);
|
||||||
|
|
||||||
|
ctx = draw_context_new(globalconf.display, sw->phys_screen,
|
||||||
|
sw->geometry.width, sw->geometry.height,
|
||||||
|
sw->drawable);
|
||||||
|
XMapRaised(globalconf.display, sw->window);
|
||||||
|
mouse_resizebar_update(ctx, style, sw, geometry, c->border);
|
||||||
|
}
|
||||||
|
|
||||||
for(;;)
|
for(;;)
|
||||||
{
|
{
|
||||||
XMaskEvent(globalconf.display, MOUSEMASK | ExposureMask | SubstructureRedirectMask, &ev);
|
XMaskEvent(globalconf.display, MOUSEMASK | ExposureMask | SubstructureRedirectMask, &ev);
|
||||||
|
@ -150,6 +185,11 @@ uicb_client_movemouse(int screen, char *arg __attribute__ ((unused)))
|
||||||
{
|
{
|
||||||
case ButtonRelease:
|
case ButtonRelease:
|
||||||
XUngrabPointer(globalconf.display, CurrentTime);
|
XUngrabPointer(globalconf.display, CurrentTime);
|
||||||
|
if(sw)
|
||||||
|
{
|
||||||
|
draw_context_delete(&ctx);
|
||||||
|
simplewindow_delete(&sw);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
case ConfigureRequest:
|
case ConfigureRequest:
|
||||||
event_handle_configurerequest(&ev);
|
event_handle_configurerequest(&ev);
|
||||||
|
@ -174,6 +214,8 @@ uicb_client_movemouse(int screen, char *arg __attribute__ ((unused)))
|
||||||
c->ismoving = True;
|
c->ismoving = True;
|
||||||
client_resize(c, geometry, False);
|
client_resize(c, geometry, False);
|
||||||
c->ismoving = False;
|
c->ismoving = False;
|
||||||
|
if(sw)
|
||||||
|
mouse_resizebar_update(ctx, style, sw, c->geometry, c->border);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -217,6 +259,9 @@ uicb_client_resizemouse(int screen, char *arg __attribute__ ((unused)))
|
||||||
Layout *layout = curtags[0]->layout;
|
Layout *layout = curtags[0]->layout;
|
||||||
area_t area = { 0, 0, 0, 0, NULL, NULL }, geometry;
|
area_t area = { 0, 0, 0, 0, NULL, NULL }, geometry;
|
||||||
double mwfact;
|
double mwfact;
|
||||||
|
SimpleWindow *sw = NULL;
|
||||||
|
DrawCtx *ctx = NULL;
|
||||||
|
style_t style;
|
||||||
|
|
||||||
/* only handle floating and tiled layouts */
|
/* only handle floating and tiled layouts */
|
||||||
if(c && !c->isfixed)
|
if(c && !c->isfixed)
|
||||||
|
@ -226,6 +271,19 @@ uicb_client_resizemouse(int screen, char *arg __attribute__ ((unused)))
|
||||||
ocx = c->geometry.x;
|
ocx = c->geometry.x;
|
||||||
ocy = c->geometry.y;
|
ocy = c->geometry.y;
|
||||||
c->ismax = False;
|
c->ismax = False;
|
||||||
|
style = globalconf.screens[c->screen].styles.focus;
|
||||||
|
|
||||||
|
sw = simplewindow_new(globalconf.display, c->phys_screen, 0, 0,
|
||||||
|
draw_textwidth(globalconf.display,
|
||||||
|
globalconf.screens[c->screen].styles.focus.font,
|
||||||
|
"0000x0000+0000+0000") + style.font->height,
|
||||||
|
1.5 * style.font->height, 0);
|
||||||
|
|
||||||
|
ctx = draw_context_new(globalconf.display, sw->phys_screen,
|
||||||
|
sw->geometry.width, sw->geometry.height,
|
||||||
|
sw->drawable);
|
||||||
|
XMapRaised(globalconf.display, sw->window);
|
||||||
|
mouse_resizebar_update(ctx, style, sw, geometry, c->border);
|
||||||
}
|
}
|
||||||
else if (layout->arrange == layout_tile || layout->arrange == layout_tileleft
|
else if (layout->arrange == layout_tile || layout->arrange == layout_tileleft
|
||||||
|| layout->arrange == layout_tilebottom || layout->arrange == layout_tiletop)
|
|| layout->arrange == layout_tilebottom || layout->arrange == layout_tiletop)
|
||||||
|
@ -270,6 +328,11 @@ uicb_client_resizemouse(int screen, char *arg __attribute__ ((unused)))
|
||||||
{
|
{
|
||||||
case ButtonRelease:
|
case ButtonRelease:
|
||||||
XUngrabPointer(globalconf.display, CurrentTime);
|
XUngrabPointer(globalconf.display, CurrentTime);
|
||||||
|
if(sw)
|
||||||
|
{
|
||||||
|
draw_context_delete(&ctx);
|
||||||
|
simplewindow_delete(&sw);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
case ConfigureRequest:
|
case ConfigureRequest:
|
||||||
event_handle_configurerequest(&ev);
|
event_handle_configurerequest(&ev);
|
||||||
|
@ -290,6 +353,8 @@ uicb_client_resizemouse(int screen, char *arg __attribute__ ((unused)))
|
||||||
geometry.x = c->geometry.x;
|
geometry.x = c->geometry.x;
|
||||||
geometry.y = c->geometry.y;
|
geometry.y = c->geometry.y;
|
||||||
client_resize(c, geometry, True);
|
client_resize(c, geometry, True);
|
||||||
|
if(sw)
|
||||||
|
mouse_resizebar_update(ctx, style, sw, c->geometry, c->border);
|
||||||
}
|
}
|
||||||
else if(layout->arrange == layout_tile || layout->arrange == layout_tileleft
|
else if(layout->arrange == layout_tile || layout->arrange == layout_tileleft
|
||||||
|| layout->arrange == layout_tiletop || layout->arrange == layout_tilebottom)
|
|| layout->arrange == layout_tiletop || layout->arrange == layout_tilebottom)
|
||||||
|
|
Loading…
Reference in New Issue