resize handling patches from martin

SVN revision: 16870
This commit is contained in:
Carsten Haitzler 2005-09-23 15:47:18 +00:00
parent 7c7cd5e8bd
commit df07e38102
3 changed files with 187 additions and 182 deletions

View File

@ -591,22 +591,26 @@ ACT_FN_GO(window_resize_by)
obj = E_OBJECT(e_border_focused_get());
if (!obj) return;
}
if (params)
{
int dw, dh;
if (sscanf(params, "%i %i", &dw, &dh) == 2) {
if (sscanf(params, "%i %i", &dw, &dh) == 2)
{
E_Border *bd;
bd = (E_Border *)obj;
e_border_resize(bd, bd->w + dw, bd->h + dh);
dw += bd->w;
dh += bd->h;
e_border_resize_limit(bd, &dw, &dh);
e_border_resize(bd, dw, dh);
if (e_config->focus_policy != E_FOCUS_CLICK)
ecore_x_pointer_warp(bd->zone->container->win,
bd->x + (bd->w / 2),
bd->y + (bd->h / 2));
}
bd->x + (dw / 2),
bd->y + (dh / 2));
}
}
}

View File

@ -57,7 +57,6 @@ static int _e_border_cb_mouse_move(void *data, int type, void *event);
static int _e_border_cb_grab_replay(void *data, int type, void *event);
static void _e_border_eval(E_Border *bd);
static void _e_border_resize_limit(E_Border *bd, int *w, int *h);
static void _e_border_moveinfo_gather(E_Border *bd, const char *source);
static void _e_border_resize_handle(E_Border *bd);
@ -1476,7 +1475,7 @@ e_border_maximize(E_Border *bd, E_Maximize max)
w = bd->zone->w;
h = bd->zone->h;
/* center x-direction */
_e_border_resize_limit(bd, &w, &h);
e_border_resize_limit(bd, &w, &h);
x1 = bd->zone->x + (bd->zone->w - w) / 2;
/* center y-direction */
y1 = bd->zone->y + (bd->zone->h - h) / 2;
@ -1497,7 +1496,7 @@ e_border_maximize(E_Border *bd, E_Maximize max)
w = x2 - x1;
h = y2 - y1;
_e_border_resize_limit(bd, &w, &h);
e_border_resize_limit(bd, &w, &h);
e_border_move_resize(bd, x1, y1, w, h);
edje_object_signal_emit(bd->bg_object, "maximize", "");
break;
@ -1515,7 +1514,7 @@ e_border_maximize(E_Border *bd, E_Maximize max)
w = x2 - x1;
h = y2 - y1;
_e_border_resize_limit(bd, &w, &h);
e_border_resize_limit(bd, &w, &h);
e_border_move_resize(bd, x1, y1, w, h);
break;
}
@ -1627,7 +1626,7 @@ e_border_fullscreen(E_Border *bd)
y = bd->zone->y;
w = bd->zone->w;
h = bd->zone->h;
_e_border_resize_limit(bd, &w, &h);
e_border_resize_limit(bd, &w, &h);
/* center */
x = x + (bd->zone->w - w) / 2;
y = y + (bd->zone->h - h) / 2;
@ -2296,6 +2295,174 @@ e_border_name_get(E_Border *bd)
return "";
}
void
e_border_signal_move_begin(E_Border *bd, char *sig, char *src)
{
if (!_e_border_move_begin(bd)) return;
bd->moving = 1;
e_zone_flip_win_disable();
_e_border_moveinfo_gather(bd, sig);
}
void
e_border_signal_move_end(E_Border *bd, char *sig, char *src)
{
if (!bd->moving) return;
bd->moving = 0;
e_zone_flip_win_restore();
_e_border_move_end(bd);
e_zone_flip_coords_handle(bd->zone, -1, -1);
}
int
e_border_resizing_get(E_Border *bd)
{
if (bd->resize_mode == RESIZE_NONE) return 0;
return 1;
}
void
e_border_signal_resize_begin(E_Border *bd, char *dir, char *sig, char *src)
{
Ecore_X_Gravity grav = ECORE_X_GRAVITY_NW;
int resize_mode = RESIZE_BR;
if (!_e_border_resize_begin(bd))
return;
if (!strcmp(dir, "tl"))
{
resize_mode = RESIZE_TL;
grav = ECORE_X_GRAVITY_SE;
}
else if (!strcmp(dir, "t"))
{
resize_mode = RESIZE_T;
grav = ECORE_X_GRAVITY_S;
}
else if (!strcmp(dir, "tr"))
{
resize_mode = RESIZE_TR;
grav = ECORE_X_GRAVITY_SW;
}
else if (!strcmp(dir, "r"))
{
resize_mode = RESIZE_R;
grav = ECORE_X_GRAVITY_W;
}
else if (!strcmp(dir, "br"))
{
resize_mode = RESIZE_BR;
grav = ECORE_X_GRAVITY_NW;
}
else if (!strcmp(dir, "b"))
{
resize_mode = RESIZE_B;
grav = ECORE_X_GRAVITY_N;
}
else if (!strcmp(dir, "bl"))
{
resize_mode = RESIZE_BL;
grav = ECORE_X_GRAVITY_NE;
}
else if (!strcmp(dir, "l"))
{
resize_mode = RESIZE_L;
grav = ECORE_X_GRAVITY_E;
}
bd->resize_mode = resize_mode;
_e_border_moveinfo_gather(bd, sig);
GRAV_SET(bd, grav);
}
void
e_border_signal_resize_end(E_Border *bd, char *dir, char *sig, char *src)
{
if (bd->resize_mode == RESIZE_NONE) return;
_e_border_resize_handle(bd);
bd->resize_mode = RESIZE_NONE;
_e_border_resize_end(bd);
bd->changes.reset_gravity = 1;
bd->changed = 1;
}
void
e_border_resize_limit(E_Border *bd, int *w, int *h)
{
double a;
*w -= bd->client_inset.l + bd->client_inset.r;
*h -= bd->client_inset.t + bd->client_inset.b;
if (*h < 1) *h = 1;
if (*w < 1) *w = 1;
if ((bd->client.icccm.base_w >= 0) &&
(bd->client.icccm.base_h >= 0))
{
int tw, th;
tw = *w - bd->client.icccm.base_w;
th = *h - bd->client.icccm.base_h;
if (tw < 1) tw = 1;
if (th < 1) th = 1;
a = (double)(tw) / (double)(th);
if ((bd->client.icccm.min_aspect != 0.0) &&
(a < bd->client.icccm.min_aspect))
{
th = tw / bd->client.icccm.max_aspect;
*h = th + bd->client.icccm.base_h;
}
else if ((bd->client.icccm.max_aspect != 0.0) &&
(a > bd->client.icccm.max_aspect))
{
tw = th * bd->client.icccm.max_aspect;
*w = tw + bd->client.icccm.base_w;
}
}
else
{
a = (double)*w / (double)*h;
if ((bd->client.icccm.min_aspect != 0.0) &&
(a < bd->client.icccm.min_aspect))
*h = *w / bd->client.icccm.min_aspect;
else if ((bd->client.icccm.max_aspect != 0.0) &&
(a > bd->client.icccm.max_aspect))
*w = *h * bd->client.icccm.max_aspect;
}
if (bd->client.icccm.step_w > 0)
{
if (bd->client.icccm.base_w >= 0)
*w = bd->client.icccm.base_w +
(((*w - bd->client.icccm.base_w) / bd->client.icccm.step_w) *
bd->client.icccm.step_w);
else
*w = bd->client.icccm.min_w +
(((*w - bd->client.icccm.min_w) / bd->client.icccm.step_w) *
bd->client.icccm.step_w);
}
if (bd->client.icccm.step_h > 0)
{
if (bd->client.icccm.base_h >= 0)
*h = bd->client.icccm.base_h +
(((*h - bd->client.icccm.base_h) / bd->client.icccm.step_h) *
bd->client.icccm.step_h);
else
*h = bd->client.icccm.min_h +
(((*h - bd->client.icccm.min_h) / bd->client.icccm.step_h) *
bd->client.icccm.step_h);
}
if (*h < 1) *h = 1;
if (*w < 1) *w = 1;
if (*w > bd->client.icccm.max_w) *w = bd->client.icccm.max_w;
else if (*w < bd->client.icccm.min_w) *w = bd->client.icccm.min_w;
if (*h > bd->client.icccm.max_h) *h = bd->client.icccm.max_h;
else if (*h < bd->client.icccm.min_h) *h = bd->client.icccm.min_h;
*w += bd->client_inset.l + bd->client_inset.r;
*h += bd->client_inset.t + bd->client_inset.b;
}
/* local subsystem functions */
static void
_e_border_free(E_Border *bd)
@ -3496,96 +3663,6 @@ _e_border_cb_pointer_warp(void *data, int ev_type, void *ev)
return 1;
}
void
e_border_signal_move_begin(E_Border *bd, char *sig, char *src)
{
if (!_e_border_move_begin(bd)) return;
bd->moving = 1;
e_zone_flip_win_disable();
_e_border_moveinfo_gather(bd, sig);
}
void
e_border_signal_move_end(E_Border *bd, char *sig, char *src)
{
if (!bd->moving) return;
bd->moving = 0;
e_zone_flip_win_restore();
_e_border_move_end(bd);
e_zone_flip_coords_handle(bd->zone, -1, -1);
}
int
e_border_resizing_get(E_Border *bd)
{
if (bd->resize_mode == RESIZE_NONE) return 0;
return 1;
}
void
e_border_signal_resize_begin(E_Border *bd, char *dir, char *sig, char *src)
{
Ecore_X_Gravity grav = ECORE_X_GRAVITY_NW;
int resize_mode = RESIZE_BR;
if (!_e_border_resize_begin(bd))
return;
if (!strcmp(dir, "tl"))
{
resize_mode = RESIZE_TL;
grav = ECORE_X_GRAVITY_SE;
}
else if (!strcmp(dir, "t"))
{
resize_mode = RESIZE_T;
grav = ECORE_X_GRAVITY_S;
}
else if (!strcmp(dir, "tr"))
{
resize_mode = RESIZE_TR;
grav = ECORE_X_GRAVITY_SW;
}
else if (!strcmp(dir, "r"))
{
resize_mode = RESIZE_R;
grav = ECORE_X_GRAVITY_W;
}
else if (!strcmp(dir, "br"))
{
resize_mode = RESIZE_BR;
grav = ECORE_X_GRAVITY_NW;
}
else if (!strcmp(dir, "b"))
{
resize_mode = RESIZE_B;
grav = ECORE_X_GRAVITY_N;
}
else if (!strcmp(dir, "bl"))
{
resize_mode = RESIZE_BL;
grav = ECORE_X_GRAVITY_NE;
}
else if (!strcmp(dir, "l"))
{
resize_mode = RESIZE_L;
grav = ECORE_X_GRAVITY_E;
}
bd->resize_mode = resize_mode;
_e_border_moveinfo_gather(bd, sig);
GRAV_SET(bd, grav);
}
void
e_border_signal_resize_end(E_Border *bd, char *dir, char *sig, char *src)
{
if (bd->resize_mode == RESIZE_NONE) return;
_e_border_resize_handle(bd);
bd->resize_mode = RESIZE_NONE;
_e_border_resize_end(bd);
bd->changes.reset_gravity = 1;
bd->changed = 1;
}
static void
_e_border_cb_signal_bind(void *data, Evas_Object *obj, const char *emission, const char *source)
{
@ -5294,83 +5371,6 @@ _e_border_eval(E_Border *bd)
e_remember_update(bd->remember, bd);
}
static void
_e_border_resize_limit(E_Border *bd, int *w, int *h)
{
double a;
*w -= bd->client_inset.l + bd->client_inset.r;
*h -= bd->client_inset.t + bd->client_inset.b;
if (*h < 1) *h = 1;
if (*w < 1) *w = 1;
if ((bd->client.icccm.base_w >= 0) &&
(bd->client.icccm.base_h >= 0))
{
int tw, th;
tw = *w - bd->client.icccm.base_w;
th = *h - bd->client.icccm.base_h;
if (tw < 1) tw = 1;
if (th < 1) th = 1;
a = (double)(tw) / (double)(th);
if ((bd->client.icccm.min_aspect != 0.0) &&
(a < bd->client.icccm.min_aspect))
{
th = tw / bd->client.icccm.max_aspect;
*h = th + bd->client.icccm.base_h;
}
else if ((bd->client.icccm.max_aspect != 0.0) &&
(a > bd->client.icccm.max_aspect))
{
tw = th * bd->client.icccm.max_aspect;
*w = tw + bd->client.icccm.base_w;
}
}
else
{
a = (double)*w / (double)*h;
if ((bd->client.icccm.min_aspect != 0.0) &&
(a < bd->client.icccm.min_aspect))
*h = *w / bd->client.icccm.min_aspect;
else if ((bd->client.icccm.max_aspect != 0.0) &&
(a > bd->client.icccm.max_aspect))
*w = *h * bd->client.icccm.max_aspect;
}
if (bd->client.icccm.step_w > 0)
{
if (bd->client.icccm.base_w >= 0)
*w = bd->client.icccm.base_w +
(((*w - bd->client.icccm.base_w) / bd->client.icccm.step_w) *
bd->client.icccm.step_w);
else
*w = bd->client.icccm.min_w +
(((*w - bd->client.icccm.min_w) / bd->client.icccm.step_w) *
bd->client.icccm.step_w);
}
if (bd->client.icccm.step_h > 0)
{
if (bd->client.icccm.base_h >= 0)
*h = bd->client.icccm.base_h +
(((*h - bd->client.icccm.base_h) / bd->client.icccm.step_h) *
bd->client.icccm.step_h);
else
*h = bd->client.icccm.min_h +
(((*h - bd->client.icccm.min_h) / bd->client.icccm.step_h) *
bd->client.icccm.step_h);
}
if (*h < 1) *h = 1;
if (*w < 1) *w = 1;
if (*w > bd->client.icccm.max_w) *w = bd->client.icccm.max_w;
else if (*w < bd->client.icccm.min_w) *w = bd->client.icccm.min_w;
if (*h > bd->client.icccm.max_h) *h = bd->client.icccm.max_h;
else if (*h < bd->client.icccm.min_h) *h = bd->client.icccm.min_h;
*w += bd->client_inset.l + bd->client_inset.r;
*h += bd->client_inset.t + bd->client_inset.b;
}
static void
_e_border_moveinfo_gather(E_Border *bd, const char *source)
{
@ -5470,7 +5470,7 @@ _e_border_resize_handle(E_Border *bd)
w = new_w;
h = new_h;
_e_border_resize_limit(bd, &new_w, &new_h);
e_border_resize_limit(bd, &new_w, &new_h);
if ((bd->resize_mode == RESIZE_TL) ||
(bd->resize_mode == RESIZE_L) ||
(bd->resize_mode == RESIZE_BL))

View File

@ -552,6 +552,7 @@ EAPI void e_border_signal_move_end(E_Border *bd, char *sig, char *src);
EAPI int e_border_resizing_get(E_Border *bd);
EAPI void e_border_signal_resize_begin(E_Border *bd, char *dir, char *sig, char *src);
EAPI void e_border_signal_resize_end(E_Border *bd, char *dir, char *sig, char *src);
EAPI void e_border_resize_limit(E_Border *bd, int *w, int *h);
extern EAPI int E_EVENT_BORDER_RESIZE;
extern EAPI int E_EVENT_BORDER_MOVE;