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:
Julien Danjou 2008-03-25 16:10:12 +01:00
parent f00b0b850e
commit e9dbf302be
1 changed files with 76 additions and 11 deletions

81
mouse.c
View File

@ -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)