/*
* ion/ioncore/resize.c
*
- * Copyright (c) Tuomo Valkonen 1999-2007.
+ * Copyright (c) Tuomo Valkonen 1999-2008.
*
- * Ion is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2.1 of the License, or
- * (at your option) any later version.
+ * See the included file LICENSE for details.
*/
#include <stdio.h>
#define XOR_RESIZE (!ioncore_g.opaque_resize)
+extern int ioncore_edge_resistance;
+
+
/*{{{ Size/position display and rubberband */
w=mode->geom.w;
h=mode->geom.h;
- if((mode->hints.inc_set) &&
- (mode->hints.width_inc>1 || mode->hints.height_inc>1)){
- if(mode->hints.base_set){
- w-=mode->hints.base_width;
- h-=mode->hints.base_height;
- }
- w/=mode->hints.width_inc;
- h/=mode->hints.height_inc;
+ if(mode->hints.base_set){
+ w=maxof(0, w-mode->hints.base_width);
+ h=maxof(0, h-mode->hints.base_height);
+ }
+
+ if(mode->hints.inc_set){
+ w/=maxof(1, mode->hints.width_inc);
+ h/=maxof(1, mode->hints.height_inc);
}
snprintf(buf, INFOWIN_BUFFER_LEN, "%dx%d", w, h);
if(mgr==(WRegion*)parent){
mode->snapgeom.x=0;
mode->snapgeom.y=0;
- mode->snap_enabled=FALSE;
- }else if(REGION_PARENT(mgr)==parent){
- mode->snap_enabled=TRUE;
+ /*mode->snap_enabled=FALSE;*/
}
+ mode->snap_enabled=TRUE;
}
if(!mode->hints.min_set || mode->hints.min_width<1)
}
+static void moveresmode_setorig(WMoveresMode *mode)
+{
+ mode->dx1=0;
+ mode->dx2=0;
+ mode->dy1=0;
+ mode->dy2=0;
+ mode->origgeom=mode->geom;
+}
+
+
+static void moveresmode_do_newgeom(WMoveresMode *mode, WRQGeomParams *rq)
+{
+ if(XOR_RESIZE)
+ moveres_draw_rubberband(mode);
+
+ if(mode->reg!=NULL){
+ rq->flags|=mode->rqflags;
+ region_rqgeom(mode->reg, rq, &mode->geom);
+ }
+
+ moveres_draw_infowin(mode);
+
+ if(XOR_RESIZE)
+ moveres_draw_rubberband(mode);
+}
+
+
+static int clamp_up(int t, int low, int high)
+{
+ return (t < high && t > low ? high : t);
+}
+
+
static void moveresmode_delta(WMoveresMode *mode,
int dx1, int dx2, int dy1, int dy2,
WRectangle *rret)
{
int realdx1, realdx2, realdy1, realdy2;
WRQGeomParams rq=RQGEOMPARAMS_INIT;
+ int er=ioncore_edge_resistance;
int w=0, h=0;
realdx1=(mode->dx1+=dx1);
/* snap */
if(mode->snap_enabled){
WRectangle *sg=&mode->snapgeom;
- int er=CF_EDGE_RESISTANCE;
if(mode->dx1!=0 && rq.geom.x+mode->dx1<sg->x && rq.geom.x+mode->dx1>sg->x-er)
realdx1=sg->x-rq.geom.x;
realdy2=sg->y+sg->h-rq.geom.y-rq.geom.h;
}
- w=mode->origgeom.w-realdx1+realdx2;
- h=mode->origgeom.h-realdy1+realdy2;
-
- if(w<=0)
- w=mode->hints.min_width;
- if(h<=0)
- h=mode->hints.min_height;
+ w=maxof(1, mode->origgeom.w-realdx1+realdx2);
+ h=maxof(1, mode->origgeom.h-realdy1+realdy2);
+
+ if(mode->snap_enabled && mode->hints.base_set){
+ w=clamp_up(w, mode->hints.base_width-er, mode->hints.base_width);
+ h=clamp_up(h, mode->hints.base_height-er, mode->hints.base_height);
+ }
+ /* Correct size */
sizehints_correct(&mode->hints, &w, &h, TRUE, TRUE);
/* Do not modify coordinates and sizes that were not requested to be
rq.geom.y+=mode->origgeom.h-rq.geom.h;
}
- if(XOR_RESIZE)
- moveres_draw_rubberband(mode);
+ moveresmode_do_newgeom(mode, &rq);
- if(mode->reg!=NULL){
- rq.flags=mode->rqflags;
- region_rqgeom(mode->reg, &rq, &mode->geom);
- }
-
- if(!mode->resize_cumulative){
- mode->dx1=0;
- mode->dx2=0;
- mode->dy1=0;
- mode->dy2=0;
- mode->origgeom=mode->geom;
- }
-
- moveres_draw_infowin(mode);
-
- if(XOR_RESIZE)
- moveres_draw_rubberband(mode);
+ if(!mode->resize_cumulative)
+ moveresmode_setorig(mode);
if(rret!=NULL)
*rret=mode->geom;
}
+void moveresmode_rqgeom(WMoveresMode *mode, WRQGeomParams *rq,
+ WRectangle *rret)
+{
+ mode->mode=MOVERES_SIZE;
+ moveresmode_do_newgeom(mode, rq);
+ moveresmode_setorig(mode);
+}
+
+
/* It is ugly to do this here, but it will have to do for now... */
static void set_saved(WMoveresMode *mode, WRegion *reg)
{
set_saved(mode, reg);
if(mode->infowin!=NULL){
- region_dispose((WRegion*)mode->infowin, FALSE);
+ mainloop_defer_destroy((Obj*)mode->infowin);
mode->infowin=NULL;
}
destroy_obj((Obj*)mode);
}
+void rqgeomparams_from_table(WRQGeomParams *rq,
+ const WRectangle *origg, ExtlTab g)
+{
+ rq->geom=*origg;
+ rq->flags=REGION_RQGEOM_WEAK_ALL;
+
+ if(extl_table_gets_i(g, "x", &(rq->geom.x)))
+ rq->flags&=~REGION_RQGEOM_WEAK_X;
+ if(extl_table_gets_i(g, "y", &(rq->geom.y)))
+ rq->flags&=~REGION_RQGEOM_WEAK_Y;
+ if(extl_table_gets_i(g, "w", &(rq->geom.w)))
+ rq->flags&=~REGION_RQGEOM_WEAK_W;
+ if(extl_table_gets_i(g, "h", &(rq->geom.h)))
+ rq->flags&=~REGION_RQGEOM_WEAK_H;
+
+ rq->geom.w=maxof(1, rq->geom.w);
+ rq->geom.h=maxof(1, rq->geom.h);
+}
+
+
/*EXTL_DOC
* Attempt to resize and/or move \var{reg}. The table \var{g} is a usual
* geometry specification (fields \var{x}, \var{y}, \var{w} and \var{h}),
EXTL_EXPORT_AS(WRegion, rqgeom)
ExtlTab region_rqgeom_extl(WRegion *reg, ExtlTab g)
{
- WRectangle ogeom=REGION_GEOM(reg);
WRQGeomParams rq=RQGEOMPARAMS_INIT;
+ WRectangle res;
+ rqgeomparams_from_table(&rq, ®ION_GEOM(reg), g);
- rq.geom=ogeom;
- rq.flags=REGION_RQGEOM_WEAK_ALL;
-
-
- if(extl_table_gets_i(g, "x", &(rq.geom.x)))
- rq.flags&=~REGION_RQGEOM_WEAK_X;
- if(extl_table_gets_i(g, "y", &(rq.geom.y)))
- rq.flags&=~REGION_RQGEOM_WEAK_Y;
- if(extl_table_gets_i(g, "w", &(rq.geom.w)))
- rq.flags&=~REGION_RQGEOM_WEAK_W;
- if(extl_table_gets_i(g, "h", &(rq.geom.h)))
- rq.flags&=~REGION_RQGEOM_WEAK_H;
-
- rq.geom.w=maxof(1, rq.geom.w);
- rq.geom.h=maxof(1, rq.geom.h);
-
- region_rqgeom(reg, &rq, &ogeom);
+ region_rqgeom(reg, &rq, &res);
- return extl_table_from_rectangle(&ogeom);
+ return extl_table_from_rectangle(&res);
}