2005-02-07 05:51:05 -08:00
|
|
|
/*
|
|
|
|
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
|
|
|
|
*/
|
2004-10-23 07:26:25 -07:00
|
|
|
/*
|
|
|
|
* _NET_WM... aka Extended Window Manager Hint (EWMH) functions.
|
|
|
|
*/
|
2004-12-08 12:29:45 -08:00
|
|
|
#include "config.h"
|
2004-10-23 07:26:25 -07:00
|
|
|
#include "Ecore.h"
|
2005-09-29 23:16:49 -07:00
|
|
|
#include "Ecore_Data.h"
|
2004-10-23 07:26:25 -07:00
|
|
|
#include "ecore_x_private.h"
|
|
|
|
#include "Ecore_X.h"
|
2004-12-04 02:10:29 -08:00
|
|
|
#include "Ecore_X_Atoms.h"
|
2004-10-23 07:26:25 -07:00
|
|
|
|
2005-09-29 23:16:49 -07:00
|
|
|
typedef struct _Ecore_X_Startup_Info Ecore_X_Startup_Info;
|
|
|
|
|
|
|
|
struct _Ecore_X_Startup_Info
|
|
|
|
{
|
|
|
|
Ecore_X_Window win;
|
|
|
|
|
|
|
|
int init;
|
|
|
|
|
|
|
|
int buffer_size;
|
|
|
|
char *buffer;
|
|
|
|
|
|
|
|
int length;
|
|
|
|
|
|
|
|
/* These are the sequence info fields */
|
|
|
|
char *id;
|
|
|
|
char *name;
|
|
|
|
int screen;
|
|
|
|
char *bin;
|
|
|
|
char *icon;
|
|
|
|
int desktop;
|
|
|
|
int timestamp;
|
|
|
|
char *description;
|
|
|
|
char *wmclass;
|
|
|
|
int silent;
|
|
|
|
};
|
|
|
|
|
|
|
|
static void _ecore_x_window_prop_string_utf8_set(Ecore_X_Window win, Ecore_X_Atom atom, const char *str);
|
|
|
|
static char *_ecore_x_window_prop_string_utf8_get(Ecore_X_Window win, Ecore_X_Atom atom);
|
|
|
|
static int _ecore_x_netwm_startup_info_process(Ecore_X_Startup_Info *info);
|
|
|
|
static int _ecore_x_netwm_startup_info_parse(Ecore_X_Startup_Info *info, char *data);
|
|
|
|
static void _ecore_x_netwm_startup_info_free(void *data);
|
|
|
|
|
2004-10-23 07:26:25 -07:00
|
|
|
/*
|
|
|
|
* Convenience macros
|
|
|
|
*/
|
2004-10-27 14:50:58 -07:00
|
|
|
#define _ATOM_GET(name) \
|
|
|
|
XInternAtom(_ecore_x_disp, name, False)
|
|
|
|
|
2004-12-08 12:29:45 -08:00
|
|
|
#define _ATOM_SET_UTF8_STRING(win, atom, string) \
|
2004-12-04 02:10:29 -08:00
|
|
|
XChangeProperty(_ecore_x_disp, win, atom, ECORE_X_ATOM_UTF8_STRING, 8, PropModeReplace, \
|
2004-10-23 07:26:25 -07:00
|
|
|
(unsigned char *)string, strlen(string))
|
2004-12-08 12:29:45 -08:00
|
|
|
#define _ATOM_SET_UTF8_STRING_LIST(win, atom, string, cnt) \
|
2004-12-04 02:10:29 -08:00
|
|
|
XChangeProperty(_ecore_x_disp, win, atom, ECORE_X_ATOM_UTF8_STRING, 8, PropModeReplace, \
|
2004-10-23 07:26:25 -07:00
|
|
|
(unsigned char *)string, cnt)
|
2004-12-08 12:29:45 -08:00
|
|
|
#define _ATOM_SET_WINDOW(win, atom, p_wins, cnt) \
|
2004-10-23 07:26:25 -07:00
|
|
|
XChangeProperty(_ecore_x_disp, win, atom, XA_WINDOW, 32, PropModeReplace, \
|
|
|
|
(unsigned char *)p_wins, cnt)
|
2004-12-08 12:29:45 -08:00
|
|
|
#define _ATOM_SET_ATOM(win, atom, p_atom, cnt) \
|
2004-10-23 07:26:25 -07:00
|
|
|
XChangeProperty(_ecore_x_disp, win, atom, XA_ATOM, 32, PropModeReplace, \
|
|
|
|
(unsigned char *)p_atom, cnt)
|
2004-12-08 12:29:45 -08:00
|
|
|
#define _ATOM_SET_CARD32(win, atom, p_val, cnt) \
|
2004-10-23 07:26:25 -07:00
|
|
|
XChangeProperty(_ecore_x_disp, win, atom, XA_CARDINAL, 32, PropModeReplace, \
|
|
|
|
(unsigned char *)p_val, cnt)
|
|
|
|
|
2004-11-29 15:25:12 -08:00
|
|
|
/*
|
2005-09-29 23:16:49 -07:00
|
|
|
* Local variables
|
2004-11-29 15:25:12 -08:00
|
|
|
*/
|
|
|
|
|
2005-09-29 23:16:49 -07:00
|
|
|
static Ecore_Hash *startup_info = NULL;
|
2004-11-29 15:25:12 -08:00
|
|
|
|
2004-10-27 14:50:58 -07:00
|
|
|
/*
|
|
|
|
* Root window NetWM hints.
|
|
|
|
*/
|
2004-12-04 02:10:29 -08:00
|
|
|
Ecore_X_Atom ECORE_X_ATOM_NET_SUPPORTED = 0;
|
|
|
|
Ecore_X_Atom ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK = 0;
|
2004-10-27 14:50:58 -07:00
|
|
|
|
2004-12-04 02:10:29 -08:00
|
|
|
Ecore_X_Atom ECORE_X_ATOM_NET_NUMBER_OF_DESKTOPS = 0;
|
|
|
|
Ecore_X_Atom ECORE_X_ATOM_NET_VIRTUAL_ROOTS = 0;
|
|
|
|
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_DESKTOP_LAYOUT = 0;
|
2005-02-07 05:51:05 -08:00
|
|
|
Ecore_X_Atom ECORE_X_ATOM_NET_WORKAREA = 0;
|
2004-10-27 14:50:58 -07:00
|
|
|
|
2004-12-04 02:10:29 -08:00
|
|
|
Ecore_X_Atom ECORE_X_ATOM_NET_CURRENT_DESKTOP = 0;
|
|
|
|
Ecore_X_Atom ECORE_X_ATOM_NET_SHOWING_DESKTOP = 0;
|
2004-10-27 14:50:58 -07:00
|
|
|
|
2004-12-04 02:10:29 -08:00
|
|
|
Ecore_X_Atom ECORE_X_ATOM_NET_CLIENT_LIST = 0;
|
|
|
|
Ecore_X_Atom ECORE_X_ATOM_NET_CLIENT_LIST_STACKING = 0;
|
|
|
|
Ecore_X_Atom ECORE_X_ATOM_NET_ACTIVE_WINDOW = 0;
|
2004-10-27 14:50:58 -07:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Client message types.
|
|
|
|
*/
|
2004-12-04 02:10:29 -08:00
|
|
|
Ecore_X_Atom ECORE_X_ATOM_NET_CLOSE_WINDOW = 0;
|
|
|
|
Ecore_X_Atom ECORE_X_ATOM_NET_WM_MOVERESIZE = 0;
|
2004-10-27 14:50:58 -07:00
|
|
|
|
2005-02-07 05:51:05 -08:00
|
|
|
/*
|
|
|
|
* Pagers
|
|
|
|
*/
|
|
|
|
Ecore_X_Atom ECORE_X_ATOM_NET_MOVERESIZE_WINDOW = 0;
|
|
|
|
Ecore_X_Atom ECORE_X_ATOM_NET_RESTACK_WINDOW = 0;
|
|
|
|
|
2004-10-23 07:26:25 -07:00
|
|
|
/*
|
2004-10-27 14:50:58 -07:00
|
|
|
* Application window specific NetWM hints.
|
2004-10-23 07:26:25 -07:00
|
|
|
*/
|
2004-12-04 02:10:29 -08:00
|
|
|
Ecore_X_Atom ECORE_X_ATOM_NET_WM_NAME = 0;
|
2005-09-13 20:26:23 -07:00
|
|
|
Ecore_X_Atom ECORE_X_ATOM_NET_STARTUP_ID = 0;
|
2004-12-04 02:10:29 -08:00
|
|
|
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;
|
2005-02-07 05:51:05 -08:00
|
|
|
Ecore_X_Atom ECORE_X_ATOM_NET_WM_DESKTOP = 0;
|
2004-12-04 02:10:29 -08:00
|
|
|
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;
|
2005-02-07 05:51:05 -08:00
|
|
|
Ecore_X_Atom ECORE_X_ATOM_NET_WM_HANDLED_ICONS = 0;
|
2004-12-04 02:10:29 -08:00
|
|
|
Ecore_X_Atom ECORE_X_ATOM_NET_WM_USER_TIME = 0;
|
|
|
|
|
2005-02-07 05:51:05 -08:00
|
|
|
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;
|
2004-12-04 02:10:29 -08:00
|
|
|
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;
|
|
|
|
Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_MENU = 0;
|
|
|
|
Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_UTILITY = 0;
|
|
|
|
Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_SPLASH = 0;
|
|
|
|
Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DIALOG = 0;
|
|
|
|
Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL = 0;
|
|
|
|
|
2005-02-07 05:51:05 -08:00
|
|
|
Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE = 0;
|
2004-12-04 02:10:29 -08:00
|
|
|
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;
|
|
|
|
Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_HORZ = 0;
|
|
|
|
Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_SHADED = 0;
|
|
|
|
Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_SKIP_TASKBAR = 0;
|
|
|
|
Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_SKIP_PAGER = 0;
|
|
|
|
Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_HIDDEN = 0;
|
|
|
|
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;
|
2005-02-07 05:51:05 -08:00
|
|
|
Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_DEMANDS_ATTENTION = 0;
|
2004-12-04 02:10:29 -08:00
|
|
|
|
|
|
|
Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_OPACITY = 0;
|
2004-10-23 07:26:25 -07:00
|
|
|
|
2005-01-12 23:13:06 -08:00
|
|
|
Ecore_X_Atom ECORE_X_ATOM_NET_FRAME_EXTENTS = 0;
|
2005-02-07 05:51:05 -08:00
|
|
|
Ecore_X_Atom ECORE_X_ATOM_NET_REQUEST_FRAME_EXTENTS = 0;
|
2005-01-12 23:13:06 -08:00
|
|
|
|
2005-04-27 23:50:11 -07:00
|
|
|
Ecore_X_Atom ECORE_X_ATOM_NET_WM_PING = 0;
|
|
|
|
Ecore_X_Atom ECORE_X_ATOM_NET_WM_SYNC_REQUEST = 0;
|
2005-06-06 08:04:28 -07:00
|
|
|
Ecore_X_Atom ECORE_X_ATOM_NET_WM_SYNC_REQUEST_COUNTER = 0;
|
2005-04-27 23:50:11 -07:00
|
|
|
|
2005-09-29 23:16:49 -07:00
|
|
|
Ecore_X_Atom ECORE_X_ATOM_NET_STARTUP_INFO_BEGIN = 0;
|
|
|
|
Ecore_X_Atom ECORE_X_ATOM_NET_STARTUP_INFO = 0;
|
|
|
|
|
2004-10-23 07:26:25 -07:00
|
|
|
void
|
2005-09-07 02:50:14 -07:00
|
|
|
ecore_x_netwm_init(void)
|
2004-10-23 07:26:25 -07:00
|
|
|
{
|
2004-12-04 02:10:29 -08:00
|
|
|
ECORE_X_ATOM_NET_SUPPORTED = _ATOM_GET("_NET_SUPPORTED");
|
|
|
|
ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK = _ATOM_GET("_NET_SUPPORTING_WM_CHECK");
|
|
|
|
|
|
|
|
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_NAMES = _ATOM_GET("_NET_DESKTOP_NAMES");
|
2005-02-07 05:51:05 -08:00
|
|
|
ECORE_X_ATOM_NET_DESKTOP_GEOMETRY = _ATOM_GET("_NET_DESKTOP_GEOMETRY");
|
2004-12-04 02:10:29 -08:00
|
|
|
ECORE_X_ATOM_NET_DESKTOP_VIEWPORT = _ATOM_GET("_NET_DESKTOP_VIEWPORT");
|
2005-02-07 05:51:05 -08:00
|
|
|
ECORE_X_ATOM_NET_DESKTOP_LAYOUT = _ATOM_GET("_NET_DESKTOP_LAYOUT");
|
2004-12-04 02:10:29 -08:00
|
|
|
ECORE_X_ATOM_NET_WORKAREA = _ATOM_GET("_NET_WORKAREA");
|
|
|
|
|
2005-02-07 05:51:05 -08:00
|
|
|
ECORE_X_ATOM_NET_CURRENT_DESKTOP = _ATOM_GET("_NET_CURRENT_DESKTOP");
|
|
|
|
ECORE_X_ATOM_NET_SHOWING_DESKTOP = _ATOM_GET("_NET_SHOWING_DESKTOP");
|
|
|
|
|
2004-12-04 02:10:29 -08:00
|
|
|
ECORE_X_ATOM_NET_CLIENT_LIST = _ATOM_GET("_NET_CLIENT_LIST");
|
|
|
|
ECORE_X_ATOM_NET_CLIENT_LIST_STACKING =
|
|
|
|
_ATOM_GET("_NET_CLIENT_LIST_STACKING");
|
|
|
|
ECORE_X_ATOM_NET_ACTIVE_WINDOW = _ATOM_GET("_NET_ACTIVE_WINDOW");
|
|
|
|
|
|
|
|
ECORE_X_ATOM_NET_CLOSE_WINDOW = _ATOM_GET("_NET_CLOSE_WINDOW");
|
|
|
|
ECORE_X_ATOM_NET_WM_MOVERESIZE = _ATOM_GET("_NET_WM_MOVERESIZE");
|
|
|
|
|
2005-02-07 05:51:05 -08:00
|
|
|
ECORE_X_ATOM_NET_MOVERESIZE_WINDOW = _ATOM_GET("_NET_MOVERESIZE_WINDOW");
|
|
|
|
ECORE_X_ATOM_NET_RESTACK_WINDOW = _ATOM_GET("_NET_RESTACK_WINDOW");
|
|
|
|
|
2004-12-04 02:10:29 -08:00
|
|
|
ECORE_X_ATOM_NET_WM_NAME = _ATOM_GET("_NET_WM_NAME");
|
2005-09-13 20:26:23 -07:00
|
|
|
ECORE_X_ATOM_NET_STARTUP_ID = _ATOM_GET("_NET_STARTUP_ID");
|
2004-12-04 02:10:29 -08:00
|
|
|
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");
|
2005-09-13 20:26:23 -07:00
|
|
|
ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME = _ATOM_GET("_NET_WM_VISIBLE_ICON_NAME");
|
2004-12-04 02:10:29 -08:00
|
|
|
ECORE_X_ATOM_NET_WM_DESKTOP = _ATOM_GET("_NET_WM_DESKTOP");
|
|
|
|
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");
|
2005-02-07 05:51:05 -08:00
|
|
|
ECORE_X_ATOM_NET_WM_HANDLED_ICONS = _ATOM_GET("_NET_WM_HANDLED_ICONS");
|
2004-12-04 02:10:29 -08:00
|
|
|
ECORE_X_ATOM_NET_WM_USER_TIME = _ATOM_GET("_NET_WM_USER_TIME");
|
|
|
|
|
2005-02-07 05:51:05 -08:00
|
|
|
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");
|
2005-09-13 20:26:23 -07:00
|
|
|
ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DESKTOP = _ATOM_GET("_NET_WM_WINDOW_TYPE_DESKTOP");
|
2004-12-04 02:10:29 -08:00
|
|
|
ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DOCK = _ATOM_GET("_NET_WM_WINDOW_TYPE_DOCK");
|
2005-09-13 20:26:23 -07:00
|
|
|
ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLBAR = _ATOM_GET("_NET_WM_WINDOW_TYPE_TOOLBAR");
|
2004-12-04 02:10:29 -08:00
|
|
|
ECORE_X_ATOM_NET_WM_WINDOW_TYPE_MENU = _ATOM_GET("_NET_WM_WINDOW_TYPE_MENU");
|
2005-09-13 20:26:23 -07:00
|
|
|
ECORE_X_ATOM_NET_WM_WINDOW_TYPE_UTILITY = _ATOM_GET("_NET_WM_WINDOW_TYPE_UTILITY");
|
|
|
|
ECORE_X_ATOM_NET_WM_WINDOW_TYPE_SPLASH = _ATOM_GET("_NET_WM_WINDOW_TYPE_SPLASH");
|
|
|
|
ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DIALOG = _ATOM_GET("_NET_WM_WINDOW_TYPE_DIALOG");
|
|
|
|
ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL = _ATOM_GET("_NET_WM_WINDOW_TYPE_NORMAL");
|
2004-12-04 02:10:29 -08:00
|
|
|
|
2005-02-07 05:51:05 -08:00
|
|
|
ECORE_X_ATOM_NET_WM_STATE = _ATOM_GET("_NET_WM_STATE");
|
2004-12-04 02:10:29 -08:00
|
|
|
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");
|
2005-09-13 20:26:23 -07:00
|
|
|
ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_VERT = _ATOM_GET("_NET_WM_STATE_MAXIMIZED_VERT");
|
|
|
|
ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_HORZ = _ATOM_GET("_NET_WM_STATE_MAXIMIZED_HORZ");
|
2004-12-04 02:10:29 -08:00
|
|
|
ECORE_X_ATOM_NET_WM_STATE_SHADED = _ATOM_GET("_NET_WM_STATE_SHADED");
|
2005-09-13 20:26:23 -07:00
|
|
|
ECORE_X_ATOM_NET_WM_STATE_SKIP_TASKBAR = _ATOM_GET("_NET_WM_STATE_SKIP_TASKBAR");
|
2004-12-04 02:10:29 -08:00
|
|
|
ECORE_X_ATOM_NET_WM_STATE_SKIP_PAGER = _ATOM_GET("_NET_WM_STATE_SKIP_PAGER");
|
|
|
|
ECORE_X_ATOM_NET_WM_STATE_HIDDEN = _ATOM_GET("_NET_WM_STATE_HIDDEN");
|
|
|
|
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");
|
2005-02-07 05:51:05 -08:00
|
|
|
ECORE_X_ATOM_NET_WM_STATE_DEMANDS_ATTENTION = _ATOM_GET("_NET_WM_STATE_DEMANDS_ATTENTION");
|
2004-12-04 02:10:29 -08:00
|
|
|
|
|
|
|
ECORE_X_ATOM_NET_WM_WINDOW_OPACITY = _ATOM_GET("_NET_WM_WINDOW_OPACITY");
|
2005-02-07 05:51:05 -08:00
|
|
|
|
2005-01-12 23:13:06 -08:00
|
|
|
ECORE_X_ATOM_NET_FRAME_EXTENTS = _ATOM_GET("_NET_FRAME_EXTENTS");
|
2005-02-07 05:51:05 -08:00
|
|
|
ECORE_X_ATOM_NET_REQUEST_FRAME_EXTENTS = _ATOM_GET("_NET_REQUEST_FRAME_EXTENTS");
|
2005-04-27 23:50:11 -07:00
|
|
|
|
|
|
|
ECORE_X_ATOM_NET_WM_PING = _ATOM_GET("_NET_WM_PING");
|
|
|
|
ECORE_X_ATOM_NET_WM_SYNC_REQUEST = _ATOM_GET("_NET_WM_SYNC_REQUEST");
|
2005-06-06 08:04:28 -07:00
|
|
|
ECORE_X_ATOM_NET_WM_SYNC_REQUEST_COUNTER = _ATOM_GET("_NET_WM_SYNC_REQUEST_COUNTER");
|
2005-09-29 23:16:49 -07:00
|
|
|
|
|
|
|
ECORE_X_ATOM_NET_STARTUP_INFO_BEGIN = _ATOM_GET("_NET_STARTUP_INFO_BEGIN");
|
|
|
|
ECORE_X_ATOM_NET_STARTUP_INFO = _ATOM_GET("_NET_STARTUP_INFO");
|
|
|
|
|
|
|
|
startup_info = ecore_hash_new(ecore_direct_hash, ecore_direct_compare);
|
|
|
|
if (startup_info)
|
|
|
|
{
|
|
|
|
ecore_hash_set_free_value(startup_info, _ecore_x_netwm_startup_info_free);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ecore_x_netwm_shutdown(void)
|
|
|
|
{
|
|
|
|
if (startup_info)
|
|
|
|
ecore_hash_destroy(startup_info);
|
|
|
|
startup_info = NULL;
|
2004-10-23 07:26:25 -07:00
|
|
|
}
|
2004-10-27 14:50:58 -07:00
|
|
|
|
|
|
|
/*
|
|
|
|
* WM identification
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
ecore_x_netwm_wm_identify(Ecore_X_Window root, Ecore_X_Window check,
|
2004-12-04 02:10:29 -08:00
|
|
|
const char *wm_name)
|
2004-10-27 14:50:58 -07:00
|
|
|
{
|
2004-12-08 12:29:45 -08:00
|
|
|
_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);
|
2004-10-27 14:50:58 -07:00
|
|
|
/* This one isn't mandatory */
|
2004-12-08 12:29:45 -08:00
|
|
|
_ATOM_SET_UTF8_STRING(root, ECORE_X_ATOM_NET_WM_NAME, wm_name);
|
2004-12-04 02:10:29 -08:00
|
|
|
}
|
2004-10-23 07:26:25 -07:00
|
|
|
|
|
|
|
/*
|
2005-05-16 05:59:26 -07:00
|
|
|
* Set supported atoms
|
2004-10-23 07:26:25 -07:00
|
|
|
*/
|
2005-06-07 08:34:54 -07:00
|
|
|
void
|
2005-06-04 03:01:23 -07:00
|
|
|
ecore_x_netwm_supported_set(Ecore_X_Window root, Ecore_X_Atom *supported, int num)
|
2005-05-16 05:59:26 -07:00
|
|
|
{
|
2005-06-04 03:01:23 -07:00
|
|
|
_ATOM_SET_ATOM(root, ECORE_X_ATOM_NET_SUPPORTED, supported, num);
|
|
|
|
}
|
2005-05-16 05:59:26 -07:00
|
|
|
|
2005-06-07 08:34:54 -07:00
|
|
|
int
|
|
|
|
ecore_x_netwm_supported_get(Ecore_X_Window root, Ecore_X_Atom **supported, int *num)
|
2005-06-04 03:01:23 -07:00
|
|
|
{
|
2005-06-05 01:25:48 -07:00
|
|
|
int num_ret;
|
2005-06-04 03:01:23 -07:00
|
|
|
unsigned char *data;
|
2005-05-16 05:59:26 -07:00
|
|
|
|
2005-06-04 03:01:23 -07:00
|
|
|
if (num) *num = 0;
|
2005-06-07 08:34:54 -07:00
|
|
|
if (supported) *supported = NULL;
|
2005-05-16 05:59:26 -07:00
|
|
|
|
2005-06-04 03:01:23 -07:00
|
|
|
if (!ecore_x_window_prop_property_get(root, ECORE_X_ATOM_NET_SUPPORTED,
|
|
|
|
XA_ATOM, 32, &data, &num_ret))
|
2005-06-07 08:34:54 -07:00
|
|
|
return 0;
|
2005-05-16 05:59:26 -07:00
|
|
|
|
2005-06-07 08:34:54 -07:00
|
|
|
if ((!data) || (!num_ret)) return 0;
|
2004-10-23 07:26:25 -07:00
|
|
|
|
2005-06-04 03:01:23 -07:00
|
|
|
if (num) *num = num_ret;
|
2005-06-07 08:34:54 -07:00
|
|
|
if (supported) *supported = (Ecore_X_Atom *)data;
|
|
|
|
return 1;
|
2005-05-16 05:59:26 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Desktop configuration and status
|
|
|
|
*/
|
2004-10-23 07:26:25 -07:00
|
|
|
void
|
2004-12-08 12:29:45 -08:00
|
|
|
ecore_x_netwm_desk_count_set(Ecore_X_Window root, unsigned int n_desks)
|
2004-10-23 07:26:25 -07:00
|
|
|
{
|
2004-12-08 12:29:45 -08:00
|
|
|
ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_NUMBER_OF_DESKTOPS,
|
|
|
|
&n_desks, 1);
|
2004-10-23 07:26:25 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2005-06-07 08:34:54 -07:00
|
|
|
ecore_x_netwm_desk_roots_set(Ecore_X_Window root,
|
|
|
|
Ecore_X_Window *vroots, unsigned int n_desks)
|
2004-10-23 07:26:25 -07:00
|
|
|
{
|
2004-12-08 12:29:45 -08:00
|
|
|
_ATOM_SET_WINDOW(root, ECORE_X_ATOM_NET_VIRTUAL_ROOTS, vroots, n_desks);
|
2004-10-23 07:26:25 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2005-06-07 08:34:54 -07:00
|
|
|
ecore_x_netwm_desk_names_set(Ecore_X_Window root,
|
|
|
|
const char **names, unsigned int n_desks)
|
2004-10-23 07:26:25 -07:00
|
|
|
{
|
|
|
|
char ss[32], *buf;
|
|
|
|
const char *s;
|
2004-12-08 12:29:45 -08:00
|
|
|
unsigned int i;
|
|
|
|
int l, len;
|
2004-10-23 07:26:25 -07:00
|
|
|
|
|
|
|
buf = NULL;
|
|
|
|
len = 0;
|
|
|
|
|
|
|
|
for (i = 0; i < n_desks; i++)
|
|
|
|
{
|
|
|
|
s = (names) ? names[i] : NULL;
|
|
|
|
if (!s)
|
|
|
|
{
|
|
|
|
/* Default to "Desk-<number>" */
|
|
|
|
sprintf(ss, "Desk-%d", i);
|
|
|
|
s = ss;
|
|
|
|
}
|
|
|
|
|
|
|
|
l = strlen(s) + 1;
|
|
|
|
buf = realloc(buf, len + l);
|
|
|
|
memcpy(buf + len, s, l);
|
|
|
|
len += l;
|
|
|
|
}
|
|
|
|
|
2004-12-08 12:29:45 -08:00
|
|
|
_ATOM_SET_UTF8_STRING_LIST(root, ECORE_X_ATOM_NET_DESKTOP_NAMES, buf, len);
|
2004-10-23 07:26:25 -07:00
|
|
|
|
|
|
|
free(buf);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2004-12-08 12:29:45 -08:00
|
|
|
ecore_x_netwm_desk_size_set(Ecore_X_Window root, unsigned int width,
|
|
|
|
unsigned int height)
|
2004-10-23 07:26:25 -07:00
|
|
|
{
|
2004-12-08 12:29:45 -08:00
|
|
|
unsigned int size[2];
|
2004-10-23 07:26:25 -07:00
|
|
|
|
|
|
|
size[0] = width;
|
|
|
|
size[1] = height;
|
2004-12-08 12:29:45 -08:00
|
|
|
ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_DESKTOP_GEOMETRY, size,
|
|
|
|
2);
|
2004-10-23 07:26:25 -07:00
|
|
|
}
|
|
|
|
|
2005-02-07 05:51:05 -08:00
|
|
|
void
|
2005-06-07 08:34:54 -07:00
|
|
|
ecore_x_netwm_desk_viewports_set(Ecore_X_Window root,
|
|
|
|
unsigned int *origins, unsigned int n_desks)
|
2005-02-07 05:51:05 -08:00
|
|
|
{
|
|
|
|
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)
|
|
|
|
{
|
2005-05-16 05:59:26 -07:00
|
|
|
unsigned int layout[4];
|
2005-02-07 05:51:05 -08:00
|
|
|
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
2004-10-23 07:26:25 -07:00
|
|
|
void
|
2005-06-07 08:34:54 -07:00
|
|
|
ecore_x_netwm_desk_workareas_set(Ecore_X_Window root,
|
|
|
|
unsigned int *areas, unsigned int n_desks)
|
2004-10-23 07:26:25 -07:00
|
|
|
{
|
2004-12-08 12:29:45 -08:00
|
|
|
ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_WORKAREA, areas,
|
|
|
|
4 * n_desks);
|
2004-10-23 07:26:25 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2004-12-08 12:29:45 -08:00
|
|
|
ecore_x_netwm_desk_current_set(Ecore_X_Window root, unsigned int desk)
|
2004-10-23 07:26:25 -07:00
|
|
|
{
|
2004-12-08 12:29:45 -08:00
|
|
|
ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_CURRENT_DESKTOP, &desk,
|
|
|
|
1);
|
2004-10-23 07:26:25 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ecore_x_netwm_showing_desktop_set(Ecore_X_Window root, int on)
|
|
|
|
{
|
2005-06-07 08:34:54 -07:00
|
|
|
unsigned int val;
|
2004-10-23 07:26:25 -07:00
|
|
|
|
2004-12-08 12:29:45 -08:00
|
|
|
val = (on) ? 1 : 0;
|
|
|
|
ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_SHOWING_DESKTOP, &val,
|
|
|
|
1);
|
2004-10-23 07:26:25 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Client status
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* Mapping order */
|
|
|
|
void
|
2005-06-07 08:34:54 -07:00
|
|
|
ecore_x_netwm_client_list_set(Ecore_X_Window root,
|
|
|
|
Ecore_X_Window *p_clients, unsigned int n_clients)
|
2004-10-23 07:26:25 -07:00
|
|
|
{
|
2004-12-08 12:29:45 -08:00
|
|
|
_ATOM_SET_WINDOW(root, ECORE_X_ATOM_NET_CLIENT_LIST, p_clients, n_clients);
|
2004-10-23 07:26:25 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Stacking order */
|
|
|
|
void
|
2004-12-08 12:29:45 -08:00
|
|
|
ecore_x_netwm_client_list_stacking_set(Ecore_X_Window root,
|
2005-06-07 08:34:54 -07:00
|
|
|
Ecore_X_Window *p_clients,
|
|
|
|
unsigned int n_clients)
|
2004-10-23 07:26:25 -07:00
|
|
|
{
|
2004-12-08 12:29:45 -08:00
|
|
|
_ATOM_SET_WINDOW(root, ECORE_X_ATOM_NET_CLIENT_LIST_STACKING, p_clients,
|
2004-10-23 07:26:25 -07:00
|
|
|
n_clients);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ecore_x_netwm_client_active_set(Ecore_X_Window root, Ecore_X_Window win)
|
|
|
|
{
|
2004-12-08 12:29:45 -08:00
|
|
|
_ATOM_SET_WINDOW(root, ECORE_X_ATOM_NET_ACTIVE_WINDOW, &win, 1);
|
2004-10-23 07:26:25 -07:00
|
|
|
}
|
2004-11-29 15:25:12 -08:00
|
|
|
|
|
|
|
void
|
|
|
|
ecore_x_netwm_name_set(Ecore_X_Window win, const char *name)
|
|
|
|
{
|
2004-12-08 12:29:45 -08:00
|
|
|
_ecore_x_window_prop_string_utf8_set(win, ECORE_X_ATOM_NET_WM_NAME, name);
|
2004-11-29 15:25:12 -08:00
|
|
|
}
|
|
|
|
|
2005-06-07 08:34:54 -07:00
|
|
|
int
|
|
|
|
ecore_x_netwm_name_get(Ecore_X_Window win, char **name)
|
2004-11-29 15:25:12 -08:00
|
|
|
{
|
2005-06-07 08:34:54 -07:00
|
|
|
if (name)
|
|
|
|
*name = _ecore_x_window_prop_string_utf8_get(win, ECORE_X_ATOM_NET_WM_NAME);
|
|
|
|
return 1;
|
2004-11-29 15:25:12 -08:00
|
|
|
}
|
|
|
|
|
2005-09-13 20:26:23 -07:00
|
|
|
void
|
|
|
|
ecore_x_netwm_startup_id_set(Ecore_X_Window win, const char *id)
|
|
|
|
{
|
|
|
|
_ecore_x_window_prop_string_utf8_set(win, ECORE_X_ATOM_NET_STARTUP_ID, id);
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
ecore_x_netwm_startup_id_get(Ecore_X_Window win, char **id)
|
|
|
|
{
|
|
|
|
if (id)
|
|
|
|
*id = _ecore_x_window_prop_string_utf8_get(win, ECORE_X_ATOM_NET_STARTUP_ID);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2004-11-29 15:25:12 -08:00
|
|
|
void
|
2005-02-07 05:51:05 -08:00
|
|
|
ecore_x_netwm_visible_name_set(Ecore_X_Window win, const char *name)
|
2004-12-04 02:10:29 -08:00
|
|
|
{
|
2005-02-07 05:51:05 -08:00
|
|
|
_ecore_x_window_prop_string_utf8_set(win, ECORE_X_ATOM_NET_WM_VISIBLE_NAME,
|
2004-12-04 02:10:29 -08:00
|
|
|
name);
|
|
|
|
}
|
|
|
|
|
2005-06-07 08:34:54 -07:00
|
|
|
int
|
|
|
|
ecore_x_netwm_visible_name_get(Ecore_X_Window win, char **name)
|
2004-11-29 15:25:12 -08:00
|
|
|
{
|
2005-06-07 08:34:54 -07:00
|
|
|
if (name)
|
|
|
|
*name = _ecore_x_window_prop_string_utf8_get(win,
|
|
|
|
ECORE_X_ATOM_NET_WM_VISIBLE_NAME);
|
|
|
|
return 1;
|
2004-11-29 15:25:12 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2005-02-07 05:51:05 -08:00
|
|
|
ecore_x_netwm_icon_name_set(Ecore_X_Window win, const char *name)
|
2004-12-04 02:10:29 -08:00
|
|
|
{
|
2005-02-07 05:51:05 -08:00
|
|
|
_ecore_x_window_prop_string_utf8_set(win, ECORE_X_ATOM_NET_WM_ICON_NAME,
|
2004-12-04 02:10:29 -08:00
|
|
|
name);
|
2004-11-29 15:25:12 -08:00
|
|
|
}
|
|
|
|
|
2005-06-07 08:34:54 -07:00
|
|
|
int
|
|
|
|
ecore_x_netwm_icon_name_get(Ecore_X_Window win, char **name)
|
2004-11-29 15:25:12 -08:00
|
|
|
{
|
2005-06-07 08:34:54 -07:00
|
|
|
if (name)
|
|
|
|
*name = _ecore_x_window_prop_string_utf8_get(win,
|
|
|
|
ECORE_X_ATOM_NET_WM_ICON_NAME);
|
|
|
|
return 1;
|
2004-11-29 15:25:12 -08:00
|
|
|
}
|
2004-12-04 02:10:29 -08:00
|
|
|
|
2004-11-29 15:25:12 -08:00
|
|
|
void
|
|
|
|
ecore_x_netwm_visible_icon_name_set(Ecore_X_Window win, const char *name)
|
2004-12-04 02:10:29 -08:00
|
|
|
{
|
2004-12-08 12:29:45 -08:00
|
|
|
_ecore_x_window_prop_string_utf8_set(win,
|
|
|
|
ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME,
|
|
|
|
name);
|
2004-12-04 02:10:29 -08:00
|
|
|
}
|
|
|
|
|
2005-06-07 08:34:54 -07:00
|
|
|
int
|
|
|
|
ecore_x_netwm_visible_icon_name_get(Ecore_X_Window win, char **name)
|
2004-12-04 02:10:29 -08:00
|
|
|
{
|
2005-06-07 08:34:54 -07:00
|
|
|
if (name)
|
|
|
|
*name = _ecore_x_window_prop_string_utf8_get(win,
|
|
|
|
ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME);
|
|
|
|
return 1;
|
2004-12-04 02:10:29 -08:00
|
|
|
}
|
2004-12-08 12:29:45 -08:00
|
|
|
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
ecore_x_netwm_desktop_get(Ecore_X_Window win, unsigned int *desk)
|
|
|
|
{
|
2005-02-15 03:21:47 -08:00
|
|
|
int ret;
|
2005-05-16 05:59:26 -07:00
|
|
|
unsigned int tmp;
|
|
|
|
|
2005-02-15 03:21:47 -08:00
|
|
|
ret = ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_DESKTOP,
|
2005-05-16 05:59:26 -07:00
|
|
|
&tmp, 1);
|
2005-02-15 03:21:47 -08:00
|
|
|
|
2005-05-16 05:59:26 -07:00
|
|
|
if (desk) *desk = tmp;
|
2005-02-15 03:21:47 -08:00
|
|
|
return ret == 1 ? 1 : 0;
|
2004-12-08 12:29:45 -08:00
|
|
|
}
|
|
|
|
|
2005-02-07 05:51:05 -08:00
|
|
|
/*
|
2005-06-03 05:11:27 -07:00
|
|
|
* _NET_WM_STRUT is deprecated
|
2005-02-07 05:51:05 -08:00
|
|
|
*/
|
2004-12-08 12:29:45 -08:00
|
|
|
void
|
2005-02-07 05:51:05 -08:00
|
|
|
ecore_x_netwm_strut_set(Ecore_X_Window win, int left, int right,
|
|
|
|
int top, int bottom)
|
2004-12-08 12:29:45 -08:00
|
|
|
{
|
2005-05-16 05:59:26 -07:00
|
|
|
unsigned int strut[4];
|
2005-02-07 05:51:05 -08:00
|
|
|
|
|
|
|
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);
|
2004-12-08 12:29:45 -08:00
|
|
|
}
|
|
|
|
|
2005-02-07 05:51:05 -08:00
|
|
|
/*
|
2005-06-03 05:11:27 -07:00
|
|
|
* _NET_WM_STRUT is deprecated
|
2005-02-07 05:51:05 -08:00
|
|
|
*/
|
2004-12-08 12:29:45 -08:00
|
|
|
int
|
2005-02-07 05:51:05 -08:00
|
|
|
ecore_x_netwm_strut_get(Ecore_X_Window win, int *left, int *right,
|
|
|
|
int *top, int *bottom)
|
2004-12-08 12:29:45 -08:00
|
|
|
{
|
2005-02-07 05:51:05 -08:00
|
|
|
int ret = 0;
|
2005-05-16 05:59:26 -07:00
|
|
|
unsigned int strut[4];
|
2005-02-07 05:51:05 -08:00
|
|
|
|
|
|
|
ret = ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_STRUT, strut, 4);
|
|
|
|
if (ret != 4)
|
|
|
|
return 0;
|
|
|
|
|
2005-05-16 05:59:26 -07:00
|
|
|
if (left) *left = strut[0];
|
|
|
|
if (right) *right = strut[1];
|
|
|
|
if (top) *top = strut[2];
|
|
|
|
if (bottom) *bottom = strut[3];
|
2005-02-07 05:51:05 -08:00
|
|
|
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)
|
|
|
|
{
|
2005-05-16 05:59:26 -07:00
|
|
|
unsigned int strut[12];
|
2005-02-07 05:51:05 -08:00
|
|
|
|
|
|
|
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;
|
2005-02-15 03:21:47 -08:00
|
|
|
ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_STRUT_PARTIAL, strut, 12);
|
2005-02-07 05:51:05 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
2005-05-16 05:59:26 -07:00
|
|
|
unsigned int strut[12];
|
2005-02-07 05:51:05 -08:00
|
|
|
|
|
|
|
ret = ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_STRUT_PARTIAL, strut, 12);
|
|
|
|
if (ret != 12)
|
2005-06-03 05:11:27 -07:00
|
|
|
return 0;
|
2005-02-07 05:51:05 -08:00
|
|
|
|
2005-05-16 05:59:26 -07:00
|
|
|
if (left) *left = strut[0];
|
|
|
|
if (right) *right = strut[1];
|
|
|
|
if (top) *top = strut[2];
|
|
|
|
if (bottom) *bottom = strut[3];
|
|
|
|
if (left_start_y) *left_start_y = strut[4];
|
|
|
|
if (left_end_y) *left_end_y = strut[5];
|
|
|
|
if (right_start_y) *right_start_y = strut[6];
|
|
|
|
if (right_end_y) *right_end_y = strut[7];
|
|
|
|
if (top_start_x) *top_start_x = strut[8];
|
|
|
|
if (top_end_x) *top_end_x = strut[9];
|
|
|
|
if (bottom_start_x) *bottom_start_x = strut[10];
|
|
|
|
if (bottom_end_x) *bottom_end_x = strut[11];
|
2005-02-07 05:51:05 -08:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2005-06-02 13:14:13 -07:00
|
|
|
int
|
2005-09-25 09:48:30 -07:00
|
|
|
ecore_x_netwm_icons_get(Ecore_X_Window win, Ecore_X_Icon **icon, int *num)
|
2005-06-02 13:14:13 -07:00
|
|
|
{
|
2005-06-02 18:18:58 -07:00
|
|
|
unsigned char *data_ret;
|
2005-09-25 09:48:30 -07:00
|
|
|
unsigned int *data, *p;
|
2005-06-02 18:18:58 -07:00
|
|
|
unsigned int *src;
|
2005-09-25 09:48:30 -07:00
|
|
|
unsigned int len, icons, i;
|
|
|
|
int num_ret;
|
2005-06-02 13:14:13 -07:00
|
|
|
|
|
|
|
if (num) *num = 0;
|
2005-09-25 09:48:30 -07:00
|
|
|
if (icon) *icon = NULL;
|
2005-06-02 13:14:13 -07:00
|
|
|
|
|
|
|
if (!ecore_x_window_prop_property_get(win, ECORE_X_ATOM_NET_WM_ICON,
|
|
|
|
XA_CARDINAL, 32, &data_ret, &num_ret))
|
|
|
|
return 0;
|
2005-09-24 04:36:22 -07:00
|
|
|
if (!data_ret) return 0;
|
2005-09-24 06:18:43 -07:00
|
|
|
if (num_ret < 2)
|
|
|
|
{
|
|
|
|
free(data_ret);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2005-06-03 22:43:11 -07:00
|
|
|
data = (unsigned int *)data_ret;
|
2005-06-02 13:14:13 -07:00
|
|
|
|
2005-09-25 09:48:30 -07:00
|
|
|
/* Check how many icons there are */
|
|
|
|
icons = 0;
|
|
|
|
p = data;
|
|
|
|
while (p)
|
2005-06-02 18:18:58 -07:00
|
|
|
{
|
2005-09-25 09:48:30 -07:00
|
|
|
len = p[0] * p[1];
|
|
|
|
p += (len + 2);
|
|
|
|
if ((p - data) > num_ret)
|
|
|
|
{
|
|
|
|
free(data_ret);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
icons++;
|
|
|
|
|
|
|
|
if ((p - data) == num_ret)
|
|
|
|
p = NULL;
|
2005-06-02 18:18:58 -07:00
|
|
|
}
|
2005-09-25 09:48:30 -07:00
|
|
|
if (num) *num = icons;
|
2005-06-02 13:14:13 -07:00
|
|
|
|
2005-09-25 09:48:30 -07:00
|
|
|
/* If the user doesn't want the icons, return */
|
|
|
|
if (!icon)
|
|
|
|
{
|
|
|
|
free(data_ret);
|
|
|
|
return 1;
|
|
|
|
}
|
2005-06-02 13:14:13 -07:00
|
|
|
|
2005-09-25 09:48:30 -07:00
|
|
|
/* Allocate memory */
|
|
|
|
*icon = malloc(icons * sizeof(Ecore_X_Icon));
|
|
|
|
if (!(*icon))
|
2005-09-24 04:36:22 -07:00
|
|
|
{
|
|
|
|
free(data_ret);
|
|
|
|
return 0;
|
|
|
|
}
|
2005-09-25 09:48:30 -07:00
|
|
|
|
|
|
|
for (i = 0; i < icons; i++)
|
|
|
|
{
|
|
|
|
((*icon)[i]).data = malloc(len * sizeof(unsigned int));
|
|
|
|
if (!((*icon)[i]).data)
|
|
|
|
{
|
|
|
|
while (i)
|
|
|
|
free(((*icon)[--i]).data);
|
|
|
|
free(*icon);
|
|
|
|
free(data_ret);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Fetch the icons */
|
|
|
|
p = data;
|
|
|
|
for (i = 0; i < icons; i++)
|
|
|
|
{
|
|
|
|
len = p[0] * p[1];
|
|
|
|
((*icon)[i]).width = p[0];
|
|
|
|
((*icon)[i]).height = p[1];
|
|
|
|
src = &(p[2]);
|
|
|
|
((*icon)[i]).data = malloc(len * sizeof(unsigned int));
|
|
|
|
memcpy(((*icon)[i]).data, src, len * sizeof(unsigned int));
|
|
|
|
|
|
|
|
p += (len + 2);
|
|
|
|
}
|
|
|
|
|
2005-06-02 13:14:13 -07:00
|
|
|
free(data_ret);
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2005-02-07 05:51:05 -08:00
|
|
|
void
|
|
|
|
ecore_x_netwm_icon_geometry_set(Ecore_X_Window win, int x, int y, int width, int height)
|
|
|
|
{
|
2005-05-16 05:59:26 -07:00
|
|
|
unsigned int geometry[4];
|
2005-02-07 05:51:05 -08:00
|
|
|
|
|
|
|
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;
|
2005-05-16 05:59:26 -07:00
|
|
|
unsigned int geometry[4];
|
2005-02-07 05:51:05 -08:00
|
|
|
|
|
|
|
ret = ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_ICON_GEOMETRY, geometry, 4);
|
|
|
|
if (ret != 4)
|
|
|
|
return 0;
|
|
|
|
|
2005-05-16 05:59:26 -07:00
|
|
|
if (x) *x = geometry[0];
|
|
|
|
if (y) *y = geometry[1];
|
|
|
|
if (width) *width = geometry[2];
|
|
|
|
if (height) *height = geometry[3];
|
2005-02-07 05:51:05 -08:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ecore_x_netwm_pid_set(Ecore_X_Window win, int pid)
|
|
|
|
{
|
2005-05-16 05:59:26 -07:00
|
|
|
unsigned int tmp;
|
|
|
|
|
|
|
|
tmp = pid;
|
2005-02-07 05:51:05 -08:00
|
|
|
ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_PID,
|
2005-05-16 05:59:26 -07:00
|
|
|
&tmp, 1);
|
2005-02-07 05:51:05 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
ecore_x_netwm_pid_get(Ecore_X_Window win, int *pid)
|
|
|
|
{
|
2005-02-15 03:21:47 -08:00
|
|
|
int ret;
|
2005-05-16 05:59:26 -07:00
|
|
|
unsigned int tmp;
|
|
|
|
|
2005-02-15 03:21:47 -08:00
|
|
|
ret = ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_PID,
|
2005-05-16 05:59:26 -07:00
|
|
|
&tmp, 1);
|
|
|
|
if (pid) *pid = tmp;
|
2005-02-15 03:21:47 -08:00
|
|
|
return ret == 1 ? 1 : 0;
|
2005-02-07 05:51:05 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
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
|
2005-06-03 04:58:10 -07:00
|
|
|
ecore_x_netwm_user_time_set(Ecore_X_Window win, unsigned int time)
|
2005-02-07 05:51:05 -08:00
|
|
|
{
|
|
|
|
ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_USER_TIME,
|
2005-06-03 04:58:10 -07:00
|
|
|
&time, 1);
|
2005-02-07 05:51:05 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
int
|
2005-06-03 04:58:10 -07:00
|
|
|
ecore_x_netwm_user_time_get(Ecore_X_Window win, unsigned int *time)
|
2005-02-07 05:51:05 -08:00
|
|
|
{
|
2005-02-15 03:21:47 -08:00
|
|
|
int ret;
|
2005-05-16 05:59:26 -07:00
|
|
|
unsigned int tmp;
|
|
|
|
|
2005-02-15 03:21:47 -08:00
|
|
|
ret = ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_USER_TIME,
|
2005-05-16 05:59:26 -07:00
|
|
|
&tmp, 1);
|
|
|
|
if (time) *time = tmp;
|
2005-02-15 03:21:47 -08:00
|
|
|
return ret == 1 ? 1 : 0;
|
2004-12-08 12:29:45 -08:00
|
|
|
}
|
2004-12-29 21:36:01 -08:00
|
|
|
|
2005-04-28 05:26:34 -07:00
|
|
|
Ecore_X_Window_State
|
|
|
|
_ecore_x_netwm_state_get(Ecore_X_Atom a)
|
|
|
|
{
|
|
|
|
if (a == ECORE_X_ATOM_NET_WM_STATE_MODAL)
|
|
|
|
return ECORE_X_WINDOW_STATE_MODAL;
|
|
|
|
else if (a == ECORE_X_ATOM_NET_WM_STATE_STICKY)
|
|
|
|
return ECORE_X_WINDOW_STATE_STICKY;
|
|
|
|
else if (a == ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_VERT)
|
|
|
|
return ECORE_X_WINDOW_STATE_MAXIMIZED_VERT;
|
|
|
|
else if (a == ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_HORZ)
|
|
|
|
return ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ;
|
|
|
|
else if (a == ECORE_X_ATOM_NET_WM_STATE_SHADED)
|
|
|
|
return ECORE_X_WINDOW_STATE_SHADED;
|
|
|
|
else if (a == ECORE_X_ATOM_NET_WM_STATE_SKIP_TASKBAR)
|
|
|
|
return ECORE_X_WINDOW_STATE_SKIP_TASKBAR;
|
|
|
|
else if (a == ECORE_X_ATOM_NET_WM_STATE_SKIP_PAGER)
|
|
|
|
return ECORE_X_WINDOW_STATE_SKIP_PAGER;
|
|
|
|
else if (a == ECORE_X_ATOM_NET_WM_STATE_HIDDEN)
|
|
|
|
return ECORE_X_WINDOW_STATE_HIDDEN;
|
|
|
|
else if (a == ECORE_X_ATOM_NET_WM_STATE_FULLSCREEN)
|
|
|
|
return ECORE_X_WINDOW_STATE_FULLSCREEN;
|
|
|
|
else if (a == ECORE_X_ATOM_NET_WM_STATE_ABOVE)
|
|
|
|
return ECORE_X_WINDOW_STATE_ABOVE;
|
|
|
|
else if (a == ECORE_X_ATOM_NET_WM_STATE_BELOW)
|
|
|
|
return ECORE_X_WINDOW_STATE_BELOW;
|
|
|
|
else if (a == ECORE_X_ATOM_NET_WM_STATE_DEMANDS_ATTENTION)
|
|
|
|
return ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION;
|
|
|
|
else
|
|
|
|
return ECORE_X_WINDOW_STATE_UNKNOWN;
|
|
|
|
}
|
|
|
|
|
2004-12-29 21:36:01 -08:00
|
|
|
static Ecore_X_Atom
|
|
|
|
_ecore_x_netwm_state_atom_get(Ecore_X_Window_State s)
|
|
|
|
{
|
|
|
|
switch(s)
|
2005-03-22 11:34:10 -08:00
|
|
|
{
|
2004-12-29 21:36:01 -08:00
|
|
|
case ECORE_X_WINDOW_STATE_MODAL:
|
2005-03-22 11:34:10 -08:00
|
|
|
return ECORE_X_ATOM_NET_WM_STATE_MODAL;
|
2004-12-29 21:36:01 -08:00
|
|
|
case ECORE_X_WINDOW_STATE_STICKY:
|
2005-03-22 11:34:10 -08:00
|
|
|
return ECORE_X_ATOM_NET_WM_STATE_STICKY;
|
2004-12-29 21:36:01 -08:00
|
|
|
case ECORE_X_WINDOW_STATE_MAXIMIZED_VERT:
|
2005-03-22 11:34:10 -08:00
|
|
|
return ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_VERT;
|
2004-12-29 21:36:01 -08:00
|
|
|
case ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ:
|
2005-03-22 11:34:10 -08:00
|
|
|
return ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_HORZ;
|
2004-12-29 21:36:01 -08:00
|
|
|
case ECORE_X_WINDOW_STATE_SHADED:
|
2005-03-22 11:34:10 -08:00
|
|
|
return ECORE_X_ATOM_NET_WM_STATE_SHADED;
|
2004-12-29 21:36:01 -08:00
|
|
|
case ECORE_X_WINDOW_STATE_SKIP_TASKBAR:
|
2005-03-22 11:34:10 -08:00
|
|
|
return ECORE_X_ATOM_NET_WM_STATE_SKIP_TASKBAR;
|
2004-12-29 21:36:01 -08:00
|
|
|
case ECORE_X_WINDOW_STATE_SKIP_PAGER:
|
2005-03-22 11:34:10 -08:00
|
|
|
return ECORE_X_ATOM_NET_WM_STATE_SKIP_PAGER;
|
2004-12-29 21:36:01 -08:00
|
|
|
case ECORE_X_WINDOW_STATE_HIDDEN:
|
2005-03-22 11:34:10 -08:00
|
|
|
return ECORE_X_ATOM_NET_WM_STATE_HIDDEN;
|
2004-12-29 21:36:01 -08:00
|
|
|
case ECORE_X_WINDOW_STATE_FULLSCREEN:
|
2005-03-22 11:34:10 -08:00
|
|
|
return ECORE_X_ATOM_NET_WM_STATE_FULLSCREEN;
|
2004-12-29 21:36:01 -08:00
|
|
|
case ECORE_X_WINDOW_STATE_ABOVE:
|
2005-03-22 11:34:10 -08:00
|
|
|
return ECORE_X_ATOM_NET_WM_STATE_ABOVE;
|
2004-12-29 21:36:01 -08:00
|
|
|
case ECORE_X_WINDOW_STATE_BELOW:
|
2005-03-22 11:34:10 -08:00
|
|
|
return ECORE_X_ATOM_NET_WM_STATE_BELOW;
|
2005-02-07 05:51:05 -08:00
|
|
|
case ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION:
|
2005-03-22 11:34:10 -08:00
|
|
|
return ECORE_X_ATOM_NET_WM_STATE_DEMANDS_ATTENTION;
|
2004-12-29 21:36:01 -08:00
|
|
|
default:
|
2005-03-22 11:34:10 -08:00
|
|
|
return 0;
|
|
|
|
}
|
2004-12-29 21:36:01 -08:00
|
|
|
}
|
|
|
|
|
2005-06-07 08:34:54 -07:00
|
|
|
void
|
|
|
|
ecore_x_netwm_window_state_set(Ecore_X_Window win, Ecore_X_Window_State *state, unsigned int num)
|
2005-05-30 23:51:50 -07:00
|
|
|
{
|
|
|
|
unsigned char *data;
|
|
|
|
Ecore_X_Atom *set;
|
|
|
|
int i;
|
|
|
|
|
2005-06-07 08:34:54 -07:00
|
|
|
if (!num)
|
2005-05-30 23:51:50 -07:00
|
|
|
{
|
2005-06-09 21:18:24 -07:00
|
|
|
ecore_x_window_prop_property_del(win, ECORE_X_ATOM_NET_WM_STATE);
|
2005-06-07 08:34:54 -07:00
|
|
|
return;
|
2005-05-30 23:51:50 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
data = malloc(num * sizeof(Ecore_X_Atom));
|
2005-06-07 08:34:54 -07:00
|
|
|
if (!data) return;
|
2005-05-30 23:51:50 -07:00
|
|
|
|
2005-06-05 01:25:48 -07:00
|
|
|
set = (Ecore_X_Atom *) data;
|
2005-05-30 23:51:50 -07:00
|
|
|
for (i = 0; i < num; i++)
|
|
|
|
set[i] = _ecore_x_netwm_state_atom_get(state[i]);
|
|
|
|
|
2005-06-05 01:25:48 -07:00
|
|
|
_ATOM_SET_ATOM(win, ECORE_X_ATOM_NET_WM_STATE, data, num);
|
|
|
|
|
2005-05-30 23:51:50 -07:00
|
|
|
free(data);
|
2005-06-07 08:34:54 -07:00
|
|
|
return;
|
2005-05-30 23:51:50 -07:00
|
|
|
}
|
|
|
|
|
2004-12-29 21:36:01 -08:00
|
|
|
int
|
2005-06-07 08:34:54 -07:00
|
|
|
ecore_x_netwm_window_state_get(Ecore_X_Window win, Ecore_X_Window_State **state, unsigned int *num)
|
2004-12-29 21:36:01 -08:00
|
|
|
{
|
2005-06-07 08:34:54 -07:00
|
|
|
int num_ret, i;
|
|
|
|
unsigned char *data;
|
|
|
|
Ecore_X_Atom *atoms;
|
2004-12-29 21:36:01 -08:00
|
|
|
|
2005-06-07 08:34:54 -07:00
|
|
|
if (num) *num = 0;
|
|
|
|
if (state) *state = NULL;
|
2004-12-29 21:36:01 -08:00
|
|
|
|
2005-06-07 08:34:54 -07:00
|
|
|
if (!ecore_x_window_prop_property_get(win, ECORE_X_ATOM_NET_WM_STATE,
|
|
|
|
XA_ATOM, 32, &data, &num_ret))
|
|
|
|
return 0;
|
2005-02-07 05:51:05 -08:00
|
|
|
|
2005-06-07 08:34:54 -07:00
|
|
|
if ((!data) || (!num_ret)) return 0;
|
2004-12-29 21:36:01 -08:00
|
|
|
|
2005-06-07 08:34:54 -07:00
|
|
|
atoms = (Ecore_X_Atom *) data;
|
|
|
|
if (state)
|
2005-03-22 11:34:10 -08:00
|
|
|
{
|
2005-06-07 08:34:54 -07:00
|
|
|
*state = malloc(num_ret * sizeof(Ecore_X_Window_State));
|
|
|
|
if (*state)
|
|
|
|
for (i = 0; i < num_ret; ++i)
|
|
|
|
(*state)[i] = _ecore_x_netwm_state_get(atoms[i]);
|
2005-03-22 11:34:10 -08:00
|
|
|
|
2005-06-07 08:34:54 -07:00
|
|
|
if (num) *num = num_ret;
|
2005-03-22 11:34:10 -08:00
|
|
|
}
|
2005-05-16 05:59:26 -07:00
|
|
|
|
2005-06-07 08:34:54 -07:00
|
|
|
free(data);
|
|
|
|
return 1;
|
2005-02-07 05:51:05 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
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
|
2005-06-03 12:46:40 -07:00
|
|
|
return ECORE_X_WINDOW_TYPE_UNKNOWN;
|
2005-02-07 05:51:05 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static Ecore_X_Atom
|
|
|
|
_ecore_x_netwm_window_type_atom_get(Ecore_X_Window_Type type)
|
|
|
|
{
|
|
|
|
switch (type)
|
2005-03-22 11:34:10 -08:00
|
|
|
{
|
2005-02-07 05:51:05 -08:00
|
|
|
case ECORE_X_WINDOW_TYPE_DESKTOP:
|
2005-03-22 11:34:10 -08:00
|
|
|
return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DESKTOP;
|
2005-02-07 05:51:05 -08:00
|
|
|
case ECORE_X_WINDOW_TYPE_DOCK:
|
2005-03-22 11:34:10 -08:00
|
|
|
return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DOCK;
|
2005-02-07 05:51:05 -08:00
|
|
|
case ECORE_X_WINDOW_TYPE_TOOLBAR:
|
2005-03-22 11:34:10 -08:00
|
|
|
return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLBAR;
|
2005-02-07 05:51:05 -08:00
|
|
|
case ECORE_X_WINDOW_TYPE_MENU:
|
2005-03-22 11:34:10 -08:00
|
|
|
return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_MENU;
|
2005-02-07 05:51:05 -08:00
|
|
|
case ECORE_X_WINDOW_TYPE_UTILITY:
|
2005-03-22 11:34:10 -08:00
|
|
|
return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_UTILITY;
|
2005-02-07 05:51:05 -08:00
|
|
|
case ECORE_X_WINDOW_TYPE_SPLASH:
|
2005-03-22 11:34:10 -08:00
|
|
|
return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_SPLASH;
|
2005-02-07 05:51:05 -08:00
|
|
|
case ECORE_X_WINDOW_TYPE_DIALOG:
|
2005-03-22 11:34:10 -08:00
|
|
|
return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DIALOG;
|
2005-02-07 05:51:05 -08:00
|
|
|
case ECORE_X_WINDOW_TYPE_NORMAL:
|
2005-03-22 11:34:10 -08:00
|
|
|
return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL;
|
2005-02-07 05:51:05 -08:00
|
|
|
default:
|
2005-03-22 11:34:10 -08:00
|
|
|
return 0;
|
|
|
|
}
|
2005-02-07 05:51:05 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* 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);
|
|
|
|
}
|
|
|
|
|
2005-06-07 08:34:54 -07:00
|
|
|
/* FIXME: Maybe return 0 on some conditions? */
|
|
|
|
int
|
|
|
|
ecore_x_netwm_window_type_get(Ecore_X_Window win, Ecore_X_Window_Type *type)
|
2005-02-07 05:51:05 -08:00
|
|
|
{
|
|
|
|
int num, i;
|
|
|
|
unsigned char *data;
|
|
|
|
Ecore_X_Atom *atoms;
|
|
|
|
|
2005-06-07 08:34:54 -07:00
|
|
|
if (type) *type = ECORE_X_WINDOW_TYPE_NORMAL;
|
|
|
|
|
2005-02-07 05:51:05 -08:00
|
|
|
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 */
|
2005-06-07 08:34:54 -07:00
|
|
|
if ((type) && (ecore_x_icccm_transient_for_get(win)))
|
|
|
|
*type = ECORE_X_WINDOW_TYPE_DIALOG;
|
|
|
|
return 1;
|
2005-02-07 05:51:05 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
atoms = (Ecore_X_Atom *) data;
|
|
|
|
|
2005-06-07 08:34:54 -07:00
|
|
|
if (type)
|
2005-03-22 11:34:10 -08:00
|
|
|
{
|
2005-06-07 08:34:54 -07:00
|
|
|
for (i = 0; i < num; ++i)
|
2005-03-22 11:34:10 -08:00
|
|
|
{
|
2005-06-07 08:34:54 -07:00
|
|
|
*type = _ecore_x_netwm_window_type_type_get(atoms[i]);
|
|
|
|
if (*type != ECORE_X_WINDOW_TYPE_UNKNOWN)
|
|
|
|
break;
|
2005-03-22 11:34:10 -08:00
|
|
|
}
|
|
|
|
}
|
2005-02-07 05:51:05 -08:00
|
|
|
|
2005-06-04 03:01:23 -07:00
|
|
|
free(data);
|
2005-06-07 08:34:54 -07:00
|
|
|
return 1;
|
2005-02-07 05:51:05 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-06-07 08:34:54 -07:00
|
|
|
/* FIXME: Get complete list */
|
2005-02-07 05:51:05 -08:00
|
|
|
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)
|
2005-03-22 11:34:10 -08:00
|
|
|
{
|
|
|
|
if (atom == atoms[i])
|
|
|
|
{
|
|
|
|
ret = 1;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2005-02-07 05:51:05 -08:00
|
|
|
|
2005-06-04 03:01:23 -07:00
|
|
|
free(data);
|
2005-02-07 05:51:05 -08:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2005-06-07 08:34:54 -07:00
|
|
|
/* FIXME: Set complete list */
|
2005-02-07 05:51:05 -08:00
|
|
|
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)
|
2005-03-22 11:34:10 -08:00
|
|
|
{
|
2005-05-16 05:59:26 -07:00
|
|
|
for (i = 0; i < num; ++i)
|
2005-03-22 11:34:10 -08:00
|
|
|
{
|
2005-05-16 05:59:26 -07:00
|
|
|
if (oldset[i] == atom)
|
|
|
|
goto done;
|
2005-03-22 11:34:10 -08:00
|
|
|
}
|
2005-05-16 05:59:26 -07:00
|
|
|
|
2005-03-22 11:34:10 -08:00
|
|
|
newset = calloc(num + 1, sizeof(Ecore_X_Atom));
|
2005-05-16 05:59:26 -07:00
|
|
|
if (!newset)
|
|
|
|
goto done;
|
2005-03-22 11:34:10 -08:00
|
|
|
|
2005-05-16 05:59:26 -07:00
|
|
|
data = (unsigned char *) newset;
|
2005-03-22 11:34:10 -08:00
|
|
|
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);
|
|
|
|
}
|
2005-02-07 05:51:05 -08:00
|
|
|
else
|
2005-03-22 11:34:10 -08:00
|
|
|
{
|
2005-05-16 05:59:26 -07:00
|
|
|
int has;
|
|
|
|
|
|
|
|
has = 0;
|
|
|
|
for (i = 0; i < num; ++i)
|
2005-03-22 11:34:10 -08:00
|
|
|
{
|
2005-05-16 05:59:26 -07:00
|
|
|
if (oldset[i] == atom)
|
|
|
|
has = 1;
|
2005-03-22 11:34:10 -08:00
|
|
|
}
|
2005-05-16 05:59:26 -07:00
|
|
|
if (!has)
|
|
|
|
goto done;
|
|
|
|
|
2005-04-10 03:20:18 -07:00
|
|
|
newset = calloc(num - 1, sizeof(Ecore_X_Atom));
|
2005-03-22 11:34:10 -08:00
|
|
|
if (!newset)
|
2005-05-16 05:59:26 -07:00
|
|
|
goto done;
|
|
|
|
|
2005-03-22 11:34:10 -08:00
|
|
|
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);
|
|
|
|
}
|
2004-12-29 21:36:01 -08:00
|
|
|
free(newset);
|
2005-05-16 05:59:26 -07:00
|
|
|
done:
|
2005-06-04 03:01:23 -07:00
|
|
|
free(oldset);
|
2004-12-29 21:36:01 -08:00
|
|
|
}
|
|
|
|
|
2005-02-07 05:51:05 -08:00
|
|
|
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);
|
|
|
|
}
|
2004-12-29 21:36:01 -08:00
|
|
|
|
2005-02-07 05:51:05 -08:00
|
|
|
int
|
|
|
|
ecore_x_netwm_opacity_get(Ecore_X_Window win, unsigned int *opacity)
|
|
|
|
{
|
2005-02-15 03:21:47 -08:00
|
|
|
int ret;
|
2005-05-16 05:59:26 -07:00
|
|
|
unsigned int tmp;
|
|
|
|
|
2005-02-15 03:21:47 -08:00
|
|
|
ret = ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_WINDOW_OPACITY,
|
2005-05-16 05:59:26 -07:00
|
|
|
&tmp, 1);
|
|
|
|
if (opacity) *opacity = tmp;
|
2005-02-15 03:21:47 -08:00
|
|
|
return ret == 1 ? 1 : 0;
|
2005-02-07 05:51:05 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ecore_x_netwm_frame_size_set(Ecore_X_Window win, int fl, int fr, int ft, int fb)
|
|
|
|
{
|
2005-05-16 05:59:26 -07:00
|
|
|
unsigned int frames[4];
|
2005-02-07 05:51:05 -08:00
|
|
|
|
|
|
|
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;
|
2005-05-16 05:59:26 -07:00
|
|
|
unsigned int frames[4];
|
2005-02-07 05:51:05 -08:00
|
|
|
|
|
|
|
ret = ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_FRAME_EXTENTS, frames, 4);
|
|
|
|
if (ret != 4)
|
|
|
|
return 0;
|
|
|
|
|
2005-05-16 05:59:26 -07:00
|
|
|
if (fl) *fl = frames[0];
|
|
|
|
if (fr) *fr = frames[1];
|
|
|
|
if (ft) *ft = frames[2];
|
|
|
|
if (fb) *fb = frames[3];
|
2005-02-07 05:51:05 -08:00
|
|
|
return 1;
|
|
|
|
}
|
2004-12-29 21:36:01 -08:00
|
|
|
|
2005-06-07 08:34:54 -07:00
|
|
|
int
|
|
|
|
ecore_x_netwm_sync_counter_get(Ecore_X_Window win, Ecore_X_Sync_Counter *counter)
|
|
|
|
{
|
|
|
|
int ret;
|
|
|
|
unsigned int tmp;
|
|
|
|
|
|
|
|
ret = ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_SYNC_REQUEST_COUNTER,
|
|
|
|
&tmp, 1);
|
|
|
|
|
|
|
|
if (counter) *counter = tmp;
|
|
|
|
return ret == 1 ? 1 : 0;
|
|
|
|
}
|
|
|
|
|
2005-06-05 07:38:42 -07:00
|
|
|
void
|
2005-06-09 21:18:24 -07:00
|
|
|
ecore_x_netwm_ping_send(Ecore_X_Window win)
|
2005-06-05 07:38:42 -07:00
|
|
|
{
|
|
|
|
XEvent xev;
|
|
|
|
|
|
|
|
if (!win) return;
|
|
|
|
|
|
|
|
xev.xclient.type = ClientMessage;
|
|
|
|
xev.xclient.display = _ecore_x_disp;
|
|
|
|
xev.xclient.window = win;
|
|
|
|
xev.xclient.message_type = ECORE_X_ATOM_WM_PROTOCOLS;
|
|
|
|
xev.xclient.format = 32;
|
|
|
|
xev.xclient.data.l[0] = ECORE_X_ATOM_NET_WM_PING;
|
|
|
|
xev.xclient.data.l[1] = CurrentTime;
|
|
|
|
xev.xclient.data.l[2] = win;
|
|
|
|
xev.xclient.data.l[3] = 0;
|
|
|
|
xev.xclient.data.l[4] = 0;
|
|
|
|
xev.xclient.data.l[5] = 0;
|
|
|
|
|
|
|
|
XSendEvent(_ecore_x_disp, win, False, NoEventMask, &xev);
|
|
|
|
}
|
2005-06-06 08:04:28 -07:00
|
|
|
|
|
|
|
void
|
|
|
|
ecore_x_netwm_sync_request_send(Ecore_X_Window win, unsigned int serial)
|
|
|
|
{
|
|
|
|
XSyncValue value;
|
|
|
|
XEvent xev;
|
|
|
|
|
2005-06-07 00:43:58 -07:00
|
|
|
if (!win) return;
|
|
|
|
|
2005-06-06 08:04:28 -07:00
|
|
|
XSyncIntToValue(&value, serial);
|
|
|
|
|
|
|
|
xev.xclient.type = ClientMessage;
|
|
|
|
xev.xclient.display = _ecore_x_disp;
|
|
|
|
xev.xclient.window = win;
|
|
|
|
xev.xclient.message_type = ECORE_X_ATOM_WM_PROTOCOLS;
|
|
|
|
xev.xclient.format = 32;
|
|
|
|
xev.xclient.data.l[0] = ECORE_X_ATOM_NET_WM_SYNC_REQUEST;
|
|
|
|
xev.xclient.data.l[1] = CurrentTime;
|
|
|
|
xev.xclient.data.l[2] = XSyncValueLow32(value);
|
|
|
|
xev.xclient.data.l[3] = XSyncValueHigh32(value);
|
|
|
|
xev.xclient.data.l[4] = 0;
|
|
|
|
|
|
|
|
XSendEvent(_ecore_x_disp, win, False, 0, &xev);
|
|
|
|
}
|
2005-06-09 21:18:24 -07:00
|
|
|
|
|
|
|
void
|
|
|
|
ecore_x_netwm_state_request_send(Ecore_X_Window win, Ecore_X_Window root,
|
|
|
|
Ecore_X_Window_State s1, Ecore_X_Window_State s2, int set)
|
|
|
|
{
|
|
|
|
XEvent xev;
|
|
|
|
|
|
|
|
if (!win) return;
|
|
|
|
if (!root) root = DefaultRootWindow(_ecore_x_disp);
|
|
|
|
|
|
|
|
xev.xclient.type = ClientMessage;
|
|
|
|
xev.xclient.serial = 0;
|
|
|
|
xev.xclient.send_event = True;
|
|
|
|
xev.xclient.display = _ecore_x_disp;
|
|
|
|
xev.xclient.window = win;
|
|
|
|
xev.xclient.format = 32;
|
|
|
|
xev.xclient.message_type = ECORE_X_ATOM_NET_WM_STATE;
|
|
|
|
xev.xclient.data.l[0] = !!set;
|
|
|
|
xev.xclient.data.l[1] = _ecore_x_netwm_state_atom_get(s1);
|
|
|
|
xev.xclient.data.l[2] = _ecore_x_netwm_state_atom_get(s2);
|
|
|
|
/* 1 == normal client, if someone wants to use this
|
|
|
|
* function in a pager, this should be 2 */
|
|
|
|
xev.xclient.data.l[3] = 1;
|
|
|
|
xev.xclient.data.l[4] = 0;
|
|
|
|
|
|
|
|
XSendEvent(_ecore_x_disp, root, False, 0, &xev);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ecore_x_netwm_desktop_request_send(Ecore_X_Window win, Ecore_X_Window root, unsigned int desktop)
|
|
|
|
{
|
|
|
|
XEvent xev;
|
|
|
|
|
|
|
|
if (!win) return;
|
|
|
|
if (!root) root = DefaultRootWindow(_ecore_x_disp);
|
|
|
|
|
|
|
|
xev.xclient.type = ClientMessage;
|
|
|
|
xev.xclient.serial = 0;
|
|
|
|
xev.xclient.send_event = True;
|
|
|
|
xev.xclient.display = _ecore_x_disp;
|
|
|
|
xev.xclient.window = win;
|
|
|
|
xev.xclient.format = 32;
|
|
|
|
xev.xclient.message_type = ECORE_X_ATOM_NET_WM_DESKTOP;
|
|
|
|
xev.xclient.data.l[0] = desktop;
|
|
|
|
|
|
|
|
XSendEvent(_ecore_x_disp, root, False,
|
|
|
|
SubstructureNotifyMask | SubstructureRedirectMask, &xev);
|
|
|
|
}
|
2005-09-29 23:16:49 -07:00
|
|
|
|
|
|
|
int
|
|
|
|
_ecore_x_netwm_startup_info_begin(Ecore_X_Window win, char *data)
|
|
|
|
{
|
|
|
|
Ecore_X_Startup_Info *info;
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
if (!startup_info) return 0;
|
|
|
|
info = ecore_hash_get(startup_info, (void *)win);
|
|
|
|
if (info)
|
|
|
|
{
|
|
|
|
printf("Already got info for win: 0x%x\n", win);
|
|
|
|
_ecore_x_netwm_startup_info_free(info);
|
|
|
|
}
|
|
|
|
info = calloc(1, sizeof(Ecore_X_Startup_Info));
|
|
|
|
if (!info) return 0;
|
|
|
|
info->win = win;
|
|
|
|
info->length = 0;
|
|
|
|
info->buffer_size = 161;
|
|
|
|
info->buffer = calloc(info->buffer_size, sizeof(char));
|
|
|
|
if (!info->buffer)
|
|
|
|
{
|
|
|
|
_ecore_x_netwm_startup_info_free(info);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
memcpy(info->buffer, data, 20);
|
|
|
|
info->length += 20;
|
|
|
|
info->buffer[info->length] = 0;
|
|
|
|
ecore_hash_set(startup_info, (void *)info->win, info);
|
|
|
|
if (strlen(info->buffer) != 20)
|
|
|
|
{
|
|
|
|
/* We have a '\0' in there, the message is done */
|
|
|
|
_ecore_x_netwm_startup_info_process(info);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
_ecore_x_netwm_startup_info(Ecore_X_Window win, char *data)
|
|
|
|
{
|
|
|
|
Ecore_X_Startup_Info *info;
|
|
|
|
char *p;
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
if (!startup_info) return 0;
|
|
|
|
info = ecore_hash_get(startup_info, (void *)win);
|
|
|
|
if (!info) return 0;
|
|
|
|
if ((info->length + 20) > info->buffer_size)
|
|
|
|
{
|
|
|
|
info->buffer_size += 160;
|
|
|
|
info->buffer = realloc(info->buffer, info->buffer_size * sizeof(char));
|
|
|
|
if (!info->buffer)
|
|
|
|
{
|
|
|
|
ecore_hash_remove(startup_info, (void *)info->win);
|
|
|
|
_ecore_x_netwm_startup_info_free(info);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
memcpy(info->buffer + info->length, data, 20);
|
|
|
|
p = info->buffer + info->length;
|
|
|
|
info->length += 20;
|
|
|
|
info->buffer[info->length] = 0;
|
|
|
|
if (strlen(p) != 20)
|
|
|
|
{
|
|
|
|
/* We have a '\0' in there, the message is done */
|
|
|
|
_ecore_x_netwm_startup_info_process(info);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Set UTF-8 string property
|
|
|
|
*/
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Get UTF-8 string property
|
|
|
|
*/
|
|
|
|
static char *
|
|
|
|
_ecore_x_window_prop_string_utf8_get(Ecore_X_Window win, Ecore_X_Atom atom)
|
|
|
|
{
|
|
|
|
char *str;
|
|
|
|
unsigned char *prop_ret;
|
|
|
|
Atom type_ret;
|
|
|
|
unsigned long bytes_after, num_ret;
|
|
|
|
int format_ret;
|
|
|
|
|
|
|
|
str = NULL;
|
|
|
|
prop_ret = NULL;
|
|
|
|
XGetWindowProperty(_ecore_x_disp, win, atom, 0, 0x7fffffff, False,
|
|
|
|
ECORE_X_ATOM_UTF8_STRING, &type_ret,
|
|
|
|
&format_ret, &num_ret, &bytes_after, &prop_ret);
|
|
|
|
if (prop_ret && num_ret > 0 && format_ret == 8)
|
|
|
|
{
|
|
|
|
str = malloc(num_ret + 1);
|
|
|
|
if (str)
|
|
|
|
{
|
|
|
|
memcpy(str, prop_ret, num_ret);
|
|
|
|
str[num_ret] = '\0';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (prop_ret)
|
|
|
|
XFree(prop_ret);
|
|
|
|
|
|
|
|
return str;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Process startup info
|
|
|
|
*/
|
|
|
|
static int
|
|
|
|
_ecore_x_netwm_startup_info_process(Ecore_X_Startup_Info *info)
|
|
|
|
{
|
|
|
|
Ecore_X_Event_Startup_Sequence *e;
|
|
|
|
int event;
|
|
|
|
char *p;
|
|
|
|
|
|
|
|
p = strchr(info->buffer, ':');
|
|
|
|
if (!p)
|
|
|
|
{
|
|
|
|
ecore_hash_remove(startup_info, (void *)info->win);
|
|
|
|
_ecore_x_netwm_startup_info_free(info);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
*p = 0;
|
|
|
|
if (!strcmp(info->buffer, "new"))
|
|
|
|
{
|
|
|
|
if (info->init)
|
|
|
|
event = ECORE_X_EVENT_STARTUP_SEQUENCE_CHANGE;
|
|
|
|
else
|
|
|
|
event = ECORE_X_EVENT_STARTUP_SEQUENCE_NEW;
|
|
|
|
info->init = 1;
|
|
|
|
}
|
|
|
|
else if (!strcmp(info->buffer, "change"))
|
|
|
|
{
|
|
|
|
event = ECORE_X_EVENT_STARTUP_SEQUENCE_CHANGE;
|
|
|
|
}
|
|
|
|
else if (!strcmp(info->buffer, "remove"))
|
|
|
|
event = ECORE_X_EVENT_STARTUP_SEQUENCE_REMOVE;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ecore_hash_remove(startup_info, (void *)info->win);
|
|
|
|
_ecore_x_netwm_startup_info_free(info);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
p++;
|
|
|
|
|
|
|
|
if (!_ecore_x_netwm_startup_info_parse(info, p))
|
|
|
|
{
|
|
|
|
ecore_hash_remove(startup_info, (void *)info->win);
|
|
|
|
_ecore_x_netwm_startup_info_free(info);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (info->init)
|
|
|
|
{
|
|
|
|
e = calloc(1, sizeof(Ecore_X_Event_Startup_Sequence));
|
|
|
|
if (!e)
|
|
|
|
{
|
|
|
|
ecore_hash_remove(startup_info, (void *)info->win);
|
|
|
|
_ecore_x_netwm_startup_info_free(info);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
e->win = info->win;
|
|
|
|
ecore_event_add(event, e, NULL, NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (event == ECORE_X_EVENT_STARTUP_SEQUENCE_REMOVE)
|
|
|
|
{
|
|
|
|
ecore_hash_remove(startup_info, (void *)info->win);
|
|
|
|
_ecore_x_netwm_startup_info_free(info);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* Discard buffer */
|
|
|
|
info->length = 0;
|
|
|
|
info->buffer[0] = 0;
|
|
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Parse startup info
|
|
|
|
*/
|
|
|
|
static int
|
|
|
|
_ecore_x_netwm_startup_info_parse(Ecore_X_Startup_Info *info, char *data)
|
|
|
|
{
|
|
|
|
|
|
|
|
while (*data)
|
|
|
|
{
|
|
|
|
int in_quot_sing, in_quot_dbl, escaped;
|
|
|
|
char *p, *pp;
|
|
|
|
char *key;
|
|
|
|
char value[1024];
|
|
|
|
|
|
|
|
/* Skip space */
|
|
|
|
while (*data == ' ') data++;
|
|
|
|
/* Get key */
|
|
|
|
key = data;
|
|
|
|
data = strchr(key, '=');
|
|
|
|
if (!data) return 0;
|
|
|
|
*data = 0;
|
|
|
|
data++;
|
|
|
|
|
|
|
|
/* Get value */
|
|
|
|
p = data;
|
|
|
|
pp = value;
|
|
|
|
in_quot_dbl = 0;
|
|
|
|
in_quot_sing = 0;
|
|
|
|
escaped = 0;
|
|
|
|
while (*p)
|
|
|
|
{
|
|
|
|
if ((pp - value) >= 1024) return 0;
|
|
|
|
if (escaped)
|
|
|
|
{
|
|
|
|
*pp = *p;
|
|
|
|
pp++;
|
|
|
|
escaped = 0;
|
|
|
|
}
|
|
|
|
else if (in_quot_sing)
|
|
|
|
{
|
|
|
|
if (*p == '\\')
|
|
|
|
escaped = 1;
|
|
|
|
else if (*p == '\'')
|
|
|
|
in_quot_sing = 0;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
*pp = *p;
|
|
|
|
pp++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (in_quot_dbl)
|
|
|
|
{
|
|
|
|
if (*p == '\\')
|
|
|
|
escaped = 1;
|
|
|
|
else if (*p == '\"')
|
|
|
|
in_quot_dbl = 0;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
*pp = *p;
|
|
|
|
pp++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (*p == '\\')
|
|
|
|
escaped = 1;
|
|
|
|
else if (*p == '\'')
|
|
|
|
in_quot_sing = 1;
|
|
|
|
else if (*p == '\"')
|
|
|
|
in_quot_dbl = 1;
|
|
|
|
else if (*p == ' ')
|
|
|
|
{
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
*pp = *p;
|
|
|
|
pp++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
p++;
|
|
|
|
}
|
|
|
|
data = p;
|
|
|
|
*pp = 0;
|
|
|
|
|
|
|
|
/* Parse info */
|
|
|
|
if (!strcmp(key, "ID"))
|
|
|
|
{
|
|
|
|
if ((info->id) && (strcmp(info->id, value))) return 0;
|
|
|
|
info->id = strdup(value);
|
|
|
|
p = strstr(value, "_TIME");
|
|
|
|
if (p)
|
|
|
|
{
|
|
|
|
info->timestamp = atoi(p + 5);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (!strcmp(key, "NAME"))
|
|
|
|
{
|
|
|
|
if (info->name) free(info->name);
|
|
|
|
info->name = strdup(value);
|
|
|
|
}
|
|
|
|
else if (!strcmp(key, "SCREEN"))
|
|
|
|
{
|
|
|
|
info->screen = atoi(value);
|
|
|
|
}
|
|
|
|
else if (!strcmp(key, "BIN"))
|
|
|
|
{
|
|
|
|
if (info->bin) free(info->bin);
|
|
|
|
info->bin = strdup(value);
|
|
|
|
}
|
|
|
|
else if (!strcmp(key, "ICON"))
|
|
|
|
{
|
|
|
|
if (info->icon) free(info->icon);
|
|
|
|
info->icon = strdup(value);
|
|
|
|
}
|
|
|
|
else if (!strcmp(key, "DESKTOP"))
|
|
|
|
{
|
|
|
|
info->desktop = atoi(value);
|
|
|
|
}
|
|
|
|
else if (!strcmp(key, "TIMESTAMP"))
|
|
|
|
{
|
|
|
|
if (!info->timestamp)
|
|
|
|
info->timestamp = atoi(value);
|
|
|
|
}
|
|
|
|
else if (!strcmp(key, "DESCRIPTION"))
|
|
|
|
{
|
|
|
|
if (info->description) free(info->description);
|
|
|
|
info->description = strdup(value);
|
|
|
|
}
|
|
|
|
else if (!strcmp(key, "WMCLASS"))
|
|
|
|
{
|
|
|
|
if (info->wmclass) free(info->wmclass);
|
|
|
|
info->wmclass = strdup(value);
|
|
|
|
}
|
|
|
|
else if (!strcmp(key, "SILENT"))
|
|
|
|
{
|
|
|
|
info->silent = atoi(value);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
printf("Ecore X Sequence, Unknown: %s=%s\n", key, value);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!info->id) return 0;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Free startup info struct
|
|
|
|
*/
|
|
|
|
static void
|
|
|
|
_ecore_x_netwm_startup_info_free(void *data)
|
|
|
|
{
|
|
|
|
Ecore_X_Startup_Info *info;
|
|
|
|
|
|
|
|
info = data;
|
|
|
|
if (!info) return;
|
|
|
|
if (info->buffer) free(info->buffer);
|
|
|
|
if (info->id) free(info->id);
|
|
|
|
if (info->name) free(info->name);
|
|
|
|
if (info->bin) free(info->bin);
|
|
|
|
if (info->icon) free(info->icon);
|
|
|
|
if (info->description) free(info->description);
|
|
|
|
if (info->wmclass) free(info->wmclass);
|
|
|
|
free(info);
|
|
|
|
}
|