enlightenment/src/bin/e_int_client_prop.c

523 lines
16 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "e.h"
#define MODE_NOTHING 0
#define MODE_GEOMETRY 1
#define MODE_LOCKS 2
#define MODE_GEOMETRY_LOCKS 3
#define MODE_ALL 4
static void _ec_cb_dialog_del(void *obj);
static void _ec_cb_dialog_close(void *data, E_Dialog *dia);
static Evas_Object *_ec_icccm_create(E_Dialog *dia, void *data);
static Evas_Object *_ec_netwm_create(E_Dialog *dia, void *data);
static void _ec_go(void *data, void *data2);
static void _create_data(E_Dialog *cfd, E_Client *ec);
static void _free_data(E_Dialog *cfd, E_Config_Dialog_Data *cfdata);
struct _E_Config_Dialog_Data
{
E_Client *client;
/*- BASIC -*/
struct
{
char *title;
char *name;
char *class;
char *icon_name;
char *machine;
char *role;
char *min;
char *max;
char *base;
char *step;
char *aspect;
char *initial_state;
char *state;
char *window_id;
char *window_group;
char *transient_for;
char *client_leader;
char *gravity;
char *command;
int take_focus;
int accepts_focus;
int urgent;
int delete_request;
int request_pos;
} icccm;
struct
{
char *name;
char *icon_name;
int modal;
int sticky;
int shaded;
int skip_taskbar;
int skip_pager;
int hidden;
int fullscreen;
char *stacking;
} netwm;
};
E_API void
e_int_client_prop(E_Client *ec)
{
E_Dialog *dia;
if (ec->border_prop_dialog) return;
dia = e_dialog_new(NULL, "E", "_window_props");
e_object_del_attach_func_set(E_OBJECT(dia), _ec_cb_dialog_del);
_create_data(dia, ec);
_ec_go(dia, (void *)0);
e_dialog_button_add(dia, _("Close"), NULL, _ec_cb_dialog_close, dia);
elm_win_center(dia->win, 1, 1);
e_dialog_show(dia);
e_dialog_border_icon_set(dia, "preferences-system-windows");
evas_object_layer_set(e_win_client_get(dia->win)->frame, ec->layer);
}
static void
_create_data(E_Dialog *cfd, E_Client *ec)
{
E_Config_Dialog_Data *cfdata;
char buf[4096];
cfdata = E_NEW(E_Config_Dialog_Data, 1);
cfdata->client = ec;
ec->border_prop_dialog = cfd;
#define IFDUP(prop, dest) \
if (cfdata->client->prop) \
cfdata->dest = strdup(cfdata->client->prop)
IFDUP(icccm.title, icccm.title);
IFDUP(icccm.name, icccm.name);
IFDUP(icccm.class, icccm.class);
IFDUP(icccm.icon_name, icccm.icon_name);
IFDUP(icccm.machine, icccm.machine);
IFDUP(icccm.window_role, icccm.role);
if (cfdata->client->icccm.min_w >= 0)
{
snprintf(buf, sizeof(buf), _("%i×%i"),
cfdata->client->icccm.min_w,
cfdata->client->icccm.min_h);
cfdata->icccm.min = strdup(buf);
}
if (cfdata->client->icccm.max_w >= 0)
{
snprintf(buf, sizeof(buf), _("%i×%i"),
cfdata->client->icccm.max_w,
cfdata->client->icccm.max_h);
cfdata->icccm.max = strdup(buf);
}
if (cfdata->client->icccm.base_w >= 0)
{
snprintf(buf, sizeof(buf), _("%i×%i"),
cfdata->client->icccm.base_w,
cfdata->client->icccm.base_h);
cfdata->icccm.base = strdup(buf);
}
if (cfdata->client->icccm.step_w >= 0)
{
snprintf(buf, sizeof(buf), _("%i,%i"),
cfdata->client->icccm.step_w,
cfdata->client->icccm.step_h);
cfdata->icccm.step = strdup(buf);
}
if ((cfdata->client->icccm.min_aspect > 0.0) &&
(cfdata->client->icccm.max_aspect > 0.0))
{
if (EINA_DBL_EQ(cfdata->client->icccm.min_aspect, cfdata->client->icccm.max_aspect))
snprintf(buf, sizeof(buf), _("%1.3f"),
cfdata->client->icccm.min_aspect);
else
snprintf(buf, sizeof(buf), _("%1.3f%1.3f"),
cfdata->client->icccm.min_aspect,
cfdata->client->icccm.max_aspect);
cfdata->icccm.aspect = strdup(buf);
}
#ifndef HAVE_WAYLAND_ONLY
if (cfdata->client->icccm.initial_state != ECORE_X_WINDOW_STATE_HINT_NONE)
{
switch (cfdata->client->icccm.initial_state)
{
case ECORE_X_WINDOW_STATE_HINT_WITHDRAWN:
snprintf(buf, sizeof(buf), _("Withdrawn"));
break;
case ECORE_X_WINDOW_STATE_HINT_NORMAL:
snprintf(buf, sizeof(buf), _("Normal"));
break;
case ECORE_X_WINDOW_STATE_HINT_ICONIC:
snprintf(buf, sizeof(buf), _("Iconic"));
break;
default:
buf[0] = 0;
break;
}
cfdata->icccm.initial_state = strdup(buf);
}
if (cfdata->client->icccm.state != ECORE_X_WINDOW_STATE_HINT_NONE)
{
switch (cfdata->client->icccm.state)
{
case ECORE_X_WINDOW_STATE_HINT_WITHDRAWN:
snprintf(buf, sizeof(buf), _("Withdrawn"));
break;
case ECORE_X_WINDOW_STATE_HINT_NORMAL:
snprintf(buf, sizeof(buf), _("Normal"));
break;
case ECORE_X_WINDOW_STATE_HINT_ICONIC:
snprintf(buf, sizeof(buf), _("Iconic"));
break;
default:
buf[0] = 0;
break;
}
cfdata->icccm.state = strdup(buf);
}
#endif
snprintf(buf, sizeof(buf), "0x%08x",
(unsigned int)e_client_util_win_get(cfdata->client));
cfdata->icccm.window_id = strdup(buf);
if (cfdata->client->icccm.window_group != 0)
{
snprintf(buf, sizeof(buf), "0x%08x",
(unsigned int)cfdata->client->icccm.window_group);
cfdata->icccm.window_group = strdup(buf);
}
if (cfdata->client->icccm.transient_for != 0)
{
snprintf(buf, sizeof(buf), "0x%08x",
(unsigned int)cfdata->client->icccm.transient_for);
cfdata->icccm.transient_for = strdup(buf);
}
if (cfdata->client->icccm.client_leader != 0)
{
snprintf(buf, sizeof(buf), "0x%08x",
(unsigned int)cfdata->client->icccm.client_leader);
cfdata->icccm.client_leader = strdup(buf);
}
#ifndef HAVE_WAYLAND_ONLY
switch (cfdata->client->icccm.gravity)
{
case ECORE_X_GRAVITY_FORGET:
snprintf(buf, sizeof(buf), _("Forget/Unmap"));
break;
case ECORE_X_GRAVITY_NW:
snprintf(buf, sizeof(buf), _("Northwest"));
break;
case ECORE_X_GRAVITY_N:
snprintf(buf, sizeof(buf), _("North"));
break;
case ECORE_X_GRAVITY_NE:
snprintf(buf, sizeof(buf), _("Northeast"));
break;
case ECORE_X_GRAVITY_W:
snprintf(buf, sizeof(buf), _("West"));
break;
case ECORE_X_GRAVITY_CENTER:
snprintf(buf, sizeof(buf), _("Center"));
break;
case ECORE_X_GRAVITY_E:
snprintf(buf, sizeof(buf), _("East"));
break;
case ECORE_X_GRAVITY_SW:
snprintf(buf, sizeof(buf), _("Southwest"));
break;
case ECORE_X_GRAVITY_S:
snprintf(buf, sizeof(buf), _("South"));
break;
case ECORE_X_GRAVITY_SE:
snprintf(buf, sizeof(buf), _("Southeast"));
break;
case ECORE_X_GRAVITY_STATIC:
snprintf(buf, sizeof(buf), _("Static"));
break;
default:
buf[0] = 0;
break;
}
cfdata->icccm.gravity = strdup(buf);
#endif
if (cfdata->client->icccm.command.argv)
{
int i;
buf[0] = 0;
for (i = 0; i < cfdata->client->icccm.command.argc; i++)
{
if ((sizeof(buf) - strlen(buf)) <
(strlen(cfdata->client->icccm.command.argv[i]) - 2))
break;
strcat(buf, cfdata->client->icccm.command.argv[i]);
strcat(buf, " ");
}
cfdata->icccm.command = strdup(buf);
}
cfdata->icccm.take_focus = cfdata->client->icccm.take_focus;
cfdata->icccm.accepts_focus = cfdata->client->icccm.accepts_focus;
cfdata->icccm.urgent = cfdata->client->icccm.urgent;
cfdata->icccm.delete_request = cfdata->client->icccm.delete_request;
cfdata->icccm.request_pos = cfdata->client->icccm.request_pos;
IFDUP(netwm.name, netwm.name);
IFDUP(netwm.icon_name, netwm.icon_name);
cfdata->netwm.modal = cfdata->client->netwm.state.modal;
cfdata->netwm.sticky = cfdata->client->netwm.state.sticky;
cfdata->netwm.shaded = cfdata->client->netwm.state.shaded;
cfdata->netwm.skip_taskbar = cfdata->client->netwm.state.skip_taskbar;
cfdata->netwm.skip_pager = cfdata->client->netwm.state.skip_pager;
cfdata->netwm.hidden = cfdata->client->netwm.state.hidden;
cfdata->netwm.fullscreen = cfdata->client->netwm.state.fullscreen;
switch (cfdata->client->netwm.state.stacking)
{
case 0:
cfdata->netwm.stacking = strdup(_("None"));
break;
case 1:
cfdata->netwm.stacking = strdup(_("Above"));
break;
case 2:
cfdata->netwm.stacking = strdup(_("Below"));
break;
}
cfd->data = cfdata;
}
static void
_free_data(E_Dialog *cfd, E_Config_Dialog_Data *cfdata)
{
if (cfdata->client)
cfdata->client->border_prop_dialog = NULL;
/* Free the cfdata */
#define IFREE(x) E_FREE(cfdata->x)
IFREE(icccm.title);
IFREE(icccm.name);
IFREE(icccm.class);
IFREE(icccm.icon_name);
IFREE(icccm.machine);
IFREE(icccm.role);
IFREE(icccm.min);
IFREE(icccm.max);
IFREE(icccm.base);
IFREE(icccm.step);
IFREE(icccm.aspect);
IFREE(icccm.initial_state);
IFREE(icccm.state);
IFREE(icccm.window_id);
IFREE(icccm.window_group);
IFREE(icccm.transient_for);
IFREE(icccm.client_leader);
IFREE(icccm.gravity);
IFREE(icccm.command);
IFREE(netwm.name);
IFREE(netwm.icon_name);
IFREE(netwm.stacking);
free(cfdata);
cfd->data = NULL;
}
static void
_ec_cb_dialog_del(void *obj)
{
E_Dialog *dia;
dia = obj;
if (dia->data)
_free_data(dia, dia->data);
}
static void
_ec_cb_dialog_close(void *data EINA_UNUSED, E_Dialog *dia)
{
if (dia->data)
_free_data(dia, dia->data);
e_object_del(E_OBJECT(dia));
}
static void
_ec_go(void *data, void *data2)
{
E_Dialog *dia;
Evas_Object *c, *o, *ob;
Evas_Coord w, h;
dia = data;
if (!dia) return;
if (dia->content_object)
evas_object_del(dia->content_object);
c = e_widget_list_add(evas_object_evas_get(dia->win), 0, 0);
if (!data2)
{
o = _ec_icccm_create(dia, NULL);
e_dialog_title_set(dia, _("ICCCM Properties"));
e_widget_list_object_append(c, o, 1, 1, 0.0);
ob = e_widget_button_add(evas_object_evas_get(dia->win), _("NetWM"), "go-next",
_ec_go, dia, (void *)1);
}
else
{
o = _ec_netwm_create(dia, NULL);
e_dialog_title_set(dia, _("NetWM Properties"));
e_widget_list_object_append(c, o, 1, 1, 0.0);
ob = e_widget_button_add(evas_object_evas_get(dia->win), _("ICCCM"), "go-next",
_ec_go, dia, (void *)0);
}
e_widget_list_object_append(c, ob, 0, 0, 1.0);
e_widget_size_min_get(c, &w, &h);
e_dialog_content_set(dia, c, w, h);
e_dialog_show(dia);
}
#define STR_ENTRY(label, x, y, val) \
{ \
Evas_Coord mw, mh; \
ob = e_widget_label_add(evas, label); \
if (!cfdata->val) e_widget_disabled_set(ob, 1); \
e_widget_table_object_append(o, ob, x, y, 1, 1, 1, 1, 0, 1); \
ob = e_widget_entry_add(dia->win, & (cfdata->val), NULL, NULL, NULL); \
e_widget_entry_readonly_set(ob, 1); \
e_widget_size_min_get(ob, &mw, &mh); \
e_widget_size_min_set(ob, 160, mh); \
e_widget_table_object_append(o, ob, x + 1, y, 1, 1, 1, 0, 1, 0); \
}
#define CHK_ENTRY(label, x, y, val) \
{ \
ob = e_widget_label_add(evas, label); \
e_widget_table_object_append(o, ob, x, y, 1, 1, 1, 1, 0, 1); \
ob = e_widget_check_add(evas, "", & (cfdata->val)); \
e_widget_disabled_set(ob, 1); \
e_widget_table_object_append(o, ob, x + 1, y, 1, 1, 1, 0, 1, 0); \
}
static Evas_Object *
_ec_icccm_create(E_Dialog *dia, void *data EINA_UNUSED)
{
Evas *evas;
Evas_Object *o, *ob, *otb;
E_Config_Dialog_Data *cfdata;
if (!dia) return NULL;
cfdata = dia->data;
if (dia->content_object)
evas_object_del(dia->content_object);
evas = evas_object_evas_get(dia->win);
otb = e_widget_toolbook_add(evas, 48 * e_scale, 48 * e_scale);
o = e_widget_table_add(e_win_evas_win_get(evas), 0);
STR_ENTRY(_("Title"), 0, 0, icccm.title);
STR_ENTRY(_("Name"), 0, 1, icccm.name);
STR_ENTRY(_("Class"), 0, 2, icccm.class);
STR_ENTRY(_("Icon Name"), 0, 3, icccm.icon_name);
STR_ENTRY(_("Machine"), 0, 4, icccm.machine);
STR_ENTRY(_("Role"), 0, 5, icccm.role);
e_widget_toolbook_page_append(otb, NULL, _("General"), o, 1, 1, 1, 1, 0.5, 0.0);
o = e_widget_table_add(e_win_evas_win_get(evas), 0);
STR_ENTRY(_("Minimum Size"), 0, 6, icccm.min);
STR_ENTRY(_("Maximum Size"), 0, 7, icccm.max);
STR_ENTRY(_("Base Size"), 0, 8, icccm.base);
STR_ENTRY(_("Resize Steps"), 0, 9, icccm.step);
e_widget_toolbook_page_append(otb, NULL, _("Sizing"), o, 1, 1, 1, 1, 0.5, 0.0);
o = e_widget_table_add(e_win_evas_win_get(evas), 0);
STR_ENTRY(_("Aspect Ratio"), 2, 0, icccm.aspect);
STR_ENTRY(_("Initial State"), 2, 1, icccm.initial_state);
STR_ENTRY(_("State"), 2, 2, icccm.state);
STR_ENTRY(_("Window ID"), 2, 3, icccm.window_id);
STR_ENTRY(_("Window Group"), 2, 4, icccm.window_group);
STR_ENTRY(_("Transient For"), 2, 5, icccm.transient_for);
STR_ENTRY(_("Client Leader"), 2, 6, icccm.client_leader);
STR_ENTRY(_("Gravity"), 2, 7, icccm.gravity);
STR_ENTRY(_("Command"), 2, 8, icccm.command);
e_widget_toolbook_page_append(otb, NULL, _("States"), o, 1, 1, 1, 1, 0.5, 0.0);
o = e_widget_table_add(e_win_evas_win_get(evas), 0);
CHK_ENTRY(_("Take Focus"), 0, 11, icccm.take_focus);
CHK_ENTRY(_("Accepts Focus"), 0, 12, icccm.accepts_focus);
CHK_ENTRY(_("Urgent"), 0, 13, icccm.urgent);
CHK_ENTRY(_("Request Delete"), 2, 11, icccm.delete_request);
CHK_ENTRY(_("Request Position"), 2, 12, icccm.request_pos);
e_widget_toolbook_page_append(otb, NULL, _("Settings"), o, 1, 1, 1, 1, 0.5, 0.0);
e_widget_toolbook_page_show(otb, 0);
return otb;
}
static Evas_Object *
_ec_netwm_create(E_Dialog *dia, void *data EINA_UNUSED)
{
Evas *evas;
Evas_Object *o, *ob, *otb;
E_Config_Dialog_Data *cfdata;
if (!dia) return NULL;
cfdata = dia->data;
if (dia->content_object)
evas_object_del(dia->content_object);
evas = evas_object_evas_get(dia->win);
otb = e_widget_toolbook_add(evas, 48 * e_scale, 48 * e_scale);
o = e_widget_table_add(e_win_evas_win_get(evas), 0);
STR_ENTRY(_("Name"), 0, 1, netwm.name);
STR_ENTRY(_("Icon Name"), 0, 2, netwm.icon_name);
STR_ENTRY(_("Stacking"), 0, 3, netwm.stacking);
e_widget_toolbook_page_append(otb, NULL, _("General"), o, 1, 1, 1, 1, 0.5, 0.0);
o = e_widget_table_add(e_win_evas_win_get(evas), 0);
CHK_ENTRY(_("Modal"), 0, 4, netwm.modal);
CHK_ENTRY(_("Sticky"), 0, 5, netwm.sticky);
CHK_ENTRY(_("Shaded"), 0, 6, netwm.shaded);
CHK_ENTRY(_("Skip Taskbar"), 0, 7, netwm.skip_taskbar);
CHK_ENTRY(_("Skip Pager"), 0, 8, netwm.skip_pager);
CHK_ENTRY(_("Hidden"), 0, 9, netwm.hidden);
CHK_ENTRY(_("Fullscreen"), 0, 10, netwm.fullscreen);
e_widget_toolbook_page_append(otb, NULL, _("Settings"), o, 1, 1, 1, 1, 0.5, 0.0);
e_widget_toolbook_page_show(otb, 0);
return otb;
}