1 #include "e_mod_tiling.h"
3 /* HACK: Needed to get subobjs of the widget. Is there a better way? */
4 typedef struct _E_Widget_Smart_Data E_Widget_Smart_Data;
6 struct _E_Widget_Smart_Data
8 Evas_Object *parent_obj;
10 Evas_Coord minw, minh;
14 /* Some defines to make coding with the e_widget_* easier for
15 * configuration panel */
16 #define RADIO(title, value, radiogroup) \
17 e_widget_radio_add(evas, _(title), value, radiogroup)
18 #define LIST_ADD(list, object) \
19 e_widget_list_object_append(list, object, 1, 1, 0.5)
21 struct _Config_vdesk *
22 get_vdesk(Eina_List *vdesks,
25 unsigned int zone_num)
28 for (l = vdesks; l; l = l->next) {
29 struct _Config_vdesk *vd = l->data;
33 if (vd->nb_stacks < 0 || vd->nb_stacks > TILING_MAX_STACKS)
35 if (vd->x == x && vd->y == y && vd->zone_num == zone_num)
43 * Fills the E_Config_Dialog-struct with the data currently in use
47 _create_data(E_Config_Dialog *cfd __UNUSED__)
49 E_Config_Dialog_Data *cfdata;
52 cfdata = E_NEW(E_Config_Dialog_Data, 1);
54 /* Because we save a lot of lines here by using memcpy,
55 * the structs have to be ordered the same */
56 memcpy(cfdata, tiling_g.config, sizeof(Config));
57 cfdata->config.keyhints = strdup(tiling_g.config->keyhints);
59 /* Handle things which can't be easily memcpy'd */
60 cfdata->config.vdesks = NULL;
62 for (l = tiling_g.config->vdesks; l; l = l->next) {
63 struct _Config_vdesk *vd = l->data,
69 newvd = E_NEW(struct _Config_vdesk, 1);
72 newvd->zone_num = vd->zone_num;
73 newvd->nb_stacks = vd->nb_stacks;
74 newvd->use_rows = vd->use_rows;
76 EINA_LIST_APPEND(cfdata->config.vdesks, newvd);
83 _free_data(E_Config_Dialog *cfd __UNUSED__,
84 E_Config_Dialog_Data *cfdata)
86 eina_list_free(cfdata->config.vdesks);
87 free(cfdata->config.keyhints);
92 _fill_zone_config(E_Zone *zone,
93 E_Config_Dialog_Data *cfdata)
100 /* Clear old entries first */
101 evas_object_del(cfdata->o_desklist);
103 cfdata->o_desklist = e_widget_list_add(evas, 1, 0);
105 for (i = 0; i < zone->desk_y_count * zone->desk_x_count; i++) {
106 E_Desk *desk = zone->desks[i];
107 struct _Config_vdesk *vd;
108 Evas_Object *list, *slider, *radio;
114 vd = get_vdesk(cfdata->config.vdesks, desk->x, desk->y, zone->num);
116 vd = E_NEW(struct _Config_vdesk, 1);
119 vd->zone_num = zone->num;
123 EINA_LIST_APPEND(cfdata->config.vdesks, vd);
126 list = e_widget_list_add(evas, false, true);
128 LIST_ADD(list, e_widget_label_add(evas, desk->name));
129 slider = e_widget_slider_add(evas, 1, 0, _("%1.0f"),
130 0.0, 8.0, 1.0, 0, NULL,
131 &vd->nb_stacks, 150);
132 LIST_ADD(list, slider);
134 rg = e_widget_radio_group_new(&vd->use_rows);
135 radio = e_widget_radio_add(evas, _("columns"), 0, rg);
136 LIST_ADD(list, radio);
137 radio = e_widget_radio_add(evas, _("rows"), 1, rg);
138 LIST_ADD(list, radio);
140 LIST_ADD(cfdata->o_desklist, list);
143 /* Get the correct sizes of desklist and scrollframe */
144 LIST_ADD(cfdata->osf, cfdata->o_desklist);
148 _cb_zone_change(void *data,
149 Evas_Object *obj __UNUSED__)
152 E_Config_Dialog_Data *cfdata = data;
155 if (!cfdata || !cfdata->o_zonelist)
158 n = e_widget_ilist_selected_get(cfdata->o_zonelist);
159 zone = e_widget_ilist_nth_data_get(cfdata->o_zonelist, n);
162 _fill_zone_config(zone, cfdata);
166 _basic_create_widgets(E_Config_Dialog *cfd __UNUSED__,
168 E_Config_Dialog_Data *cfdata)
170 Evas_Object *o, *oc, *of;
175 con = e_container_current_get(e_manager_current_get());
177 o = e_widget_list_add(evas, 0, 0);
179 /* General settings */
180 of = e_widget_framelist_add(evas, _("General"), 0);
181 e_widget_framelist_object_append(of,
182 e_widget_check_add(evas, _("Tile dialog windows as well"),
183 &cfdata->config.tile_dialogs));
184 e_widget_framelist_object_append(of,
185 e_widget_check_add(evas, _("Show window titles"),
186 &cfdata->config.show_titles));
187 oc = e_widget_list_add(evas, false, true);
188 e_widget_list_object_append(oc,
189 e_widget_label_add(evas, _("Key hints")), 1, 0, 0.5);
190 e_widget_list_object_append(oc,
191 e_widget_entry_add(evas, &cfdata->config.keyhints, NULL, NULL, NULL),
193 e_widget_framelist_object_append(of, oc);
197 /* Virtual desktop settings */
198 of = e_widget_framelist_add(evas, _("Virtual Desktops"), 0);
199 e_widget_label_add(evas,
200 _("Number of columns used to tile per desk"
201 " (0 → tiling disabled):"));
202 cfdata->osf = e_widget_list_add(evas, 0, 1);
205 cfdata->o_zonelist = e_widget_ilist_add(evas, 0, 0, NULL);
206 e_widget_ilist_multi_select_set(cfdata->o_zonelist, false);
207 e_widget_size_min_set(cfdata->o_zonelist, 100, 100);
208 e_widget_on_change_hook_set(cfdata->o_zonelist, _cb_zone_change, cfdata);
209 for (l = con->zones; l; l = l->next) {
210 if (!(zone = l->data))
212 e_widget_ilist_append(cfdata->o_zonelist, NULL, zone->name, NULL, zone, NULL);
214 e_widget_ilist_go(cfdata->o_zonelist);
215 e_widget_ilist_thaw(cfdata->o_zonelist);
217 LIST_ADD(cfdata->osf, cfdata->o_zonelist);
219 /* List of individual tiling modes */
222 _fill_zone_config(eina_list_data_get(con->zones), cfdata);
224 e_widget_ilist_selected_set(cfdata->o_zonelist, 0);
226 e_widget_framelist_object_append(of, cfdata->osf);
234 _basic_apply_data(E_Config_Dialog *cfd __UNUSED__,
235 E_Config_Dialog_Data *cfdata)
237 struct _Config_vdesk *vd;
240 tiling_g.config->tile_dialogs = cfdata->config.tile_dialogs;
241 tiling_g.config->show_titles = cfdata->config.show_titles;
242 if (strcmp(tiling_g.config->keyhints, cfdata->config.keyhints)) {
243 free(tiling_g.config->keyhints);
244 if (!cfdata->config.keyhints || !*cfdata->config.keyhints) {
245 tiling_g.config->keyhints = strdup(tiling_g.default_keyhints);
247 char *c = cfdata->config.keyhints;
248 int len = strlen(cfdata->config.keyhints);
250 /* Remove duplicates */
254 while ((f = strchr(f, *c))) {
255 *f = cfdata->config.keyhints[--len];
256 cfdata->config.keyhints[len] = '\0';
260 tiling_g.config->keyhints = strdup(cfdata->config.keyhints);
264 /* Check if the layout for one of the vdesks has changed */
265 for (l = tiling_g.config->vdesks; l; l = l->next) {
266 struct _Config_vdesk *newvd;
272 if (!(newvd = get_vdesk(cfdata->config.vdesks,
273 vd->x, vd->y, vd->zone_num))) {
274 change_desk_conf(vd);
278 if (newvd->nb_stacks != vd->nb_stacks
279 || newvd->use_rows != vd->use_rows) {
280 DBG("number of columns for (%d, %d, %d) changed from %d|%d"
282 vd->x, vd->y, vd->zone_num,
283 vd->nb_stacks, vd->use_rows,
284 newvd->nb_stacks, newvd->use_rows);
285 change_desk_conf(newvd);
291 for (l = cfdata->config.vdesks; l; l = l->next) {
296 if (!get_vdesk(tiling_g.config->vdesks,
297 vd->x, vd->y, vd->zone_num)) {
298 change_desk_conf(vd);
303 EINA_LIST_FREE(tiling_g.config->vdesks, vd) {
306 tiling_g.config->vdesks = NULL;
308 for (l = cfdata->config.vdesks; l; l = l->next) {
309 struct _Config_vdesk *newvd;
315 newvd = E_NEW(struct _Config_vdesk, 1);
318 newvd->zone_num = vd->zone_num;
319 newvd->nb_stacks = vd->nb_stacks;
320 newvd->use_rows = vd->use_rows;
322 EINA_LIST_APPEND(tiling_g.config->vdesks, newvd);
325 e_tiling_update_conf();
327 e_config_save_queue();
333 e_int_config_tiling_module(E_Container *con,
334 const char *params __UNUSED__)
336 E_Config_Dialog *cfd;
337 E_Config_Dialog_View *v;
340 if (e_config_dialog_find("E", "windows/tiling"))
343 v = E_NEW(E_Config_Dialog_View, 1);
345 v->create_cfdata = _create_data;
346 v->free_cfdata = _free_data;
347 v->basic.apply_cfdata = _basic_apply_data;
348 v->basic.create_widgets = _basic_create_widgets;
350 snprintf(buf, sizeof(buf), "%s/e-module-tiling.edj",
351 e_module_dir_get(tiling_g.module));
352 cfd = e_config_dialog_new(con,
353 _("Tiling Configuration"),
354 "E", "windows/tiling",