Hi!
I've added functions for different _NET atoms, and fixed ecore_x_netwm_state_isset and ecore_x_netwm_state_get
Also added some atoms and changed some. Used this EWMH spec: http://standards.freedesktop.org/wm-spec/wm-spec-1.3.html
Sebastian
Index: ecore/src/lib/ecore_x/Ecore_X.h
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/Ecore_X.h,v
retrieving revision 1.94
diff -u -r1.94 Ecore_X.h
--- ecore/src/lib/ecore_x/Ecore_X.h 13 Jan 2005 07:13:06 -0000 1.94
+++ ecore/src/lib/ecore_x/Ecore_X.h 7 Feb 2005 09:31:19 -0000
@@ -724,7 +724,10 @@
/* The following are not documented because they are not
* intended for use in applications. */
ECORE_X_WINDOW_STATE_ABOVE,
- ECORE_X_WINDOW_STATE_BELOW
+ ECORE_X_WINDOW_STATE_BELOW,
+
+ /* FIXME: Documentation */
+ ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION
} Ecore_X_Window_State;
@@ -739,6 +742,19 @@
ECORE_X_WINDOW_TYPE_NORMAL
} Ecore_X_Window_Type;
+typedef enum _Ecore_X_Action {
+ ECORE_X_ACTION_MOVE,
+ ECORE_X_ACTION_RESIZE,
+ ECORE_X_ACTION_MINIMIZE,
+ ECORE_X_ACTION_SHADE,
+ ECORE_X_ACTION_STICK,
+ ECORE_X_ACTION_MAXIMIZE_HORZ,
+ ECORE_X_ACTION_MAXIMIZE_VERT,
+ ECORE_X_ACTION_FULLSCREEN,
+ ECORE_X_ACTION_CHANGE_DESKTOP,
+ ECORE_X_ACTION_CLOSE
+} Ecore_X_Action;
+
typedef enum _Ecore_X_Window_Configure_Mask {
ECORE_X_WINDOW_CONFIGURE_MASK_X = (1 << 0),
ECORE_X_WINDOW_CONFIGURE_MASK_Y = (1 << 1),
@@ -1080,6 +1096,7 @@
EAPI void ecore_x_netwm_desk_workareas_set(Ecore_X_Window
root, unsigned int n_desks, unsigned int *areas);
EAPI void ecore_x_netwm_desk_current_set(Ecore_X_Window
root, unsigned int desk);
EAPI void ecore_x_netwm_desk_viewports_set(Ecore_X_Window
root, unsigned int n_desks, unsigned int *origins);
+ EAPI void ecore_x_netwm_desk_layout_set(Ecore_X_Window root,
int orientation, int columns, int rows, int starting_corner);
EAPI void ecore_x_netwm_showing_desktop_set(Ecore_X_Window
root, int on);
EAPI void ecore_x_netwm_client_list_set(Ecore_X_Window root,
unsigned int n_clients, Ecore_X_Window * p_clients);
EAPI void
ecore_x_netwm_client_list_stacking_set(Ecore_X_Window root, unsigned int
n_clients, Ecore_X_Window * p_clients);
@@ -1094,11 +1111,33 @@
EAPI char *ecore_x_netwm_visible_icon_name_get(Ecore_X_Window
win);
EAPI void ecore_x_netwm_desktop_set(Ecore_X_Window win,
unsigned int desk);
EAPI int ecore_x_netwm_desktop_get(Ecore_X_Window win,
unsigned int *desk);
- EAPI void ecore_x_netwm_opacity_set(Ecore_X_Window win,
unsigned int opacity);
- EAPI int ecore_x_netwm_opacity_get(Ecore_X_Window win,
unsigned int *opacity);
+ EAPI void ecore_x_netwm_strut_set(Ecore_X_Window win, int
left, int right, int top, int bottom);
+ EAPI int ecore_x_netwm_strut_get(Ecore_X_Window win, int
*left, int *right, int *top, int *bottom);
+ EAPI void ecore_x_netwm_strut_partial_set(Ecore_X_Window
win, int left, int right, int top, int bottom, int left_start_y, int
left_end_y, int right_start_y, int right_end_y, int top_start_x, int top_end_x,
int bottom_start_x, int bottom_end_x);
+ EAPI int ecore_x_netwm_strut_partial_get(Ecore_X_Window
win, int *left, int *right, int *top, int *bottom, int *left_start_y, int
*left_end_y, int *right_start_y, int *right_end_y, int *top_start_x, int
*top_end_x, int *bottom_start_x, int *bottom_end_x);
+ EAPI void ecore_x_netwm_icon_geometry_set(Ecore_X_Window
win, int x, int y, int width, int height);
+ EAPI int ecore_x_netwm_icon_geometry_get(Ecore_X_Window
win, int *x, int *y, int *width, int *height);
+#if 0
+ /* FIXME */
+ EAPI void ecore_x_netwm_icon_set();
+ EAPI int ecore_x_netwm_icon_get();
+#endif
+ EAPI void ecore_x_netwm_pid_set(Ecore_X_Window win, int pid);
+ EAPI int ecore_x_netwm_pid_get(Ecore_X_Window win, int
*pid);
+ EAPI void ecore_x_netwm_handled_icons_set(Ecore_X_Window
win);
+ EAPI int ecore_x_netwm_handled_icons_get(Ecore_X_Window
win);
+ EAPI void ecore_x_netwm_user_time_set(Ecore_X_Window win,
int time);
+ EAPI int ecore_x_netwm_user_time_get(Ecore_X_Window win,
int *time);
+
EAPI void ecore_x_netwm_window_state_set(Ecore_X_Window win,
Ecore_X_Window_State state, int on);
EAPI int ecore_x_netwm_window_state_isset(Ecore_X_Window
win, Ecore_X_Window_State state);
+ EAPI void ecore_x_netwm_window_type_set(Ecore_X_Window win,
Ecore_X_Window_Type type);
+ EAPI Ecore_X_Window_Type ecore_x_netwm_window_type_get(Ecore_X_Window win);
+ EAPI int ecore_x_netwm_action_allowed(Ecore_X_Window win,
Ecore_X_Action action);
+ EAPI void ecore_x_netwm_opacity_set(Ecore_X_Window win,
unsigned int opacity);
+ EAPI int ecore_x_netwm_opacity_get(Ecore_X_Window win,
unsigned int *opacity);
EAPI void ecore_x_netwm_frame_size_set(Ecore_X_Window win,
int fl, int fr, int ft, int fb);
+ EAPI int ecore_x_netwm_frame_size_get(Ecore_X_Window win,
int *fl, int *fr, int *ft, int *fb);
EAPI int ecore_x_xinerama_screen_count_get(void);
EAPI int ecore_x_xinerama_screen_geometry_get(int screen,
int *x, int *y, int *w, int *h);
Index: ecore/src/lib/ecore_x/Ecore_X_Atoms.h
===================================================================
RCS file:
/cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/Ecore_X_Atoms.h,v
retrieving revision 1.2
diff -u -r1.2 Ecore_X_Atoms.h
--- ecore/src/lib/ecore_x/Ecore_X_Atoms.h 5 Dec 2004 08:29:10 -0000
1.2
+++ ecore/src/lib/ecore_x/Ecore_X_Atoms.h 7 Feb 2005 09:31:19 -0000
@@ -49,36 +49,43 @@
extern Ecore_X_Atom ECORE_X_ATOM_NET_VIRTUAL_ROOTS;
extern Ecore_X_Atom ECORE_X_ATOM_NET_DESKTOP_NAMES;
extern Ecore_X_Atom ECORE_X_ATOM_NET_DESKTOP_GEOMETRY;
+extern Ecore_X_Atom ECORE_X_ATOM_NET_DESKTOP_VIEWPORT;
+extern Ecore_X_Atom ECORE_X_ATOM_NET_DESKTOP_LAYOUT;
extern Ecore_X_Atom ECORE_X_ATOM_NET_WORKAREA;
+
extern Ecore_X_Atom ECORE_X_ATOM_NET_CURRENT_DESKTOP;
-extern Ecore_X_Atom ECORE_X_ATOM_NET_DESKTOP_VIEWPORT;
extern Ecore_X_Atom ECORE_X_ATOM_NET_SHOWING_DESKTOP;
extern Ecore_X_Atom ECORE_X_ATOM_NET_CLIENT_LIST;
extern Ecore_X_Atom ECORE_X_ATOM_NET_CLIENT_LIST_STACKING;
extern Ecore_X_Atom ECORE_X_ATOM_NET_ACTIVE_WINDOW;
-extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_DESKTOP;
-extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE;
-extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_ABOVE;
-extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_BELOW;
-
extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_NAME;
extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_VISIBLE_NAME;
extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_ICON_NAME;
extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME;
extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_DESKTOP;
-extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE;
-extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE;
-extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS;
extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_STRUT;
extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_STRUT_PARTIAL;
extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_ICON_GEOMETRY;
extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_ICON;
extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_PID;
-extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_HANDLE_ICONS;
+extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_HANDLED_ICONS;
extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_USER_TIME;
+extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS;
+extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_MOVE;
+extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_RESIZE;
+extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_MINIMIZE;
+extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_SHADE;
+extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_STICK;
+extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_HORZ;
+extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_VERT;
+extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_FULLSCREEN;
+extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_CHANGE_DESKTOP;
+extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_CLOSE; /*x*/
+
+extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE;
extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DESKTOP;
extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DOCK;
extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLBAR;
@@ -88,8 +95,7 @@
extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DIALOG;
extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL;
-extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_OPACITY;
-
+extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE;
extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_MODAL;
extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_STICKY;
extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_VERT;
@@ -101,6 +107,12 @@
extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_FULLSCREEN;
extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_ABOVE;
extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_BELOW;
+extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_DEMANDS_ATTENTION;
+
+extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_OPACITY;
+
+extern Ecore_X_Atom ECORE_X_ATOM_NET_FRAME_EXTENTS;
+extern Ecore_X_Atom ECORE_X_ATOM_NET_REQUEST_FRAME_EXTENTS;
/* Selections */
extern Ecore_X_Atom ECORE_X_ATOM_SELECTION_PRIMARY;
Index: ecore/src/lib/ecore_x/ecore_x_netwm.c
===================================================================
RCS file:
/cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x_netwm.c,v
retrieving revision 1.8
diff -u -r1.8 ecore_x_netwm.c
--- ecore/src/lib/ecore_x/ecore_x_netwm.c 13 Jan 2005 07:13:06 -0000
1.8
+++ ecore/src/lib/ecore_x/ecore_x_netwm.c 7 Feb 2005 09:31:23 -0000
@@ -1,4 +1,7 @@
/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+/*
* _NET_WM... aka Extended Window Manager Hint (EWMH) functions.
*/
#include "config.h"
@@ -110,7 +113,7 @@
/*
* Get UTF-8 string property
*/
-static char *
+static char *
_ecore_x_window_prop_string_utf8_get(Ecore_X_Window win, Ecore_X_Atom atom)
{
char *str;
@@ -141,17 +144,19 @@
/* Set/clear atom in list */
static void
-_ecore_x_netwm_atom_list_set(Ecore_X_Atom *atoms, int size, int *count,
+_ecore_x_netwm_atom_list_set(Ecore_X_Atom *atoms, int size, int *count,
Ecore_X_Atom atom, int set)
{
- int i, n, in_list;
+ int i, n, in_list = 0;
n = *count;
/* Check if atom is in list or not (+get index) */
for (i = 0; i < n; i++)
if (atoms[i] == atom)
- break;
- in_list = i < n;
+ {
+ in_list = 1;
+ break;
+ }
if (set && !in_list)
{
@@ -180,8 +185,8 @@
Ecore_X_Atom ECORE_X_ATOM_NET_DESKTOP_NAMES = 0;
Ecore_X_Atom ECORE_X_ATOM_NET_DESKTOP_GEOMETRY = 0;
Ecore_X_Atom ECORE_X_ATOM_NET_DESKTOP_VIEWPORT = 0;
-Ecore_X_Atom ECORE_X_ATOM_NET_WORKAREA = 0;
Ecore_X_Atom ECORE_X_ATOM_NET_DESKTOP_LAYOUT = 0;
+Ecore_X_Atom ECORE_X_ATOM_NET_WORKAREA = 0;
Ecore_X_Atom ECORE_X_ATOM_NET_CURRENT_DESKTOP = 0;
Ecore_X_Atom ECORE_X_ATOM_NET_SHOWING_DESKTOP = 0;
@@ -197,24 +202,40 @@
Ecore_X_Atom ECORE_X_ATOM_NET_WM_MOVERESIZE = 0;
/*
+ * Pagers
+ */
+Ecore_X_Atom ECORE_X_ATOM_NET_MOVERESIZE_WINDOW = 0;
+Ecore_X_Atom ECORE_X_ATOM_NET_RESTACK_WINDOW = 0;
+
+/*
* Application window specific NetWM hints.
*/
-Ecore_X_Atom ECORE_X_ATOM_NET_WM_DESKTOP = 0;
Ecore_X_Atom ECORE_X_ATOM_NET_WM_NAME = 0;
Ecore_X_Atom ECORE_X_ATOM_NET_WM_VISIBLE_NAME = 0;
Ecore_X_Atom ECORE_X_ATOM_NET_WM_ICON_NAME = 0;
Ecore_X_Atom ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME = 0;
-Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE = 0;
-Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE = 0;
-Ecore_X_Atom ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS = 0;
+Ecore_X_Atom ECORE_X_ATOM_NET_WM_DESKTOP = 0;
Ecore_X_Atom ECORE_X_ATOM_NET_WM_STRUT = 0;
Ecore_X_Atom ECORE_X_ATOM_NET_WM_STRUT_PARTIAL = 0;
Ecore_X_Atom ECORE_X_ATOM_NET_WM_ICON_GEOMETRY = 0;
Ecore_X_Atom ECORE_X_ATOM_NET_WM_ICON = 0;
Ecore_X_Atom ECORE_X_ATOM_NET_WM_PID = 0;
-Ecore_X_Atom ECORE_X_ATOM_NET_WM_HANDLE_ICONS = 0;
+Ecore_X_Atom ECORE_X_ATOM_NET_WM_HANDLED_ICONS = 0;
Ecore_X_Atom ECORE_X_ATOM_NET_WM_USER_TIME = 0;
+Ecore_X_Atom ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS = 0;
+Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_MOVE = 0;
+Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_RESIZE = 0;
+Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_MINIMIZE = 0;
+Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_SHADE = 0;
+Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_STICK = 0;
+Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_HORZ = 0;
+Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_VERT = 0;
+Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_FULLSCREEN = 0;
+Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_CHANGE_DESKTOP = 0;
+Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_CLOSE = 0;
+
+Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE = 0;
Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DESKTOP = 0;
Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DOCK = 0;
Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLBAR = 0;
@@ -224,6 +245,7 @@
Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DIALOG = 0;
Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL = 0;
+Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE = 0;
Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_MODAL = 0;
Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_STICKY = 0;
Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_VERT = 0;
@@ -235,10 +257,12 @@
Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_FULLSCREEN = 0;
Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_ABOVE = 0;
Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_BELOW = 0;
+Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_DEMANDS_ATTENTION = 0;
Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_OPACITY = 0;
Ecore_X_Atom ECORE_X_ATOM_NET_FRAME_EXTENTS = 0;
+Ecore_X_Atom ECORE_X_ATOM_NET_REQUEST_FRAME_EXTENTS = 0;
void
ecore_x_netwm_init(void)
@@ -248,12 +272,15 @@
ECORE_X_ATOM_NET_NUMBER_OF_DESKTOPS = _ATOM_GET("_NET_NUMBER_OF_DESKTOPS");
ECORE_X_ATOM_NET_VIRTUAL_ROOTS = _ATOM_GET("_NET_VIRTUAL_ROOTS");
- ECORE_X_ATOM_NET_DESKTOP_GEOMETRY = _ATOM_GET("_NET_DESKTOP_GEOMETRY");
ECORE_X_ATOM_NET_DESKTOP_NAMES = _ATOM_GET("_NET_DESKTOP_NAMES");
- ECORE_X_ATOM_NET_CURRENT_DESKTOP = _ATOM_GET("_NET_CURRENT_DESKTOP");
+ ECORE_X_ATOM_NET_DESKTOP_GEOMETRY = _ATOM_GET("_NET_DESKTOP_GEOMETRY");
ECORE_X_ATOM_NET_DESKTOP_VIEWPORT = _ATOM_GET("_NET_DESKTOP_VIEWPORT");
+ ECORE_X_ATOM_NET_DESKTOP_LAYOUT = _ATOM_GET("_NET_DESKTOP_LAYOUT");
ECORE_X_ATOM_NET_WORKAREA = _ATOM_GET("_NET_WORKAREA");
+ ECORE_X_ATOM_NET_CURRENT_DESKTOP = _ATOM_GET("_NET_CURRENT_DESKTOP");
+ ECORE_X_ATOM_NET_SHOWING_DESKTOP = _ATOM_GET("_NET_SHOWING_DESKTOP");
+
ECORE_X_ATOM_NET_CLIENT_LIST = _ATOM_GET("_NET_CLIENT_LIST");
ECORE_X_ATOM_NET_CLIENT_LIST_STACKING =
_ATOM_GET("_NET_CLIENT_LIST_STACKING");
@@ -262,22 +289,36 @@
ECORE_X_ATOM_NET_CLOSE_WINDOW = _ATOM_GET("_NET_CLOSE_WINDOW");
ECORE_X_ATOM_NET_WM_MOVERESIZE = _ATOM_GET("_NET_WM_MOVERESIZE");
+ ECORE_X_ATOM_NET_MOVERESIZE_WINDOW = _ATOM_GET("_NET_MOVERESIZE_WINDOW");
+ ECORE_X_ATOM_NET_RESTACK_WINDOW = _ATOM_GET("_NET_RESTACK_WINDOW");
+
ECORE_X_ATOM_NET_WM_NAME = _ATOM_GET("_NET_WM_NAME");
ECORE_X_ATOM_NET_WM_VISIBLE_NAME = _ATOM_GET("_NET_WM_VISIBLE_NAME");
ECORE_X_ATOM_NET_WM_ICON_NAME = _ATOM_GET("_NET_WM_ICON_NAME");
ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME =
_ATOM_GET("_NET_WM_VISIBLE_ICON_NAME");
ECORE_X_ATOM_NET_WM_DESKTOP = _ATOM_GET("_NET_WM_DESKTOP");
- ECORE_X_ATOM_NET_WM_WINDOW_TYPE = _ATOM_GET("_NET_WM_WINDOW_TYPE");
- ECORE_X_ATOM_NET_WM_STATE = _ATOM_GET("_NET_WM_STATE");
- ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS = _ATOM_GET("_NET_WM_ALLOWED_ACTIONS");
ECORE_X_ATOM_NET_WM_STRUT = _ATOM_GET("_NET_WM_STRUT");
ECORE_X_ATOM_NET_WM_STRUT_PARTIAL = _ATOM_GET("_NET_WM_STRUT_PARTIAL");
ECORE_X_ATOM_NET_WM_ICON_GEOMETRY = _ATOM_GET("_NET_WM_ICON_GEOMETRY");
ECORE_X_ATOM_NET_WM_ICON = _ATOM_GET("_NET_WM_ICON");
ECORE_X_ATOM_NET_WM_PID = _ATOM_GET("_NET_WM_PID");
+ ECORE_X_ATOM_NET_WM_HANDLED_ICONS = _ATOM_GET("_NET_WM_HANDLED_ICONS");
ECORE_X_ATOM_NET_WM_USER_TIME = _ATOM_GET("_NET_WM_USER_TIME");
+ ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS = _ATOM_GET("_NET_WM_ALLOWED_ACTIONS");
+ ECORE_X_ATOM_NET_WM_ACTION_MOVE = _ATOM_GET("_NET_WM_ACTION_MOVE");
+ ECORE_X_ATOM_NET_WM_ACTION_RESIZE = _ATOM_GET("_NET_WM_ACTION_RESIZE");
+ ECORE_X_ATOM_NET_WM_ACTION_MINIMIZE = _ATOM_GET("_NET_WM_ACTION_MINIMIZE");
+ ECORE_X_ATOM_NET_WM_ACTION_SHADE = _ATOM_GET("_NET_WM_ACTION_SHADE");
+ ECORE_X_ATOM_NET_WM_ACTION_STICK = _ATOM_GET("_NET_WM_ACTION_STICK");
+ ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_HORZ =
_ATOM_GET("_NET_WM_ACTION_MAXIMIZE_HORZ");
+ ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_VERT =
_ATOM_GET("_NET_WM_ACTION_MAXIMIZE_VERT");
+ ECORE_X_ATOM_NET_WM_ACTION_FULLSCREEN =
_ATOM_GET("_NET_WM_ACTION_FULLSCREEN");
+ ECORE_X_ATOM_NET_WM_ACTION_CHANGE_DESKTOP =
_ATOM_GET("_NET_WM_ACTION_CHANGE_DESKTOP");
+ ECORE_X_ATOM_NET_WM_ACTION_CLOSE = _ATOM_GET("_NET_WM_ACTION_CLOSE");
+
+ ECORE_X_ATOM_NET_WM_WINDOW_TYPE = _ATOM_GET("_NET_WM_WINDOW_TYPE");
ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DESKTOP =
_ATOM_GET("_NET_WM_WINDOW_TYPE_DESKTOP");
ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DOCK =
_ATOM_GET("_NET_WM_WINDOW_TYPE_DOCK");
@@ -293,6 +334,7 @@
ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL =
_ATOM_GET("_NET_WM_WINDOW_TYPE_NORMAL");
+ ECORE_X_ATOM_NET_WM_STATE = _ATOM_GET("_NET_WM_STATE");
ECORE_X_ATOM_NET_WM_STATE_MODAL = _ATOM_GET("_NET_WM_STATE_MODAL");
ECORE_X_ATOM_NET_WM_STATE_STICKY = _ATOM_GET("_NET_WM_STATE_STICKY");
ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_VERT =
@@ -307,10 +349,12 @@
ECORE_X_ATOM_NET_WM_STATE_FULLSCREEN =
_ATOM_GET("_NET_WM_STATE_FULLSCREEN");
ECORE_X_ATOM_NET_WM_STATE_ABOVE = _ATOM_GET("_NET_WM_STATE_ABOVE");
ECORE_X_ATOM_NET_WM_STATE_BELOW = _ATOM_GET("_NET_WM_STATE_BELOW");
+ ECORE_X_ATOM_NET_WM_STATE_DEMANDS_ATTENTION =
_ATOM_GET("_NET_WM_STATE_DEMANDS_ATTENTION");
ECORE_X_ATOM_NET_WM_WINDOW_OPACITY = _ATOM_GET("_NET_WM_WINDOW_OPACITY");
-
+
ECORE_X_ATOM_NET_FRAME_EXTENTS = _ATOM_GET("_NET_FRAME_EXTENTS");
+ ECORE_X_ATOM_NET_REQUEST_FRAME_EXTENTS =
_ATOM_GET("_NET_REQUEST_FRAME_EXTENTS");
}
/*
@@ -391,6 +435,29 @@
}
void
+ecore_x_netwm_desk_viewports_set(Ecore_X_Window root, unsigned int n_desks,
+ unsigned int *origins)
+{
+ ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_DESKTOP_VIEWPORT,
+ origins, 2 * n_desks);
+}
+
+void
+ecore_x_netwm_desk_layout_set(Ecore_X_Window root, int orientation,
+ int columns, int rows,
+ int starting_corner)
+{
+ int layout[4];
+
+ layout[0] = orientation;
+ layout[1] = columns;
+ layout[2] = rows;
+ layout[3] = starting_corner;
+ ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_DESKTOP_LAYOUT,
+ layout, 4);
+}
+
+void
ecore_x_netwm_desk_workareas_set(Ecore_X_Window root, unsigned int n_desks,
unsigned int *areas)
{
@@ -406,14 +473,6 @@
}
void
-ecore_x_netwm_desk_viewports_set(Ecore_X_Window root, unsigned int n_desks,
- unsigned int *origins)
-{
- ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_DESKTOP_VIEWPORT,
- origins, 2 * n_desks);
-}
-
-void
ecore_x_netwm_showing_desktop_set(Ecore_X_Window root, int on)
{
unsigned int val;
@@ -457,38 +516,38 @@
_ecore_x_window_prop_string_utf8_set(win, ECORE_X_ATOM_NET_WM_NAME, name);
}
-char *
+char *
ecore_x_netwm_name_get(Ecore_X_Window win)
{
return _ecore_x_window_prop_string_utf8_get(win, ECORE_X_ATOM_NET_WM_NAME);
}
void
-ecore_x_netwm_icon_name_set(Ecore_X_Window win, const char *name)
+ecore_x_netwm_visible_name_set(Ecore_X_Window win, const char *name)
{
- _ecore_x_window_prop_string_utf8_set(win, ECORE_X_ATOM_NET_WM_ICON_NAME,
+ _ecore_x_window_prop_string_utf8_set(win, ECORE_X_ATOM_NET_WM_VISIBLE_NAME,
name);
}
-char *
-ecore_x_netwm_icon_name_get(Ecore_X_Window win)
+char *
+ecore_x_netwm_visible_name_get(Ecore_X_Window win)
{
return _ecore_x_window_prop_string_utf8_get(win,
- ECORE_X_ATOM_NET_WM_ICON_NAME);
+
ECORE_X_ATOM_NET_WM_VISIBLE_NAME);
}
void
-ecore_x_netwm_visible_name_set(Ecore_X_Window win, const char *name)
+ecore_x_netwm_icon_name_set(Ecore_X_Window win, const char *name)
{
- _ecore_x_window_prop_string_utf8_set(win, ECORE_X_ATOM_NET_WM_VISIBLE_NAME,
+ _ecore_x_window_prop_string_utf8_set(win, ECORE_X_ATOM_NET_WM_ICON_NAME,
name);
}
-char *
-ecore_x_netwm_visible_name_get(Ecore_X_Window win)
+char *
+ecore_x_netwm_icon_name_get(Ecore_X_Window win)
{
return _ecore_x_window_prop_string_utf8_get(win,
-
ECORE_X_ATOM_NET_WM_VISIBLE_NAME);
+ ECORE_X_ATOM_NET_WM_ICON_NAME);
}
void
@@ -499,7 +558,7 @@
name);
}
-char *
+char *
ecore_x_netwm_visible_icon_name_get(Ecore_X_Window win)
{
return _ecore_x_window_prop_string_utf8_get(win,
@@ -507,18 +566,6 @@
}
void
-ecore_x_netwm_frame_size_set(Ecore_X_Window win, int fl, int fr, int ft, int
fb)
-{
- int frames[4];
-
- frames[0] = fl;
- frames[1] = fr;
- frames[2] = ft;
- frames[3] = fb;
- ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_FRAME_EXTENTS, frames,
4);
-}
-
-void
ecore_x_netwm_desktop_set(Ecore_X_Window win, unsigned int desk)
{
ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_DESKTOP, &desk, 1);
@@ -531,18 +578,176 @@
desk, 1);
}
+/*
+ * _NET_WM_STRUT is deprecated, set both _NET_WM_STRUT and
_NET_WM_STRUT_PARTIAL.
+ */
void
-ecore_x_netwm_opacity_set(Ecore_X_Window win, unsigned int opacity)
+ecore_x_netwm_strut_set(Ecore_X_Window win, int left, int right,
+ int top, int bottom)
{
- ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_WINDOW_OPACITY,
- &opacity, 1);
+ int strut[4];
+
+ ecore_x_netwm_strut_partial_set(win, left, right, top, bottom, 0, 0, 0, 0,
0, 0, 0, 0);
+
+ strut[0] = left;
+ strut[1] = right;
+ strut[2] = top;
+ strut[3] = bottom;
+ ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_STRUT, strut, 4);
}
+/*
+ * _NET_WM_STRUT is deprecated, check first _NET_WM_STRUT_PARTIAL
+ * and then _NET_WM_STRUT.
+ */
int
-ecore_x_netwm_opacity_get(Ecore_X_Window win, unsigned int *opacity)
+ecore_x_netwm_strut_get(Ecore_X_Window win, int *left, int *right,
+ int *top, int *bottom)
{
- return ecore_x_window_prop_card32_get(win,
ECORE_X_ATOM_NET_WM_WINDOW_OPACITY,
- opacity, 1);
+ int ret = 0;
+ int left_start_y, left_end_y, right_start_y, right_end_y;
+ int top_start_x, top_end_x, bottom_start_x, bottom_end_x;
+ int strut[4];
+
+ ret = ecore_x_netwm_strut_partial_get(win, left, right, top, bottom,
+ &left_start_y, &left_end_y,
&right_start_y, &right_end_y,
+ &top_start_x, &top_end_x,
&bottom_start_x, &bottom_end_x);
+ if (ret)
+ return ret;
+
+ ret = ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_STRUT, strut,
4);
+ if (ret != 4)
+ return 0;
+
+ *left = strut[0];
+ *right = strut[1];
+ *top = strut[2];
+ *bottom = strut[3];
+ return 1;
+}
+
+void
+ecore_x_netwm_strut_partial_set(Ecore_X_Window win, int left, int right,
+ int top, int bottom, int left_start_y, int
left_end_y,
+ int right_start_y, int right_end_y, int
top_start_x,
+ int top_end_x, int bottom_start_x, int
bottom_end_x)
+{
+ int strut[12];
+
+ strut[0] = left;
+ strut[1] = right;
+ strut[2] = top;
+ strut[3] = bottom;
+ strut[4] = left_start_y;
+ strut[5] = left_end_y;
+ strut[6] = right_start_y;
+ strut[7] = right_end_y;
+ strut[8] = top_start_x;
+ strut[9] = top_end_x;
+ strut[10] = bottom_start_x;
+ strut[11] = bottom_end_x;
+ ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_STRUT, strut, 12);
+}
+
+int
+ecore_x_netwm_strut_partial_get(Ecore_X_Window win, int *left, int *right,
+ int *top, int *bottom, int *left_start_y, int
*left_end_y,
+ int *right_start_y, int *right_end_y, int
*top_start_x,
+ int *top_end_x, int *bottom_start_x, int
*bottom_end_x)
+{
+ int ret = 0;
+ int strut[12];
+
+ ret = ecore_x_window_prop_card32_get(win,
ECORE_X_ATOM_NET_WM_STRUT_PARTIAL, strut, 12);
+ if (ret != 12)
+ return 0;
+
+ *left = strut[0];
+ *right = strut[1];
+ *top = strut[2];
+ *bottom = strut[3];
+ *left_start_y = strut[4];
+ *left_end_y = strut[5];
+ *right_start_y = strut[6];
+ *right_end_y = strut[7];
+ *top_start_x = strut[8];
+ *top_end_x = strut[9];
+ *bottom_start_x = strut[10];
+ *bottom_end_x = strut[11];
+ return 1;
+}
+
+void
+ecore_x_netwm_icon_geometry_set(Ecore_X_Window win, int x, int y, int width,
int height)
+{
+ int geometry[4];
+
+ geometry[0] = x;
+ geometry[1] = y;
+ geometry[2] = width;
+ geometry[3] = height;
+ ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_ICON_GEOMETRY,
geometry, 4);
+}
+
+int
+ecore_x_netwm_icon_geometry_get(Ecore_X_Window win, int *x, int *y, int
*width, int *height)
+{
+ int ret;
+ int geometry[4];
+
+ ret = ecore_x_window_prop_card32_get(win,
ECORE_X_ATOM_NET_WM_ICON_GEOMETRY, geometry, 4);
+ if (ret != 4)
+ return 0;
+
+ *x = geometry[0];
+ *y = geometry[1];
+ *width = geometry[2];
+ *height = geometry[3];
+ return 1;
+}
+
+void
+ecore_x_netwm_pid_set(Ecore_X_Window win, int pid)
+{
+ ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_PID,
+ &pid, 1);
+}
+
+int
+ecore_x_netwm_pid_get(Ecore_X_Window win, int *pid)
+{
+ return ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_PID,
+ pid, 1);
+}
+
+void
+ecore_x_netwm_handled_icons_set(Ecore_X_Window win)
+{
+ ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_HANDLED_ICONS,
+ NULL, 0);
+}
+
+int
+ecore_x_netwm_handled_icons_get(Ecore_X_Window win)
+{
+ int ret = 0;
+ ret = ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_HANDLED_ICONS,
+ NULL, 0);
+ return ret == 0 ? 1 : 0;
+}
+
+void
+ecore_x_netwm_user_time_set(Ecore_X_Window win, int time)
+{
+ ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_USER_TIME,
+ &time, 1);
+}
+
+int
+ecore_x_netwm_user_time_get(Ecore_X_Window win, int *time)
+{
+ return ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_USER_TIME,
+ time, 1);
}
static Ecore_X_Atom
@@ -572,6 +777,8 @@
return ECORE_X_ATOM_NET_WM_STATE_ABOVE;
case ECORE_X_WINDOW_STATE_BELOW:
return ECORE_X_ATOM_NET_WM_STATE_BELOW;
+ case ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION:
+ return ECORE_X_ATOM_NET_WM_STATE_DEMANDS_ATTENTION;
default:
return 0;
}
@@ -583,18 +790,18 @@
{
int num, i, ret = 0;
unsigned char *data;
- Ecore_X_Atom *states, state;
+ Ecore_X_Atom *atoms, atom;
- state = _ecore_x_netwm_state_atom_get(s);
if (!ecore_x_window_prop_property_get(win, ECORE_X_ATOM_NET_WM_STATE,
XA_ATOM, 32, &data, &num))
return ret;
- states = (Ecore_X_Atom *) data;
+ atom = _ecore_x_netwm_state_atom_get(s);
+ atoms = (Ecore_X_Atom *) data;
for (i = 0; i < num; ++i)
{
- if (states[i] == state)
+ if (atoms[i] == atom)
{
ret = 1;
break;
@@ -615,7 +822,7 @@
unsigned char *old_data = NULL;
atom = _ecore_x_netwm_state_atom_get(state);
-
+
ecore_x_window_prop_property_get(win, ECORE_X_ATOM_NET_WM_STATE,
XA_ATOM, 32, &old_data, &num);
oldset = (Ecore_X_Atom *) old_data;
@@ -630,10 +837,13 @@
newset = calloc(num + 1, sizeof(Ecore_X_Atom));
if (!newset) return;
data = (unsigned char *) newset;
-
+
for (i = 0; i < num; i++)
newset[i] = oldset[i];
- newset[num] = state;
+ newset[num] = atom;
+
+ ecore_x_window_prop_property_set(win, ECORE_X_ATOM_NET_WM_STATE,
+ XA_ATOM, 32, data, num + 1);
}
else
{
@@ -650,17 +860,267 @@
}
data = (unsigned char *) newset;
for (i = 0; i < num; i++)
- if (oldset[i] != state)
+ if (oldset[i] != atom)
newset[j++] = oldset[i];
+
+ ecore_x_window_prop_property_set(win, ECORE_X_ATOM_NET_WM_STATE,
+ XA_ATOM, 32, data, num - 1);
+ }
+ XFree(oldset);
+ free(newset);
+}
+
+static Ecore_X_Window_Type
+_ecore_x_netwm_window_type_type_get(Ecore_X_Atom atom)
+{
+ if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DESKTOP)
+ return ECORE_X_WINDOW_TYPE_DESKTOP;
+ else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DOCK)
+ return ECORE_X_WINDOW_TYPE_DOCK;
+ else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLBAR)
+ return ECORE_X_WINDOW_TYPE_TOOLBAR;
+ else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_MENU)
+ return ECORE_X_WINDOW_TYPE_MENU;
+ else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_UTILITY)
+ return ECORE_X_WINDOW_TYPE_UTILITY;
+ else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_SPLASH)
+ return ECORE_X_WINDOW_TYPE_SPLASH;
+ else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DIALOG)
+ return ECORE_X_WINDOW_TYPE_DIALOG;
+ else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL)
+ return ECORE_X_WINDOW_TYPE_NORMAL;
+ else
+ return 0;
+}
+
+static Ecore_X_Atom
+_ecore_x_netwm_window_type_atom_get(Ecore_X_Window_Type type)
+{
+ switch (type)
+ {
+ case ECORE_X_WINDOW_TYPE_DESKTOP:
+ return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DESKTOP;
+ case ECORE_X_WINDOW_TYPE_DOCK:
+ return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DOCK;
+ case ECORE_X_WINDOW_TYPE_TOOLBAR:
+ return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLBAR;
+ case ECORE_X_WINDOW_TYPE_MENU:
+ return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_MENU;
+ case ECORE_X_WINDOW_TYPE_UTILITY:
+ return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_UTILITY;
+ case ECORE_X_WINDOW_TYPE_SPLASH:
+ return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_SPLASH;
+ case ECORE_X_WINDOW_TYPE_DIALOG:
+ return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DIALOG;
+ case ECORE_X_WINDOW_TYPE_NORMAL:
+ return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL;
+ default:
+ return 0;
+ }
+}
+
+/*
+ * FIXME: We should set WM_TRANSIENT_FOR if type is ECORE_X_WINDOW_TYPE_TOOLBAR
+ * , ECORE_X_WINDOW_TYPE_MENU or ECORE_X_WINDOW_TYPE_DIALOG
+ */
+void
+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_Type
+ecore_x_netwm_window_type_get(Ecore_X_Window win)
+{
+ int num, i;
+ Ecore_X_Window_Type ret = ECORE_X_WINDOW_TYPE_NORMAL, type;
+ unsigned char *data;
+ Ecore_X_Atom *atoms;
+
+ if (!ecore_x_window_prop_property_get(win, ECORE_X_ATOM_NET_WM_WINDOW_TYPE,
+ XA_ATOM, 32, &data, &num))
+ {
+ /* Check if WM_TRANSIENT_FOR is set */
+ if (ecore_x_icccm_transient_for_get(win))
+ ret = ECORE_X_WINDOW_TYPE_DIALOG;
+ return ret;
+ }
+
+ atoms = (Ecore_X_Atom *) data;
+
+ for (i = 0; i < num; ++i)
+ {
+ type = _ecore_x_netwm_window_type_type_get(atoms[i]);
+ if (type)
+ {
+ ret = type;
+ break;
+ }
+ }
+
+ XFree(data);
+ return ret;
+}
+
+static Ecore_X_Atom
+_ecore_x_netwm_action_atom_get(Ecore_X_Action action)
+{
+ switch (action)
+ {
+ case ECORE_X_ACTION_MOVE:
+ return ECORE_X_ATOM_NET_WM_ACTION_MOVE;
+ case ECORE_X_ACTION_RESIZE:
+ return ECORE_X_ATOM_NET_WM_ACTION_RESIZE;
+ case ECORE_X_ACTION_MINIMIZE:
+ return ECORE_X_ATOM_NET_WM_ACTION_MINIMIZE;
+ case ECORE_X_ACTION_SHADE:
+ return ECORE_X_ATOM_NET_WM_ACTION_SHADE;
+ case ECORE_X_ACTION_STICK:
+ return ECORE_X_ATOM_NET_WM_ACTION_STICK;
+ case ECORE_X_ACTION_MAXIMIZE_HORZ:
+ return ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_HORZ;
+ case ECORE_X_ACTION_MAXIMIZE_VERT:
+ return ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_VERT;
+ case ECORE_X_ACTION_FULLSCREEN:
+ return ECORE_X_ATOM_NET_WM_ACTION_FULLSCREEN;
+ case ECORE_X_ACTION_CHANGE_DESKTOP:
+ return ECORE_X_ATOM_NET_WM_ACTION_CHANGE_DESKTOP;
+ case ECORE_X_ACTION_CLOSE:
+ return ECORE_X_ATOM_NET_WM_ACTION_CLOSE;
+ default:
+ return 0;
+ }
+}
+
+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))
+ return ret;
+
+ atom = _ecore_x_netwm_action_atom_get(action);
+ atoms = (Ecore_X_Atom *) data;
+
+ for (i = 0; i < num; ++i)
+ {
+ if (atom == atoms[i])
+ {
+ ret = 1;
+ break;
+ }
+ }
+
+ XFree(data);
+ return ret;
+}
+
+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;
+
+ atom = _ecore_x_netwm_action_atom_get(action);
+
+ 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)
+ {
+ if (ecore_x_netwm_allowed_action_isset(win, action))
+ {
+ XFree(old_data);
+ return;
+ }
+ newset = calloc(num + 1, sizeof(Ecore_X_Atom));
+ if (!newset) return;
+ 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
+ {
+ if (!ecore_x_netwm_allowed_action_isset(win, action))
+ {
+ XFree(old_data);
+ return;
+ }
+ newset = calloc(num - 1, sizeof(Atom));
+ if (!newset)
+ {
+ XFree(old_data);
+ return;
+ }
+ 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_STATE,
- XA_ATOM, 32, data, j);
+ ecore_x_window_prop_property_set(win,
ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS,
+ XA_ATOM, 32, data, num - 1);
+ }
XFree(oldset);
free(newset);
}
+void
+ecore_x_netwm_opacity_set(Ecore_X_Window win, unsigned int opacity)
+{
+ ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_WINDOW_OPACITY,
+ &opacity, 1);
+}
+
+int
+ecore_x_netwm_opacity_get(Ecore_X_Window win, unsigned int *opacity)
+{
+ return ecore_x_window_prop_card32_get(win,
ECORE_X_ATOM_NET_WM_WINDOW_OPACITY,
+ opacity, 1);
+}
+
+void
+ecore_x_netwm_frame_size_set(Ecore_X_Window win, int fl, int fr, int ft, int
fb)
+{
+ int frames[4];
+
+ frames[0] = fl;
+ frames[1] = fr;
+ frames[2] = ft;
+ frames[3] = fb;
+ ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_FRAME_EXTENTS, frames,
4);
+}
+
+int
+ecore_x_netwm_frame_size_get(Ecore_X_Window win, int *fl, int *fr, int *ft,
int *fb)
+{
+ int ret = 0;
+ int frames[4];
-
+ ret = ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_FRAME_EXTENTS,
frames, 4);
+ if (ret != 4)
+ return 0;
+
+ *fl = frames[0];
+ *fr = frames[1];
+ *ft = frames[2];
+ *fb = frames[3];
+ return 1;
+}
-
Index: ecore/src/lib/ecore_x/ecore_x_window_prop.c
===================================================================
RCS file:
/cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x_window_prop.c,v
retrieving revision 1.59
diff -u -r1.59 ecore_x_window_prop.c
--- ecore/src/lib/ecore_x/ecore_x_window_prop.c 13 Jan 2005 13:48:38 -0000
1.59
+++ ecore/src/lib/ecore_x/ecore_x_window_prop.c 7 Feb 2005 09:31:25 -0000
@@ -1,7 +1,6 @@
/*
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
*/
-
#include "Ecore.h"
#include "ecore_x_private.h"
#include "Ecore_X.h"
@@ -86,17 +85,17 @@
}
for (i = 0; i < num_ret; i++)
- switch (size) {
- case 8:
- (*data)[i] = prop_ret[i];
- break;
- case 16:
- ((uint16_t *) *data)[i] = ((uint16_t *) prop_ret)[i];
- break;
- case 32:
- ((uint32_t *) *data)[i] = ((uint32_t *) prop_ret)[i];
- break;
- }
+ switch (size) {
+ case 8:
+ (*data)[i] = prop_ret[i];
+ break;
+ case 16:
+ ((uint16_t *) *data)[i] = ((uint16_t *) prop_ret)[i];
+ break;
+ case 32:
+ ((uint32_t *) *data)[i] = ((uint32_t *) prop_ret)[i];
+ break;
+ }
XFree(prop_ret);
@@ -1156,6 +1155,8 @@
return ECORE_X_ATOM_NET_WM_STATE_ABOVE;
case ECORE_X_WINDOW_STATE_BELOW:
return ECORE_X_ATOM_NET_WM_STATE_BELOW;
+ case ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION:
+ return ECORE_X_ATOM_NET_WM_STATE_DEMANDS_ATTENTION;
default:
return 0;
}
