enlightenment/src/modules/illume2/e_mod_layout_illume.c

140 lines
3.8 KiB
C

#include "e.h"
#include "e_mod_main.h"
#include "e_mod_layout.h"
#include "e_mod_layout_illume.h"
static void
_border_add(E_Border *bd)
{ // handle a border being added
}
static void
_border_del(E_Border *bd)
{ // handle a border being deleted
}
static void
_border_focus_in(E_Border *bd)
{ // do something if focus enters a window
}
static void
_border_focus_out(E_Border *bd)
{ // do something if the rfocus exits a window
}
static void
_zone_layout(E_Zone *z)
{ // borders are in re-layout stage. this is where you move/resize them
Eina_List *l, *borders;
E_Border *bd;
// data for state
int shelfsize = 0;
int kbdsize = 0;
int panelsize = 0;
// phase 1. loop through borders to figure out sizes of things
borders = e_border_client_list();
EINA_LIST_FOREACH(borders, l, bd)
{
int mw, mh;
if (bd->zone != z) continue;
if (bd->new_client) continue;
if (!bd->visible) continue;
illume_border_min_get(bd, &mw, &mh);
if (illume_border_is_top_shelf(bd))
{
if (shelfsize < mh) shelfsize = mh;
}
else if (illume_border_is_bottom_panel(bd))
{
if (panelsize < mh) panelsize = mh;
}
else if (illume_border_is_keyboard(bd))
{
if (kbdsize < mh) kbdsize = mh;
}
}
// actually apply the sizing, positioning and layering too
borders = e_border_client_list();
EINA_LIST_FOREACH(borders, l, bd)
{
int mw, mh;
if (bd->zone != z) continue;
if (bd->new_client) continue;
if (!bd->visible) continue;
illume_border_min_get(bd, &mw, &mh);
if (illume_border_is_top_shelf(bd))
{
e_border_move_resize(bd, z->x, z->y, z->w, shelfsize);
if (bd->layer != 200) e_border_layer_set(bd, 200);
}
else if (illume_border_is_bottom_panel(bd))
{
e_border_move_resize(bd, z->x, z->y + z->h - panelsize, z->w, panelsize);
if (bd->layer != 100) e_border_layer_set(bd, 100);
}
else if (illume_border_is_keyboard(bd))
{
e_border_move_resize(bd, z->x, z->y + z->h - kbdsize, z->w, kbdsize);
if (bd->layer != 150) e_border_layer_set(bd, 150);
}
else if (illume_border_is_home(bd))
{
e_border_move_resize(bd, z->x, z->y, z->w, z->h);
if (bd->layer != 50) e_border_layer_set(bd, 50);
}
else if (illume_border_is_dialog(bd))
{
if (mh > z->h) mh = z->h;
e_border_move_resize(bd, z->x, z->y + ((z->h - mh) / 2), z->w, mh);
if (bd->layer != 120) e_border_layer_set(bd, 120);
}
else
{
e_border_move_resize(bd, z->x, z->y + shelfsize, z->w, z->h - shelfsize - kbdsize);
if (bd->layer != 100) e_border_layer_set(bd, 100);
}
}
}
static void
_zone_move_resize(E_Zone *z)
{ // the zone was moved or resized - re-configure all windows in this zone
_zone_layout(z);
}
//////////////////////////////////////////////////////////////////////////////
const Illume_Layout_Mode laymode =
{
"illume", "Illume", // FIXME: translatable?
// ---
_border_add,
_border_del,
_border_focus_in,
_border_focus_out,
// ---
_zone_layout,
_zone_move_resize,
// ---
};
//////////////////////////////////////////////////////////////////////////////
void
illume_layout_illume_init(void)
{
illume_layout_mode_register(&laymode);
}
//////////////////////////////////////////////////////////////////////////////
void
illume_layout_illume_shutdown(void)
{
illume_layout_mode_unregister(&laymode);
}
//////////////////////////////////////////////////////////////////////////////