diff --git a/src/modules/tiling/e_mod_config.c b/src/modules/tiling/e_mod_config.c index 4c37e759d..3e2a47481 100644 --- a/src/modules/tiling/e_mod_config.c +++ b/src/modules/tiling/e_mod_config.c @@ -6,9 +6,9 @@ typedef struct _E_Widget_Smart_Data E_Widget_Smart_Data; struct _E_Widget_Smart_Data { Evas_Object *parent_obj; - Evas_Coord x, y, w, h; - Evas_Coord minw, minh; - Eina_List *subobjs; + Evas_Coord x, y, w, h; + Evas_Coord minw, minh; + Eina_List *subobjs; }; static void @@ -25,32 +25,31 @@ _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) { - struct _Config_vdesk *vd = l->data; + Eina_List *l; - if (!vd) - continue; - if (vd->nb_stacks < 0 || vd->nb_stacks > TILING_MAX_STACKS) - vd->nb_stacks = 0; - if (vd->x == x && vd->y == y && vd->zone_num == zone_num) - return vd; - } + for (l = vdesks; l; l = l->next) + { + struct _Config_vdesk *vd = l->data; - return NULL; + if (!vd) + continue; + if (vd->nb_stacks < 0 || vd->nb_stacks > TILING_MAX_STACKS) + vd->nb_stacks = 0; + if (vd->x == x && vd->y == y && vd->zone_num == zone_num) + return vd; + } + + return NULL; } /* @@ -58,275 +57,276 @@ get_vdesk(Eina_List *vdesks, * */ static void * -_create_data(E_Config_Dialog *cfd EINA_UNUSED) +_create_data(E_Config_Dialog * cfd EINA_UNUSED) { - E_Config_Dialog_Data *cfdata; - Eina_List *l; + E_Config_Dialog_Data *cfdata; + Eina_List *l; - cfdata = E_NEW(E_Config_Dialog_Data, 1); + 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 */ - memcpy(cfdata, tiling_g.config, sizeof(Config)); + /* 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; + /* 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; + if (!vd) + continue; - newvd = E_NEW(struct _Config_vdesk, 1); - newvd->x = vd->x; - newvd->y = vd->y; - newvd->zone_num = vd->zone_num; - newvd->nb_stacks = vd->nb_stacks; + newvd = E_NEW(struct _Config_vdesk, 1); - EINA_LIST_APPEND(cfdata->config.vdesks, newvd); - } + newvd->x = vd->x; + newvd->y = vd->y; + newvd->zone_num = vd->zone_num; + newvd->nb_stacks = vd->nb_stacks; - return cfdata; + EINA_LIST_APPEND(cfdata->config.vdesks, newvd); + } + + return cfdata; } 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); + 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; + Evas *evas; + int i; - evas = cfdata->evas; + evas = cfdata->evas; - /* Clear old entries first */ - evas_object_del(cfdata->o_desklist); + /* Clear old entries first */ + evas_object_del(cfdata->o_desklist); - cfdata->o_desklist = e_widget_list_add(evas, 1, 0); + cfdata->o_desklist = e_widget_list_add(evas, 1, 0); - 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; + 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; - if (!desk) - continue; + if (!desk) + continue; - vd = get_vdesk(cfdata->config.vdesks, desk->x, desk->y, zone->num); - if (!vd) { - vd = E_NEW(struct _Config_vdesk, 1); - vd->x = desk->x; - vd->y = desk->y; - vd->zone_num = zone->num; - vd->nb_stacks = 0; + vd = get_vdesk(cfdata->config.vdesks, desk->x, desk->y, zone->num); + if (!vd) + { + vd = E_NEW(struct _Config_vdesk, 1); - EINA_LIST_APPEND(cfdata->config.vdesks, vd); - } + vd->x = desk->x; + vd->y = desk->y; + vd->zone_num = zone->num; + vd->nb_stacks = 0; - list = e_widget_list_add(evas, false, true); + EINA_LIST_APPEND(cfdata->config.vdesks, vd); + } - LIST_ADD(list, e_widget_label_add(evas, desk->name)); - slider = e_widget_check_add(evas, "", &vd->nb_stacks); - LIST_ADD(list, slider); + list = e_widget_list_add(evas, false, true); - LIST_ADD(cfdata->o_desklist, list); - } + LIST_ADD(list, e_widget_label_add(evas, desk->name)); + slider = e_widget_check_add(evas, "", &vd->nb_stacks); + LIST_ADD(list, slider); - /* Get the correct sizes of desklist and scrollframe */ - LIST_ADD(cfdata->osf, cfdata->o_desklist); + LIST_ADD(cfdata->o_desklist, list); + } + + /* Get the correct sizes of desklist and scrollframe */ + LIST_ADD(cfdata->osf, cfdata->o_desklist); } 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; - E_Zone *zone; + int n; + E_Config_Dialog_Data *cfdata = data; + E_Zone *zone; - if (!cfdata || !cfdata->o_zonelist) - return; + if (!cfdata || !cfdata->o_zonelist) + return; - n = e_widget_ilist_selected_get(cfdata->o_zonelist); - zone = e_widget_ilist_nth_data_get(cfdata->o_zonelist, n); - if (!zone) - return; - _fill_zone_config(zone, cfdata); + n = e_widget_ilist_selected_get(cfdata->o_zonelist); + zone = e_widget_ilist_nth_data_get(cfdata->o_zonelist, n); + if (!zone) + return; + _fill_zone_config(zone, cfdata); } static Evas_Object * -_basic_create_widgets(E_Config_Dialog *cfd EINA_UNUSED, - Evas *evas, - E_Config_Dialog_Data *cfdata) +_basic_create_widgets(E_Config_Dialog * cfd EINA_UNUSED, Evas * evas, + E_Config_Dialog_Data * cfdata) { - Evas_Object *o, *oc, *of; - E_Comp *comp; - E_Zone *zone; - Eina_List *l; + Evas_Object *o, *oc, *of; + E_Comp *comp; + E_Zone *zone; + Eina_List *l; - comp = e_comp_get(NULL); + comp = e_comp_get(NULL); - o = e_widget_list_add(evas, 0, 0); + o = e_widget_list_add(evas, 0, 0); - /* 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)); + /* 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)); - LIST_ADD(o, of); + LIST_ADD(o, of); - /* Virtual desktop settings */ - 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); + /* Virtual desktop settings */ + 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); - /* Zone list */ - cfdata->o_zonelist = e_widget_ilist_add(evas, 0, 0, NULL); - 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) { - if (!(zone = l->data)) - continue; - 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); + /* Zone list */ + cfdata->o_zonelist = e_widget_ilist_add(evas, 0, 0, NULL); + 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) + { + if (!(zone = l->data)) + continue; + 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); - LIST_ADD(cfdata->osf, cfdata->o_zonelist); + LIST_ADD(cfdata->osf, cfdata->o_zonelist); - /* List of individual tiling modes */ - cfdata->evas = evas; + /* List of individual tiling modes */ + cfdata->evas = evas; - _fill_zone_config(eina_list_data_get(comp->zones), cfdata); + _fill_zone_config(eina_list_data_get(comp->zones), cfdata); - e_widget_ilist_selected_set(cfdata->o_zonelist, 0); + e_widget_ilist_selected_set(cfdata->o_zonelist, 0); - e_widget_framelist_object_append(of, cfdata->osf); + e_widget_framelist_object_append(of, cfdata->osf); - LIST_ADD(o, of); + LIST_ADD(o, of); - oc = e_widget_button_add(evas, _("Help"), "help", _open_browser_help_cb, - NULL, NULL); - LIST_ADD(o, oc); + oc = e_widget_button_add(evas, _("Help"), "help", _open_browser_help_cb, + NULL, NULL); + LIST_ADD(o, oc); - return o; + return o; } static int -_basic_apply_data(E_Config_Dialog *cfd EINA_UNUSED, - E_Config_Dialog_Data *cfdata) +_basic_apply_data(E_Config_Dialog * cfd EINA_UNUSED, + E_Config_Dialog_Data * cfdata) { - struct _Config_vdesk *vd; - Eina_List *l; + struct _Config_vdesk *vd; + Eina_List *l; - tiling_g.config->tile_dialogs = cfdata->config.tile_dialogs; - tiling_g.config->show_titles = cfdata->config.show_titles; + tiling_g.config->tile_dialogs = cfdata->config.tile_dialogs; + 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) { - struct _Config_vdesk *newvd; + /* Check if the layout for one of the vdesks has changed */ + for (l = tiling_g.config->vdesks; l; l = l->next) + { + struct _Config_vdesk *newvd; - vd = l->data; + vd = l->data; - if (!vd) - continue; - if (!(newvd = get_vdesk(cfdata->config.vdesks, - vd->x, vd->y, vd->zone_num))) { - change_desk_conf(vd); - continue; - } + if (!vd) + continue; + 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); - change_desk_conf(newvd); - free(vd); - l->data = NULL; - } - } + 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) { - vd = l->data; + 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)) { - change_desk_conf(vd); - continue; - } - } + if (!vd) + continue; + 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) { - free(vd); - } - tiling_g.config->vdesks = NULL; + EINA_LIST_FREE(tiling_g.config->vdesks, vd) + { + free(vd); + } + tiling_g.config->vdesks = NULL; - for (l = cfdata->config.vdesks; l; l = l->next) { - struct _Config_vdesk *newvd; + for (l = cfdata->config.vdesks; l; l = l->next) + { + struct _Config_vdesk *newvd; - vd = l->data; - if (!vd) - continue; + vd = l->data; + if (!vd) + continue; - newvd = E_NEW(struct _Config_vdesk, 1); - newvd->x = vd->x; - newvd->y = vd->y; - newvd->zone_num = vd->zone_num; - newvd->nb_stacks = vd->nb_stacks; + newvd = E_NEW(struct _Config_vdesk, 1); - EINA_LIST_APPEND(tiling_g.config->vdesks, newvd); - } + newvd->x = vd->x; + newvd->y = vd->y; + newvd->zone_num = vd->zone_num; + newvd->nb_stacks = vd->nb_stacks; - e_tiling_update_conf(); + EINA_LIST_APPEND(tiling_g.config->vdesks, newvd); + } - e_config_save_queue(); + e_tiling_update_conf(); - return EINA_TRUE; + e_config_save_queue(); + + return EINA_TRUE; } 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; - char buf[PATH_MAX]; + E_Config_Dialog *cfd; + E_Config_Dialog_View *v; + char buf[PATH_MAX]; - if (e_config_dialog_find("E", "windows/tiling")) - return NULL; + if (e_config_dialog_find("E", "windows/tiling")) + return NULL; - v = E_NEW(E_Config_Dialog_View, 1); + v = E_NEW(E_Config_Dialog_View, 1); - v->create_cfdata = _create_data; - v->free_cfdata = _free_data; - v->basic.apply_cfdata = _basic_apply_data; - v->basic.create_widgets = _basic_create_widgets; + v->create_cfdata = _create_data; + v->free_cfdata = _free_data; + v->basic.apply_cfdata = _basic_apply_data; + v->basic.create_widgets = _basic_create_widgets; - 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); - return cfd; + 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); + return cfd; } diff --git a/src/modules/tiling/e_mod_tiling.c b/src/modules/tiling/e_mod_tiling.c index 2c0d37b69..3ed049df7 100644 --- a/src/modules/tiling/e_mod_tiling.c +++ b/src/modules/tiling/e_mod_tiling.c @@ -6,72 +6,62 @@ #define TILING_RESIZE_STEP 5 #define TILING_WRAP_SPEED 0.1 -typedef struct geom_t { - int x, y, w, h; +typedef struct geom_t +{ + int x, y, w, h; } geom_t; -typedef struct Client_Extra { - E_Client *client; - geom_t expected; - struct { - geom_t geom; - E_Maximize maximized; - const char *bordername; - } orig; - int last_frame_adjustment; // FIXME: Hack for frame resize bug. - Eina_Bool floating : 1; - Eina_Bool tiled : 1; +typedef struct Client_Extra +{ + E_Client *client; + geom_t expected; + struct + { + geom_t geom; + E_Maximize maximized; + const char *bordername; + } orig; + int last_frame_adjustment; // FIXME: Hack for frame resize bug. + Eina_Bool floating:1; + Eina_Bool tiled:1; } Client_Extra; struct tiling_g tiling_g = { - .module = NULL, - .config = NULL, - .log_domain = -1, + .module = NULL, + .config = NULL, + .log_domain = -1, }; -static void _add_client(E_Client *ec); -static void _remove_client(E_Client *ec); -static void _foreach_desk(void (*func)(E_Desk *desk)); +static void _add_client(E_Client * ec); +static void _remove_client(E_Client * ec); +static void _foreach_desk(void (*func) (E_Desk * desk)); /* }}} */ /* Globals {{{ */ static struct tiling_mod_main_g { - char edj_path[PATH_MAX]; - 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; - E_Client_Menu_Hook *client_menu_hook; + char edj_path[PATH_MAX]; + 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; + E_Client_Menu_Hook *client_menu_hook; - Tiling_Info *tinfo; - Eina_Hash *info_hash; - Eina_Hash *client_extras; + 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, -}; + Tiling_Split_Type split_type; +} _G = +{ +.split_type = TILING_SPLIT_HORIZONTAL,}; /* }}} */ /* Utils {{{ */ @@ -80,54 +70,57 @@ static struct tiling_mod_main_g static E_Desk * get_current_desk(void) { - E_Manager *m = e_manager_current_get(); - E_Comp *c = m->comp; - E_Zone *z = e_zone_current_get(c); + E_Manager *m = e_manager_current_get(); + E_Comp *c = m->comp; + E_Zone *z = e_zone_current_get(c); - return e_desk_current_get(z); + return e_desk_current_get(z); } static Tiling_Info * -_initialize_tinfo(const E_Desk *desk) +_initialize_tinfo(const E_Desk * desk) { - Tiling_Info *tinfo; + Tiling_Info *tinfo; - tinfo = E_NEW(Tiling_Info, 1); - tinfo->desk = desk; - eina_hash_direct_add(_G.info_hash, &tinfo->desk, tinfo); + tinfo = E_NEW(Tiling_Info, 1); + 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; + return tinfo; } static void -check_tinfo(const E_Desk *desk) +check_tinfo(const E_Desk * desk) { - if (!_G.tinfo || _G.tinfo->desk != desk) { - _G.tinfo = eina_hash_find(_G.info_hash, &desk); - 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, - desk->zone->num); - } - } + if (!_G.tinfo || _G.tinfo->desk != desk) + { + _G.tinfo = eina_hash_find(_G.info_hash, &desk); + 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, + desk->zone->num); + } + } } static Eina_Bool -desk_should_tile_check(const E_Desk *desk) +desk_should_tile_check(const E_Desk * desk) { check_tinfo(desk); - return (_G.tinfo && _G.tinfo->conf &&_G.tinfo->conf->nb_stacks); + return (_G.tinfo && _G.tinfo->conf && _G.tinfo->conf->nb_stacks); } static int -is_ignored_window(const Client_Extra *extra) +is_ignored_window(const Client_Extra * extra) { if (extra->client->sticky || extra->floating) return true; @@ -136,234 +129,219 @@ is_ignored_window(const Client_Extra *extra) } static int -is_tilable(const E_Client *ec) +is_tilable(const E_Client * ec) { - if (ec->icccm.min_h == ec->icccm.max_h - && ec->icccm.max_h > 0) - return false; + if (ec->icccm.min_h == ec->icccm.max_h && ec->icccm.max_h > 0) + return false; - if (ec->icccm.gravity == ECORE_X_GRAVITY_STATIC) - return false; + if (ec->icccm.gravity == ECORE_X_GRAVITY_STATIC) + return false; - if (ec->e.state.centered) - return false; + 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))) - return false; + if (!tiling_g.config->tile_dialogs && ((ec->icccm.transient_for != 0) || + (ec->netwm.type == E_WINDOW_TYPE_DIALOG))) + return false; - if (ec->fullscreen) { - return false; - } + if (ec->fullscreen) + { + return false; + } - if (e_client_util_ignored_get(ec)) - return false; + if (e_client_util_ignored_get(ec)) + return false; - return true; + return true; } 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; - ec->changes.border = true; - ec->changed = true; + eina_stringshare_replace(&ec->bordername, bordername); + ec->border.changed = true; + ec->changes.border = true; + ec->changed = true; - DBG("%p -> border %s", ec, bordername); + DBG("%p -> border %s", ec, bordername); } 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; + Tiling_Info *tinfo = data; - if (tinfo->desk) { - tinfo->conf = get_vdesk(tiling_g.config->vdesks, - tinfo->desk->x, tinfo->desk->y, - tinfo->desk->zone->num); - } else { - tinfo->conf = NULL; - } + if (tinfo->desk) + { + tinfo->conf = + get_vdesk(tiling_g.config->vdesks, tinfo->desk->x, tinfo->desk->y, + tinfo->desk->zone->num); + } else + { + tinfo->conf = NULL; + } - return true; + return true; } void e_tiling_update_conf(void) { - eina_hash_foreach(_G.info_hash, _info_hash_update, NULL); + eina_hash_foreach(_G.info_hash, _info_hash_update, NULL); } 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; + Client_Extra *extra; - extra = eina_hash_find(_G.client_extras, &ec); - if (!extra) { - ERR("No extra for %p", ec); - return; - } + extra = eina_hash_find(_G.client_extras, &ec); + if (!extra) + { + ERR("No extra for %p", ec); + return; + } - 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); + 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); } static void -_e_client_unmaximize(E_Client *ec, E_Maximize max) +_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"); - e_client_unmaximize(ec, 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"); + e_client_unmaximize(ec, max); } static void -_restore_client(E_Client *ec) +_restore_client(E_Client * ec) { - Client_Extra *extra; + Client_Extra *extra; - extra = eina_hash_find(_G.client_extras, &ec); - 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_maximize(ec, extra->orig.maximized); - ec->maximized = extra->orig.maximized; - } + extra = eina_hash_find(_G.client_extras, &ec); + 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_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 * -_get_or_create_client_extra(E_Client *ec) +_get_or_create_client_extra(E_Client * ec) { - Client_Extra *extra; + Client_Extra *extra; - extra = eina_hash_find(_G.client_extras, &ec); - 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), - }, - }; - 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, - }; - extra->orig.geom = extra->expected; - extra->orig.maximized = ec->maximized; - eina_stringshare_replace(&extra->orig.bordername, ec->bordername); - } + extra = eina_hash_find(_G.client_extras, &ec); + 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),} + ,}; + 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,}; + extra->orig.geom = extra->expected; + extra->orig.maximized = ec->maximized; + eina_stringshare_replace(&extra->orig.bordername, ec->bordername); + } - return extra; + return extra; } 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) { - ERR("No extra for %p", ec); - return; - } + Client_Extra *extra = eina_hash_find(_G.client_extras, &ec); - extra->expected = (geom_t) { - .x = x, - .y = y, - .w = w, - .h = h, - }; + if (!extra) + { + ERR("No extra for %p", ec); + return; + } + + extra->expected = (geom_t) + { + .x = x,.y = y,.w = w,.h = h,}; _e_client_move_resize(ec, x, y, w, h); } static Client_Extra * -tiling_entry_func(E_Client *ec) +tiling_entry_func(E_Client * ec) { - if (!ec) - return NULL; + if (!ec) + return NULL; - if (!is_tilable(ec)) - return NULL; + if (!is_tilable(ec)) + return NULL; - if (!desk_should_tile_check(ec->desk)) - return NULL; + if (!desk_should_tile_check(ec->desk)) + return NULL; - Client_Extra *extra = eina_hash_find(_G.client_extras, &ec); + Client_Extra *extra = eina_hash_find(_G.client_extras, &ec); - if (!extra) - ERR("No extra for %p", ec); + if (!extra) + ERR("No extra for %p", ec); - return extra; + return extra; } /* }}} */ -/* Reorganize Stacks {{{*/ +/* Reorganize Stacks {{{ */ static void _reapply_tree(void) { - int zx, zy, zw, zh; + int zx, zy, zw, zh; - if (_G.tinfo->tree) - { - e_zone_useful_geometry_get(_G.tinfo->desk->zone, &zx, &zy, &zw, &zh); + if (_G.tinfo->tree) + { + e_zone_useful_geometry_get(_G.tinfo->desk->zone, &zx, &zy, &zw, &zh); - tiling_window_tree_apply(_G.tinfo->tree, zx, zy, zw, zh); - } + tiling_window_tree_apply(_G.tinfo->tree, zx, zy, zw, zh); + } } void _restore_free_client(void *_item) { Window_Tree *item = _item; + if (item->client) { - _restore_client(item->client); + _restore_client(item->client); } free(item); } @@ -371,182 +349,196 @@ _restore_free_client(void *_item) void change_desk_conf(struct _Config_vdesk *newconf) { - E_Manager *m; - E_Comp *c; - E_Zone *z; - E_Desk *d; - int old_nb_stacks = 0, - new_nb_stacks = newconf->nb_stacks; + E_Manager *m; + E_Comp *c; + E_Zone *z; + E_Desk *d; + int old_nb_stacks = 0, new_nb_stacks = newconf->nb_stacks; - m = e_manager_current_get(); - if (!m) return; - c = m->comp; - z = e_comp_zone_number_get(c, newconf->zone_num); - if (!z) return; - d = e_desk_at_xy_get(z, newconf->x, newconf->y); - if (!d) return; + m = e_manager_current_get(); + if (!m) + return; + c = m->comp; + z = e_comp_zone_number_get(c, newconf->zone_num); + if (!z) + return; + d = e_desk_at_xy_get(z, newconf->x, newconf->y); + if (!d) + return; - check_tinfo(d); - if (_G.tinfo->conf) { - old_nb_stacks = _G.tinfo->conf->nb_stacks; - } else { - newconf->nb_stacks = 0; - } - _G.tinfo->conf = newconf; - _G.tinfo->conf->nb_stacks = old_nb_stacks; + check_tinfo(d); + if (_G.tinfo->conf) + { + old_nb_stacks = _G.tinfo->conf->nb_stacks; + } else + { + newconf->nb_stacks = 0; + } + _G.tinfo->conf = newconf; + _G.tinfo->conf->nb_stacks = old_nb_stacks; - if (new_nb_stacks == old_nb_stacks) - return; + if (new_nb_stacks == old_nb_stacks) + return; - 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); - } - _G.tinfo->conf->nb_stacks = new_nb_stacks; + 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); + } + _G.tinfo->conf->nb_stacks = new_nb_stacks; } /* }}} */ -/* Reorganize windows {{{*/ +/* Reorganize windows {{{ */ static void -_add_client(E_Client *ec) +_add_client(E_Client * ec) { - /* Should I need to check that the client is not already added? */ - if (!ec) { - return; - } - if (!is_tilable(ec)) { - return; - } + /* Should I need to check that the client is not already added? */ + if (!ec) + { + return; + } + if (!is_tilable(ec)) + { + return; + } - if (!desk_should_tile_check(ec->desk)) - return; + if (!desk_should_tile_check(ec->desk)) + return; - Client_Extra *extra = _get_or_create_client_extra(ec); + Client_Extra *extra = _get_or_create_client_extra(ec); - if (is_ignored_window(extra)) - return; + if (is_ignored_window(extra)) + return; - if (_G.split_type == TILING_SPLIT_FLOAT) - { - extra->floating = EINA_TRUE; - return; - } + if (_G.split_type == TILING_SPLIT_FLOAT) + { + extra->floating = EINA_TRUE; + return; + } - if (extra->tiled) - return; + if (extra->tiled) + return; - extra->tiled = EINA_TRUE; + extra->tiled = EINA_TRUE; - DBG("adding %p", ec); + DBG("adding %p", ec); - if (ec->maximized) - _e_client_unmaximize(ec, E_MAXIMIZE_BOTH); + if (ec->maximized) + _e_client_unmaximize(ec, E_MAXIMIZE_BOTH); - if (!tiling_g.config->show_titles && - (!ec->bordername || strcmp(ec->bordername, "pixel"))) - change_window_border(ec, "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)) - { - ERR("Couldn't find tree item for focused client %p. Using root..", - e_client_focused_get()); - } - } + /* Window tree updating. */ + { + E_Client *ec_focused = e_client_focused_get(); - _G.tinfo->tree = tiling_window_tree_add(_G.tinfo->tree, parent, ec, _G.split_type); - } + /* If focused is NULL, it should return the root. */ + Window_Tree *parent = tiling_window_tree_client_find(_G.tinfo->tree, + ec_focused); - _reapply_tree(); + 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)) + { + 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); + } + + _reapply_tree(); } static void -_remove_client(E_Client *ec) +_remove_client(E_Client * ec) { - if (!ec) - return; + if (!ec) + return; - DBG("removing %p", ec); + DBG("removing %p", ec); - Client_Extra *extra = eina_hash_find(_G.client_extras, &ec); - if (!extra) - { - if (is_tilable(ec)) - { - ERR("No extra for %p", ec); - } - return; - } + Client_Extra *extra = eina_hash_find(_G.client_extras, &ec); - if (!extra->tiled) - return; + if (!extra) + { + if (is_tilable(ec)) + { + ERR("No extra for %p", ec); + } + return; + } - extra->tiled = EINA_FALSE; + if (!extra->tiled) + return; - /* Window tree updating. */ - { - /* 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); - return; - } + extra->tiled = EINA_FALSE; - _G.tinfo->tree = tiling_window_tree_remove(_G.tinfo->tree, item); - } + /* Window tree updating. */ + { + /* If focused is NULL, it should return the root. */ + Window_Tree *item = tiling_window_tree_client_find(_G.tinfo->tree, ec); - _reapply_tree(); + if (!item) + { + ERR("Couldn't find tree item for client %p!", ec); + return; + } + + _G.tinfo->tree = tiling_window_tree_remove(_G.tinfo->tree, item); + } + + _reapply_tree(); } /* }}} */ /* Toggle Floating {{{ */ static void -toggle_floating(E_Client *ec) +toggle_floating(E_Client * ec) { - Client_Extra *extra = tiling_entry_func(ec); + Client_Extra *extra = tiling_entry_func(ec); - if (!extra) { - return; - } + if (!extra) + { + return; + } - extra->floating = !extra->floating; + extra->floating = !extra->floating; - /* This is the new state, act accordingly. */ - if (extra->floating) - { - _restore_client(ec); - _remove_client(ec); - } - else - { - _add_client(ec); - } + /* This is the new state, act accordingly. */ + if (extra->floating) + { + _restore_client(ec); + _remove_client(ec); + } else + { + _add_client(ec); + } } static void -_e_mod_action_toggle_floating_cb(E_Object *obj EINA_UNUSED, - const char *params EINA_UNUSED) +_e_mod_action_toggle_floating_cb(E_Object * obj EINA_UNUSED, + const char *params EINA_UNUSED) { - toggle_floating(e_client_focused_get()); + toggle_floating(e_client_focused_get()); } 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_Binding_Event_Mouse_Button * ev 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,8 +554,9 @@ _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_Binding_Event_Mouse_Button * ev 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); E_Client *first_ec = _go_mouse_client; @@ -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; @@ -616,54 +611,55 @@ _e_mod_menu_border_cb(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UN static void _action_swap(int cross_edge) { - E_Desk *desk; - E_Client *focused_ec; + E_Desk *desk; + E_Client *focused_ec; - desk = get_current_desk(); - if (!desk) - return; + desk = get_current_desk(); + if (!desk) + return; - focused_ec = e_client_focused_get(); - if (!focused_ec || focused_ec->desk != desk) - return; + focused_ec = e_client_focused_get(); + if (!focused_ec || focused_ec->desk != desk) + return; - if (!desk_should_tile_check(desk)) - return; + 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) - { - tiling_window_tree_node_move(item, cross_edge); + if (item) + { + tiling_window_tree_node_move(item, cross_edge); - _reapply_tree(); - } + _reapply_tree(); + } } static void -_e_mod_action_move_left_cb(E_Object *obj EINA_UNUSED, - const char *params EINA_UNUSED) +_e_mod_action_move_left_cb(E_Object * obj EINA_UNUSED, + const char *params EINA_UNUSED) { _action_swap(TILING_WINDOW_TREE_EDGE_LEFT); } static void -_e_mod_action_move_right_cb(E_Object *obj EINA_UNUSED, - const char *params EINA_UNUSED) +_e_mod_action_move_right_cb(E_Object * obj EINA_UNUSED, + const char *params EINA_UNUSED) { _action_swap(TILING_WINDOW_TREE_EDGE_RIGHT); } static void -_e_mod_action_move_up_cb(E_Object *obj EINA_UNUSED, - const char *params EINA_UNUSED) +_e_mod_action_move_up_cb(E_Object * obj EINA_UNUSED, + const char *params EINA_UNUSED) { _action_swap(TILING_WINDOW_TREE_EDGE_TOP); } static void -_e_mod_action_move_down_cb(E_Object *obj EINA_UNUSED, - const char *params EINA_UNUSED) +_e_mod_action_move_down_cb(E_Object * obj EINA_UNUSED, + const char *params EINA_UNUSED) { _action_swap(TILING_WINDOW_TREE_EDGE_BOTTOM); } @@ -672,361 +668,372 @@ _e_mod_action_move_down_cb(E_Object *obj EINA_UNUSED, /* Toggle split mode {{{ */ static void -_e_mod_action_toggle_split_mode(E_Object *obj EINA_UNUSED, - const char *params EINA_UNUSED) +_e_mod_action_toggle_split_mode(E_Object * obj EINA_UNUSED, + const char *params EINA_UNUSED) { - E_Desk *desk; + E_Desk *desk; - desk = get_current_desk(); - if (!desk) - return; + desk = get_current_desk(); + if (!desk) + return; - if (!desk_should_tile_check(desk)) - return; + if (!desk_should_tile_check(desk)) + return; - _G.split_type = (_G.split_type + 1) % TILING_SPLIT_LAST; + _G.split_type = (_G.split_type + 1) % TILING_SPLIT_LAST; } /* }}} */ -/* Hooks {{{*/ +/* Hooks {{{ */ -static void _move_or_resize(E_Client *ec) +static void +_move_or_resize(E_Client * ec) { - Client_Extra *extra = tiling_entry_func(ec); + Client_Extra *extra = tiling_entry_func(ec); - if (!extra) { - return; - } + if (!extra) + { + return; + } - if (is_ignored_window(extra)) - return; + if (is_ignored_window(extra)) + return; - if ((ec->x == extra->expected.x) && (ec->y == extra->expected.y) && - (ec->w == extra->expected.w) && (ec->h == extra->expected.h)) - { + if ((ec->x == extra->expected.x) && (ec->y == extra->expected.y) && + (ec->w == extra->expected.w) && (ec->h == extra->expected.h)) + { - return; - } + return; + } - if (!extra->last_frame_adjustment) - { - printf("This is probably because of the frame adjustment bug. Return\n"); - _reapply_tree(); - return; - } + if (!extra->last_frame_adjustment) + { + 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); - return; - } + Window_Tree *item = tiling_window_tree_client_find(_G.tinfo->tree, 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; - } - if (abs(extra->expected.h - ec->h) >= 1) - { - h_diff = ((double) ec->h) / extra->expected.h; - } - switch (ec->resize_mode) - { - case E_POINTER_RESIZE_L: - case E_POINTER_RESIZE_BL: - w_dir = -1; - break; - case E_POINTER_RESIZE_T: - case E_POINTER_RESIZE_TR: - h_dir = -1; - break; - case E_POINTER_RESIZE_TL: - w_dir = -1; - h_dir = -1; - break; - default: - break; - } - if ((w_diff != 1.0) || (h_diff != 1.0)) - { - if (!tiling_window_tree_node_resize(item, w_dir, w_diff, h_dir, h_diff)) - { - /* FIXME: Do something? */ - } - } - } + if (!item) + { + ERR("Couldn't find tree item for resized client %p!", ec); + return; + } - _reapply_tree(); + { + 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; + } + if (abs(extra->expected.h - ec->h) >= 1) + { + h_diff = ((double) ec->h) / extra->expected.h; + } + switch (ec->resize_mode) + { + case E_POINTER_RESIZE_L: + case E_POINTER_RESIZE_BL: + w_dir = -1; + break; + case E_POINTER_RESIZE_T: + case E_POINTER_RESIZE_TR: + h_dir = -1; + break; + case E_POINTER_RESIZE_TL: + w_dir = -1; + h_dir = -1; + break; + default: + break; + } + if ((w_diff != 1.0) || (h_diff != 1.0)) + { + if (!tiling_window_tree_node_resize(item, w_dir, w_diff, h_dir, + h_diff)) + { + /* FIXME: Do something? */ + } + } + } + + _reapply_tree(); } static void -_resize_begin_hook(void *data EINA_UNUSED, E_Client *ec) +_resize_begin_hook(void *data EINA_UNUSED, E_Client * ec) { - Client_Extra *extra = tiling_entry_func(ec); + Client_Extra *extra = tiling_entry_func(ec); - if (!extra) { - return; - } + if (!extra) + { + return; + } - if (is_ignored_window(extra)) - return; + if (is_ignored_window(extra)) + 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); - return; - } + Window_Tree *item = tiling_window_tree_client_find(_G.tinfo->tree, ec); - int edges = tiling_window_tree_edges_get(item); - if (edges & TILING_WINDOW_TREE_EDGE_LEFT) - { - switch (ec->resize_mode) - { - case E_POINTER_RESIZE_L: - ec->resize_mode = E_POINTER_RESIZE_NONE; - break; - case E_POINTER_RESIZE_TL: - ec->resize_mode = E_POINTER_RESIZE_T; - break; - case E_POINTER_RESIZE_BL: - ec->resize_mode = E_POINTER_RESIZE_B; - break; - default: - break; - } - } - if (edges & TILING_WINDOW_TREE_EDGE_RIGHT) - { - switch (ec->resize_mode) - { - case E_POINTER_RESIZE_R: - ec->resize_mode = E_POINTER_RESIZE_NONE; - break; - case E_POINTER_RESIZE_TR: - ec->resize_mode = E_POINTER_RESIZE_T; - break; - case E_POINTER_RESIZE_BR: - ec->resize_mode = E_POINTER_RESIZE_B; - break; - default: - break; - } - } - if (edges & TILING_WINDOW_TREE_EDGE_TOP) - { - switch (ec->resize_mode) - { - case E_POINTER_RESIZE_T: - ec->resize_mode = E_POINTER_RESIZE_NONE; - break; - case E_POINTER_RESIZE_TL: - ec->resize_mode = E_POINTER_RESIZE_L; - break; - case E_POINTER_RESIZE_TR: - ec->resize_mode = E_POINTER_RESIZE_R; - break; - default: - break; - } - } - if (edges & TILING_WINDOW_TREE_EDGE_BOTTOM) - { - switch (ec->resize_mode) - { - case E_POINTER_RESIZE_B: - ec->resize_mode = E_POINTER_RESIZE_NONE; - break; - case E_POINTER_RESIZE_BL: - ec->resize_mode = E_POINTER_RESIZE_L; - break; - case E_POINTER_RESIZE_BR: - ec->resize_mode = E_POINTER_RESIZE_R; - break; - default: - break; - } - } + if (!item) + { + ERR("Couldn't find tree item for resized client %p!", ec); + return; + } + + int edges = tiling_window_tree_edges_get(item); + + if (edges & TILING_WINDOW_TREE_EDGE_LEFT) + { + switch (ec->resize_mode) + { + case E_POINTER_RESIZE_L: + ec->resize_mode = E_POINTER_RESIZE_NONE; + break; + case E_POINTER_RESIZE_TL: + ec->resize_mode = E_POINTER_RESIZE_T; + break; + case E_POINTER_RESIZE_BL: + ec->resize_mode = E_POINTER_RESIZE_B; + break; + default: + break; + } + } + if (edges & TILING_WINDOW_TREE_EDGE_RIGHT) + { + switch (ec->resize_mode) + { + case E_POINTER_RESIZE_R: + ec->resize_mode = E_POINTER_RESIZE_NONE; + break; + case E_POINTER_RESIZE_TR: + ec->resize_mode = E_POINTER_RESIZE_T; + break; + case E_POINTER_RESIZE_BR: + ec->resize_mode = E_POINTER_RESIZE_B; + break; + default: + break; + } + } + if (edges & TILING_WINDOW_TREE_EDGE_TOP) + { + switch (ec->resize_mode) + { + case E_POINTER_RESIZE_T: + ec->resize_mode = E_POINTER_RESIZE_NONE; + break; + case E_POINTER_RESIZE_TL: + ec->resize_mode = E_POINTER_RESIZE_L; + break; + case E_POINTER_RESIZE_TR: + ec->resize_mode = E_POINTER_RESIZE_R; + break; + default: + break; + } + } + if (edges & TILING_WINDOW_TREE_EDGE_BOTTOM) + { + switch (ec->resize_mode) + { + case E_POINTER_RESIZE_B: + ec->resize_mode = E_POINTER_RESIZE_NONE; + break; + case E_POINTER_RESIZE_BL: + ec->resize_mode = E_POINTER_RESIZE_L; + break; + case E_POINTER_RESIZE_BR: + ec->resize_mode = E_POINTER_RESIZE_R; + break; + default: + break; + } + } } 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; + E_Client *ec = event->ec; - _move_or_resize(ec); + _move_or_resize(ec); - return true; + return true; } static Eina_Bool -_move_hook(void *data EINA_UNUSED, int type EINA_UNUSED, E_Event_Client*event) +_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); + E_Client *ec = event->ec; + Client_Extra *extra = tiling_entry_func(ec); - if (!extra) { - return true; - } + if (!extra) + { + return true; + } - if (is_ignored_window(extra)) - return true; + if (is_ignored_window(extra)) + return true; - e_client_act_move_end(event->ec, NULL); + e_client_act_move_end(event->ec, NULL); - _reapply_tree(); + _reapply_tree(); - return true; + return true; } static Eina_Bool -_add_hook(void *data EINA_UNUSED, int type EINA_UNUSED, E_Event_Client *event) +_add_hook(void *data EINA_UNUSED, int type EINA_UNUSED, E_Event_Client * event) { - E_Client *ec = event->ec; + 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); + _add_client(ec); - return true; + return true; } 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; + 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; + if (_G.currently_switching_desktop) + return true; - if (!desk_should_tile_check(ec->desk)) - return true; + if (!desk_should_tile_check(ec->desk)) + return true; - _remove_client(ec); + _remove_client(ec); - eina_hash_del(_G.client_extras, &ec, NULL); + eina_hash_del(_G.client_extras, &ec, NULL); - return true; + return true; } 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; + E_Client *ec = event->ec; - DBG("iconify hook: %p", ec); + DBG("iconify hook: %p", ec); - if (ec->deskshow) - return true; + if (ec->deskshow) + return true; - _remove_client(ec); + _remove_client(ec); - return true; + return true; } 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; + E_Client *ec = event->ec; - if (ec->deskshow) - return true; + if (ec->deskshow) + return true; - _add_client(ec); + _add_client(ec); - return true; + return true; } static void -toggle_sticky(E_Client *ec) +toggle_sticky(E_Client * ec) { - Client_Extra *extra = tiling_entry_func(ec); + Client_Extra *extra = tiling_entry_func(ec); - if (!extra) { - return; - } + if (!extra) + { + return; + } - /* This is the new state, act accordingly. */ - if (ec->sticky) - { - _restore_client(ec); - _remove_client(ec); - } - else - { - _add_client(ec); - } + /* This is the new state, act accordingly. */ + if (ec->sticky) + { + _restore_client(ec); + _remove_client(ec); + } 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; + _G.currently_switching_desktop = 0; - return true; + return true; } 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; + _G.currently_switching_desktop = 1; - return true; + return true; } 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, - ev->ec->desk->x, ev->ec->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)) { - _restore_client(ev->ec); - _remove_client(ev->ec); - } - } + if (desk_should_tile_check(ev->desk)) + { + if (tiling_window_tree_client_find(_G.tinfo->tree, ev->ec)) + { + _restore_client(ev->ec); + _remove_client(ev->ec); + } + } - if (!desk_should_tile_check(ev->ec->desk)) - return true; + if (!desk_should_tile_check(ev->ec->desk)) + return true; - _add_client(ev->ec); + _add_client(ev->ec); - return true; + return true; } static void -_compositor_resize_hook_desk_reapply(E_Desk *desk) +_compositor_resize_hook_desk_reapply(E_Desk * desk) { check_tinfo(desk); if (!desk_should_tile_check(desk)) @@ -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); @@ -1044,26 +1052,32 @@ _compositor_resize_hook(void *data EINA_UNUSED, int type EINA_UNUSED, E_Event_Co } static void -_bd_hook(void *d EINA_UNUSED, E_Client *ec) +_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) { - return; - } + Client_Extra *extra = eina_hash_find(_G.client_extras, &ec); + + 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")); @@ -1073,72 +1087,75 @@ _bd_hook(void *d EINA_UNUSED, E_Client *ec) } /* }}} */ -/* Module setup {{{*/ +/* Module setup {{{ */ static void _clear_info_hash(void *data) { - Tiling_Info *ti = data; + Tiling_Info *ti = data; - tiling_window_tree_free(ti->tree); - ti->tree = NULL; - E_FREE(ti); + tiling_window_tree_free(ti->tree); + ti->tree = NULL; + E_FREE(ti); } static void _clear_border_extras(void *data) { - Client_Extra *extra = data; + Client_Extra *extra = data; - eina_stringshare_del(extra->orig.bordername); + eina_stringshare_del(extra->orig.bordername); - E_FREE(extra); + E_FREE(extra); } -EAPI E_Module_Api e_modapi = -{ - E_MODULE_API_VERSION, - "Tiling" +EAPI E_Module_Api e_modapi = { + E_MODULE_API_VERSION, + "Tiling" }; EAPI void * -e_modapi_init(E_Module *m) +e_modapi_init(E_Module * m) { - E_Desk *desk; - Eina_List *l; + E_Desk *desk; + Eina_List *l; - tiling_g.module = m; + tiling_g.module = m; - if (tiling_g.log_domain < 0) { - tiling_g.log_domain = eina_log_domain_register("tiling", NULL); - if (tiling_g.log_domain < 0) { - EINA_LOG_CRIT("could not register log domain 'tiling'"); - } - } + if (tiling_g.log_domain < 0) + { + tiling_g.log_domain = eina_log_domain_register("tiling", NULL); + if (tiling_g.log_domain < 0) + { + EINA_LOG_CRIT("could not register log domain 'tiling'"); + } + } - _G.info_hash = eina_hash_pointer_new(_clear_info_hash); - _G.client_extras = eina_hash_pointer_new(_clear_border_extras); + _G.info_hash = eina_hash_pointer_new(_clear_info_hash); + _G.client_extras = eina_hash_pointer_new(_clear_border_extras); #define HANDLER(_h, _e, _f) \ _h = ecore_event_handler_add(E_EVENT_##_e, \ (Ecore_Event_Handler_Cb) _f, \ NULL); - e_client_hook_add(E_CLIENT_HOOK_RESIZE_BEGIN, _resize_begin_hook, NULL); - HANDLER(_G.handler_client_resize, CLIENT_RESIZE, _resize_hook); - HANDLER(_G.handler_client_move, CLIENT_MOVE, _move_hook); - HANDLER(_G.handler_client_add, CLIENT_ADD, _add_hook); - HANDLER(_G.handler_client_remove, CLIENT_REMOVE, _remove_hook); + e_client_hook_add(E_CLIENT_HOOK_RESIZE_BEGIN, _resize_begin_hook, NULL); + HANDLER(_G.handler_client_resize, CLIENT_RESIZE, _resize_hook); + HANDLER(_G.handler_client_move, CLIENT_MOVE, _move_hook); + HANDLER(_G.handler_client_add, CLIENT_ADD, _add_hook); + HANDLER(_G.handler_client_remove, CLIENT_REMOVE, _remove_hook); - HANDLER(_G.handler_client_iconify, CLIENT_ICONIFY, _iconify_hook); - HANDLER(_G.handler_client_uniconify, CLIENT_UNICONIFY, _uniconify_hook); - HANDLER(_G.handler_client_stick, CLIENT_STICK, _stick_hook); - HANDLER(_G.handler_client_unstick, CLIENT_UNSTICK, _unstick_hook); + HANDLER(_G.handler_client_iconify, CLIENT_ICONIFY, _iconify_hook); + HANDLER(_G.handler_client_uniconify, CLIENT_UNICONIFY, _uniconify_hook); + HANDLER(_G.handler_client_stick, CLIENT_STICK, _stick_hook); + 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_set, CLIENT_DESK_SET, _desk_set_hook); - HANDLER(_G.handler_compositor_resize, COMPOSITOR_RESIZE, _compositor_resize_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_set, CLIENT_DESK_SET, _desk_set_hook); + HANDLER(_G.handler_compositor_resize, COMPOSITOR_RESIZE, + _compositor_resize_hook); #undef HANDLER #define ACTION_ADD(_action, _cb, _title, _value, _params, _example, _editable) \ @@ -1151,97 +1168,92 @@ 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); + /* Module's actions */ + ACTION_ADD(_G.act_togglefloat, _e_mod_action_toggle_floating_cb, + 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); - ACTION_ADD(_G.act_move_down, _e_mod_action_move_down_cb, - 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); - ACTION_ADD(_G.act_move_right, _e_mod_action_move_right_cb, - N_("Move the focused window right"), "move_right", - 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); + ACTION_ADD(_G.act_move_down, _e_mod_action_move_down_cb, + 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); + ACTION_ADD(_G.act_move_right, _e_mod_action_move_right_cb, + 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); + ACTION_ADD(_G.act_toggle_split_mode, _e_mod_action_toggle_split_mode, + 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); - _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; + 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; #undef ACTION_ADD - /* Configuration entries */ - snprintf(_G.edj_path, sizeof(_G.edj_path),"%s/e-module-tiling.edj", - 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); + /* Configuration entries */ + snprintf(_G.edj_path, sizeof(_G.edj_path), "%s/e-module-tiling.edj", + 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); - /* 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); - E_CONFIG_VAL(_G.config_edd, Config, tile_dialogs, INT); - E_CONFIG_VAL(_G.config_edd, Config, show_titles, INT); + /* 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); - E_CONFIG_LIST(_G.config_edd, Config, vdesks, _G.vdesk_edd); - E_CONFIG_VAL(_G.vdesk_edd, struct _Config_vdesk, x, INT); - E_CONFIG_VAL(_G.vdesk_edd, struct _Config_vdesk, y, INT); - E_CONFIG_VAL(_G.vdesk_edd, struct _Config_vdesk, zone_num, INT); - E_CONFIG_VAL(_G.vdesk_edd, struct _Config_vdesk, nb_stacks, INT); + E_CONFIG_VAL(_G.config_edd, Config, tile_dialogs, INT); + E_CONFIG_VAL(_G.config_edd, Config, show_titles, INT); - tiling_g.config = e_config_domain_load("module.tiling", _G.config_edd); - if (!tiling_g.config) { - tiling_g.config = E_NEW(Config, 1); - tiling_g.config->tile_dialogs = 1; - tiling_g.config->show_titles = 1; - } + E_CONFIG_LIST(_G.config_edd, Config, vdesks, _G.vdesk_edd); + E_CONFIG_VAL(_G.vdesk_edd, struct _Config_vdesk, x, INT); + E_CONFIG_VAL(_G.vdesk_edd, struct _Config_vdesk, y, INT); + E_CONFIG_VAL(_G.vdesk_edd, struct _Config_vdesk, zone_num, INT); + E_CONFIG_VAL(_G.vdesk_edd, struct _Config_vdesk, nb_stacks, INT); - E_CONFIG_LIMIT(tiling_g.config->tile_dialogs, 0, 1); - E_CONFIG_LIMIT(tiling_g.config->show_titles, 0, 1); + tiling_g.config = e_config_domain_load("module.tiling", _G.config_edd); + if (!tiling_g.config) + { + tiling_g.config = E_NEW(Config, 1); + tiling_g.config->tile_dialogs = 1; + tiling_g.config->show_titles = 1; + } - for (l = tiling_g.config->vdesks; l; l = l->next) { - struct _Config_vdesk *vd; + E_CONFIG_LIMIT(tiling_g.config->tile_dialogs, 0, 1); + E_CONFIG_LIMIT(tiling_g.config->show_titles, 0, 1); - vd = l->data; + for (l = tiling_g.config->vdesks; l; l = l->next) + { + struct _Config_vdesk *vd; - E_CONFIG_LIMIT(vd->nb_stacks, 0, TILING_MAX_STACKS); - } + vd = l->data; - _G.client_menu_hook = e_int_client_menu_hook_add(_bd_hook, NULL); + E_CONFIG_LIMIT(vd->nb_stacks, 0, TILING_MAX_STACKS); + } - desk = get_current_desk(); - _G.tinfo = _initialize_tinfo(desk); + _G.client_menu_hook = e_int_client_menu_hook_add(_bd_hook, NULL); - _G.currently_switching_desktop = 0; + desk = get_current_desk(); + _G.tinfo = _initialize_tinfo(desk); - /* Add all the existing windows. */ + _G.currently_switching_desktop = 0; + + /* Add all the existing windows. */ + { + E_Client *ec; + + E_CLIENT_FOREACH(e_comp_get(NULL), ec) { - E_Client *ec; - E_CLIENT_FOREACH(e_comp_get(NULL), ec) - { - _add_client(ec); - } + _add_client(ec); } + } - return m; + return m; } static void -_disable_desk(E_Desk *desk) +_disable_desk(E_Desk * desk) { check_tinfo(desk); if (!_G.tinfo->conf) @@ -1254,117 +1266,122 @@ _disable_desk(E_Desk *desk) static void _disable_all_tiling(void) { - const Eina_List *l, *ll; - E_Comp *comp; - E_Zone *zone; + const Eina_List *l, *ll; + E_Comp *comp; + E_Zone *zone; - _foreach_desk(_disable_desk); + _foreach_desk(_disable_desk); - EINA_LIST_FOREACH(e_comp_list(), l, comp) { - EINA_LIST_FOREACH(comp->zones, ll, zone) { - e_place_zone_region_smart_cleanup(zone); - } - } + EINA_LIST_FOREACH(e_comp_list(), l, comp) + { + EINA_LIST_FOREACH(comp->zones, ll, zone) + { + e_place_zone_region_smart_cleanup(zone); + } + } } static void -_foreach_desk(void (*func)(E_Desk *desk)) +_foreach_desk(void (*func) (E_Desk * desk)) { - const Eina_List *l, *ll; - E_Comp *comp; - E_Zone *zone; - E_Desk *desk; - int x, y; + const Eina_List *l, *ll; + E_Comp *comp; + E_Zone *zone; + 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++) { - desk = zone->desks[x + (y * zone->desk_x_count)]; + 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); - } - } - } - } + func(desk); + } + } + } + } } EAPI int -e_modapi_shutdown(E_Module *m EINA_UNUSED) +e_modapi_shutdown(E_Module * m EINA_UNUSED) { - _disable_all_tiling(); + _disable_all_tiling(); - e_int_client_menu_hook_del(_G.client_menu_hook); - - if (tiling_g.log_domain >= 0) { - eina_log_domain_unregister(tiling_g.log_domain); - tiling_g.log_domain = -1; - } + e_int_client_menu_hook_del(_G.client_menu_hook); + 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); \ x = NULL; \ } - FREE_HANDLER(_G.handler_client_resize); - FREE_HANDLER(_G.handler_client_move); - FREE_HANDLER(_G.handler_client_add); - FREE_HANDLER(_G.handler_client_remove); + FREE_HANDLER(_G.handler_client_resize); + FREE_HANDLER(_G.handler_client_move); + FREE_HANDLER(_G.handler_client_add); + FREE_HANDLER(_G.handler_client_remove); - FREE_HANDLER(_G.handler_client_iconify); - FREE_HANDLER(_G.handler_client_uniconify); - FREE_HANDLER(_G.handler_client_stick); - FREE_HANDLER(_G.handler_client_unstick); + FREE_HANDLER(_G.handler_client_iconify); + FREE_HANDLER(_G.handler_client_uniconify); + FREE_HANDLER(_G.handler_client_stick); + FREE_HANDLER(_G.handler_client_unstick); - FREE_HANDLER(_G.handler_desk_show); - FREE_HANDLER(_G.handler_desk_before_show); - FREE_HANDLER(_G.handler_desk_set); + FREE_HANDLER(_G.handler_desk_show); + FREE_HANDLER(_G.handler_desk_before_show); + FREE_HANDLER(_G.handler_desk_set); #undef FREE_HANDLER - #define ACTION_DEL(act, title, value) \ if (act) { \ e_action_predef_name_del("Tiling", title); \ e_action_del(value); \ act = NULL; \ } - ACTION_DEL(_G.act_togglefloat, "Toggle floating", "toggle_floating"); - ACTION_DEL(_G.act_move_up, "Move the focused window up", "move_up"); - ACTION_DEL(_G.act_move_down, "Move the focused window down", "move_down"); - ACTION_DEL(_G.act_move_left, "Move the focused window left", "move_left"); - ACTION_DEL(_G.act_move_right, "Move the focused window right", "move_right"); + ACTION_DEL(_G.act_togglefloat, "Toggle floating", "toggle_floating"); + ACTION_DEL(_G.act_move_up, "Move the focused window up", "move_up"); + ACTION_DEL(_G.act_move_down, "Move the focused window down", "move_down"); + ACTION_DEL(_G.act_move_left, "Move the focused window left", "move_left"); + ACTION_DEL(_G.act_move_right, "Move the focused window right", "move_right"); - 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_toggle_split_mode, "Toggle split mode", + "toggle_split_mode"); + ACTION_DEL(_G.act_swap_window, "Swap window", "swap_window"); #undef ACTION_DEL - e_configure_registry_item_del("windows/tiling"); - e_configure_registry_category_del("windows"); + e_configure_registry_item_del("windows/tiling"); + e_configure_registry_category_del("windows"); - E_FREE(tiling_g.config); - E_CONFIG_DD_FREE(_G.config_edd); - E_CONFIG_DD_FREE(_G.vdesk_edd); + E_FREE(tiling_g.config); + E_CONFIG_DD_FREE(_G.config_edd); + E_CONFIG_DD_FREE(_G.vdesk_edd); - tiling_g.module = NULL; + tiling_g.module = NULL; - eina_hash_free(_G.info_hash); - _G.info_hash = NULL; + eina_hash_free(_G.info_hash); + _G.info_hash = NULL; - eina_hash_free(_G.client_extras); - _G.client_extras = NULL; + eina_hash_free(_G.client_extras); + _G.client_extras = NULL; - _G.tinfo = NULL; + _G.tinfo = NULL; - return 1; + return 1; } EAPI int -e_modapi_save(E_Module *m EINA_UNUSED) +e_modapi_save(E_Module * m EINA_UNUSED) { - e_config_domain_save("module.tiling", _G.config_edd, tiling_g.config); + e_config_domain_save("module.tiling", _G.config_edd, tiling_g.config); - return true; + return true; } + /* }}} */ diff --git a/src/modules/tiling/e_mod_tiling.h b/src/modules/tiling/e_mod_tiling.h index 46d73f2b6..e5bbd7887 100644 --- a/src/modules/tiling/e_mod_tiling.h +++ b/src/modules/tiling/e_mod_tiling.h @@ -1,56 +1,56 @@ #ifndef E_MOD_TILING_H -#define E_MOD_TILING_H +# define E_MOD_TILING_H -#include +# include -#include +# include -#include +# include -#include "window_tree.h" +# include "window_tree.h" -typedef struct _Config Config; +typedef struct _Config Config; typedef struct _Tiling_Info Tiling_Info; struct tiling_g { - E_Module *module; - Config *config; - int log_domain; + E_Module *module; + Config *config; + int log_domain; }; extern struct tiling_g tiling_g; -#undef ERR -#undef DBG -#define ERR(...) EINA_LOG_DOM_ERR(tiling_g.log_domain, __VA_ARGS__) -#define DBG(...) EINA_LOG_DOM_DBG(tiling_g.log_domain, __VA_ARGS__) +# undef ERR +# undef DBG +# define ERR(...) EINA_LOG_DOM_ERR(tiling_g.log_domain, __VA_ARGS__) +# define DBG(...) EINA_LOG_DOM_DBG(tiling_g.log_domain, __VA_ARGS__) -#define TILING_MAX_STACKS 8 +# define TILING_MAX_STACKS 8 struct _Config_vdesk { - int x, y; - unsigned int zone_num; - int nb_stacks; + int x, y; + unsigned int zone_num; + int nb_stacks; }; struct _Config { - int tile_dialogs; - int show_titles; - Eina_List *vdesks; + int tile_dialogs; + int show_titles; + Eina_List *vdesks; }; 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 */ - const E_Desk *desk; + /* 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; + struct _Config_vdesk *conf; - Window_Tree *tree; + Window_Tree *tree; }; struct _E_Config_Dialog_Data @@ -59,41 +59,34 @@ struct _E_Config_Dialog_Data Evas_Object *o_zonelist; Evas_Object *o_desklist; Evas_Object *osf; - Evas *evas; + 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; -EAPI void *e_modapi_init(E_Module *m); -EAPI int e_modapi_shutdown(E_Module *m); -EAPI int e_modapi_save(E_Module *m); +EAPI void *e_modapi_init(E_Module * m); +EAPI int e_modapi_shutdown(E_Module * m); +EAPI int e_modapi_save(E_Module * m); 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, - unsigned int zone_num); +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, - int h); -#define EINA_LIST_IS_IN(_list, _el) \ +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) -#define EINA_LIST_APPEND(_list, _el) \ +# define EINA_LIST_APPEND(_list, _el) \ _list = eina_list_append(_list, _el) -#define EINA_LIST_REMOVE(_list, _el) \ +# define EINA_LIST_REMOVE(_list, _el) \ _list = eina_list_remove(_list, _el) -#define _TILE_MIN(a, b) (((a) < (b)) ? (a) : (b)) -#define _TILE_MAX(a, b) (((a) > (b)) ? (a) : (b)) +# define _TILE_MIN(a, b) (((a) < (b)) ? (a) : (b)) +# define _TILE_MAX(a, b) (((a) > (b)) ? (a) : (b)) #endif diff --git a/src/modules/tiling/window_tree.c b/src/modules/tiling/window_tree.c index 191059bfb..2e8768e95 100644 --- a/src/modules/tiling/window_tree.c +++ b/src/modules/tiling/window_tree.c @@ -4,31 +4,33 @@ #include "e_mod_tiling.h" void -tiling_window_tree_walk(Window_Tree *root, void (*func)(void *)) +tiling_window_tree_walk(Window_Tree * root, void (*func) (void *)) { Eina_Inlist *itr_safe; Window_Tree *itr; + if (!root) return; EINA_INLIST_FOREACH_SAFE(root->children, itr_safe, itr) - { - tiling_window_tree_walk(itr, func); - } + { + tiling_window_tree_walk(itr, func); + } func(root); } void -tiling_window_tree_free(Window_Tree *root) +tiling_window_tree_free(Window_Tree * root) { tiling_window_tree_walk(root, free); } static void -_tiling_window_tree_split_add(Window_Tree *parent, Window_Tree *new_node) +_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,14 +38,14 @@ _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 -_tiling_window_tree_parent_add(Window_Tree *parent, Window_Tree *new_node) +_tiling_window_tree_parent_add(Window_Tree * parent, Window_Tree * new_node) { /* Adjust existing children's weights */ Window_Tree *itr; @@ -55,185 +57,182 @@ _tiling_window_tree_parent_add(Window_Tree *parent, Window_Tree *new_node) weight *= children_count; EINA_INLIST_FOREACH(parent->children, itr) - { - itr->weight *= weight; - } + { + 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) +_tiling_window_tree_split_type_get(Window_Tree * node) { int ret = 0; + while (node->parent) { - ret++; - node = node->parent; + ret++; + node = node->parent; } return ret % 2; } 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) + return root; + } else if (!root) { - new_node->weight = 1.0; - return new_node; - } - else if (!parent) + new_node->weight = 1.0; + return new_node; + } else if (!parent) { - parent = root; - parent_split_type = _tiling_window_tree_split_type_get(parent); - if ((parent_split_type != split_type) && (parent->children)) - { - parent = (Window_Tree *) parent->children; - } + parent = root; + parent_split_type = _tiling_window_tree_split_type_get(parent); + if ((parent_split_type != split_type) && (parent->children)) + { + parent = (Window_Tree *) parent->children; + } } parent_split_type = _tiling_window_tree_split_type_get(parent); if (parent_split_type == split_type) { - if (parent->children) - { - _tiling_window_tree_parent_add(parent, new_node); - } - else - { - _tiling_window_tree_split_add(parent, new_node); - } - } - else + if (parent->children) + { + _tiling_window_tree_parent_add(parent, new_node); + } else + { + _tiling_window_tree_split_add(parent, new_node); + } + } else { - Window_Tree *grand_parent = parent->parent; - if (grand_parent && grand_parent->children) - { - _tiling_window_tree_parent_add(grand_parent, new_node); - } - 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)); - parent->parent = root; - } + Window_Tree *grand_parent = parent->parent; + + if (grand_parent && grand_parent->children) + { + _tiling_window_tree_parent_add(grand_parent, new_node); + } 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)); + parent->parent = root; + } } return root; } Window_Tree * -tiling_window_tree_remove(Window_Tree *root, Window_Tree *item) +tiling_window_tree_remove(Window_Tree * root, Window_Tree * item) { if (root == item) { - free(item); - return NULL; - } - else if (!item->client) + free(item); + return NULL; + } else if (!item->client) { - ERR("Tried deleting node %p that doesn't have a client.", item); - return root; + 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); if (children_count <= 2) { - Window_Tree *grand_parent = parent->parent; - Window_Tree *item_keep = NULL; - /* Adjust existing children's weights */ - EINA_INLIST_FOREACH(parent->children, item_keep) - { - if (item_keep != item) - break; - } + Window_Tree *grand_parent = parent->parent; + Window_Tree *item_keep = NULL; - if (!item_keep) - { - /* Special case of deleting the last vertical split item. */ - free(item); - free(root); - return NULL; - } - else if (!item_keep->children) - { - parent->client = item_keep->client; - parent->children = NULL; + /* Adjust existing children's weights */ + EINA_INLIST_FOREACH(parent->children, item_keep) + { + if (item_keep != item) + break; + } - free(item_keep); - } - else - { - if (grand_parent) - { - /* Update the children's parent. */ - { - Eina_Inlist *itr_safe; - Window_Tree *itr; + if (!item_keep) + { + /* Special case of deleting the last vertical split item. */ + free(item); + free(root); + return NULL; + } else if (!item_keep->children) + { + parent->client = item_keep->client; + parent->children = NULL; - EINA_INLIST_FOREACH_SAFE(item_keep->children, itr_safe, itr) - { - /* We are prepending to double-reverse the order. */ - grand_parent->children = - eina_inlist_prepend_relative(grand_parent->children, - EINA_INLIST_GET(itr), EINA_INLIST_GET(parent)); - itr->weight *= parent->weight; - itr->parent = grand_parent; - } + free(item_keep); + } else + { + if (grand_parent) + { + /* Update the children's parent. */ + { + Eina_Inlist *itr_safe; + Window_Tree *itr; - grand_parent->children = eina_inlist_remove(grand_parent->children, - EINA_INLIST_GET(parent)); - free(parent); - } - } - else - { - /* This is fine, as this is a child of the root so we allow two - * levels. */ - item_keep->weight = 1.0; - } + EINA_INLIST_FOREACH_SAFE(item_keep->children, itr_safe, + itr) + { + /* We are prepending to double-reverse the order. */ + grand_parent->children = + eina_inlist_prepend_relative(grand_parent->children, + EINA_INLIST_GET(itr), EINA_INLIST_GET(parent)); + itr->weight *= parent->weight; + itr->parent = grand_parent; + } - parent->children = eina_inlist_remove(parent->children, EINA_INLIST_GET(item)); - } - } - else + grand_parent->children = + eina_inlist_remove(grand_parent->children, + EINA_INLIST_GET(parent)); + free(parent); + } + } else + { + /* 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)); + } + } else { - Window_Tree *itr; - float weight = 1.0 - item->weight; + 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) - { - itr->weight /= weight; - } + /* Adjust existing children's weights */ + EINA_INLIST_FOREACH(parent->children, itr) + { + itr->weight /= weight; + } } - free(item); - return root; + free(item); + return root; } Window_Tree * -tiling_window_tree_client_find(Window_Tree *root, E_Client *client) +tiling_window_tree_client_find(Window_Tree * root, E_Client * client) { Window_Tree *itr; @@ -244,19 +243,20 @@ tiling_window_tree_client_find(Window_Tree *root, E_Client *client) return root; EINA_INLIST_FOREACH(root->children, itr) - { - Window_Tree *ret; - ret = tiling_window_tree_client_find(itr, client); - if (ret) - return ret; - } + { + Window_Tree *ret; + + ret = tiling_window_tree_client_find(itr, client); + if (ret) + return ret; + } return NULL; } void -_tiling_window_tree_level_apply(Window_Tree *root, Evas_Coord x, Evas_Coord y, - Evas_Coord w, Evas_Coord h, int level) +_tiling_window_tree_level_apply(Window_Tree * root, Evas_Coord x, Evas_Coord y, + Evas_Coord w, Evas_Coord h, int level) { Window_Tree *itr; Tiling_Split_Type split_type = level % 2; @@ -264,29 +264,30 @@ _tiling_window_tree_level_apply(Window_Tree *root, Evas_Coord x, Evas_Coord y, if (root->client) { - tiling_e_client_move_resize_extra(root->client, x, y, w, h); - return; + tiling_e_client_move_resize_extra(root->client, x, y, w, h); + return; } if (split_type == TILING_SPLIT_HORIZONTAL) { - 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) + 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) { - 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; - } + 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; + } } /* Adjust the last item's weight in case weight < 1.0 */ @@ -294,65 +295,62 @@ _tiling_window_tree_level_apply(Window_Tree *root, Evas_Coord x, Evas_Coord y, } void -tiling_window_tree_apply(Window_Tree *root, Evas_Coord x, Evas_Coord y, - Evas_Coord w, Evas_Coord h) +tiling_window_tree_apply(Window_Tree * root, Evas_Coord x, Evas_Coord y, + Evas_Coord w, Evas_Coord h) { _tiling_window_tree_level_apply(root, x, y, w, h, 0); } static Window_Tree * -_inlist_next(Window_Tree *it) +_inlist_next(Window_Tree * it) { return (Window_Tree *) EINA_INLIST_GET(it)->next; } static Window_Tree * -_inlist_prev(Window_Tree *it) +_inlist_prev(Window_Tree * it) { return (Window_Tree *) EINA_INLIST_GET(it)->prev; } 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; Window_Tree *children_start; Window_Tree *itr; - Window_Tree *(*itr_func)(Window_Tree *); + Window_Tree *(*itr_func) (Window_Tree *); if (dir > 0) { - itr_func = _inlist_prev; - children_start = (Window_Tree *) parent->children->last; - } - else + itr_func = _inlist_prev; + children_start = (Window_Tree *) parent->children->last; + } else { - itr_func = _inlist_next; - children_start = (Window_Tree *) parent->children; + itr_func = _inlist_next; + children_start = (Window_Tree *) parent->children; } - itr = (Window_Tree *) children_start; while (itr != node) { - weight += itr->weight; + weight += itr->weight; - itr = itr_func(itr); + itr = itr_func(itr); } /* If it's at the edge, try the grandpa of the parent. */ if (weight == 0.0) { - 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), - dir); - } - return EINA_FALSE; + 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), + dir); + } + return EINA_FALSE; } weight_diff = itr->weight; @@ -360,16 +358,17 @@ _tiling_window_tree_node_resize_direction(Window_Tree *node, Window_Tree *parent weight_diff -= itr->weight; weight_diff /= weight; - for (itr = children_start ; itr != node ; itr = itr_func(itr)) + for (itr = children_start; itr != node; itr = itr_func(itr)) { - itr->weight += itr->weight * weight_diff; + itr->weight += itr->weight * weight_diff; } return EINA_TRUE; } 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,90 +379,101 @@ 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 + w_parent = parent; + h_parent = grand_parent; + } else { - w_parent = grand_parent; - h_parent = parent; + w_parent = grand_parent; + h_parent = parent; } 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); + 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); } 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); + 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); } return ret; } int -_tiling_window_tree_edges_get_helper(Window_Tree *node, Tiling_Split_Type split_type, Eina_Bool gave_up_this, - Eina_Bool gave_up_parent) +_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 | - TILING_WINDOW_TREE_EDGE_TOP | TILING_WINDOW_TREE_EDGE_BOTTOM; + 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) + return ret; + } else if (gave_up_this && gave_up_parent) { - return 0; - } - else if (gave_up_this) + return 0; + } 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); + /* 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); } 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; + gave_up_this = EINA_TRUE; + 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; + gave_up_this = EINA_TRUE; + 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 -tiling_window_tree_edges_get(Window_Tree *node) +tiling_window_tree_edges_get(Window_Tree * node) { Tiling_Split_Type split_type = _tiling_window_tree_split_type_get(node); return _tiling_window_tree_edges_get_helper(node, !split_type, EINA_FALSE, - EINA_FALSE); + EINA_FALSE); } /* Node move */ -static struct _Node_Move_Context { - Window_Tree *node; - Window_Tree *ret; - int cross_edge; - int best_match; +static struct _Node_Move_Context +{ + Window_Tree *node; + Window_Tree *ret; + int cross_edge; + int best_match; } _node_move_ctx; #define CNODE (_node_move_ctx.node) @@ -474,8 +484,8 @@ static struct _Node_Move_Context { CNODE->client->x, CNODE->client->w, node->client->x, node->client->w) static void -_tiling_window_tree_node_move_if_match_set(Window_Tree *node, Evas_Coord cx, - Evas_Coord cw, Evas_Coord ox, Evas_Coord ow) +_tiling_window_tree_node_move_if_match_set(Window_Tree * node, Evas_Coord cx, + Evas_Coord cw, Evas_Coord ox, Evas_Coord ow) { Evas_Coord leftx, rightx; int match; @@ -486,8 +496,8 @@ _tiling_window_tree_node_move_if_match_set(Window_Tree *node, Evas_Coord cx, if (match > _node_move_ctx.best_match) { - _node_move_ctx.best_match = match; - _node_move_ctx.ret = node; + _node_move_ctx.best_match = match; + _node_move_ctx.ret = node; } } @@ -502,24 +512,24 @@ _tiling_window_tree_node_move_walker(void *_node) switch (_node_move_ctx.cross_edge) { - case TILING_WINDOW_TREE_EDGE_LEFT: - if ((node->client->x + node->client->w) == CNODE->client->x) - IF_MATCH_SET_LR(node); - break; - case TILING_WINDOW_TREE_EDGE_RIGHT: - if (node->client->x == (CNODE->client->x + CNODE->client->w)) - IF_MATCH_SET_LR(node); - break; - case TILING_WINDOW_TREE_EDGE_TOP: - if ((node->client->y + node->client->h) == CNODE->client->y) - IF_MATCH_SET_TB(node); - break; - case TILING_WINDOW_TREE_EDGE_BOTTOM: - if (node->client->y == (CNODE->client->y + CNODE->client->h)) - IF_MATCH_SET_TB(node); - break; - default: - break; + case TILING_WINDOW_TREE_EDGE_LEFT: + if ((node->client->x + node->client->w) == CNODE->client->x) + IF_MATCH_SET_LR(node); + break; + case TILING_WINDOW_TREE_EDGE_RIGHT: + if (node->client->x == (CNODE->client->x + CNODE->client->w)) + IF_MATCH_SET_LR(node); + break; + case TILING_WINDOW_TREE_EDGE_TOP: + if ((node->client->y + node->client->h) == CNODE->client->y) + IF_MATCH_SET_TB(node); + break; + case TILING_WINDOW_TREE_EDGE_BOTTOM: + if (node->client->y == (CNODE->client->y + CNODE->client->h)) + IF_MATCH_SET_TB(node); + break; + default: + break; } } @@ -528,11 +538,12 @@ _tiling_window_tree_node_move_walker(void *_node) #undef IF_MATCH_SET_TB void -tiling_window_tree_node_move(Window_Tree *node, int cross_edge) +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; @@ -546,22 +557,24 @@ 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; + E_Client *ec = node->client; + + node->client = _node_move_ctx.ret->client; + _node_move_ctx.ret->client = ec; } } + /* End Node move. */ void -tiling_window_tree_dump(Window_Tree *root, int level) +tiling_window_tree_dump(Window_Tree * root, int level) { int i; if (!root) return; - for (i = 0 ; i < level ; i++) + for (i = 0; i < level; i++) printf(" "); if (root->children) @@ -572,8 +585,9 @@ 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); - } + { + tiling_window_tree_dump(itr, level + 1); + } } diff --git a/src/modules/tiling/window_tree.h b/src/modules/tiling/window_tree.h index cd960e85b..bf38cd154 100644 --- a/src/modules/tiling/window_tree.h +++ b/src/modules/tiling/window_tree.h @@ -1,13 +1,14 @@ #ifndef WINDOW_TREE_H -#define WINDOW_TREE_H -#include +# define WINDOW_TREE_H +# include /* XXX: First two have to be 0 and 1 because I use them with modulo. */ -typedef enum { - TILING_SPLIT_HORIZONTAL = 0, - TILING_SPLIT_VERTICAL = 1, - TILING_SPLIT_FLOAT, - TILING_SPLIT_LAST +typedef enum +{ + TILING_SPLIT_HORIZONTAL = 0, + TILING_SPLIT_VERTICAL = 1, + TILING_SPLIT_FLOAT, + TILING_SPLIT_LAST } Tiling_Split_Type; typedef struct _Window_Tree Window_Tree; @@ -18,31 +19,35 @@ struct _Window_Tree EINA_INLIST; Window_Tree *parent; /* FIXME: client is falid iff children is null. Sholud enforce it. */ - Eina_Inlist *children; /* Window_Tree * type */ + Eina_Inlist *children; /* Window_Tree * type */ E_Client *client; double weight; }; -#define TILING_WINDOW_TREE_EDGE_LEFT (1 << 0) -#define TILING_WINDOW_TREE_EDGE_RIGHT (1 << 1) -#define TILING_WINDOW_TREE_EDGE_TOP (1 << 2) -#define TILING_WINDOW_TREE_EDGE_BOTTOM (1 << 3) +# define TILING_WINDOW_TREE_EDGE_LEFT (1 << 0) +# define TILING_WINDOW_TREE_EDGE_RIGHT (1 << 1) +# define TILING_WINDOW_TREE_EDGE_TOP (1 << 2) +# define TILING_WINDOW_TREE_EDGE_BOTTOM (1 << 3) -int tiling_window_tree_edges_get(Window_Tree *node); +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 *)); +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_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); +void tiling_window_tree_node_move(Window_Tree * node, int cross_edge); #endif