forked from enlightenment/efl
Add some utility functions for get/setting window properties.
Move a number of ecore_x_window_prop_property_get/set calls to the new ones. Eliminate broken (64bit arch) _ATOM_SET_... macros. New functions should be solid as they have been in e16 for ages. Changes in ecore_x_icccm/netwm.c have not been tested thoroughly. SVN revision: 19543
This commit is contained in:
parent
29f6991aa1
commit
34cf6187a7
|
@ -941,6 +941,12 @@ typedef enum _Ecore_X_Window_Configure_Mask {
|
|||
#define ECORE_X_WINDOW_LAYER_NORMAL 4
|
||||
#define ECORE_X_WINDOW_LAYER_ABOVE 6
|
||||
|
||||
/* Property list operations */
|
||||
#define ECORE_X_PROP_LIST_REMOVE 0
|
||||
#define ECORE_X_PROP_LIST_ADD 1
|
||||
#define ECORE_X_PROP_LIST_TOGGLE 2
|
||||
|
||||
|
||||
EAPI int ecore_x_init(const char *name);
|
||||
EAPI int ecore_x_shutdown(void);
|
||||
EAPI int ecore_x_disconnect(void);
|
||||
|
@ -1053,6 +1059,56 @@ EAPI void ecore_x_window_prop_card32_set(Ecore_X_Window win, Ecore_X
|
|||
unsigned int *val, unsigned int num);
|
||||
EAPI int ecore_x_window_prop_card32_get(Ecore_X_Window win, Ecore_X_Atom atom,
|
||||
unsigned int *val, unsigned int len);
|
||||
EAPI int ecore_x_window_prop_card32_list_get(Ecore_X_Window win,
|
||||
Ecore_X_Atom atom,
|
||||
unsigned int **plst);
|
||||
|
||||
EAPI void ecore_x_window_prop_xid_set(Ecore_X_Window win,
|
||||
Ecore_X_Atom atom,
|
||||
Ecore_X_Atom type,
|
||||
Ecore_X_ID * lst,
|
||||
unsigned int num);
|
||||
EAPI int ecore_x_window_prop_xid_get(Ecore_X_Window win,
|
||||
Ecore_X_Atom atom,
|
||||
Ecore_X_Atom type,
|
||||
Ecore_X_ID * lst,
|
||||
unsigned int len);
|
||||
EAPI int ecore_x_window_prop_xid_list_get(Ecore_X_Window win,
|
||||
Ecore_X_Atom atom,
|
||||
Ecore_X_Atom type,
|
||||
Ecore_X_ID ** plst);
|
||||
EAPI void ecore_x_window_prop_xid_list_change(Ecore_X_Window win,
|
||||
Ecore_X_Atom atom,
|
||||
Ecore_X_Atom type,
|
||||
Ecore_X_ID item,
|
||||
int op);
|
||||
EAPI void ecore_x_window_prop_atom_set(Ecore_X_Window win,
|
||||
Ecore_X_Atom atom,
|
||||
Ecore_X_Atom * val,
|
||||
unsigned int num);
|
||||
EAPI int ecore_x_window_prop_atom_get(Ecore_X_Window win,
|
||||
Ecore_X_Atom atom,
|
||||
Ecore_X_Atom * val,
|
||||
unsigned int len);
|
||||
EAPI int ecore_x_window_prop_atom_list_get(Ecore_X_Window win,
|
||||
Ecore_X_Atom atom,
|
||||
Ecore_X_Atom ** plst);
|
||||
EAPI void ecore_x_window_prop_atom_list_change(Ecore_X_Window win,
|
||||
Ecore_X_Atom atom,
|
||||
Ecore_X_Atom item,
|
||||
int op);
|
||||
EAPI void ecore_x_window_prop_window_set(Ecore_X_Window win,
|
||||
Ecore_X_Atom atom,
|
||||
Ecore_X_Window * val,
|
||||
unsigned int num);
|
||||
EAPI int ecore_x_window_prop_window_get(Ecore_X_Window win,
|
||||
Ecore_X_Atom atom,
|
||||
Ecore_X_Window * val,
|
||||
unsigned int len);
|
||||
EAPI int ecore_x_window_prop_window_list_get(Ecore_X_Window win,
|
||||
Ecore_X_Atom atom,
|
||||
Ecore_X_Window ** plst);
|
||||
|
||||
EAPI Ecore_X_Atom ecore_x_window_prop_any_type(void);
|
||||
EAPI void ecore_x_window_prop_property_set(Ecore_X_Window win, Ecore_X_Atom type, Ecore_X_Atom format, int size, void *data, int number);
|
||||
EAPI int ecore_x_window_prop_property_get(Ecore_X_Window win, Ecore_X_Atom property, Ecore_X_Atom type, int size, unsigned char **data, int *num);
|
||||
|
|
|
@ -1024,9 +1024,8 @@ ecore_x_icccm_window_role_get(Ecore_X_Window win)
|
|||
void
|
||||
ecore_x_icccm_client_leader_set(Ecore_X_Window win, Ecore_X_Window l)
|
||||
{
|
||||
ecore_x_window_prop_property_set(win,
|
||||
ECORE_X_ATOM_WM_CLIENT_LEADER,
|
||||
XA_WINDOW, 32, &l, 1);
|
||||
ecore_x_window_prop_window_set(win, ECORE_X_ATOM_WM_CLIENT_LEADER,
|
||||
&l, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1036,22 +1035,11 @@ ecore_x_icccm_client_leader_set(Ecore_X_Window win, Ecore_X_Window l)
|
|||
Ecore_X_Window
|
||||
ecore_x_icccm_client_leader_get(Ecore_X_Window win)
|
||||
{
|
||||
unsigned char *data;
|
||||
int num;
|
||||
Ecore_X_Window l;
|
||||
|
||||
if (ecore_x_window_prop_property_get(win,
|
||||
ECORE_X_ATOM_WM_CLIENT_LEADER,
|
||||
XA_WINDOW, 32, &data, &num))
|
||||
{
|
||||
if (data)
|
||||
{
|
||||
Ecore_X_Window wlead;
|
||||
|
||||
wlead = *((Ecore_X_Window *)data);
|
||||
free(data);
|
||||
return wlead;
|
||||
}
|
||||
}
|
||||
if (ecore_x_window_prop_window_get(win, ECORE_X_ATOM_WM_CLIENT_LEADER,
|
||||
&l, 1) > 0)
|
||||
return l;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -49,21 +49,9 @@ static void _ecore_x_netwm_startup_info_free(void *data);
|
|||
#define _ATOM_GET(name) \
|
||||
XInternAtom(_ecore_x_disp, name, False)
|
||||
|
||||
#define _ATOM_SET_UTF8_STRING(win, atom, string) \
|
||||
XChangeProperty(_ecore_x_disp, win, atom, ECORE_X_ATOM_UTF8_STRING, 8, PropModeReplace, \
|
||||
(unsigned char *)string, strlen(string))
|
||||
#define _ATOM_SET_UTF8_STRING_LIST(win, atom, string, cnt) \
|
||||
XChangeProperty(_ecore_x_disp, win, atom, ECORE_X_ATOM_UTF8_STRING, 8, PropModeReplace, \
|
||||
(unsigned char *)string, cnt)
|
||||
#define _ATOM_SET_WINDOW(win, atom, p_wins, cnt) \
|
||||
XChangeProperty(_ecore_x_disp, win, atom, XA_WINDOW, 32, PropModeReplace, \
|
||||
(unsigned char *)p_wins, cnt)
|
||||
#define _ATOM_SET_ATOM(win, atom, p_atom, cnt) \
|
||||
XChangeProperty(_ecore_x_disp, win, atom, XA_ATOM, 32, PropModeReplace, \
|
||||
(unsigned char *)p_atom, cnt)
|
||||
#define _ATOM_SET_CARD32(win, atom, p_val, cnt) \
|
||||
XChangeProperty(_ecore_x_disp, win, atom, XA_CARDINAL, 32, PropModeReplace, \
|
||||
(unsigned char *)p_val, cnt)
|
||||
|
||||
/*
|
||||
* Local variables
|
||||
|
@ -281,11 +269,11 @@ void
|
|||
ecore_x_netwm_wm_identify(Ecore_X_Window root, Ecore_X_Window check,
|
||||
const char *wm_name)
|
||||
{
|
||||
_ATOM_SET_WINDOW(root, ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK, &check, 1);
|
||||
_ATOM_SET_WINDOW(check, ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK, &check, 1);
|
||||
_ATOM_SET_UTF8_STRING(check, ECORE_X_ATOM_NET_WM_NAME, wm_name);
|
||||
ecore_x_window_prop_window_set(root, ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK, &check, 1);
|
||||
ecore_x_window_prop_window_set(check, ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK, &check, 1);
|
||||
_ecore_x_window_prop_string_utf8_set(check, ECORE_X_ATOM_NET_WM_NAME, wm_name);
|
||||
/* This one isn't mandatory */
|
||||
_ATOM_SET_UTF8_STRING(root, ECORE_X_ATOM_NET_WM_NAME, wm_name);
|
||||
_ecore_x_window_prop_string_utf8_set(root, ECORE_X_ATOM_NET_WM_NAME, wm_name);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -294,26 +282,23 @@ ecore_x_netwm_wm_identify(Ecore_X_Window root, Ecore_X_Window check,
|
|||
void
|
||||
ecore_x_netwm_supported_set(Ecore_X_Window root, Ecore_X_Atom *supported, int num)
|
||||
{
|
||||
_ATOM_SET_ATOM(root, ECORE_X_ATOM_NET_SUPPORTED, supported, num);
|
||||
ecore_x_window_prop_atom_set(root, ECORE_X_ATOM_NET_SUPPORTED, supported, num);
|
||||
}
|
||||
|
||||
int
|
||||
ecore_x_netwm_supported_get(Ecore_X_Window root, Ecore_X_Atom **supported, int *num)
|
||||
{
|
||||
int num_ret;
|
||||
unsigned char *data;
|
||||
|
||||
if (num) *num = 0;
|
||||
if (supported) *supported = NULL;
|
||||
|
||||
if (!ecore_x_window_prop_property_get(root, ECORE_X_ATOM_NET_SUPPORTED,
|
||||
XA_ATOM, 32, &data, &num_ret))
|
||||
num_ret = ecore_x_window_prop_atom_list_get(root, ECORE_X_ATOM_NET_SUPPORTED,
|
||||
supported);
|
||||
if (num_ret <= 0)
|
||||
return 0;
|
||||
|
||||
if ((!data) || (!num_ret)) return 0;
|
||||
|
||||
if (num) *num = num_ret;
|
||||
if (supported) *supported = (Ecore_X_Atom *)data;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -331,7 +316,7 @@ void
|
|||
ecore_x_netwm_desk_roots_set(Ecore_X_Window root,
|
||||
Ecore_X_Window *vroots, unsigned int n_desks)
|
||||
{
|
||||
_ATOM_SET_WINDOW(root, ECORE_X_ATOM_NET_VIRTUAL_ROOTS, vroots, n_desks);
|
||||
ecore_x_window_prop_window_set(root, ECORE_X_ATOM_NET_VIRTUAL_ROOTS, vroots, n_desks);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -436,7 +421,8 @@ void
|
|||
ecore_x_netwm_client_list_set(Ecore_X_Window root,
|
||||
Ecore_X_Window *p_clients, unsigned int n_clients)
|
||||
{
|
||||
_ATOM_SET_WINDOW(root, ECORE_X_ATOM_NET_CLIENT_LIST, p_clients, n_clients);
|
||||
ecore_x_window_prop_window_set(root, ECORE_X_ATOM_NET_CLIENT_LIST,
|
||||
p_clients, n_clients);
|
||||
}
|
||||
|
||||
/* Stacking order */
|
||||
|
@ -445,14 +431,15 @@ ecore_x_netwm_client_list_stacking_set(Ecore_X_Window root,
|
|||
Ecore_X_Window *p_clients,
|
||||
unsigned int n_clients)
|
||||
{
|
||||
_ATOM_SET_WINDOW(root, ECORE_X_ATOM_NET_CLIENT_LIST_STACKING, p_clients,
|
||||
n_clients);
|
||||
ecore_x_window_prop_window_set(root, ECORE_X_ATOM_NET_CLIENT_LIST_STACKING,
|
||||
p_clients, n_clients);
|
||||
}
|
||||
|
||||
void
|
||||
ecore_x_netwm_client_active_set(Ecore_X_Window root, Ecore_X_Window win)
|
||||
{
|
||||
_ATOM_SET_WINDOW(root, ECORE_X_ATOM_NET_ACTIVE_WINDOW, &win, 1);
|
||||
ecore_x_window_prop_window_set(root, ECORE_X_ATOM_NET_ACTIVE_WINDOW,
|
||||
&win, 1);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -642,7 +629,6 @@ ecore_x_netwm_strut_partial_get(Ecore_X_Window win, int *left, int *right,
|
|||
int
|
||||
ecore_x_netwm_icons_get(Ecore_X_Window win, Ecore_X_Icon **icon, int *num)
|
||||
{
|
||||
unsigned char *data_ret;
|
||||
unsigned int *data, *p;
|
||||
unsigned int *src;
|
||||
unsigned int len, icons, i;
|
||||
|
@ -651,18 +637,17 @@ ecore_x_netwm_icons_get(Ecore_X_Window win, Ecore_X_Icon **icon, int *num)
|
|||
if (num) *num = 0;
|
||||
if (icon) *icon = NULL;
|
||||
|
||||
if (!ecore_x_window_prop_property_get(win, ECORE_X_ATOM_NET_WM_ICON,
|
||||
XA_CARDINAL, 32, &data_ret, &num_ret))
|
||||
num_ret = ecore_x_window_prop_card32_list_get(win, ECORE_X_ATOM_NET_WM_ICON,
|
||||
&data);
|
||||
if (num_ret <= 0)
|
||||
return 0;
|
||||
if (!data_ret) return 0;
|
||||
if (!data) return 0;
|
||||
if (num_ret < 2)
|
||||
{
|
||||
free(data_ret);
|
||||
free(data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
data = (unsigned int *)data_ret;
|
||||
|
||||
/* Check how many icons there are */
|
||||
icons = 0;
|
||||
p = data;
|
||||
|
@ -672,7 +657,7 @@ ecore_x_netwm_icons_get(Ecore_X_Window win, Ecore_X_Icon **icon, int *num)
|
|||
p += (len + 2);
|
||||
if ((p - data) > num_ret)
|
||||
{
|
||||
free(data_ret);
|
||||
free(data);
|
||||
return 0;
|
||||
}
|
||||
icons++;
|
||||
|
@ -685,7 +670,7 @@ ecore_x_netwm_icons_get(Ecore_X_Window win, Ecore_X_Icon **icon, int *num)
|
|||
/* If the user doesn't want the icons, return */
|
||||
if (!icon)
|
||||
{
|
||||
free(data_ret);
|
||||
free(data);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -693,7 +678,7 @@ ecore_x_netwm_icons_get(Ecore_X_Window win, Ecore_X_Icon **icon, int *num)
|
|||
*icon = malloc(icons * sizeof(Ecore_X_Icon));
|
||||
if (!(*icon))
|
||||
{
|
||||
free(data_ret);
|
||||
free(data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -711,7 +696,7 @@ ecore_x_netwm_icons_get(Ecore_X_Window win, Ecore_X_Icon **icon, int *num)
|
|||
while (i)
|
||||
free(((*icon)[--i]).data);
|
||||
free(*icon);
|
||||
free(data_ret);
|
||||
free(data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -720,7 +705,7 @@ ecore_x_netwm_icons_get(Ecore_X_Window win, Ecore_X_Icon **icon, int *num)
|
|||
p += (len + 2);
|
||||
}
|
||||
|
||||
free(data_ret);
|
||||
free(data);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
@ -879,7 +864,6 @@ _ecore_x_netwm_state_atom_get(Ecore_X_Window_State s)
|
|||
void
|
||||
ecore_x_netwm_window_state_set(Ecore_X_Window win, Ecore_X_Window_State *state, unsigned int num)
|
||||
{
|
||||
unsigned char *data;
|
||||
Ecore_X_Atom *set;
|
||||
int i;
|
||||
|
||||
|
@ -889,36 +873,31 @@ ecore_x_netwm_window_state_set(Ecore_X_Window win, Ecore_X_Window_State *state,
|
|||
return;
|
||||
}
|
||||
|
||||
data = malloc(num * sizeof(Ecore_X_Atom));
|
||||
if (!data) return;
|
||||
set = malloc(num * sizeof(Ecore_X_Atom));
|
||||
if (!set) return;
|
||||
|
||||
set = (Ecore_X_Atom *) data;
|
||||
for (i = 0; i < num; i++)
|
||||
set[i] = _ecore_x_netwm_state_atom_get(state[i]);
|
||||
|
||||
_ATOM_SET_ATOM(win, ECORE_X_ATOM_NET_WM_STATE, data, num);
|
||||
ecore_x_window_prop_atom_set(win, ECORE_X_ATOM_NET_WM_STATE, set, num);
|
||||
|
||||
free(data);
|
||||
return;
|
||||
free(set);
|
||||
}
|
||||
|
||||
int
|
||||
ecore_x_netwm_window_state_get(Ecore_X_Window win, Ecore_X_Window_State **state, unsigned int *num)
|
||||
{
|
||||
int num_ret, i;
|
||||
unsigned char *data;
|
||||
Ecore_X_Atom *atoms;
|
||||
|
||||
if (num) *num = 0;
|
||||
if (state) *state = NULL;
|
||||
|
||||
if (!ecore_x_window_prop_property_get(win, ECORE_X_ATOM_NET_WM_STATE,
|
||||
XA_ATOM, 32, &data, &num_ret))
|
||||
num_ret = ecore_x_window_prop_atom_list_get(win, ECORE_X_ATOM_NET_WM_STATE,
|
||||
&atoms);
|
||||
if (num_ret <= 0)
|
||||
return 0;
|
||||
|
||||
if ((!data) || (!num_ret)) return 0;
|
||||
|
||||
atoms = (Ecore_X_Atom *) data;
|
||||
if (state)
|
||||
{
|
||||
*state = malloc(num_ret * sizeof(Ecore_X_Window_State));
|
||||
|
@ -929,7 +908,7 @@ ecore_x_netwm_window_state_get(Ecore_X_Window win, Ecore_X_Window_State **state,
|
|||
if (num) *num = num_ret;
|
||||
}
|
||||
|
||||
free(data);
|
||||
free(atoms);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -992,8 +971,8 @@ ecore_x_netwm_window_type_set(Ecore_X_Window win, Ecore_X_Window_Type type)
|
|||
Ecore_X_Atom atom;
|
||||
|
||||
atom = _ecore_x_netwm_window_type_atom_get(type);
|
||||
ecore_x_window_prop_property_set(win, ECORE_X_ATOM_NET_WM_WINDOW_TYPE,
|
||||
XA_ATOM, 32, (unsigned char *)&atom, 1);
|
||||
ecore_x_window_prop_atom_set(win, ECORE_X_ATOM_NET_WM_WINDOW_TYPE,
|
||||
&atom, 1);
|
||||
}
|
||||
|
||||
/* FIXME: Maybe return 0 on some conditions? */
|
||||
|
@ -1001,22 +980,21 @@ int
|
|||
ecore_x_netwm_window_type_get(Ecore_X_Window win, Ecore_X_Window_Type *type)
|
||||
{
|
||||
int num, i;
|
||||
unsigned char *data;
|
||||
Ecore_X_Atom *atoms;
|
||||
|
||||
if (type) *type = ECORE_X_WINDOW_TYPE_NORMAL;
|
||||
|
||||
if (!ecore_x_window_prop_property_get(win, ECORE_X_ATOM_NET_WM_WINDOW_TYPE,
|
||||
XA_ATOM, 32, &data, &num))
|
||||
num = ecore_x_window_prop_atom_list_get(win, ECORE_X_ATOM_NET_WM_WINDOW_TYPE,
|
||||
&atoms);
|
||||
if (num < 0)
|
||||
{
|
||||
/* IMO this is not the place to mix netwm and icccm /kwo */
|
||||
/* Check if WM_TRANSIENT_FOR is set */
|
||||
if ((type) && (ecore_x_icccm_transient_for_get(win)))
|
||||
*type = ECORE_X_WINDOW_TYPE_DIALOG;
|
||||
return 1;
|
||||
}
|
||||
|
||||
atoms = (Ecore_X_Atom *) data;
|
||||
|
||||
if (type)
|
||||
{
|
||||
for (i = 0; i < num; ++i)
|
||||
|
@ -1027,7 +1005,7 @@ ecore_x_netwm_window_type_get(Ecore_X_Window win, Ecore_X_Window_Type *type)
|
|||
}
|
||||
}
|
||||
|
||||
free(data);
|
||||
free(atoms);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -1066,15 +1044,14 @@ int
|
|||
ecore_x_netwm_allowed_action_isset(Ecore_X_Window win, Ecore_X_Action action)
|
||||
{
|
||||
int num, i, ret = 0;
|
||||
unsigned char *data;
|
||||
Ecore_X_Atom *atoms, atom;
|
||||
|
||||
if (!ecore_x_window_prop_property_get(win, ECORE_X_ATOM_NET_WM_WINDOW_TYPE,
|
||||
XA_ATOM, 32, &data, &num))
|
||||
num = ecore_x_window_prop_atom_list_get(win, ECORE_X_ATOM_NET_WM_WINDOW_TYPE,
|
||||
&atoms);
|
||||
if (num <= 0)
|
||||
return ret;
|
||||
|
||||
atom = _ecore_x_netwm_action_atom_get(action);
|
||||
atoms = (Ecore_X_Atom *) data;
|
||||
|
||||
for (i = 0; i < num; ++i)
|
||||
{
|
||||
|
@ -1085,7 +1062,7 @@ ecore_x_netwm_allowed_action_isset(Ecore_X_Window win, Ecore_X_Action action)
|
|||
}
|
||||
}
|
||||
|
||||
free(data);
|
||||
free(atoms);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1093,66 +1070,13 @@ ecore_x_netwm_allowed_action_isset(Ecore_X_Window win, Ecore_X_Action action)
|
|||
void
|
||||
ecore_x_netwm_allowed_action_set(Ecore_X_Window win, Ecore_X_Action action, int on)
|
||||
{
|
||||
Ecore_X_Atom atom;
|
||||
Ecore_X_Atom *oldset = NULL, *newset = NULL;
|
||||
int i, j = 0, num = 0;
|
||||
unsigned char *data = NULL;
|
||||
unsigned char *old_data = NULL;
|
||||
Ecore_X_Atom atom;
|
||||
|
||||
atom = _ecore_x_netwm_action_atom_get(action);
|
||||
on = (on) ? ECORE_X_PROP_LIST_ADD : ECORE_X_PROP_LIST_REMOVE;
|
||||
|
||||
ecore_x_window_prop_property_get(win, ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS,
|
||||
XA_ATOM, 32, &old_data, &num);
|
||||
oldset = (Ecore_X_Atom *) old_data;
|
||||
|
||||
if (on)
|
||||
{
|
||||
for (i = 0; i < num; ++i)
|
||||
{
|
||||
if (oldset[i] == atom)
|
||||
goto done;
|
||||
}
|
||||
|
||||
newset = calloc(num + 1, sizeof(Ecore_X_Atom));
|
||||
if (!newset)
|
||||
goto done;
|
||||
|
||||
data = (unsigned char *) newset;
|
||||
for (i = 0; i < num; i++)
|
||||
newset[i] = oldset[i];
|
||||
newset[num] = atom;
|
||||
|
||||
ecore_x_window_prop_property_set(win, ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS,
|
||||
XA_ATOM, 32, data, num + 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
int has;
|
||||
|
||||
has = 0;
|
||||
for (i = 0; i < num; ++i)
|
||||
{
|
||||
if (oldset[i] == atom)
|
||||
has = 1;
|
||||
}
|
||||
if (!has)
|
||||
goto done;
|
||||
|
||||
newset = calloc(num - 1, sizeof(Ecore_X_Atom));
|
||||
if (!newset)
|
||||
goto done;
|
||||
|
||||
data = (unsigned char *) newset;
|
||||
for (i = 0; i < num; i++)
|
||||
if (oldset[i] != atom)
|
||||
newset[j++] = oldset[i];
|
||||
|
||||
ecore_x_window_prop_property_set(win, ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS,
|
||||
XA_ATOM, 32, data, num - 1);
|
||||
}
|
||||
free(newset);
|
||||
done:
|
||||
free(oldset);
|
||||
ecore_x_window_prop_atom_list_change(win, ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS,
|
||||
atom, on);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -1388,7 +1312,8 @@ static void
|
|||
_ecore_x_window_prop_string_utf8_set(Ecore_X_Window win, Ecore_X_Atom atom,
|
||||
const char *str)
|
||||
{
|
||||
_ATOM_SET_UTF8_STRING(win, atom, str);
|
||||
XChangeProperty(_ecore_x_disp, win, atom, ECORE_X_ATOM_UTF8_STRING, 8,
|
||||
PropModeReplace, (unsigned char *)str, strlen(str));
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -78,6 +78,316 @@ ecore_x_window_prop_card32_get(Ecore_X_Window win, Ecore_X_Atom atom,
|
|||
return num;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get CARD32 (array) property of any length
|
||||
*
|
||||
* If the property was successfully fetched the number of items stored in
|
||||
* val is returned, otherwise -1 is returned.
|
||||
* Note: Return value 0 means that the property exists but has no elements.
|
||||
*/
|
||||
int
|
||||
ecore_x_window_prop_card32_list_get(Ecore_X_Window win, Ecore_X_Atom atom,
|
||||
unsigned int **plst)
|
||||
{
|
||||
unsigned char *prop_ret;
|
||||
Atom type_ret;
|
||||
unsigned long bytes_after, num_ret;
|
||||
int format_ret;
|
||||
unsigned int i, *val;
|
||||
int num;
|
||||
|
||||
prop_ret = NULL;
|
||||
if (XGetWindowProperty(_ecore_x_disp, win, atom, 0, 0x7fffffff, False,
|
||||
XA_CARDINAL, &type_ret, &format_ret, &num_ret,
|
||||
&bytes_after, &prop_ret) != Success)
|
||||
return -1;
|
||||
|
||||
if (type_ret == None || num_ret == 0)
|
||||
{
|
||||
num = 0;
|
||||
*plst = NULL;
|
||||
}
|
||||
else if (prop_ret && type_ret == XA_CARDINAL && format_ret == 32)
|
||||
{
|
||||
val = malloc(num_ret * sizeof(unsigned int));
|
||||
for (i = 0; i < num_ret; i++)
|
||||
val[i] = ((unsigned long *)prop_ret)[i];
|
||||
num = num_ret;
|
||||
*plst = val;
|
||||
}
|
||||
else
|
||||
{
|
||||
num = -1;
|
||||
*plst = NULL;
|
||||
}
|
||||
if (prop_ret)
|
||||
XFree(prop_ret);
|
||||
|
||||
return num;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set X ID (array) property
|
||||
*/
|
||||
void
|
||||
ecore_x_window_prop_xid_set(Ecore_X_Window win, Ecore_X_Atom atom,
|
||||
Ecore_X_Atom type, Ecore_X_ID * lst,
|
||||
unsigned int num)
|
||||
{
|
||||
#if SIZEOF_INT == SIZEOF_LONG
|
||||
XChangeProperty(_ecore_x_disp, win, atom, type, 32, PropModeReplace,
|
||||
(unsigned char *)lst, num);
|
||||
#else
|
||||
unsigned long *pl;
|
||||
unsigned int i;
|
||||
|
||||
pl = malloc(num * sizeof(long));
|
||||
if (!pl)
|
||||
return;
|
||||
for (i = 0; i < num; i++)
|
||||
pl[i] = lst[i];
|
||||
XChangeProperty(_ecore_x_disp, win, atom, type, 32, PropModeReplace,
|
||||
(unsigned char *)pl, num);
|
||||
free(pl);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* Get X ID (array) property
|
||||
*
|
||||
* At most len items are returned in val.
|
||||
* If the property was successfully fetched the number of items stored in
|
||||
* val is returned, otherwise -1 is returned.
|
||||
* Note: Return value 0 means that the property exists but has no elements.
|
||||
*/
|
||||
int
|
||||
ecore_x_window_prop_xid_get(Ecore_X_Window win, Ecore_X_Atom atom,
|
||||
Ecore_X_Atom type, Ecore_X_ID * lst,
|
||||
unsigned int len)
|
||||
{
|
||||
unsigned char *prop_ret;
|
||||
Atom type_ret;
|
||||
unsigned long bytes_after, num_ret;
|
||||
int format_ret;
|
||||
int num;
|
||||
unsigned i;
|
||||
|
||||
prop_ret = NULL;
|
||||
if (XGetWindowProperty(_ecore_x_disp, win, atom, 0, 0x7fffffff, False,
|
||||
type, &type_ret, &format_ret, &num_ret,
|
||||
&bytes_after, &prop_ret) != Success)
|
||||
return -1;
|
||||
|
||||
if (type_ret == None)
|
||||
{
|
||||
num = 0;
|
||||
}
|
||||
else if (prop_ret && type_ret == type && format_ret == 32)
|
||||
{
|
||||
if (num_ret < len)
|
||||
len = num_ret;
|
||||
for (i = 0; i < len; i++)
|
||||
lst[i] = ((unsigned long *)prop_ret)[i];
|
||||
num = len;
|
||||
}
|
||||
else
|
||||
{
|
||||
num = -1;
|
||||
}
|
||||
if (prop_ret)
|
||||
XFree(prop_ret);
|
||||
|
||||
return num;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get X ID (array) property
|
||||
*
|
||||
* If the property was successfully fetched the number of items stored in
|
||||
* val is returned, otherwise -1 is returned.
|
||||
* The returned array must be freed with free().
|
||||
* Note: Return value 0 means that the property exists but has no elements.
|
||||
*/
|
||||
int
|
||||
ecore_x_window_prop_xid_list_get(Ecore_X_Window win, Ecore_X_Atom atom,
|
||||
Ecore_X_Atom type, Ecore_X_ID ** val)
|
||||
{
|
||||
unsigned char *prop_ret;
|
||||
Atom type_ret;
|
||||
unsigned long bytes_after, num_ret;
|
||||
int format_ret;
|
||||
Ecore_X_Atom *alst;
|
||||
int num;
|
||||
unsigned i;
|
||||
|
||||
*val = NULL;
|
||||
prop_ret = NULL;
|
||||
if (XGetWindowProperty(_ecore_x_disp, win, atom, 0, 0x7fffffff, False,
|
||||
type, &type_ret, &format_ret, &num_ret,
|
||||
&bytes_after, &prop_ret) != Success)
|
||||
return -1;
|
||||
|
||||
if (type_ret == None || num_ret == 0)
|
||||
{
|
||||
num = 0;
|
||||
}
|
||||
else if (prop_ret && type_ret == type && format_ret == 32)
|
||||
{
|
||||
alst = malloc(num_ret * sizeof(Ecore_X_ID));
|
||||
for (i = 0; i < num_ret; i++)
|
||||
alst[i] = ((unsigned long *)prop_ret)[i];
|
||||
*val = alst;
|
||||
num = num_ret;
|
||||
}
|
||||
else
|
||||
{
|
||||
num = -1;
|
||||
}
|
||||
if (prop_ret)
|
||||
XFree(prop_ret);
|
||||
|
||||
return num;
|
||||
}
|
||||
|
||||
/*
|
||||
* Remove/add/toggle X ID list item.
|
||||
*/
|
||||
void
|
||||
ecore_x_window_prop_xid_list_change(Ecore_X_Window win, Ecore_X_Atom atom,
|
||||
Ecore_X_Atom type, Ecore_X_ID item, int op)
|
||||
{
|
||||
Ecore_X_ID *lst;
|
||||
int i, num;
|
||||
|
||||
num = ecore_x_window_prop_xid_list_get(win, atom, type, &lst);
|
||||
if (num < 0)
|
||||
return; /* Error - assuming invalid window */
|
||||
|
||||
/* Is it there? */
|
||||
for (i = 0; i < num; i++)
|
||||
{
|
||||
if (lst[i] == item)
|
||||
break;
|
||||
}
|
||||
|
||||
if (i < num)
|
||||
{
|
||||
/* Was in list */
|
||||
if (op == ECORE_X_PROP_LIST_ADD)
|
||||
goto done;
|
||||
/* Remove it */
|
||||
num--;
|
||||
for (; i < num; i++)
|
||||
lst[i] = lst[i + 1];
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Was not in list */
|
||||
if (op == ECORE_X_PROP_LIST_REMOVE)
|
||||
goto done;
|
||||
/* Add it */
|
||||
num++;
|
||||
lst = realloc(lst, num * sizeof(Ecore_X_ID));
|
||||
lst[i] = item;
|
||||
}
|
||||
|
||||
ecore_x_window_prop_xid_set(win, atom, type, lst, num);
|
||||
|
||||
done:
|
||||
if (lst)
|
||||
free(lst);
|
||||
}
|
||||
|
||||
/*
|
||||
* Set Atom (array) property
|
||||
*/
|
||||
void
|
||||
ecore_x_window_prop_atom_set(Ecore_X_Window win, Ecore_X_Atom atom,
|
||||
Ecore_X_Atom * lst, unsigned int num)
|
||||
{
|
||||
ecore_x_window_prop_xid_set(win, atom, XA_ATOM, lst, num);
|
||||
}
|
||||
|
||||
/*
|
||||
* Get Atom (array) property
|
||||
*
|
||||
* At most len items are returned in val.
|
||||
* If the property was successfully fetched the number of items stored in
|
||||
* val is returned, otherwise -1 is returned.
|
||||
* Note: Return value 0 means that the property exists but has no elements.
|
||||
*/
|
||||
int
|
||||
ecore_x_window_prop_atom_get(Ecore_X_Window win, Ecore_X_Atom atom,
|
||||
Ecore_X_Atom * lst, unsigned int len)
|
||||
{
|
||||
return ecore_x_window_prop_xid_get(win, atom, XA_ATOM, lst, len);
|
||||
}
|
||||
|
||||
/*
|
||||
* Get Atom (array) property
|
||||
*
|
||||
* If the property was successfully fetched the number of items stored in
|
||||
* val is returned, otherwise -1 is returned.
|
||||
* The returned array must be freed with free().
|
||||
* Note: Return value 0 means that the property exists but has no elements.
|
||||
*/
|
||||
int
|
||||
ecore_x_window_prop_atom_list_get(Ecore_X_Window win, Ecore_X_Atom atom,
|
||||
Ecore_X_Atom ** plst)
|
||||
{
|
||||
return ecore_x_window_prop_xid_list_get(win, atom, XA_ATOM, plst);
|
||||
}
|
||||
|
||||
/*
|
||||
* Remove/add/toggle atom list item.
|
||||
*/
|
||||
void
|
||||
ecore_x_window_prop_atom_list_change(Ecore_X_Window win, Ecore_X_Atom atom,
|
||||
Ecore_X_Atom item, int op)
|
||||
{
|
||||
ecore_x_window_prop_xid_list_change(win, atom, XA_ATOM, item, op);
|
||||
}
|
||||
|
||||
/*
|
||||
* Set Window (array) property
|
||||
*/
|
||||
void
|
||||
ecore_x_window_prop_window_set(Ecore_X_Window win, Ecore_X_Atom atom,
|
||||
Ecore_X_Window * lst, unsigned int num)
|
||||
{
|
||||
ecore_x_window_prop_xid_set(win, atom, XA_WINDOW, lst, num);
|
||||
}
|
||||
|
||||
/*
|
||||
* Get Window (array) property
|
||||
*
|
||||
* At most len items are returned in val.
|
||||
* If the property was successfully fetched the number of items stored in
|
||||
* val is returned, otherwise -1 is returned.
|
||||
* Note: Return value 0 means that the property exists but has no elements.
|
||||
*/
|
||||
int
|
||||
ecore_x_window_prop_window_get(Ecore_X_Window win, Ecore_X_Atom atom,
|
||||
Ecore_X_Window * lst, unsigned int len)
|
||||
{
|
||||
return ecore_x_window_prop_xid_get(win, atom, XA_WINDOW, lst, len);
|
||||
}
|
||||
|
||||
/*
|
||||
* Get Window (array) property
|
||||
*
|
||||
* If the property was successfully fetched the number of items stored in
|
||||
* val is returned, otherwise -1 is returned.
|
||||
* The returned array must be freed with free().
|
||||
* Note: Return value 0 means that the property exists but has no elements.
|
||||
*/
|
||||
int
|
||||
ecore_x_window_prop_window_list_get(Ecore_X_Window win, Ecore_X_Atom atom,
|
||||
Ecore_X_Window ** plst)
|
||||
{
|
||||
return ecore_x_window_prop_xid_list_get(win, atom, XA_WINDOW, plst);
|
||||
}
|
||||
|
||||
/**
|
||||
* To be documented.
|
||||
*
|
||||
|
|
Loading…
Reference in New Issue