2010-01-12 17:10:39 -08:00
|
|
|
#include "E_Illume.h"
|
|
|
|
#include "layout.h"
|
|
|
|
|
|
|
|
/* local function prototypes */
|
|
|
|
static void _zone_layout_border_move(E_Border *bd, int x, int y);
|
|
|
|
static void _zone_layout_border_resize(E_Border *bd, int w, int h);
|
|
|
|
static void _zone_layout_single(E_Border *bd);
|
|
|
|
static void _zone_layout_dual(E_Border *bd);
|
|
|
|
static void _zone_layout_dual_top(E_Border *bd);
|
|
|
|
static void _zone_layout_dual_top_custom(E_Border *bd);
|
|
|
|
static void _zone_layout_dual_left(E_Border *bd);
|
|
|
|
|
|
|
|
/* local variables */
|
|
|
|
static int shelfsize = 0;
|
|
|
|
static int kbdsize = 0;
|
|
|
|
static int panelsize = 0;
|
|
|
|
|
|
|
|
void
|
|
|
|
_layout_border_add(E_Border *bd)
|
|
|
|
{
|
2010-01-28 22:09:20 -08:00
|
|
|
if (!bd) return;
|
2010-01-12 17:10:39 -08:00
|
|
|
if ((bd->new_client) || (!bd->visible)) return;
|
|
|
|
if ((bd->need_fullscreen) || (bd->fullscreen))
|
|
|
|
{
|
2010-01-18 16:00:07 -08:00
|
|
|
E_Border *b;
|
|
|
|
|
|
|
|
b = e_illume_border_top_shelf_get(bd->zone);
|
|
|
|
if (b) e_border_hide(b, 2);
|
2010-01-12 17:10:39 -08:00
|
|
|
if (bd->layer != IL_FULLSCREEN_LAYER)
|
|
|
|
e_border_layer_set(bd, IL_FULLSCREEN_LAYER);
|
|
|
|
bd->lock_user_stacking = 1;
|
|
|
|
}
|
|
|
|
else if (e_illume_border_is_conformant(bd))
|
|
|
|
{
|
|
|
|
if (bd->layer != IL_CONFORM_LAYER)
|
|
|
|
e_border_layer_set(bd, IL_CONFORM_LAYER);
|
|
|
|
bd->lock_user_stacking = 1;
|
|
|
|
}
|
|
|
|
if ((bd->client.icccm.accepts_focus) && (bd->client.icccm.take_focus)
|
2010-01-23 13:31:06 -08:00
|
|
|
&& (!bd->lock_focus_out) && (!bd->focused))
|
2010-01-12 17:10:39 -08:00
|
|
|
e_border_focus_set(bd, 1, 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
_layout_border_del(E_Border *bd)
|
|
|
|
{
|
2010-01-28 22:09:20 -08:00
|
|
|
if (!bd) return;
|
|
|
|
|
2010-01-12 17:10:39 -08:00
|
|
|
/* Do something if a border gets removed */
|
2010-01-18 16:00:07 -08:00
|
|
|
if ((bd->need_fullscreen) || (bd->fullscreen))
|
|
|
|
{
|
|
|
|
E_Border *b;
|
|
|
|
|
|
|
|
b = e_illume_border_top_shelf_get(bd->zone);
|
|
|
|
if (b) e_border_show(b);
|
|
|
|
}
|
2010-01-12 17:10:39 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
_layout_border_focus_in(E_Border *bd)
|
|
|
|
{
|
|
|
|
/* Do something if focus enters a window */
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
_layout_border_focus_out(E_Border *bd)
|
|
|
|
{
|
|
|
|
/* Do something if focus exits a window */
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
_layout_border_activate(E_Border *bd)
|
|
|
|
{
|
2010-02-05 17:10:10 -08:00
|
|
|
E_Border *b;
|
|
|
|
|
2010-01-12 17:10:39 -08:00
|
|
|
/* HANDLE A BORDER BEING ACTIVATED */
|
|
|
|
|
2010-01-28 22:09:20 -08:00
|
|
|
if ((!bd) || (bd->stolen)) return;
|
2010-01-12 17:10:39 -08:00
|
|
|
|
2010-02-04 22:12:02 -08:00
|
|
|
if (e_illume_border_is_conformant(bd))
|
|
|
|
{
|
2010-02-05 17:13:49 -08:00
|
|
|
b = e_illume_border_bottom_panel_get(bd->zone);
|
2010-02-05 17:10:10 -08:00
|
|
|
if (b) e_border_hide(b, 2);
|
2010-02-04 22:12:02 -08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2010-02-05 17:13:49 -08:00
|
|
|
b = e_illume_border_bottom_panel_get(bd->zone);
|
2010-02-05 17:10:10 -08:00
|
|
|
if (b) e_border_show(b);
|
2010-02-04 22:12:02 -08:00
|
|
|
}
|
|
|
|
|
2010-01-12 17:10:39 -08:00
|
|
|
/* only set focus if border accepts it and it's not locked out */
|
|
|
|
if (((!bd->client.icccm.accepts_focus) && (!bd->client.icccm.take_focus)) ||
|
|
|
|
(bd->lock_focus_out))
|
|
|
|
return;
|
|
|
|
|
|
|
|
/* if the border is not focused, check focus settings */
|
|
|
|
if ((bd) && (!bd->focused))
|
|
|
|
{
|
|
|
|
if ((e_config->focus_setting == E_FOCUS_NEW_WINDOW) ||
|
|
|
|
((bd->parent) &&
|
|
|
|
((e_config->focus_setting == E_FOCUS_NEW_DIALOG) ||
|
|
|
|
((bd->parent->focused) &&
|
|
|
|
(e_config->focus_setting == E_FOCUS_NEW_DIALOG_IF_OWNER_FOCUSED)))))
|
|
|
|
{
|
|
|
|
if (bd->iconic)
|
|
|
|
{
|
|
|
|
/* if it's iconic, then uniconify */
|
|
|
|
if (!bd->lock_user_iconify) e_border_uniconify(bd);
|
|
|
|
}
|
|
|
|
/* if we can, raise the border */
|
|
|
|
if (!bd->lock_user_stacking) e_border_raise(bd);
|
|
|
|
/* if we can, focus the border */
|
|
|
|
if (!bd->lock_focus_out) e_border_focus_set(bd, 1, 1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-02-06 07:42:04 -08:00
|
|
|
void
|
|
|
|
_layout_border_property_change(E_Border *bd, Ecore_X_Event_Window_Property *event)
|
|
|
|
{
|
|
|
|
E_Border *ind;
|
|
|
|
|
|
|
|
if (event->atom != ECORE_X_ATOM_NET_WM_STATE) return;
|
|
|
|
if ((!bd->client.icccm.name) || (!bd->client.icccm.class) ||
|
|
|
|
(bd->stolen))
|
|
|
|
return;
|
|
|
|
if (!(ind = e_illume_border_top_shelf_get(bd->zone))) return;
|
|
|
|
if ((bd->fullscreen) || (bd->need_fullscreen))
|
|
|
|
{
|
|
|
|
if (ind) e_border_hide(ind, 2);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (ind) e_border_show(ind);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-01-12 17:10:39 -08:00
|
|
|
void
|
|
|
|
_layout_zone_layout(E_Zone *zone)
|
|
|
|
{
|
|
|
|
E_Illume_Config_Zone *cfg_zone;
|
|
|
|
Eina_List *l;
|
|
|
|
E_Border *bd;
|
|
|
|
|
2010-01-28 22:09:20 -08:00
|
|
|
if (!zone) return;
|
|
|
|
|
2010-01-12 17:10:39 -08:00
|
|
|
cfg_zone = e_illume_zone_config_get(zone->id);
|
2010-01-28 22:09:20 -08:00
|
|
|
if (!cfg_zone) return;
|
|
|
|
|
2010-01-12 17:10:39 -08:00
|
|
|
EINA_LIST_FOREACH(e_border_client_list(), l, bd)
|
|
|
|
{
|
|
|
|
int mh;
|
|
|
|
|
|
|
|
if ((bd->zone != zone) || (bd->new_client) || (!bd->visible)) continue;
|
|
|
|
if (e_illume_border_is_top_shelf(bd))
|
|
|
|
{
|
|
|
|
e_illume_border_min_get(bd, NULL, &mh);
|
|
|
|
if (shelfsize < mh) shelfsize = mh;
|
|
|
|
if (!bd->client.illume.drag.drag)
|
|
|
|
{
|
|
|
|
if ((bd->w != zone->w) || (bd->h != shelfsize))
|
|
|
|
_zone_layout_border_resize(bd, zone->w, shelfsize);
|
|
|
|
if (!cfg_zone->mode.dual)
|
|
|
|
{
|
|
|
|
if ((bd->x != zone->x) || (bd->y != zone->y))
|
2010-01-22 15:28:03 -08:00
|
|
|
{
|
|
|
|
_zone_layout_border_move(bd, zone->x, zone->y);
|
|
|
|
ecore_x_e_illume_quickpanel_position_update_send(bd->client.win);
|
|
|
|
}
|
2010-01-12 17:10:39 -08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (cfg_zone->mode.side == 0)
|
|
|
|
{
|
|
|
|
if (bd->x != zone->x)
|
|
|
|
_zone_layout_border_move(bd, zone->x, bd->y);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if ((bd->x != zone->x) || (bd->y != zone->y))
|
2010-01-22 15:28:03 -08:00
|
|
|
{
|
|
|
|
_zone_layout_border_move(bd, zone->x, zone->y);
|
|
|
|
ecore_x_e_illume_quickpanel_position_update_send(bd->client.win);
|
|
|
|
}
|
2010-01-12 17:10:39 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
e_border_stick(bd);
|
|
|
|
if (bd->layer != IL_TOP_SHELF_LAYER)
|
|
|
|
e_border_layer_set(bd, IL_TOP_SHELF_LAYER);
|
|
|
|
}
|
|
|
|
else if (e_illume_border_is_bottom_panel(bd))
|
|
|
|
{
|
|
|
|
e_illume_border_min_get(bd, NULL, &mh);
|
|
|
|
if (panelsize < mh) panelsize = mh;
|
|
|
|
if (!bd->client.illume.drag.drag)
|
|
|
|
{
|
|
|
|
if ((bd->w != zone->w) || (bd->h != panelsize))
|
|
|
|
_zone_layout_border_resize(bd, zone->w, panelsize);
|
|
|
|
if ((bd->x != zone->x) ||
|
|
|
|
(bd->y != (zone->y + zone->h - panelsize)))
|
|
|
|
_zone_layout_border_move(bd, zone->x,
|
|
|
|
(zone->y + zone->h - panelsize));
|
|
|
|
}
|
|
|
|
e_border_stick(bd);
|
|
|
|
if (bd->layer != IL_BOTTOM_PANEL_LAYER)
|
|
|
|
e_border_layer_set(bd, IL_BOTTOM_PANEL_LAYER);
|
|
|
|
}
|
|
|
|
else if (e_illume_border_is_keyboard(bd))
|
|
|
|
{
|
|
|
|
e_illume_border_min_get(bd, NULL, &mh);
|
|
|
|
if (kbdsize < mh) kbdsize = mh;
|
|
|
|
if ((bd->w != zone->w) || (bd->h != kbdsize))
|
|
|
|
_zone_layout_border_resize(bd, zone->w, kbdsize);
|
|
|
|
if ((bd->x != zone->x) ||
|
|
|
|
(bd->y != (zone->y + zone->h - kbdsize)))
|
|
|
|
_zone_layout_border_move(bd, zone->x,
|
|
|
|
(zone->y + zone->h - kbdsize));
|
|
|
|
if (bd->layer != IL_KEYBOARD_LAYER)
|
|
|
|
e_border_layer_set(bd, IL_KEYBOARD_LAYER);
|
|
|
|
}
|
|
|
|
else if (e_illume_border_is_dialog(bd))
|
|
|
|
{
|
|
|
|
int mw, nx, ny;
|
|
|
|
|
|
|
|
e_illume_border_min_get(bd, &mw, &mh);
|
|
|
|
if (mw > zone->w) mw = zone->w;
|
|
|
|
if (mh > zone->h) mh = zone->h;
|
|
|
|
nx = (zone->x + ((zone->w - mw) / 2));
|
|
|
|
ny = (zone->y + ((zone->h - mh) / 2));
|
2010-01-28 20:58:14 -08:00
|
|
|
if ((bd->w != mw) || (bd->h != mh))
|
|
|
|
_zone_layout_border_resize(bd, mw, mh);
|
2010-01-12 17:10:39 -08:00
|
|
|
if ((bd->x != nx) || (bd->y != ny))
|
|
|
|
_zone_layout_border_move(bd, nx, ny);
|
|
|
|
if (bd->layer != IL_DIALOG_LAYER)
|
|
|
|
e_border_layer_set(bd, IL_DIALOG_LAYER);
|
|
|
|
}
|
|
|
|
else if (e_illume_border_is_quickpanel(bd))
|
|
|
|
{
|
|
|
|
e_illume_border_min_get(bd, NULL, &mh);
|
|
|
|
if ((bd->w != zone->w) || (bd->h != mh))
|
|
|
|
_zone_layout_border_resize(bd, zone->w, mh);
|
|
|
|
if (bd->layer != IL_QUICKPANEL_LAYER)
|
|
|
|
e_border_layer_set(bd, IL_QUICKPANEL_LAYER);
|
|
|
|
bd->lock_user_stacking = 1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2010-02-06 08:58:15 -08:00
|
|
|
if (bd->stolen) continue;
|
2010-01-12 17:10:39 -08:00
|
|
|
if (cfg_zone->mode.dual) _zone_layout_dual(bd);
|
|
|
|
else _zone_layout_single(bd);
|
2010-01-26 12:13:34 -08:00
|
|
|
if (e_illume_border_is_conformant(bd))
|
|
|
|
{
|
|
|
|
if (bd->layer != IL_CONFORM_LAYER)
|
|
|
|
e_border_layer_set(bd, IL_CONFORM_LAYER);
|
|
|
|
}
|
|
|
|
else if ((bd->fullscreen) || (bd->need_fullscreen))
|
|
|
|
{
|
|
|
|
if (bd->layer != IL_FULLSCREEN_LAYER)
|
|
|
|
e_border_layer_set(bd, IL_FULLSCREEN_LAYER);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (bd->layer != IL_APP_LAYER)
|
|
|
|
e_border_layer_set(bd, IL_APP_LAYER);
|
|
|
|
}
|
2010-01-12 17:10:39 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
_layout_zone_move_resize(E_Zone *zone)
|
|
|
|
{
|
2010-01-28 22:09:20 -08:00
|
|
|
if (!zone) return;
|
2010-01-12 17:10:39 -08:00
|
|
|
_layout_zone_layout(zone);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
_layout_drag_start(E_Border *bd)
|
|
|
|
{
|
2010-01-28 22:09:20 -08:00
|
|
|
if (!bd) return;
|
2010-01-12 17:10:39 -08:00
|
|
|
ecore_x_e_illume_drag_set(bd->client.win, 1);
|
|
|
|
ecore_x_e_illume_drag_set(bd->zone->black_win, 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
_layout_drag_end(E_Border *bd)
|
|
|
|
{
|
2010-01-28 22:09:20 -08:00
|
|
|
if (!bd) return;
|
2010-01-12 17:10:39 -08:00
|
|
|
ecore_x_e_illume_drag_set(bd->client.win, 0);
|
|
|
|
ecore_x_e_illume_drag_set(bd->zone->black_win, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* local functions */
|
|
|
|
static void
|
|
|
|
_zone_layout_border_move(E_Border *bd, int x, int y)
|
|
|
|
{
|
2010-01-28 22:09:20 -08:00
|
|
|
if (!bd) return;
|
2010-01-12 17:10:39 -08:00
|
|
|
bd->x = x;
|
|
|
|
bd->y = y;
|
|
|
|
bd->changes.pos = 1;
|
|
|
|
bd->changed = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_zone_layout_border_resize(E_Border *bd, int w, int h)
|
|
|
|
{
|
2010-01-28 22:09:20 -08:00
|
|
|
if (!bd) return;
|
2010-01-12 17:10:39 -08:00
|
|
|
bd->w = w;
|
|
|
|
bd->h = h;
|
|
|
|
bd->client.w = bd->w - (bd->client_inset.l + bd->client_inset.r);
|
|
|
|
bd->client.h = bd->h - (bd->client_inset.t + bd->client_inset.b);
|
|
|
|
bd->changes.size = 1;
|
|
|
|
bd->changed = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_zone_layout_single(E_Border *bd)
|
|
|
|
{
|
|
|
|
int kx, ky, kw, kh;
|
|
|
|
int ss = 0, ps = 0;
|
2010-01-26 02:50:51 -08:00
|
|
|
int nh, ny;
|
2010-01-12 17:10:39 -08:00
|
|
|
|
2010-01-28 22:09:20 -08:00
|
|
|
if (!bd) return;
|
2010-01-12 17:10:39 -08:00
|
|
|
e_illume_kbd_safe_app_region_get(bd->zone, &kx, &ky, &kw, &kh);
|
2010-01-26 02:16:29 -08:00
|
|
|
if (!((bd->need_fullscreen) || (bd->fullscreen)))
|
2010-01-12 17:10:39 -08:00
|
|
|
{
|
2010-01-26 02:16:29 -08:00
|
|
|
if (kh >= bd->zone->h) ps = panelsize;
|
|
|
|
ss = shelfsize;
|
2010-01-12 17:10:39 -08:00
|
|
|
}
|
2010-01-26 02:50:51 -08:00
|
|
|
nh = kh - ss - ps;
|
|
|
|
ny = ky + ss;
|
|
|
|
if (e_illume_border_is_conformant(bd))
|
|
|
|
{
|
2010-02-06 09:14:40 -08:00
|
|
|
nh = bd->zone->h;
|
2010-01-26 02:50:51 -08:00
|
|
|
ny = ky;
|
|
|
|
}
|
|
|
|
if ((bd->w != kw) || (bd->h != nh))
|
|
|
|
_zone_layout_border_resize(bd, kw, nh);
|
|
|
|
if ((bd->x != kx) || (bd->y != ny))
|
|
|
|
_zone_layout_border_move(bd, kx, ny);
|
2010-01-12 17:10:39 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_zone_layout_dual(E_Border *bd)
|
|
|
|
{
|
|
|
|
E_Illume_Config_Zone *cz;
|
|
|
|
|
2010-01-28 22:09:20 -08:00
|
|
|
if (!bd) return;
|
2010-01-12 17:10:39 -08:00
|
|
|
cz = e_illume_zone_config_get(bd->zone->id);
|
2010-01-28 22:09:20 -08:00
|
|
|
if (!cz) return;
|
2010-01-12 17:10:39 -08:00
|
|
|
if (cz->mode.side == 0)
|
|
|
|
{
|
|
|
|
int ty;
|
|
|
|
|
|
|
|
e_illume_border_top_shelf_pos_get(bd->zone, NULL, &ty);
|
|
|
|
if (ty <= bd->zone->y)
|
|
|
|
_zone_layout_dual_top(bd);
|
|
|
|
else
|
|
|
|
_zone_layout_dual_top_custom(bd);
|
|
|
|
}
|
|
|
|
else if (cz->mode.side == 1)
|
|
|
|
_zone_layout_dual_left(bd);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_zone_layout_dual_top(E_Border *bd)
|
|
|
|
{
|
|
|
|
int conform;
|
2010-01-26 12:13:34 -08:00
|
|
|
int kx, ky, kw, kh;
|
|
|
|
int ps = 0, ss = 0;
|
|
|
|
int by, bh;
|
|
|
|
E_Border *b;
|
2010-01-12 17:10:39 -08:00
|
|
|
|
2010-01-28 22:09:20 -08:00
|
|
|
if (!bd) return;
|
2010-01-12 17:10:39 -08:00
|
|
|
conform = e_illume_border_is_conformant(bd);
|
|
|
|
e_illume_kbd_safe_app_region_get(bd->zone, &kx, &ky, &kw, &kh);
|
2010-01-26 02:16:29 -08:00
|
|
|
|
2010-01-26 12:13:34 -08:00
|
|
|
if (!((bd->need_fullscreen) || (bd->fullscreen)))
|
2010-01-12 17:10:39 -08:00
|
|
|
{
|
2010-01-26 12:13:34 -08:00
|
|
|
if (kh >= bd->zone->h) ps = panelsize;
|
|
|
|
ss = shelfsize;
|
2010-01-12 17:10:39 -08:00
|
|
|
}
|
|
|
|
|
2010-01-26 12:13:34 -08:00
|
|
|
by = (ky + ss);
|
|
|
|
bh = ((kh - ss - ps) / 2);
|
2010-01-12 17:10:39 -08:00
|
|
|
|
2010-01-26 12:13:34 -08:00
|
|
|
b = e_illume_border_at_xy_get(bd->zone, kx, by);
|
|
|
|
if ((b) && (bd != b))
|
|
|
|
{
|
|
|
|
if (e_illume_border_is_home(b))
|
2010-01-12 17:10:39 -08:00
|
|
|
{
|
2010-01-26 12:13:34 -08:00
|
|
|
if (conform)
|
2010-01-12 17:10:39 -08:00
|
|
|
{
|
2010-01-26 12:13:34 -08:00
|
|
|
by = ky;
|
2010-02-06 09:14:40 -08:00
|
|
|
bh = bd->zone->h / 2;
|
2010-01-12 17:10:39 -08:00
|
|
|
}
|
2010-01-26 12:13:34 -08:00
|
|
|
else if (e_illume_border_is_home(bd))
|
2010-01-23 13:31:06 -08:00
|
|
|
by = (b->y + b->h);
|
2010-01-12 17:10:39 -08:00
|
|
|
}
|
2010-01-26 12:13:34 -08:00
|
|
|
else if (e_illume_border_is_conformant(b))
|
|
|
|
{
|
|
|
|
by = (b->y + b->h);
|
2010-02-06 09:14:40 -08:00
|
|
|
if (conform) bh = bd->zone->h / 2;
|
2010-01-26 12:13:34 -08:00
|
|
|
}
|
2010-01-12 17:10:39 -08:00
|
|
|
else
|
|
|
|
{
|
2010-01-26 12:13:34 -08:00
|
|
|
by = (b->y + b->h);
|
2010-02-06 09:14:40 -08:00
|
|
|
if (conform) bh = bd->zone->h / 2;
|
2010-01-12 17:10:39 -08:00
|
|
|
}
|
2010-01-26 12:13:34 -08:00
|
|
|
}
|
|
|
|
else if (b)
|
|
|
|
{
|
|
|
|
if (bd->client.vkbd.state > ECORE_X_VIRTUAL_KEYBOARD_STATE_OFF)
|
|
|
|
{
|
|
|
|
by = (ky + ss);
|
|
|
|
bh = ((kh - ss - ps) / 2);
|
|
|
|
}
|
|
|
|
}
|
2010-01-23 13:31:06 -08:00
|
|
|
|
2010-01-26 12:13:34 -08:00
|
|
|
if ((bd->need_fullscreen) || (bd->fullscreen))
|
|
|
|
{
|
|
|
|
by = ky;
|
|
|
|
bh = kh;
|
2010-01-12 17:10:39 -08:00
|
|
|
}
|
2010-01-26 12:13:34 -08:00
|
|
|
|
|
|
|
if ((bd->w != kw) || (bd->h != bh))
|
|
|
|
_zone_layout_border_resize(bd, kw, bh);
|
|
|
|
if ((bd->x != kx) || (bd->y != by))
|
|
|
|
_zone_layout_border_move(bd, kx, by);
|
2010-01-12 17:10:39 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_zone_layout_dual_top_custom(E_Border *bd)
|
|
|
|
{
|
2010-01-26 14:37:55 -08:00
|
|
|
int kx, kw, ky, kh;
|
2010-01-12 17:10:39 -08:00
|
|
|
int ax, ay, aw, ah;
|
|
|
|
int zx, zy, zw, zh;
|
|
|
|
|
2010-01-28 22:09:20 -08:00
|
|
|
if (!bd) return;
|
|
|
|
|
2010-01-12 17:10:39 -08:00
|
|
|
/* grab the 'safe' region. Safe region is space not occupied by keyboard */
|
2010-01-26 14:37:55 -08:00
|
|
|
e_illume_kbd_safe_app_region_get(bd->zone, &kx, &ky, &kw, &kh);
|
2010-01-12 17:10:39 -08:00
|
|
|
|
|
|
|
e_illume_border_app1_safe_region_get(bd->zone, &ax, &ay, &aw, &ah);
|
|
|
|
e_illume_border_app2_safe_region_get(bd->zone, &zx, &zy, &zw, &zh);
|
|
|
|
|
|
|
|
/* if there are no other borders, than give this one all available space */
|
2010-01-23 13:31:06 -08:00
|
|
|
if (e_illume_border_valid_count_get(bd->zone) < 2)
|
2010-01-12 17:10:39 -08:00
|
|
|
{
|
|
|
|
if (ah >= zh)
|
|
|
|
{
|
|
|
|
zx = ax;
|
|
|
|
zy = ax;
|
|
|
|
zw = aw;
|
|
|
|
zh = ah;
|
|
|
|
}
|
|
|
|
if ((bd->w != zw) || (bd->h != zh))
|
|
|
|
_zone_layout_border_resize(bd, zw, zh);
|
|
|
|
if ((bd->x != zx) || (bd->y != zy))
|
|
|
|
_zone_layout_border_move(bd, zx, zy);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
int bh, by;
|
|
|
|
|
2010-01-23 13:31:06 -08:00
|
|
|
bh = ah;
|
|
|
|
by = ay;
|
2010-01-12 17:10:39 -08:00
|
|
|
|
2010-01-23 13:31:06 -08:00
|
|
|
if (bd->client.vkbd.state <= ECORE_X_VIRTUAL_KEYBOARD_STATE_OFF)
|
2010-01-12 17:10:39 -08:00
|
|
|
{
|
2010-01-23 13:31:06 -08:00
|
|
|
E_Border *bt;
|
2010-01-12 17:10:39 -08:00
|
|
|
|
2010-01-23 13:31:06 -08:00
|
|
|
/* grab the border at the top */
|
|
|
|
bt = e_illume_border_at_xy_get(bd->zone, kx, ay);
|
|
|
|
if ((bt) && (bd != bt))
|
2010-01-12 17:10:39 -08:00
|
|
|
{
|
2010-01-23 13:31:06 -08:00
|
|
|
E_Border *bb;
|
|
|
|
|
|
|
|
/* have border @ top, check for border @ bottom */
|
2010-01-12 17:10:39 -08:00
|
|
|
bb = e_illume_border_at_xy_get(bd->zone, kx, zy);
|
2010-01-23 13:31:06 -08:00
|
|
|
if ((bb) && (bd != bb))
|
2010-01-12 17:10:39 -08:00
|
|
|
{
|
2010-01-23 13:31:06 -08:00
|
|
|
/* have border @ top & bottom; neither is current */
|
|
|
|
|
|
|
|
/* if top border is !home, check bottom */
|
|
|
|
if (!e_illume_border_is_home(bt))
|
2010-01-12 17:10:39 -08:00
|
|
|
{
|
2010-01-23 13:31:06 -08:00
|
|
|
if (e_illume_border_is_home(bb))
|
2010-01-12 17:10:39 -08:00
|
|
|
{
|
|
|
|
bh = zh;
|
|
|
|
by = zy;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2010-01-23 13:31:06 -08:00
|
|
|
/* potential hole */
|
2010-01-12 17:10:39 -08:00
|
|
|
bh = ah;
|
|
|
|
by = ay;
|
|
|
|
}
|
|
|
|
}
|
2010-01-23 13:31:06 -08:00
|
|
|
else
|
2010-01-12 17:10:39 -08:00
|
|
|
{
|
2010-01-23 13:31:06 -08:00
|
|
|
bh = ah;
|
|
|
|
by = ay;
|
2010-01-12 17:10:39 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (bb)
|
2010-01-23 13:31:06 -08:00
|
|
|
{
|
|
|
|
bh = zh;
|
|
|
|
by = bd->y;
|
|
|
|
}
|
|
|
|
else
|
2010-01-12 17:10:39 -08:00
|
|
|
{
|
|
|
|
bh = zh;
|
|
|
|
by = zy;
|
|
|
|
}
|
|
|
|
}
|
2010-01-23 13:31:06 -08:00
|
|
|
else if (bt)
|
|
|
|
{
|
|
|
|
bh = ah;
|
|
|
|
by = bd->y;
|
|
|
|
}
|
2010-01-12 17:10:39 -08:00
|
|
|
else
|
|
|
|
{
|
|
|
|
bh = ah;
|
|
|
|
by = ay;
|
|
|
|
}
|
|
|
|
}
|
2010-01-23 13:31:06 -08:00
|
|
|
|
2010-01-26 14:37:55 -08:00
|
|
|
if ((bd->fullscreen) || (bd->need_fullscreen))
|
|
|
|
{
|
|
|
|
bh = kh;
|
|
|
|
by = ky;
|
|
|
|
}
|
2010-01-12 17:10:39 -08:00
|
|
|
if ((bd->w != kw) || (bd->h != bh))
|
|
|
|
_zone_layout_border_resize(bd, kw, bh);
|
|
|
|
if ((bd->x != kx) || (bd->y != by))
|
|
|
|
_zone_layout_border_move(bd, kx, by);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_zone_layout_dual_left(E_Border *bd)
|
|
|
|
{
|
|
|
|
int conform;
|
2010-01-26 12:13:34 -08:00
|
|
|
int kx, ky, kw, kh;
|
|
|
|
int ps = 0, ss = 0;
|
|
|
|
int by, bh, bx, bw;
|
|
|
|
E_Border *b;
|
2010-01-12 17:10:39 -08:00
|
|
|
|
2010-01-28 22:09:20 -08:00
|
|
|
if (!bd) return;
|
|
|
|
|
2010-01-12 17:10:39 -08:00
|
|
|
conform = e_illume_border_is_conformant(bd);
|
|
|
|
e_illume_kbd_safe_app_region_get(bd->zone, &kx, &ky, &kw, &kh);
|
|
|
|
|
2010-01-26 12:13:34 -08:00
|
|
|
if (!((bd->need_fullscreen) || (bd->fullscreen)))
|
2010-01-12 17:10:39 -08:00
|
|
|
{
|
2010-01-26 12:13:34 -08:00
|
|
|
if (kh >= bd->zone->h) ps = panelsize;
|
|
|
|
ss = shelfsize;
|
2010-01-12 17:10:39 -08:00
|
|
|
}
|
|
|
|
|
2010-01-26 12:13:34 -08:00
|
|
|
bx = kx;
|
|
|
|
by = (ky + ss);
|
|
|
|
bw = (kw / 2);
|
|
|
|
bh = (kh - ss - ps);
|
2010-01-12 17:10:39 -08:00
|
|
|
|
2010-01-26 12:13:34 -08:00
|
|
|
b = e_illume_border_at_xy_get(bd->zone, kx, by);
|
|
|
|
if ((b) && (bd != b))
|
|
|
|
{
|
|
|
|
if (e_illume_border_is_home(b))
|
2010-01-12 17:10:39 -08:00
|
|
|
{
|
2010-01-26 12:13:34 -08:00
|
|
|
if (conform)
|
2010-01-23 13:31:06 -08:00
|
|
|
{
|
2010-01-26 12:13:34 -08:00
|
|
|
by = ky;
|
2010-02-06 09:14:40 -08:00
|
|
|
bh = bd->zone->h;
|
2010-01-23 13:31:06 -08:00
|
|
|
}
|
2010-01-26 12:13:34 -08:00
|
|
|
else if (e_illume_border_is_home(bd))
|
|
|
|
bx = (b->x + b->w);
|
|
|
|
}
|
|
|
|
else if (e_illume_border_is_conformant(b))
|
|
|
|
{
|
|
|
|
bx = (b->x + b->w);
|
|
|
|
if (conform)
|
2010-01-12 17:10:39 -08:00
|
|
|
{
|
2010-01-26 12:13:34 -08:00
|
|
|
by = ky;
|
2010-02-06 09:14:40 -08:00
|
|
|
bh = bd->zone->h;
|
2010-01-12 17:10:39 -08:00
|
|
|
}
|
2010-01-26 12:13:34 -08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
bx = (b->x + b->w);
|
|
|
|
if (conform)
|
2010-01-12 17:10:39 -08:00
|
|
|
{
|
2010-01-26 12:13:34 -08:00
|
|
|
by = ky;
|
2010-02-06 09:14:40 -08:00
|
|
|
bh = bd->zone->h;
|
2010-01-12 17:10:39 -08:00
|
|
|
}
|
|
|
|
}
|
2010-01-26 12:13:34 -08:00
|
|
|
}
|
|
|
|
else if (b)
|
|
|
|
{
|
|
|
|
if (bd->client.vkbd.state > ECORE_X_VIRTUAL_KEYBOARD_STATE_OFF)
|
2010-01-12 17:10:39 -08:00
|
|
|
{
|
2010-01-26 12:13:34 -08:00
|
|
|
by = (ky + ss);
|
2010-02-06 09:14:40 -08:00
|
|
|
bh = (kh - ss - ps);
|
2010-01-12 17:10:39 -08:00
|
|
|
}
|
|
|
|
}
|
2010-01-26 12:13:34 -08:00
|
|
|
|
|
|
|
if ((bd->need_fullscreen) || (bd->fullscreen))
|
|
|
|
{
|
|
|
|
bx = kx;
|
|
|
|
by = ky;
|
|
|
|
bw = kw;
|
|
|
|
bh = kh;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ((bd->w != bw) || (bd->h != bh))
|
|
|
|
_zone_layout_border_resize(bd, bw, bh);
|
|
|
|
if ((bd->x != bx) || (bd->y != by))
|
|
|
|
_zone_layout_border_move(bd, bx, by);
|
2010-01-12 17:10:39 -08:00
|
|
|
}
|