forked from enlightenment/enlightenment
Tiling2: Fixed coding conventions using efl_indent.
This commit is contained in:
parent
05df3290dc
commit
ee587a37b0
|
@ -25,21 +25,20 @@ _open_browser_help_cb(void *data EINA_UNUSED, void *obj EINA_UNUSED)
|
|||
free(sb);
|
||||
}
|
||||
|
||||
/* Some defines to make coding with the e_widget_* easier for
|
||||
* configuration panel */
|
||||
/* Some defines to make coding with the e_widget_* easier for configuration
|
||||
* panel */
|
||||
#define RADIO(title, value, radiogroup) \
|
||||
e_widget_radio_add(evas, _(title), value, radiogroup)
|
||||
#define LIST_ADD(list, object) \
|
||||
e_widget_list_object_append(list, object, 1, 1, 0.5)
|
||||
|
||||
struct _Config_vdesk *
|
||||
get_vdesk(Eina_List *vdesks,
|
||||
int x,
|
||||
int y,
|
||||
unsigned int zone_num)
|
||||
get_vdesk(Eina_List * vdesks, int x, int y, unsigned int zone_num)
|
||||
{
|
||||
Eina_List *l;
|
||||
for (l = vdesks; l; l = l->next) {
|
||||
|
||||
for (l = vdesks; l; l = l->next)
|
||||
{
|
||||
struct _Config_vdesk *vd = l->data;
|
||||
|
||||
if (!vd)
|
||||
|
@ -65,21 +64,22 @@ _create_data(E_Config_Dialog *cfd EINA_UNUSED)
|
|||
|
||||
cfdata = E_NEW(E_Config_Dialog_Data, 1);
|
||||
|
||||
/* Because we save a lot of lines here by using memcpy,
|
||||
* the structs have to be ordered the same */
|
||||
/* Because we save a lot of lines here by using memcpy, the structs have to
|
||||
* be ordered the same */
|
||||
memcpy(cfdata, tiling_g.config, sizeof(Config));
|
||||
|
||||
/* Handle things which can't be easily memcpy'd */
|
||||
cfdata->config.vdesks = NULL;
|
||||
|
||||
for (l = tiling_g.config->vdesks; l; l = l->next) {
|
||||
struct _Config_vdesk *vd = l->data,
|
||||
*newvd;
|
||||
for (l = tiling_g.config->vdesks; l; l = l->next)
|
||||
{
|
||||
struct _Config_vdesk *vd = l->data, *newvd;
|
||||
|
||||
if (!vd)
|
||||
continue;
|
||||
|
||||
newvd = E_NEW(struct _Config_vdesk, 1);
|
||||
|
||||
newvd->x = vd->x;
|
||||
newvd->y = vd->y;
|
||||
newvd->zone_num = vd->zone_num;
|
||||
|
@ -92,16 +92,14 @@ _create_data(E_Config_Dialog *cfd EINA_UNUSED)
|
|||
}
|
||||
|
||||
static void
|
||||
_free_data(E_Config_Dialog *cfd EINA_UNUSED,
|
||||
E_Config_Dialog_Data *cfdata)
|
||||
_free_data(E_Config_Dialog * cfd EINA_UNUSED, E_Config_Dialog_Data * cfdata)
|
||||
{
|
||||
eina_list_free(cfdata->config.vdesks);
|
||||
free(cfdata);
|
||||
}
|
||||
|
||||
static void
|
||||
_fill_zone_config(E_Zone *zone,
|
||||
E_Config_Dialog_Data *cfdata)
|
||||
_fill_zone_config(E_Zone * zone, E_Config_Dialog_Data * cfdata)
|
||||
{
|
||||
Evas *evas;
|
||||
int i;
|
||||
|
@ -113,7 +111,8 @@ _fill_zone_config(E_Zone *zone,
|
|||
|
||||
cfdata->o_desklist = e_widget_list_add(evas, 1, 0);
|
||||
|
||||
for (i = 0; i < zone->desk_y_count * zone->desk_x_count; i++) {
|
||||
for (i = 0; i < zone->desk_y_count * zone->desk_x_count; i++)
|
||||
{
|
||||
E_Desk *desk = zone->desks[i];
|
||||
struct _Config_vdesk *vd;
|
||||
Evas_Object *list, *slider;
|
||||
|
@ -122,8 +121,10 @@ _fill_zone_config(E_Zone *zone,
|
|||
continue;
|
||||
|
||||
vd = get_vdesk(cfdata->config.vdesks, desk->x, desk->y, zone->num);
|
||||
if (!vd) {
|
||||
if (!vd)
|
||||
{
|
||||
vd = E_NEW(struct _Config_vdesk, 1);
|
||||
|
||||
vd->x = desk->x;
|
||||
vd->y = desk->y;
|
||||
vd->zone_num = zone->num;
|
||||
|
@ -146,8 +147,7 @@ _fill_zone_config(E_Zone *zone,
|
|||
}
|
||||
|
||||
static void
|
||||
_cb_zone_change(void *data,
|
||||
Evas_Object *obj EINA_UNUSED)
|
||||
_cb_zone_change(void *data, Evas_Object * obj EINA_UNUSED)
|
||||
{
|
||||
int n;
|
||||
E_Config_Dialog_Data *cfdata = data;
|
||||
|
@ -164,8 +164,7 @@ _cb_zone_change(void *data,
|
|||
}
|
||||
|
||||
static Evas_Object *
|
||||
_basic_create_widgets(E_Config_Dialog *cfd EINA_UNUSED,
|
||||
Evas *evas,
|
||||
_basic_create_widgets(E_Config_Dialog * cfd EINA_UNUSED, Evas * evas,
|
||||
E_Config_Dialog_Data * cfdata)
|
||||
{
|
||||
Evas_Object *o, *oc, *of;
|
||||
|
@ -179,18 +178,15 @@ _basic_create_widgets(E_Config_Dialog *cfd EINA_UNUSED,
|
|||
|
||||
/* General settings */
|
||||
of = e_widget_framelist_add(evas, _("General"), 0);
|
||||
e_widget_framelist_object_append(of,
|
||||
e_widget_check_add(evas, _("Show window titles"),
|
||||
&cfdata->config.show_titles));
|
||||
e_widget_framelist_object_append(of,
|
||||
e_widget_check_add(evas, _("Tile dialog windows"),
|
||||
&cfdata->config.tile_dialogs));
|
||||
e_widget_framelist_object_append(of, e_widget_check_add(evas,
|
||||
_("Show window titles"), &cfdata->config.show_titles));
|
||||
e_widget_framelist_object_append(of, e_widget_check_add(evas,
|
||||
_("Tile dialog windows"), &cfdata->config.tile_dialogs));
|
||||
|
||||
LIST_ADD(o, of);
|
||||
|
||||
/* Virtual desktop settings */
|
||||
of = e_widget_label_add(evas,
|
||||
_("Enable/disable tiling per desktop."));
|
||||
of = e_widget_label_add(evas, _("Enable/disable tiling per desktop."));
|
||||
LIST_ADD(o, of);
|
||||
of = e_widget_framelist_add(evas, _("Virtual Desktops"), 0);
|
||||
cfdata->osf = e_widget_list_add(evas, 0, 1);
|
||||
|
@ -200,10 +196,12 @@ _basic_create_widgets(E_Config_Dialog *cfd EINA_UNUSED,
|
|||
e_widget_ilist_multi_select_set(cfdata->o_zonelist, false);
|
||||
e_widget_size_min_set(cfdata->o_zonelist, 100, 100);
|
||||
e_widget_on_change_hook_set(cfdata->o_zonelist, _cb_zone_change, cfdata);
|
||||
for (l = comp->zones; l; l = l->next) {
|
||||
for (l = comp->zones; l; l = l->next)
|
||||
{
|
||||
if (!(zone = l->data))
|
||||
continue;
|
||||
e_widget_ilist_append(cfdata->o_zonelist, NULL, zone->name, NULL, zone, NULL);
|
||||
e_widget_ilist_append(cfdata->o_zonelist, NULL, zone->name, NULL, zone,
|
||||
NULL);
|
||||
}
|
||||
e_widget_ilist_go(cfdata->o_zonelist);
|
||||
e_widget_ilist_thaw(cfdata->o_zonelist);
|
||||
|
@ -239,49 +237,52 @@ _basic_apply_data(E_Config_Dialog *cfd EINA_UNUSED,
|
|||
tiling_g.config->show_titles = cfdata->config.show_titles;
|
||||
|
||||
/* Check if the layout for one of the vdesks has changed */
|
||||
for (l = tiling_g.config->vdesks; l; l = l->next) {
|
||||
for (l = tiling_g.config->vdesks; l; l = l->next)
|
||||
{
|
||||
struct _Config_vdesk *newvd;
|
||||
|
||||
vd = l->data;
|
||||
|
||||
if (!vd)
|
||||
continue;
|
||||
if (!(newvd = get_vdesk(cfdata->config.vdesks,
|
||||
vd->x, vd->y, vd->zone_num))) {
|
||||
if (!(newvd =
|
||||
get_vdesk(cfdata->config.vdesks, vd->x, vd->y, vd->zone_num)))
|
||||
{
|
||||
change_desk_conf(vd);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (newvd->nb_stacks != vd->nb_stacks) {
|
||||
DBG("number of columns for (%d, %d, %d) changed from %d"
|
||||
" to %d",
|
||||
vd->x, vd->y, vd->zone_num,
|
||||
vd->nb_stacks,
|
||||
newvd->nb_stacks);
|
||||
if (newvd->nb_stacks != vd->nb_stacks)
|
||||
{
|
||||
DBG("number of columns for (%d, %d, %d) changed from %d" " to %d",
|
||||
vd->x, vd->y, vd->zone_num, vd->nb_stacks, newvd->nb_stacks);
|
||||
change_desk_conf(newvd);
|
||||
free(vd);
|
||||
l->data = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
for (l = cfdata->config.vdesks; l; l = l->next) {
|
||||
for (l = cfdata->config.vdesks; l; l = l->next)
|
||||
{
|
||||
vd = l->data;
|
||||
|
||||
if (!vd)
|
||||
continue;
|
||||
if (!get_vdesk(tiling_g.config->vdesks,
|
||||
vd->x, vd->y, vd->zone_num)) {
|
||||
if (!get_vdesk(tiling_g.config->vdesks, vd->x, vd->y, vd->zone_num))
|
||||
{
|
||||
change_desk_conf(vd);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
EINA_LIST_FREE(tiling_g.config->vdesks, vd) {
|
||||
EINA_LIST_FREE(tiling_g.config->vdesks, vd)
|
||||
{
|
||||
free(vd);
|
||||
}
|
||||
tiling_g.config->vdesks = NULL;
|
||||
|
||||
for (l = cfdata->config.vdesks; l; l = l->next) {
|
||||
for (l = cfdata->config.vdesks; l; l = l->next)
|
||||
{
|
||||
struct _Config_vdesk *newvd;
|
||||
|
||||
vd = l->data;
|
||||
|
@ -289,6 +290,7 @@ _basic_apply_data(E_Config_Dialog *cfd EINA_UNUSED,
|
|||
continue;
|
||||
|
||||
newvd = E_NEW(struct _Config_vdesk, 1);
|
||||
|
||||
newvd->x = vd->x;
|
||||
newvd->y = vd->y;
|
||||
newvd->zone_num = vd->zone_num;
|
||||
|
@ -305,8 +307,7 @@ _basic_apply_data(E_Config_Dialog *cfd EINA_UNUSED,
|
|||
}
|
||||
|
||||
E_Config_Dialog *
|
||||
e_int_config_tiling_module(E_Comp *comp,
|
||||
const char *params EINA_UNUSED)
|
||||
e_int_config_tiling_module(E_Comp * comp, const char *params EINA_UNUSED)
|
||||
{
|
||||
E_Config_Dialog *cfd;
|
||||
E_Config_Dialog_View *v;
|
||||
|
@ -324,9 +325,8 @@ e_int_config_tiling_module(E_Comp *comp,
|
|||
|
||||
snprintf(buf, sizeof(buf), "%s/e-module-tiling.edj",
|
||||
e_module_dir_get(tiling_g.module));
|
||||
cfd = e_config_dialog_new(comp,
|
||||
_("Tiling Configuration"),
|
||||
"E", "windows/tiling",
|
||||
buf, 0, v, NULL);
|
||||
cfd =
|
||||
e_config_dialog_new(comp, _("Tiling Configuration"), "E",
|
||||
"windows/tiling", buf, 0, v, NULL);
|
||||
return cfd;
|
||||
}
|
||||
|
|
|
@ -6,14 +6,17 @@
|
|||
#define TILING_RESIZE_STEP 5
|
||||
#define TILING_WRAP_SPEED 0.1
|
||||
|
||||
typedef struct geom_t {
|
||||
typedef struct geom_t
|
||||
{
|
||||
int x, y, w, h;
|
||||
} geom_t;
|
||||
|
||||
typedef struct Client_Extra {
|
||||
typedef struct Client_Extra
|
||||
{
|
||||
E_Client *client;
|
||||
geom_t expected;
|
||||
struct {
|
||||
struct
|
||||
{
|
||||
geom_t geom;
|
||||
E_Maximize maximized;
|
||||
const char *bordername;
|
||||
|
@ -39,39 +42,26 @@ static void _foreach_desk(void (*func)(E_Desk *desk));
|
|||
static struct tiling_mod_main_g
|
||||
{
|
||||
char edj_path[PATH_MAX];
|
||||
E_Config_DD *config_edd,
|
||||
*vdesk_edd;
|
||||
E_Config_DD *config_edd, *vdesk_edd;
|
||||
int currently_switching_desktop;
|
||||
Ecore_Event_Handler *handler_client_resize,
|
||||
*handler_client_move,
|
||||
*handler_client_add,
|
||||
*handler_client_remove,
|
||||
*handler_client_iconify,
|
||||
*handler_client_uniconify,
|
||||
*handler_client_stick,
|
||||
*handler_client_unstick,
|
||||
*handler_desk_show,
|
||||
*handler_desk_before_show,
|
||||
*handler_desk_set,
|
||||
*handler_compositor_resize;
|
||||
Ecore_Event_Handler *handler_client_resize, *handler_client_move,
|
||||
*handler_client_add, *handler_client_remove, *handler_client_iconify,
|
||||
*handler_client_uniconify, *handler_client_stick,
|
||||
*handler_client_unstick, *handler_desk_show, *handler_desk_before_show,
|
||||
*handler_desk_set, *handler_compositor_resize;
|
||||
E_Client_Menu_Hook *client_menu_hook;
|
||||
|
||||
Tiling_Info *tinfo;
|
||||
Eina_Hash *info_hash;
|
||||
Eina_Hash *client_extras;
|
||||
|
||||
E_Action *act_togglefloat,
|
||||
*act_move_up,
|
||||
*act_move_down,
|
||||
*act_move_left,
|
||||
*act_move_right,
|
||||
*act_toggle_split_mode,
|
||||
*act_swap_window;
|
||||
E_Action *act_togglefloat, *act_move_up, *act_move_down, *act_move_left,
|
||||
*act_move_right, *act_toggle_split_mode, *act_swap_window;
|
||||
|
||||
Tiling_Split_Type split_type;
|
||||
} _G = {
|
||||
.split_type = TILING_SPLIT_HORIZONTAL,
|
||||
};
|
||||
} _G =
|
||||
{
|
||||
.split_type = TILING_SPLIT_HORIZONTAL,};
|
||||
|
||||
/* }}} */
|
||||
/* Utils {{{ */
|
||||
|
@ -96,8 +86,8 @@ _initialize_tinfo(const E_Desk *desk)
|
|||
tinfo->desk = desk;
|
||||
eina_hash_direct_add(_G.info_hash, &tinfo->desk, tinfo);
|
||||
|
||||
tinfo->conf = get_vdesk(tiling_g.config->vdesks, desk->x, desk->y,
|
||||
desk->zone->num);
|
||||
tinfo->conf =
|
||||
get_vdesk(tiling_g.config->vdesks, desk->x, desk->y, desk->zone->num);
|
||||
|
||||
return tinfo;
|
||||
}
|
||||
|
@ -105,15 +95,18 @@ _initialize_tinfo(const E_Desk *desk)
|
|||
static void
|
||||
check_tinfo(const E_Desk * desk)
|
||||
{
|
||||
if (!_G.tinfo || _G.tinfo->desk != desk) {
|
||||
if (!_G.tinfo || _G.tinfo->desk != desk)
|
||||
{
|
||||
_G.tinfo = eina_hash_find(_G.info_hash, &desk);
|
||||
if (!_G.tinfo) {
|
||||
if (!_G.tinfo)
|
||||
{
|
||||
/* lazy init */
|
||||
_G.tinfo = _initialize_tinfo(desk);
|
||||
}
|
||||
if (!_G.tinfo->conf) {
|
||||
_G.tinfo->conf = get_vdesk(tiling_g.config->vdesks,
|
||||
desk->x, desk->y,
|
||||
if (!_G.tinfo->conf)
|
||||
{
|
||||
_G.tinfo->conf =
|
||||
get_vdesk(tiling_g.config->vdesks, desk->x, desk->y,
|
||||
desk->zone->num);
|
||||
}
|
||||
}
|
||||
|
@ -138,8 +131,7 @@ is_ignored_window(const Client_Extra *extra)
|
|||
static int
|
||||
is_tilable(const E_Client * ec)
|
||||
{
|
||||
if (ec->icccm.min_h == ec->icccm.max_h
|
||||
&& ec->icccm.max_h > 0)
|
||||
if (ec->icccm.min_h == ec->icccm.max_h && ec->icccm.max_h > 0)
|
||||
return false;
|
||||
|
||||
if (ec->icccm.gravity == ECORE_X_GRAVITY_STATIC)
|
||||
|
@ -148,12 +140,12 @@ is_tilable(const E_Client *ec)
|
|||
if (ec->e.state.centered)
|
||||
return false;
|
||||
|
||||
if (!tiling_g.config->tile_dialogs
|
||||
&& ((ec->icccm.transient_for != 0)
|
||||
|| (ec->netwm.type == E_WINDOW_TYPE_DIALOG)))
|
||||
if (!tiling_g.config->tile_dialogs && ((ec->icccm.transient_for != 0) ||
|
||||
(ec->netwm.type == E_WINDOW_TYPE_DIALOG)))
|
||||
return false;
|
||||
|
||||
if (ec->fullscreen) {
|
||||
if (ec->fullscreen)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -164,8 +156,7 @@ is_tilable(const E_Client *ec)
|
|||
}
|
||||
|
||||
static void
|
||||
change_window_border(E_Client *ec,
|
||||
const char *bordername)
|
||||
change_window_border(E_Client * ec, const char *bordername)
|
||||
{
|
||||
eina_stringshare_replace(&ec->bordername, bordername);
|
||||
ec->border.changed = true;
|
||||
|
@ -176,16 +167,18 @@ change_window_border(E_Client *ec,
|
|||
}
|
||||
|
||||
static Eina_Bool
|
||||
_info_hash_update(const Eina_Hash *hash EINA_UNUSED, const void *key EINA_UNUSED,
|
||||
void *data, void *fdata EINA_UNUSED)
|
||||
_info_hash_update(const Eina_Hash * hash EINA_UNUSED,
|
||||
const void *key EINA_UNUSED, void *data, void *fdata EINA_UNUSED)
|
||||
{
|
||||
Tiling_Info *tinfo = data;
|
||||
|
||||
if (tinfo->desk) {
|
||||
tinfo->conf = get_vdesk(tiling_g.config->vdesks,
|
||||
tinfo->desk->x, tinfo->desk->y,
|
||||
if (tinfo->desk)
|
||||
{
|
||||
tinfo->conf =
|
||||
get_vdesk(tiling_g.config->vdesks, tinfo->desk->x, tinfo->desk->y,
|
||||
tinfo->desk->zone->num);
|
||||
} else {
|
||||
} else
|
||||
{
|
||||
tinfo->conf = NULL;
|
||||
}
|
||||
|
||||
|
@ -199,21 +192,19 @@ e_tiling_update_conf(void)
|
|||
}
|
||||
|
||||
static void
|
||||
_e_client_move_resize(E_Client *ec,
|
||||
int x,
|
||||
int y,
|
||||
int w,
|
||||
int h)
|
||||
_e_client_move_resize(E_Client * ec, int x, int y, int w, int h)
|
||||
{
|
||||
Client_Extra *extra;
|
||||
|
||||
extra = eina_hash_find(_G.client_extras, &ec);
|
||||
if (!extra) {
|
||||
if (!extra)
|
||||
{
|
||||
ERR("No extra for %p", ec);
|
||||
return;
|
||||
}
|
||||
|
||||
extra->last_frame_adjustment = MAX(ec->h - ec->client.h, ec->w - ec->client.w);
|
||||
extra->last_frame_adjustment =
|
||||
MAX(ec->h - ec->client.h, ec->w - ec->client.w);
|
||||
DBG("%p -> %dx%d+%d+%d", ec, w, h, x, y);
|
||||
evas_object_geometry_set(ec->frame, x, y, w, h);
|
||||
}
|
||||
|
@ -222,10 +213,10 @@ static void
|
|||
_e_client_unmaximize(E_Client * ec, E_Maximize max)
|
||||
{
|
||||
DBG("%p -> %s", ec,
|
||||
(max & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_NONE ? "NONE" :
|
||||
(max & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_VERTICAL ? "VERTICAL" :
|
||||
(max & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_HORIZONTAL ? "HORIZONTAL" :
|
||||
"BOTH");
|
||||
(max & E_MAXIMIZE_DIRECTION) ==
|
||||
E_MAXIMIZE_NONE ? "NONE" : (max & E_MAXIMIZE_DIRECTION) ==
|
||||
E_MAXIMIZE_VERTICAL ? "VERTICAL" : (max & E_MAXIMIZE_DIRECTION) ==
|
||||
E_MAXIMIZE_HORIZONTAL ? "HORIZONTAL" : "BOTH");
|
||||
e_client_unmaximize(ec, max);
|
||||
}
|
||||
|
||||
|
@ -235,24 +226,22 @@ _restore_client(E_Client *ec)
|
|||
Client_Extra *extra;
|
||||
|
||||
extra = eina_hash_find(_G.client_extras, &ec);
|
||||
if (!extra) {
|
||||
if (!extra)
|
||||
{
|
||||
ERR("No extra for %p", ec);
|
||||
return;
|
||||
}
|
||||
_e_client_move_resize(ec,
|
||||
extra->orig.geom.x,
|
||||
extra->orig.geom.y,
|
||||
extra->orig.geom.w,
|
||||
extra->orig.geom.h);
|
||||
if (extra->orig.maximized) {
|
||||
_e_client_move_resize(ec, extra->orig.geom.x, extra->orig.geom.y,
|
||||
extra->orig.geom.w, extra->orig.geom.h);
|
||||
if (extra->orig.maximized)
|
||||
{
|
||||
e_client_maximize(ec, extra->orig.maximized);
|
||||
ec->maximized = extra->orig.maximized;
|
||||
}
|
||||
|
||||
DBG("Change window border back to %s for %p",
|
||||
extra->orig.bordername, ec);
|
||||
change_window_border(ec, (extra->orig.bordername)
|
||||
? extra->orig.bordername : "default");
|
||||
DBG("Change window border back to %s for %p", extra->orig.bordername, ec);
|
||||
change_window_border(ec,
|
||||
(extra->orig.bordername) ? extra->orig.bordername : "default");
|
||||
}
|
||||
|
||||
static Client_Extra *
|
||||
|
@ -261,35 +250,28 @@ _get_or_create_client_extra(E_Client *ec)
|
|||
Client_Extra *extra;
|
||||
|
||||
extra = eina_hash_find(_G.client_extras, &ec);
|
||||
if (!extra) {
|
||||
if (!extra)
|
||||
{
|
||||
extra = E_NEW(Client_Extra, 1);
|
||||
*extra = (Client_Extra) {
|
||||
.client = ec,
|
||||
.expected = {
|
||||
.x = ec->x,
|
||||
.y = ec->y,
|
||||
.w = ec->w,
|
||||
.h = ec->h,
|
||||
},
|
||||
.orig = {
|
||||
.geom = {
|
||||
.x = ec->x,
|
||||
.y = ec->y,
|
||||
.w = ec->w,
|
||||
.h = ec->h,
|
||||
},
|
||||
.maximized = ec->maximized,
|
||||
.bordername = eina_stringshare_add(ec->bordername),
|
||||
},
|
||||
};
|
||||
*extra = (Client_Extra)
|
||||
{
|
||||
.client = ec,.expected =
|
||||
{
|
||||
.x = ec->x,.y = ec->y,.w = ec->w,.h = ec->h,}
|
||||
,.orig =
|
||||
{
|
||||
.geom =
|
||||
{
|
||||
.x = ec->x,.y = ec->y,.w = ec->w,.h = ec->h,}
|
||||
,.maximized = ec->maximized,.bordername =
|
||||
eina_stringshare_add(ec->bordername),}
|
||||
,};
|
||||
eina_hash_direct_add(_G.client_extras, &extra->client, extra);
|
||||
} else {
|
||||
extra->expected = (geom_t) {
|
||||
.x = ec->x,
|
||||
.y = ec->y,
|
||||
.w = ec->w,
|
||||
.h = ec->h,
|
||||
};
|
||||
} else
|
||||
{
|
||||
extra->expected = (geom_t)
|
||||
{
|
||||
.x = ec->x,.y = ec->y,.w = ec->w,.h = ec->h,};
|
||||
extra->orig.geom = extra->expected;
|
||||
extra->orig.maximized = ec->maximized;
|
||||
eina_stringshare_replace(&extra->orig.bordername, ec->bordername);
|
||||
|
@ -299,24 +281,19 @@ _get_or_create_client_extra(E_Client *ec)
|
|||
}
|
||||
|
||||
void
|
||||
tiling_e_client_move_resize_extra(E_Client *ec,
|
||||
int x,
|
||||
int y,
|
||||
int w,
|
||||
int h)
|
||||
tiling_e_client_move_resize_extra(E_Client * ec, int x, int y, int w, int h)
|
||||
{
|
||||
Client_Extra *extra = eina_hash_find(_G.client_extras, &ec);
|
||||
if (!extra) {
|
||||
|
||||
if (!extra)
|
||||
{
|
||||
ERR("No extra for %p", ec);
|
||||
return;
|
||||
}
|
||||
|
||||
extra->expected = (geom_t) {
|
||||
.x = x,
|
||||
.y = y,
|
||||
.w = w,
|
||||
.h = h,
|
||||
};
|
||||
extra->expected = (geom_t)
|
||||
{
|
||||
.x = x,.y = y,.w = w,.h = h,};
|
||||
|
||||
_e_client_move_resize(ec, x, y, w, h);
|
||||
}
|
||||
|
@ -361,6 +338,7 @@ void
|
|||
_restore_free_client(void *_item)
|
||||
{
|
||||
Window_Tree *item = _item;
|
||||
|
||||
if (item->client)
|
||||
{
|
||||
_restore_client(item->client);
|
||||
|
@ -375,21 +353,25 @@ change_desk_conf(struct _Config_vdesk *newconf)
|
|||
E_Comp *c;
|
||||
E_Zone *z;
|
||||
E_Desk *d;
|
||||
int old_nb_stacks = 0,
|
||||
new_nb_stacks = newconf->nb_stacks;
|
||||
int old_nb_stacks = 0, new_nb_stacks = newconf->nb_stacks;
|
||||
|
||||
m = e_manager_current_get();
|
||||
if (!m) return;
|
||||
if (!m)
|
||||
return;
|
||||
c = m->comp;
|
||||
z = e_comp_zone_number_get(c, newconf->zone_num);
|
||||
if (!z) return;
|
||||
if (!z)
|
||||
return;
|
||||
d = e_desk_at_xy_get(z, newconf->x, newconf->y);
|
||||
if (!d) return;
|
||||
if (!d)
|
||||
return;
|
||||
|
||||
check_tinfo(d);
|
||||
if (_G.tinfo->conf) {
|
||||
if (_G.tinfo->conf)
|
||||
{
|
||||
old_nb_stacks = _G.tinfo->conf->nb_stacks;
|
||||
} else {
|
||||
} else
|
||||
{
|
||||
newconf->nb_stacks = 0;
|
||||
}
|
||||
_G.tinfo->conf = newconf;
|
||||
|
@ -398,7 +380,8 @@ change_desk_conf(struct _Config_vdesk *newconf)
|
|||
if (new_nb_stacks == old_nb_stacks)
|
||||
return;
|
||||
|
||||
if (new_nb_stacks == 0) {
|
||||
if (new_nb_stacks == 0)
|
||||
{
|
||||
tiling_window_tree_walk(_G.tinfo->tree, _restore_free_client);
|
||||
_G.tinfo->tree = NULL;
|
||||
e_place_zone_region_smart_cleanup(z);
|
||||
|
@ -413,10 +396,12 @@ static void
|
|||
_add_client(E_Client * ec)
|
||||
{
|
||||
/* Should I need to check that the client is not already added? */
|
||||
if (!ec) {
|
||||
if (!ec)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (!is_tilable(ec)) {
|
||||
if (!is_tilable(ec))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -444,27 +429,31 @@ _add_client(E_Client *ec)
|
|||
if (ec->maximized)
|
||||
_e_client_unmaximize(ec, E_MAXIMIZE_BOTH);
|
||||
|
||||
if (!tiling_g.config->show_titles &&
|
||||
(!ec->bordername || strcmp(ec->bordername, "pixel")))
|
||||
if (!tiling_g.config->show_titles && (!ec->bordername ||
|
||||
strcmp(ec->bordername, "pixel")))
|
||||
change_window_border(ec, "pixel");
|
||||
|
||||
/* Window tree updating. */
|
||||
{
|
||||
E_Client *ec_focused = e_client_focused_get();
|
||||
|
||||
/* If focused is NULL, it should return the root. */
|
||||
Window_Tree *parent = tiling_window_tree_client_find(_G.tinfo->tree,
|
||||
ec_focused);
|
||||
|
||||
if (!parent && (ec_focused != ec))
|
||||
{
|
||||
Client_Extra *extra_focused = eina_hash_find(_G.client_extras, &ec_focused);
|
||||
if (_G.tinfo->tree && extra_focused && !is_ignored_window(extra_focused))
|
||||
Client_Extra *extra_focused =
|
||||
eina_hash_find(_G.client_extras, &ec_focused);
|
||||
if (_G.tinfo->tree && extra_focused &&
|
||||
!is_ignored_window(extra_focused))
|
||||
{
|
||||
ERR("Couldn't find tree item for focused client %p. Using root..",
|
||||
e_client_focused_get());
|
||||
ERR("Couldn't find tree item for focused client %p. Using root..", e_client_focused_get());
|
||||
}
|
||||
}
|
||||
|
||||
_G.tinfo->tree = tiling_window_tree_add(_G.tinfo->tree, parent, ec, _G.split_type);
|
||||
_G.tinfo->tree =
|
||||
tiling_window_tree_add(_G.tinfo->tree, parent, ec, _G.split_type);
|
||||
}
|
||||
|
||||
_reapply_tree();
|
||||
|
@ -479,6 +468,7 @@ _remove_client(E_Client *ec)
|
|||
DBG("removing %p", ec);
|
||||
|
||||
Client_Extra *extra = eina_hash_find(_G.client_extras, &ec);
|
||||
|
||||
if (!extra)
|
||||
{
|
||||
if (is_tilable(ec))
|
||||
|
@ -497,6 +487,7 @@ _remove_client(E_Client *ec)
|
|||
{
|
||||
/* If focused is NULL, it should return the root. */
|
||||
Window_Tree *item = tiling_window_tree_client_find(_G.tinfo->tree, ec);
|
||||
|
||||
if (!item)
|
||||
{
|
||||
ERR("Couldn't find tree item for client %p!", ec);
|
||||
|
@ -517,7 +508,8 @@ toggle_floating(E_Client *ec)
|
|||
{
|
||||
Client_Extra *extra = tiling_entry_func(ec);
|
||||
|
||||
if (!extra) {
|
||||
if (!extra)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -528,8 +520,7 @@ toggle_floating(E_Client *ec)
|
|||
{
|
||||
_restore_client(ec);
|
||||
_remove_client(ec);
|
||||
}
|
||||
else
|
||||
} else
|
||||
{
|
||||
_add_client(ec);
|
||||
}
|
||||
|
@ -545,7 +536,8 @@ _e_mod_action_toggle_floating_cb(E_Object *obj EINA_UNUSED,
|
|||
static E_Client *_go_mouse_client = NULL;
|
||||
|
||||
static void
|
||||
_e_mod_action_swap_window_go_mouse(E_Object * obj EINA_UNUSED, const char *params EINA_UNUSED,
|
||||
_e_mod_action_swap_window_go_mouse(E_Object * obj EINA_UNUSED,
|
||||
const char *params EINA_UNUSED,
|
||||
E_Binding_Event_Mouse_Button * ev EINA_UNUSED)
|
||||
{
|
||||
E_Client *ec = e_client_under_pointer_get(get_current_desk(), NULL);
|
||||
|
@ -562,7 +554,8 @@ _e_mod_action_swap_window_go_mouse(E_Object * obj EINA_UNUSED, const char *param
|
|||
}
|
||||
|
||||
static void
|
||||
_e_mod_action_swap_window_end_mouse(E_Object * obj EINA_UNUSED, const char *params EINA_UNUSED,
|
||||
_e_mod_action_swap_window_end_mouse(E_Object * obj EINA_UNUSED,
|
||||
const char *params EINA_UNUSED,
|
||||
E_Binding_Event_Mouse_Button * ev EINA_UNUSED)
|
||||
{
|
||||
E_Client *ec = e_client_under_pointer_get(get_current_desk(), NULL);
|
||||
|
@ -586,6 +579,7 @@ _e_mod_action_swap_window_end_mouse(E_Object * obj EINA_UNUSED, const char *para
|
|||
return;
|
||||
|
||||
Window_Tree *item, *first_item;
|
||||
|
||||
item = tiling_window_tree_client_find(_G.tinfo->tree, ec);
|
||||
|
||||
if (!item)
|
||||
|
@ -603,7 +597,8 @@ _e_mod_action_swap_window_end_mouse(E_Object * obj EINA_UNUSED, const char *para
|
|||
}
|
||||
|
||||
static void
|
||||
_e_mod_menu_border_cb(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED)
|
||||
_e_mod_menu_border_cb(void *data, E_Menu * m EINA_UNUSED,
|
||||
E_Menu_Item * mi EINA_UNUSED)
|
||||
{
|
||||
E_Client *ec = data;
|
||||
|
||||
|
@ -630,7 +625,8 @@ _action_swap(int cross_edge)
|
|||
if (!desk_should_tile_check(desk))
|
||||
return;
|
||||
|
||||
Window_Tree *item = tiling_window_tree_client_find(_G.tinfo->tree, focused_ec);
|
||||
Window_Tree *item =
|
||||
tiling_window_tree_client_find(_G.tinfo->tree, focused_ec);
|
||||
|
||||
if (item)
|
||||
{
|
||||
|
@ -690,11 +686,13 @@ _e_mod_action_toggle_split_mode(E_Object *obj EINA_UNUSED,
|
|||
/* }}} */
|
||||
/* Hooks {{{ */
|
||||
|
||||
static void _move_or_resize(E_Client *ec)
|
||||
static void
|
||||
_move_or_resize(E_Client * ec)
|
||||
{
|
||||
Client_Extra *extra = tiling_entry_func(ec);
|
||||
|
||||
if (!extra) {
|
||||
if (!extra)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -710,12 +708,14 @@ static void _move_or_resize(E_Client *ec)
|
|||
|
||||
if (!extra->last_frame_adjustment)
|
||||
{
|
||||
printf("This is probably because of the frame adjustment bug. Return\n");
|
||||
printf
|
||||
("This is probably because of the frame adjustment bug. Return\n");
|
||||
_reapply_tree();
|
||||
return;
|
||||
}
|
||||
|
||||
Window_Tree *item = tiling_window_tree_client_find(_G.tinfo->tree, ec);
|
||||
|
||||
if (!item)
|
||||
{
|
||||
ERR("Couldn't find tree item for resized client %p!", ec);
|
||||
|
@ -725,6 +725,7 @@ static void _move_or_resize(E_Client *ec)
|
|||
{
|
||||
int w_dir = 1, h_dir = 1;
|
||||
double w_diff = 1.0, h_diff = 1.0;
|
||||
|
||||
if (abs(extra->expected.w - ec->w) >= 1)
|
||||
{
|
||||
w_diff = ((double) ec->w) / extra->expected.w;
|
||||
|
@ -752,7 +753,8 @@ static void _move_or_resize(E_Client *ec)
|
|||
}
|
||||
if ((w_diff != 1.0) || (h_diff != 1.0))
|
||||
{
|
||||
if (!tiling_window_tree_node_resize(item, w_dir, w_diff, h_dir, h_diff))
|
||||
if (!tiling_window_tree_node_resize(item, w_dir, w_diff, h_dir,
|
||||
h_diff))
|
||||
{
|
||||
/* FIXME: Do something? */
|
||||
}
|
||||
|
@ -767,7 +769,8 @@ _resize_begin_hook(void *data EINA_UNUSED, E_Client *ec)
|
|||
{
|
||||
Client_Extra *extra = tiling_entry_func(ec);
|
||||
|
||||
if (!extra) {
|
||||
if (!extra)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -775,6 +778,7 @@ _resize_begin_hook(void *data EINA_UNUSED, E_Client *ec)
|
|||
return;
|
||||
|
||||
Window_Tree *item = tiling_window_tree_client_find(_G.tinfo->tree, ec);
|
||||
|
||||
if (!item)
|
||||
{
|
||||
ERR("Couldn't find tree item for resized client %p!", ec);
|
||||
|
@ -782,6 +786,7 @@ _resize_begin_hook(void *data EINA_UNUSED, E_Client *ec)
|
|||
}
|
||||
|
||||
int edges = tiling_window_tree_edges_get(item);
|
||||
|
||||
if (edges & TILING_WINDOW_TREE_EDGE_LEFT)
|
||||
{
|
||||
switch (ec->resize_mode)
|
||||
|
@ -853,7 +858,8 @@ _resize_begin_hook(void *data EINA_UNUSED, E_Client *ec)
|
|||
}
|
||||
|
||||
static Eina_Bool
|
||||
_resize_hook(void *data EINA_UNUSED, int type EINA_UNUSED, E_Event_Client *event)
|
||||
_resize_hook(void *data EINA_UNUSED, int type EINA_UNUSED,
|
||||
E_Event_Client * event)
|
||||
{
|
||||
E_Client *ec = event->ec;
|
||||
|
||||
|
@ -868,7 +874,8 @@ _move_hook(void *data EINA_UNUSED, int type EINA_UNUSED, E_Event_Client*event)
|
|||
E_Client *ec = event->ec;
|
||||
Client_Extra *extra = tiling_entry_func(ec);
|
||||
|
||||
if (!extra) {
|
||||
if (!extra)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -887,16 +894,7 @@ _add_hook(void *data EINA_UNUSED, int type EINA_UNUSED, E_Event_Client *event)
|
|||
{
|
||||
E_Client *ec = event->ec;
|
||||
|
||||
DBG("Add: %p / '%s' / '%s', (%d,%d), changes(size=%d, position=%d, client=%d)"
|
||||
" g:%dx%d+%d+%d ecname:'%s' maximized:%s fs:%s",
|
||||
ec, ec->icccm.title, ec->netwm.name,
|
||||
ec->desk->x, ec->desk->y,
|
||||
ec->changes.size, ec->changes.pos, ec->changes.border,
|
||||
ec->w, ec->h, ec->x, ec->y, ec->bordername,
|
||||
(ec->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_NONE ? "NONE" :
|
||||
(ec->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_VERTICAL ? "VERTICAL" :
|
||||
(ec->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_HORIZONTAL ? "HORIZONTAL" :
|
||||
"BOTH", ec->fullscreen? "true": "false");
|
||||
DBG("Add: %p / '%s' / '%s', (%d,%d), changes(size=%d, position=%d, client=%d)" " g:%dx%d+%d+%d ecname:'%s' maximized:%s fs:%s", ec, ec->icccm.title, ec->netwm.name, ec->desk->x, ec->desk->y, ec->changes.size, ec->changes.pos, ec->changes.border, ec->w, ec->h, ec->x, ec->y, ec->bordername, (ec->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_NONE ? "NONE" : (ec->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_VERTICAL ? "VERTICAL" : (ec->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_HORIZONTAL ? "HORIZONTAL" : "BOTH", ec->fullscreen ? "true" : "false");
|
||||
|
||||
_add_client(ec);
|
||||
|
||||
|
@ -904,11 +902,13 @@ _add_hook(void *data EINA_UNUSED, int type EINA_UNUSED, E_Event_Client *event)
|
|||
}
|
||||
|
||||
static Eina_Bool
|
||||
_remove_hook(void *data EINA_UNUSED, int type EINA_UNUSED, E_Event_Client *event)
|
||||
_remove_hook(void *data EINA_UNUSED, int type EINA_UNUSED,
|
||||
E_Event_Client * event)
|
||||
{
|
||||
E_Client *ec = event->ec;
|
||||
|
||||
if (e_client_util_ignored_get(ec)) return ECORE_CALLBACK_RENEW;
|
||||
if (e_client_util_ignored_get(ec))
|
||||
return ECORE_CALLBACK_RENEW;
|
||||
|
||||
if (_G.currently_switching_desktop)
|
||||
return true;
|
||||
|
@ -924,7 +924,8 @@ _remove_hook(void *data EINA_UNUSED, int type EINA_UNUSED, E_Event_Client *event
|
|||
}
|
||||
|
||||
static bool
|
||||
_iconify_hook(void *data EINA_UNUSED, int type EINA_UNUSED, E_Event_Client *event)
|
||||
_iconify_hook(void *data EINA_UNUSED, int type EINA_UNUSED,
|
||||
E_Event_Client * event)
|
||||
{
|
||||
E_Client *ec = event->ec;
|
||||
|
||||
|
@ -939,7 +940,8 @@ _iconify_hook(void *data EINA_UNUSED, int type EINA_UNUSED, E_Event_Client *even
|
|||
}
|
||||
|
||||
static bool
|
||||
_uniconify_hook(void *data EINA_UNUSED, int type EINA_UNUSED, E_Event_Client *event)
|
||||
_uniconify_hook(void *data EINA_UNUSED, int type EINA_UNUSED,
|
||||
E_Event_Client * event)
|
||||
{
|
||||
E_Client *ec = event->ec;
|
||||
|
||||
|
@ -956,7 +958,8 @@ toggle_sticky(E_Client *ec)
|
|||
{
|
||||
Client_Extra *extra = tiling_entry_func(ec);
|
||||
|
||||
if (!extra) {
|
||||
if (!extra)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -965,29 +968,31 @@ toggle_sticky(E_Client *ec)
|
|||
{
|
||||
_restore_client(ec);
|
||||
_remove_client(ec);
|
||||
}
|
||||
else
|
||||
} else
|
||||
{
|
||||
_add_client(ec);
|
||||
}
|
||||
}
|
||||
|
||||
static Eina_Bool
|
||||
_stick_hook(void *data EINA_UNUSED, int type EINA_UNUSED, E_Event_Client *event)
|
||||
_stick_hook(void *data EINA_UNUSED, int type EINA_UNUSED,
|
||||
E_Event_Client * event)
|
||||
{
|
||||
toggle_sticky(event->ec);
|
||||
return true;
|
||||
}
|
||||
|
||||
static Eina_Bool
|
||||
_unstick_hook(void *data EINA_UNUSED, int type EINA_UNUSED, E_Event_Client *event)
|
||||
_unstick_hook(void *data EINA_UNUSED, int type EINA_UNUSED,
|
||||
E_Event_Client * event)
|
||||
{
|
||||
toggle_sticky(event->ec);
|
||||
return true;
|
||||
}
|
||||
|
||||
static Eina_Bool
|
||||
_desk_show_hook(void *data EINA_UNUSED, int type EINA_UNUSED, void *event EINA_UNUSED)
|
||||
_desk_show_hook(void *data EINA_UNUSED, int type EINA_UNUSED,
|
||||
void *event EINA_UNUSED)
|
||||
{
|
||||
_G.currently_switching_desktop = 0;
|
||||
|
||||
|
@ -995,7 +1000,8 @@ _desk_show_hook(void *data EINA_UNUSED, int type EINA_UNUSED, void *event EINA_U
|
|||
}
|
||||
|
||||
static Eina_Bool
|
||||
_desk_before_show_hook(void *data EINA_UNUSED, int type EINA_UNUSED, void *event EINA_UNUSED)
|
||||
_desk_before_show_hook(void *data EINA_UNUSED, int type EINA_UNUSED,
|
||||
void *event EINA_UNUSED)
|
||||
{
|
||||
_G.currently_switching_desktop = 1;
|
||||
|
||||
|
@ -1003,15 +1009,16 @@ _desk_before_show_hook(void *data EINA_UNUSED, int type EINA_UNUSED, void *event
|
|||
}
|
||||
|
||||
static bool
|
||||
_desk_set_hook(void *data EINA_UNUSED, int type EINA_UNUSED, E_Event_Client_Desk_Set *ev)
|
||||
_desk_set_hook(void *data EINA_UNUSED, int type EINA_UNUSED,
|
||||
E_Event_Client_Desk_Set * ev)
|
||||
{
|
||||
DBG("%p: from (%d,%d) to (%d,%d)", ev->ec,
|
||||
ev->desk->x, ev->desk->y,
|
||||
DBG("%p: from (%d,%d) to (%d,%d)", ev->ec, ev->desk->x, ev->desk->y,
|
||||
ev->ec->desk->x, ev->ec->desk->y);
|
||||
|
||||
if (desk_should_tile_check(ev->desk))
|
||||
{
|
||||
if (tiling_window_tree_client_find(_G.tinfo->tree, ev->ec)) {
|
||||
if (tiling_window_tree_client_find(_G.tinfo->tree, ev->ec))
|
||||
{
|
||||
_restore_client(ev->ec);
|
||||
_remove_client(ev->ec);
|
||||
}
|
||||
|
@ -1036,7 +1043,8 @@ _compositor_resize_hook_desk_reapply(E_Desk *desk)
|
|||
}
|
||||
|
||||
static bool
|
||||
_compositor_resize_hook(void *data EINA_UNUSED, int type EINA_UNUSED, E_Event_Compositor_Resize *ev EINA_UNUSED)
|
||||
_compositor_resize_hook(void *data EINA_UNUSED, int type EINA_UNUSED,
|
||||
E_Event_Compositor_Resize * ev EINA_UNUSED)
|
||||
{
|
||||
_foreach_desk(_compositor_resize_hook_desk_reapply);
|
||||
|
||||
|
@ -1049,21 +1057,27 @@ _bd_hook(void *d EINA_UNUSED, E_Client *ec)
|
|||
E_Menu_Item *mi;
|
||||
E_Menu *m;
|
||||
Eina_List *l;
|
||||
if (!ec->border_menu) return;
|
||||
|
||||
if (!ec->border_menu)
|
||||
return;
|
||||
m = ec->border_menu;
|
||||
|
||||
Client_Extra *extra = eina_hash_find(_G.client_extras, &ec);
|
||||
if (!extra) {
|
||||
|
||||
if (!extra)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
/* position menu item just before the last separator */
|
||||
EINA_LIST_REVERSE_FOREACH(m->items, l, mi)
|
||||
if (mi->separator) break;
|
||||
if ((!mi) || (!mi->separator)) return;
|
||||
EINA_LIST_REVERSE_FOREACH(m->items, l, mi) if (mi->separator)
|
||||
break;
|
||||
if ((!mi) || (!mi->separator))
|
||||
return;
|
||||
l = eina_list_prev(l);
|
||||
mi = eina_list_data_get(l);
|
||||
if (!mi) return;
|
||||
if (!mi)
|
||||
return;
|
||||
|
||||
mi = e_menu_item_new_relative(m, mi);
|
||||
e_menu_item_label_set(mi, _("Floating"));
|
||||
|
@ -1095,8 +1109,7 @@ _clear_border_extras(void *data)
|
|||
E_FREE(extra);
|
||||
}
|
||||
|
||||
EAPI E_Module_Api e_modapi =
|
||||
{
|
||||
EAPI E_Module_Api e_modapi = {
|
||||
E_MODULE_API_VERSION,
|
||||
"Tiling"
|
||||
};
|
||||
|
@ -1109,9 +1122,11 @@ e_modapi_init(E_Module *m)
|
|||
|
||||
tiling_g.module = m;
|
||||
|
||||
if (tiling_g.log_domain < 0) {
|
||||
if (tiling_g.log_domain < 0)
|
||||
{
|
||||
tiling_g.log_domain = eina_log_domain_register("tiling", NULL);
|
||||
if (tiling_g.log_domain < 0) {
|
||||
if (tiling_g.log_domain < 0)
|
||||
{
|
||||
EINA_LOG_CRIT("could not register log domain 'tiling'");
|
||||
}
|
||||
}
|
||||
|
@ -1136,9 +1151,11 @@ e_modapi_init(E_Module *m)
|
|||
HANDLER(_G.handler_client_unstick, CLIENT_UNSTICK, _unstick_hook);
|
||||
|
||||
HANDLER(_G.handler_desk_show, DESK_SHOW, _desk_show_hook);
|
||||
HANDLER(_G.handler_desk_before_show, DESK_BEFORE_SHOW, _desk_before_show_hook);
|
||||
HANDLER(_G.handler_desk_before_show, DESK_BEFORE_SHOW,
|
||||
_desk_before_show_hook);
|
||||
HANDLER(_G.handler_desk_set, CLIENT_DESK_SET, _desk_set_hook);
|
||||
HANDLER(_G.handler_compositor_resize, COMPOSITOR_RESIZE, _compositor_resize_hook);
|
||||
HANDLER(_G.handler_compositor_resize, COMPOSITOR_RESIZE,
|
||||
_compositor_resize_hook);
|
||||
#undef HANDLER
|
||||
|
||||
#define ACTION_ADD(_action, _cb, _title, _value, _params, _example, _editable) \
|
||||
|
@ -1153,29 +1170,22 @@ e_modapi_init(E_Module *m)
|
|||
|
||||
/* Module's actions */
|
||||
ACTION_ADD(_G.act_togglefloat, _e_mod_action_toggle_floating_cb,
|
||||
N_("Toggle floating"), "toggle_floating",
|
||||
NULL, NULL, 0);
|
||||
N_("Toggle floating"), "toggle_floating", NULL, NULL, 0);
|
||||
|
||||
ACTION_ADD(_G.act_move_up, _e_mod_action_move_up_cb,
|
||||
N_("Move the focused window up"), "move_up",
|
||||
NULL, NULL, 0);
|
||||
N_("Move the focused window up"), "move_up", NULL, NULL, 0);
|
||||
ACTION_ADD(_G.act_move_down, _e_mod_action_move_down_cb,
|
||||
N_("Move the focused window down"), "move_down",
|
||||
NULL, NULL, 0);
|
||||
N_("Move the focused window down"), "move_down", NULL, NULL, 0);
|
||||
ACTION_ADD(_G.act_move_left, _e_mod_action_move_left_cb,
|
||||
N_("Move the focused window left"), "move_left",
|
||||
NULL, NULL, 0);
|
||||
N_("Move the focused window left"), "move_left", NULL, NULL, 0);
|
||||
ACTION_ADD(_G.act_move_right, _e_mod_action_move_right_cb,
|
||||
N_("Move the focused window right"), "move_right",
|
||||
NULL, NULL, 0);
|
||||
N_("Move the focused window right"), "move_right", NULL, NULL, 0);
|
||||
|
||||
ACTION_ADD(_G.act_toggle_split_mode, _e_mod_action_toggle_split_mode,
|
||||
N_("Toggle split mode"), "toggle_split_mode",
|
||||
NULL, NULL, 0);
|
||||
N_("Toggle split mode"), "toggle_split_mode", NULL, NULL, 0);
|
||||
|
||||
ACTION_ADD(_G.act_swap_window, NULL,
|
||||
N_("Swap window"), "swap_window",
|
||||
NULL, NULL, 0);
|
||||
ACTION_ADD(_G.act_swap_window, NULL, N_("Swap window"), "swap_window", NULL,
|
||||
NULL, 0);
|
||||
_G.act_swap_window->func.go_mouse = _e_mod_action_swap_window_go_mouse;
|
||||
_G.act_swap_window->func.end_mouse = _e_mod_action_swap_window_end_mouse;
|
||||
|
||||
|
@ -1186,14 +1196,13 @@ e_modapi_init(E_Module *m)
|
|||
e_module_dir_get(m));
|
||||
e_configure_registry_category_add("windows", 50, _("Windows"), NULL,
|
||||
"preferences-system-windows");
|
||||
e_configure_registry_item_add("windows/tiling", 150, _("Tiling"),
|
||||
NULL, _G.edj_path,
|
||||
e_int_config_tiling_module);
|
||||
e_configure_registry_item_add("windows/tiling", 150, _("Tiling"), NULL,
|
||||
_G.edj_path, e_int_config_tiling_module);
|
||||
|
||||
/* Configuration itself */
|
||||
_G.config_edd = E_CONFIG_DD_NEW("Tiling_Config", Config);
|
||||
_G.vdesk_edd = E_CONFIG_DD_NEW("Tiling_Config_VDesk",
|
||||
struct _Config_vdesk);
|
||||
_G.vdesk_edd = E_CONFIG_DD_NEW("Tiling_Config_VDesk", struct _Config_vdesk);
|
||||
|
||||
E_CONFIG_VAL(_G.config_edd, Config, tile_dialogs, INT);
|
||||
E_CONFIG_VAL(_G.config_edd, Config, show_titles, INT);
|
||||
|
||||
|
@ -1204,7 +1213,8 @@ e_modapi_init(E_Module *m)
|
|||
E_CONFIG_VAL(_G.vdesk_edd, struct _Config_vdesk, nb_stacks, INT);
|
||||
|
||||
tiling_g.config = e_config_domain_load("module.tiling", _G.config_edd);
|
||||
if (!tiling_g.config) {
|
||||
if (!tiling_g.config)
|
||||
{
|
||||
tiling_g.config = E_NEW(Config, 1);
|
||||
tiling_g.config->tile_dialogs = 1;
|
||||
tiling_g.config->show_titles = 1;
|
||||
|
@ -1213,7 +1223,8 @@ e_modapi_init(E_Module *m)
|
|||
E_CONFIG_LIMIT(tiling_g.config->tile_dialogs, 0, 1);
|
||||
E_CONFIG_LIMIT(tiling_g.config->show_titles, 0, 1);
|
||||
|
||||
for (l = tiling_g.config->vdesks; l; l = l->next) {
|
||||
for (l = tiling_g.config->vdesks; l; l = l->next)
|
||||
{
|
||||
struct _Config_vdesk *vd;
|
||||
|
||||
vd = l->data;
|
||||
|
@ -1231,6 +1242,7 @@ e_modapi_init(E_Module *m)
|
|||
/* Add all the existing windows. */
|
||||
{
|
||||
E_Client *ec;
|
||||
|
||||
E_CLIENT_FOREACH(e_comp_get(NULL), ec)
|
||||
{
|
||||
_add_client(ec);
|
||||
|
@ -1260,8 +1272,10 @@ _disable_all_tiling(void)
|
|||
|
||||
_foreach_desk(_disable_desk);
|
||||
|
||||
EINA_LIST_FOREACH(e_comp_list(), l, comp) {
|
||||
EINA_LIST_FOREACH(comp->zones, ll, zone) {
|
||||
EINA_LIST_FOREACH(e_comp_list(), l, comp)
|
||||
{
|
||||
EINA_LIST_FOREACH(comp->zones, ll, zone)
|
||||
{
|
||||
e_place_zone_region_smart_cleanup(zone);
|
||||
}
|
||||
}
|
||||
|
@ -1276,10 +1290,14 @@ _foreach_desk(void (*func)(E_Desk *desk))
|
|||
E_Desk *desk;
|
||||
int x, y;
|
||||
|
||||
EINA_LIST_FOREACH(e_comp_list(), l, comp) {
|
||||
EINA_LIST_FOREACH(comp->zones, ll, zone) {
|
||||
for (x = 0; x < zone->desk_x_count; x++) {
|
||||
for (y = 0; y < zone->desk_y_count; y++) {
|
||||
EINA_LIST_FOREACH(e_comp_list(), l, comp)
|
||||
{
|
||||
EINA_LIST_FOREACH(comp->zones, ll, zone)
|
||||
{
|
||||
for (x = 0; x < zone->desk_x_count; x++)
|
||||
{
|
||||
for (y = 0; y < zone->desk_y_count; y++)
|
||||
{
|
||||
desk = zone->desks[x + (y * zone->desk_x_count)];
|
||||
|
||||
func(desk);
|
||||
|
@ -1296,11 +1314,11 @@ e_modapi_shutdown(E_Module *m EINA_UNUSED)
|
|||
|
||||
e_int_client_menu_hook_del(_G.client_menu_hook);
|
||||
|
||||
if (tiling_g.log_domain >= 0) {
|
||||
if (tiling_g.log_domain >= 0)
|
||||
{
|
||||
eina_log_domain_unregister(tiling_g.log_domain);
|
||||
tiling_g.log_domain = -1;
|
||||
}
|
||||
|
||||
#define FREE_HANDLER(x) \
|
||||
if (x) { \
|
||||
ecore_event_handler_del(x); \
|
||||
|
@ -1321,7 +1339,6 @@ e_modapi_shutdown(E_Module *m EINA_UNUSED)
|
|||
FREE_HANDLER(_G.handler_desk_set);
|
||||
#undef FREE_HANDLER
|
||||
|
||||
|
||||
#define ACTION_DEL(act, title, value) \
|
||||
if (act) { \
|
||||
e_action_predef_name_del("Tiling", title); \
|
||||
|
@ -1336,8 +1353,7 @@ e_modapi_shutdown(E_Module *m EINA_UNUSED)
|
|||
|
||||
ACTION_DEL(_G.act_toggle_split_mode, "Toggle split mode",
|
||||
"toggle_split_mode");
|
||||
ACTION_DEL(_G.act_swap_window, "Swap window",
|
||||
"swap_window");
|
||||
ACTION_DEL(_G.act_swap_window, "Swap window", "swap_window");
|
||||
#undef ACTION_DEL
|
||||
|
||||
e_configure_registry_item_del("windows/tiling");
|
||||
|
@ -1367,4 +1383,5 @@ e_modapi_save(E_Module *m EINA_UNUSED)
|
|||
|
||||
return true;
|
||||
}
|
||||
|
||||
/* }}} */
|
||||
|
|
|
@ -43,9 +43,9 @@ struct _Config
|
|||
|
||||
struct _Tiling_Info
|
||||
{
|
||||
/* The desk for which this _Tiling_Info is used. Needed because
|
||||
* (for example) on e restart all desks are shown on all zones but no
|
||||
* change events are triggered */
|
||||
/* The desk for which this _Tiling_Info is used. Needed because (for
|
||||
* example) on e restart all desks are shown on all zones but no change
|
||||
* events are triggered */
|
||||
const E_Desk *desk;
|
||||
|
||||
struct _Config_vdesk *conf;
|
||||
|
@ -62,8 +62,7 @@ struct _E_Config_Dialog_Data
|
|||
Evas *evas;
|
||||
};
|
||||
|
||||
E_Config_Dialog *e_int_config_tiling_module(E_Comp *comp,
|
||||
const char *params);
|
||||
E_Config_Dialog *e_int_config_tiling_module(E_Comp * comp, const char *params);
|
||||
|
||||
EAPI extern E_Module_Api e_modapi;
|
||||
|
||||
|
@ -75,16 +74,10 @@ void change_desk_conf(struct _Config_vdesk *newconf);
|
|||
|
||||
void e_tiling_update_conf(void);
|
||||
|
||||
struct _Config_vdesk *
|
||||
get_vdesk(Eina_List *vdesks,
|
||||
int x,
|
||||
int y,
|
||||
struct _Config_vdesk *get_vdesk(Eina_List * vdesks, int x, int y,
|
||||
unsigned int zone_num);
|
||||
|
||||
void tiling_e_client_move_resize_extra(E_Client *ec,
|
||||
int x,
|
||||
int y,
|
||||
int w,
|
||||
void tiling_e_client_move_resize_extra(E_Client * ec, int x, int y, int w,
|
||||
int h);
|
||||
# define EINA_LIST_IS_IN(_list, _el) \
|
||||
(eina_list_data_find(_list, _el) == _el)
|
||||
|
|
|
@ -8,6 +8,7 @@ tiling_window_tree_walk(Window_Tree *root, void (*func)(void *))
|
|||
{
|
||||
Eina_Inlist *itr_safe;
|
||||
Window_Tree *itr;
|
||||
|
||||
if (!root)
|
||||
return;
|
||||
|
||||
|
@ -29,6 +30,7 @@ _tiling_window_tree_split_add(Window_Tree *parent, Window_Tree *new_node)
|
|||
{
|
||||
/* Make a new node for the parent client and split the weights in half. */
|
||||
Window_Tree *new_parent_client = calloc(1, sizeof(*new_node));
|
||||
|
||||
new_node->parent = parent;
|
||||
new_parent_client->parent = parent;
|
||||
new_parent_client->client = parent->client;
|
||||
|
@ -36,10 +38,10 @@ _tiling_window_tree_split_add(Window_Tree *parent, Window_Tree *new_node)
|
|||
new_parent_client->weight = 0.5;
|
||||
new_node->weight = 0.5;
|
||||
|
||||
parent->children = eina_inlist_append(parent->children,
|
||||
EINA_INLIST_GET(new_parent_client));
|
||||
parent->children = eina_inlist_append(parent->children,
|
||||
EINA_INLIST_GET(new_node));
|
||||
parent->children =
|
||||
eina_inlist_append(parent->children, EINA_INLIST_GET(new_parent_client));
|
||||
parent->children =
|
||||
eina_inlist_append(parent->children, EINA_INLIST_GET(new_node));
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -59,14 +61,15 @@ _tiling_window_tree_parent_add(Window_Tree *parent, Window_Tree *new_node)
|
|||
itr->weight *= weight;
|
||||
}
|
||||
|
||||
parent->children = eina_inlist_append(parent->children,
|
||||
EINA_INLIST_GET(new_node));
|
||||
parent->children =
|
||||
eina_inlist_append(parent->children, EINA_INLIST_GET(new_node));
|
||||
}
|
||||
|
||||
static int
|
||||
_tiling_window_tree_split_type_get(Window_Tree * node)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
while (node->parent)
|
||||
{
|
||||
ret++;
|
||||
|
@ -77,22 +80,22 @@ _tiling_window_tree_split_type_get(Window_Tree *node)
|
|||
}
|
||||
|
||||
Window_Tree *
|
||||
tiling_window_tree_add(Window_Tree *root, Window_Tree *parent, E_Client *client, Tiling_Split_Type split_type)
|
||||
tiling_window_tree_add(Window_Tree * root, Window_Tree * parent,
|
||||
E_Client * client, Tiling_Split_Type split_type)
|
||||
{
|
||||
Window_Tree *new_node = calloc(1, sizeof(*new_node));
|
||||
|
||||
new_node->client = client;
|
||||
Tiling_Split_Type parent_split_type;
|
||||
|
||||
if (split_type > TILING_SPLIT_VERTICAL)
|
||||
{
|
||||
return root;
|
||||
}
|
||||
else if (!root)
|
||||
} else if (!root)
|
||||
{
|
||||
new_node->weight = 1.0;
|
||||
return new_node;
|
||||
}
|
||||
else if (!parent)
|
||||
} else if (!parent)
|
||||
{
|
||||
parent = root;
|
||||
parent_split_type = _tiling_window_tree_split_type_get(parent);
|
||||
|
@ -109,26 +112,24 @@ tiling_window_tree_add(Window_Tree *root, Window_Tree *parent, E_Client *client,
|
|||
if (parent->children)
|
||||
{
|
||||
_tiling_window_tree_parent_add(parent, new_node);
|
||||
}
|
||||
else
|
||||
} else
|
||||
{
|
||||
_tiling_window_tree_split_add(parent, new_node);
|
||||
}
|
||||
}
|
||||
else
|
||||
} else
|
||||
{
|
||||
Window_Tree *grand_parent = parent->parent;
|
||||
|
||||
if (grand_parent && grand_parent->children)
|
||||
{
|
||||
_tiling_window_tree_parent_add(grand_parent, new_node);
|
||||
}
|
||||
else
|
||||
} else
|
||||
{
|
||||
root = calloc(1, sizeof(*root));
|
||||
_tiling_window_tree_split_add(parent, new_node);
|
||||
root->weight = 1.0;
|
||||
root->children = eina_inlist_append(root->children,
|
||||
EINA_INLIST_GET(parent));
|
||||
root->children =
|
||||
eina_inlist_append(root->children, EINA_INLIST_GET(parent));
|
||||
parent->parent = root;
|
||||
}
|
||||
}
|
||||
|
@ -143,14 +144,12 @@ tiling_window_tree_remove(Window_Tree *root, Window_Tree *item)
|
|||
{
|
||||
free(item);
|
||||
return NULL;
|
||||
}
|
||||
else if (!item->client)
|
||||
} else if (!item->client)
|
||||
{
|
||||
ERR("Tried deleting node %p that doesn't have a client.", item);
|
||||
return root;
|
||||
}
|
||||
|
||||
|
||||
Window_Tree *parent = item->parent;
|
||||
int children_count = eina_inlist_count(item->parent->children);
|
||||
|
||||
|
@ -158,6 +157,7 @@ tiling_window_tree_remove(Window_Tree *root, Window_Tree *item)
|
|||
{
|
||||
Window_Tree *grand_parent = parent->parent;
|
||||
Window_Tree *item_keep = NULL;
|
||||
|
||||
/* Adjust existing children's weights */
|
||||
EINA_INLIST_FOREACH(parent->children, item_keep)
|
||||
{
|
||||
|
@ -171,15 +171,13 @@ tiling_window_tree_remove(Window_Tree *root, Window_Tree *item)
|
|||
free(item);
|
||||
free(root);
|
||||
return NULL;
|
||||
}
|
||||
else if (!item_keep->children)
|
||||
} else if (!item_keep->children)
|
||||
{
|
||||
parent->client = item_keep->client;
|
||||
parent->children = NULL;
|
||||
|
||||
free(item_keep);
|
||||
}
|
||||
else
|
||||
} else
|
||||
{
|
||||
if (grand_parent)
|
||||
{
|
||||
|
@ -188,7 +186,8 @@ tiling_window_tree_remove(Window_Tree *root, Window_Tree *item)
|
|||
Eina_Inlist *itr_safe;
|
||||
Window_Tree *itr;
|
||||
|
||||
EINA_INLIST_FOREACH_SAFE(item_keep->children, itr_safe, itr)
|
||||
EINA_INLIST_FOREACH_SAFE(item_keep->children, itr_safe,
|
||||
itr)
|
||||
{
|
||||
/* We are prepending to double-reverse the order. */
|
||||
grand_parent->children =
|
||||
|
@ -198,28 +197,28 @@ tiling_window_tree_remove(Window_Tree *root, Window_Tree *item)
|
|||
itr->parent = grand_parent;
|
||||
}
|
||||
|
||||
grand_parent->children = eina_inlist_remove(grand_parent->children,
|
||||
grand_parent->children =
|
||||
eina_inlist_remove(grand_parent->children,
|
||||
EINA_INLIST_GET(parent));
|
||||
free(parent);
|
||||
}
|
||||
}
|
||||
else
|
||||
} else
|
||||
{
|
||||
/* This is fine, as this is a child of the root so we allow two
|
||||
* levels. */
|
||||
/* This is fine, as this is a child of the root so we allow
|
||||
* two levels. */
|
||||
item_keep->weight = 1.0;
|
||||
}
|
||||
|
||||
parent->children = eina_inlist_remove(parent->children, EINA_INLIST_GET(item));
|
||||
parent->children =
|
||||
eina_inlist_remove(parent->children, EINA_INLIST_GET(item));
|
||||
}
|
||||
}
|
||||
else
|
||||
} else
|
||||
{
|
||||
Window_Tree *itr;
|
||||
float weight = 1.0 - item->weight;
|
||||
|
||||
parent->children = eina_inlist_remove(parent->children,
|
||||
EINA_INLIST_GET(item));
|
||||
parent->children =
|
||||
eina_inlist_remove(parent->children, EINA_INLIST_GET(item));
|
||||
|
||||
/* Adjust existing children's weights */
|
||||
EINA_INLIST_FOREACH(parent->children, itr)
|
||||
|
@ -246,6 +245,7 @@ tiling_window_tree_client_find(Window_Tree *root, E_Client *client)
|
|||
EINA_INLIST_FOREACH(root->children, itr)
|
||||
{
|
||||
Window_Tree *ret;
|
||||
|
||||
ret = tiling_window_tree_client_find(itr, client);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
@ -273,16 +273,17 @@ _tiling_window_tree_level_apply(Window_Tree *root, Evas_Coord x, Evas_Coord y,
|
|||
EINA_INLIST_FOREACH(root->children, itr)
|
||||
{
|
||||
Evas_Coord itw = w * itr->weight;
|
||||
|
||||
total_weight += itr->weight;
|
||||
_tiling_window_tree_level_apply(itr, x, y, itw, h, level + 1);
|
||||
x += itw;
|
||||
}
|
||||
}
|
||||
else if (split_type == TILING_SPLIT_VERTICAL)
|
||||
} else if (split_type == TILING_SPLIT_VERTICAL)
|
||||
{
|
||||
EINA_INLIST_FOREACH(root->children, itr)
|
||||
{
|
||||
Evas_Coord ith = h * itr->weight;
|
||||
|
||||
total_weight += itr->weight;
|
||||
_tiling_window_tree_level_apply(itr, x, y, w, ith, level + 1);
|
||||
y += ith;
|
||||
|
@ -313,8 +314,8 @@ _inlist_prev(Window_Tree *it)
|
|||
}
|
||||
|
||||
static Eina_Bool
|
||||
_tiling_window_tree_node_resize_direction(Window_Tree *node, Window_Tree *parent,
|
||||
double dir_diff, int dir)
|
||||
_tiling_window_tree_node_resize_direction(Window_Tree * node,
|
||||
Window_Tree * parent, double dir_diff, int dir)
|
||||
{
|
||||
double weight = 0.0;
|
||||
double weight_diff;
|
||||
|
@ -326,14 +327,12 @@ _tiling_window_tree_node_resize_direction(Window_Tree *node, Window_Tree *parent
|
|||
{
|
||||
itr_func = _inlist_prev;
|
||||
children_start = (Window_Tree *) parent->children->last;
|
||||
}
|
||||
else
|
||||
} else
|
||||
{
|
||||
itr_func = _inlist_next;
|
||||
children_start = (Window_Tree *) parent->children;
|
||||
}
|
||||
|
||||
|
||||
itr = (Window_Tree *) children_start;
|
||||
while (itr != node)
|
||||
{
|
||||
|
@ -348,8 +347,7 @@ _tiling_window_tree_node_resize_direction(Window_Tree *node, Window_Tree *parent
|
|||
if (parent->parent && parent->parent->parent)
|
||||
{
|
||||
return _tiling_window_tree_node_resize_direction(parent->parent,
|
||||
parent->parent->parent,
|
||||
1.0 + ((dir_diff - 1.) * node->weight),
|
||||
parent->parent->parent, 1.0 + ((dir_diff - 1.) * node->weight),
|
||||
dir);
|
||||
}
|
||||
return EINA_FALSE;
|
||||
|
@ -369,7 +367,8 @@ _tiling_window_tree_node_resize_direction(Window_Tree *node, Window_Tree *parent
|
|||
}
|
||||
|
||||
Eina_Bool
|
||||
tiling_window_tree_node_resize(Window_Tree *node, int w_dir, double w_diff, int h_dir, double h_diff)
|
||||
tiling_window_tree_node_resize(Window_Tree * node, int w_dir, double w_diff,
|
||||
int h_dir, double h_diff)
|
||||
{
|
||||
Window_Tree *parent = node->parent;
|
||||
Window_Tree *w_parent, *h_parent;
|
||||
|
@ -380,15 +379,15 @@ tiling_window_tree_node_resize(Window_Tree *node, int w_dir, double w_diff, int
|
|||
return EINA_FALSE;
|
||||
|
||||
Window_Tree *grand_parent = parent->parent;
|
||||
Tiling_Split_Type parent_split_type = _tiling_window_tree_split_type_get(parent);
|
||||
Tiling_Split_Type parent_split_type =
|
||||
_tiling_window_tree_split_type_get(parent);
|
||||
|
||||
/* w_diff related changes. */
|
||||
if (parent_split_type == TILING_SPLIT_HORIZONTAL)
|
||||
{
|
||||
w_parent = parent;
|
||||
h_parent = grand_parent;
|
||||
}
|
||||
else
|
||||
} else
|
||||
{
|
||||
w_parent = grand_parent;
|
||||
h_parent = parent;
|
||||
|
@ -397,56 +396,66 @@ tiling_window_tree_node_resize(Window_Tree *node, int w_dir, double w_diff, int
|
|||
if ((h_diff != 1.0) && h_parent)
|
||||
{
|
||||
Window_Tree *tmp_node = (h_parent == parent) ? node : parent;
|
||||
ret = ret || _tiling_window_tree_node_resize_direction(tmp_node, h_parent, h_diff, h_dir);
|
||||
|
||||
ret = ret ||
|
||||
_tiling_window_tree_node_resize_direction(tmp_node, h_parent,
|
||||
h_diff, h_dir);
|
||||
}
|
||||
|
||||
if ((w_diff != 1.0) && w_parent)
|
||||
{
|
||||
Window_Tree *tmp_node = (w_parent == parent) ? node : parent;
|
||||
ret = ret || _tiling_window_tree_node_resize_direction(tmp_node, w_parent, w_diff, w_dir);
|
||||
|
||||
ret = ret ||
|
||||
_tiling_window_tree_node_resize_direction(tmp_node, w_parent,
|
||||
w_diff, w_dir);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
_tiling_window_tree_edges_get_helper(Window_Tree *node, Tiling_Split_Type split_type, Eina_Bool gave_up_this,
|
||||
_tiling_window_tree_edges_get_helper(Window_Tree * node,
|
||||
Tiling_Split_Type split_type, Eina_Bool gave_up_this,
|
||||
Eina_Bool gave_up_parent)
|
||||
{
|
||||
int ret = TILING_WINDOW_TREE_EDGE_LEFT | TILING_WINDOW_TREE_EDGE_RIGHT |
|
||||
int ret =
|
||||
TILING_WINDOW_TREE_EDGE_LEFT | TILING_WINDOW_TREE_EDGE_RIGHT |
|
||||
TILING_WINDOW_TREE_EDGE_TOP | TILING_WINDOW_TREE_EDGE_BOTTOM;
|
||||
if (!node->parent)
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
else if (gave_up_this && gave_up_parent)
|
||||
} else if (gave_up_this && gave_up_parent)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
else if (gave_up_this)
|
||||
} else if (gave_up_this)
|
||||
{
|
||||
/* Mixed the gave_up vals on purpose, we do it on every call. */
|
||||
return _tiling_window_tree_edges_get_helper(node->parent, !split_type ,gave_up_parent,
|
||||
gave_up_this);
|
||||
return _tiling_window_tree_edges_get_helper(node->parent, !split_type,
|
||||
gave_up_parent, gave_up_this);
|
||||
}
|
||||
|
||||
if (EINA_INLIST_GET(node)->prev)
|
||||
{
|
||||
gave_up_this = EINA_TRUE;
|
||||
ret ^= (split_type == TILING_SPLIT_HORIZONTAL) ?
|
||||
TILING_WINDOW_TREE_EDGE_LEFT : TILING_WINDOW_TREE_EDGE_TOP;
|
||||
ret ^=
|
||||
(split_type ==
|
||||
TILING_SPLIT_HORIZONTAL) ? TILING_WINDOW_TREE_EDGE_LEFT :
|
||||
TILING_WINDOW_TREE_EDGE_TOP;
|
||||
}
|
||||
|
||||
if (EINA_INLIST_GET(node)->next)
|
||||
{
|
||||
gave_up_this = EINA_TRUE;
|
||||
ret ^= (split_type == TILING_SPLIT_HORIZONTAL) ?
|
||||
TILING_WINDOW_TREE_EDGE_RIGHT : TILING_WINDOW_TREE_EDGE_BOTTOM;
|
||||
ret ^=
|
||||
(split_type ==
|
||||
TILING_SPLIT_HORIZONTAL) ? TILING_WINDOW_TREE_EDGE_RIGHT :
|
||||
TILING_WINDOW_TREE_EDGE_BOTTOM;
|
||||
}
|
||||
|
||||
/* Mixed the gave_up vals on purpose, we do it on every call. */
|
||||
return ret & _tiling_window_tree_edges_get_helper(node->parent, !split_type ,gave_up_parent,
|
||||
gave_up_this);
|
||||
return ret & _tiling_window_tree_edges_get_helper(node->parent, !split_type,
|
||||
gave_up_parent, gave_up_this);
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -459,7 +468,8 @@ tiling_window_tree_edges_get(Window_Tree *node)
|
|||
}
|
||||
|
||||
/* Node move */
|
||||
static struct _Node_Move_Context {
|
||||
static struct _Node_Move_Context
|
||||
{
|
||||
Window_Tree *node;
|
||||
Window_Tree *ret;
|
||||
int cross_edge;
|
||||
|
@ -531,8 +541,9 @@ void
|
|||
tiling_window_tree_node_move(Window_Tree * node, int cross_edge)
|
||||
{
|
||||
Window_Tree *root = node;
|
||||
/* FIXME: This is very slow and possibly buggy. Can be done much better,
|
||||
* but is very easy to implement. */
|
||||
|
||||
/* FIXME: This is very slow and possibly buggy. Can be done much better, but
|
||||
* is very easy to implement. */
|
||||
|
||||
while (root->parent)
|
||||
root = root->parent;
|
||||
|
@ -547,10 +558,12 @@ tiling_window_tree_node_move(Window_Tree *node, int cross_edge)
|
|||
if (_node_move_ctx.ret)
|
||||
{
|
||||
E_Client *ec = node->client;
|
||||
|
||||
node->client = _node_move_ctx.ret->client;
|
||||
_node_move_ctx.ret->client = ec;
|
||||
}
|
||||
}
|
||||
|
||||
/* End Node move. */
|
||||
|
||||
void
|
||||
|
@ -572,6 +585,7 @@ tiling_window_tree_dump(Window_Tree *root, int level)
|
|||
printf("%f (%p)\n", root->weight, root->client);
|
||||
|
||||
Window_Tree *itr;
|
||||
|
||||
EINA_INLIST_FOREACH(root->children, itr)
|
||||
{
|
||||
tiling_window_tree_dump(itr, level + 1);
|
||||
|
|
|
@ -3,7 +3,8 @@
|
|||
# include <e.h>
|
||||
|
||||
/* XXX: First two have to be 0 and 1 because I use them with modulo. */
|
||||
typedef enum {
|
||||
typedef enum
|
||||
{
|
||||
TILING_SPLIT_HORIZONTAL = 0,
|
||||
TILING_SPLIT_VERTICAL = 1,
|
||||
TILING_SPLIT_FLOAT,
|
||||
|
@ -33,15 +34,19 @@ int tiling_window_tree_edges_get(Window_Tree *node);
|
|||
void tiling_window_tree_free(Window_Tree * root);
|
||||
void tiling_window_tree_walk(Window_Tree * root, void (*func) (void *));
|
||||
|
||||
Window_Tree *tiling_window_tree_add(Window_Tree *root, Window_Tree *parent, E_Client *client, Tiling_Split_Type split_type);
|
||||
Window_Tree *tiling_window_tree_add(Window_Tree * root, Window_Tree * parent,
|
||||
E_Client * client, Tiling_Split_Type split_type);
|
||||
|
||||
Window_Tree *tiling_window_tree_remove(Window_Tree * root, Window_Tree * item);
|
||||
|
||||
Window_Tree *tiling_window_tree_client_find(Window_Tree *root, E_Client *client);
|
||||
Window_Tree *tiling_window_tree_client_find(Window_Tree * root,
|
||||
E_Client * client);
|
||||
|
||||
void tiling_window_tree_apply(Window_Tree *root, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h);
|
||||
void tiling_window_tree_apply(Window_Tree * root, Evas_Coord x, Evas_Coord y,
|
||||
Evas_Coord w, Evas_Coord h);
|
||||
|
||||
Eina_Bool tiling_window_tree_node_resize(Window_Tree *node, int w_dir, double w_diff, int h_dir, double h_diff);
|
||||
Eina_Bool tiling_window_tree_node_resize(Window_Tree * node, int w_dir,
|
||||
double w_diff, int h_dir, double h_diff);
|
||||
|
||||
void tiling_window_tree_node_move(Window_Tree * node, int cross_edge);
|
||||
|
||||
|
|
Loading…
Reference in New Issue