2003-03-23 19:48:09 -08:00
|
|
|
/*
|
2004-01-19 14:30:35 -08:00
|
|
|
* Copyright (C) 2003-2004 Kim Woelders
|
2003-03-23 19:48:09 -08:00
|
|
|
*
|
|
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
|
|
* of this software and associated documentation files (the "Software"), to
|
|
|
|
* deal in the Software without restriction, including without limitation the
|
|
|
|
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
|
|
* sell copies of the Software, and to permit persons to whom the Software is
|
|
|
|
* furnished to do so, subject to the following conditions:
|
|
|
|
*
|
|
|
|
* The above copyright notice and this permission notice shall be included in
|
|
|
|
* all copies of the Software, its documentation and marketing & publicity
|
|
|
|
* materials, and acknowledgment shall be given in the documentation, materials
|
|
|
|
* and software packages that this Software was used.
|
|
|
|
*
|
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
|
|
* THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
|
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
|
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
*/
|
|
|
|
/*
|
|
|
|
* Extended Window Manager Hints.
|
|
|
|
*/
|
|
|
|
#include "E.h"
|
|
|
|
|
|
|
|
#define _ATOM_INIT(atom) atom = XInternAtom(disp, #atom, False); \
|
|
|
|
atom_list[atom_count++] = atom
|
|
|
|
|
2003-05-14 12:35:51 -07:00
|
|
|
#define _ATOM_SET_UTF8_STRING(atom, win, string) \
|
|
|
|
XChangeProperty(disp, win, atom, E_XA_UTF8_STRING, 8, PropModeReplace, \
|
2003-03-23 19:48:09 -08:00
|
|
|
(unsigned char *)string, strlen(string))
|
2003-05-14 12:35:51 -07:00
|
|
|
#define _ATOM_SET_UTF8_STRING_LIST(atom, win, string, cnt) \
|
|
|
|
XChangeProperty(disp, win, atom, E_XA_UTF8_STRING, 8, PropModeReplace, \
|
|
|
|
(unsigned char *)string, cnt)
|
2003-03-23 19:48:09 -08:00
|
|
|
#define _ATOM_SET_WINDOW(atom, win, p_wins, cnt) \
|
|
|
|
XChangeProperty(disp, win, atom, XA_WINDOW, 32, PropModeReplace, \
|
|
|
|
(unsigned char *)p_wins, cnt)
|
|
|
|
#define _ATOM_SET_ATOM(atom, win, p_atom, cnt) \
|
|
|
|
XChangeProperty(disp, win, atom, XA_ATOM, 32, PropModeReplace, \
|
|
|
|
(unsigned char *)p_atom, cnt)
|
|
|
|
#define _ATOM_SET_CARD32(atom, win, p_val, cnt) \
|
|
|
|
XChangeProperty(disp, win, atom, XA_CARDINAL, 32, PropModeReplace, \
|
|
|
|
(unsigned char *)p_val, cnt)
|
|
|
|
|
2003-05-14 12:35:51 -07:00
|
|
|
/* Will become predefined? */
|
|
|
|
Atom E_XA_UTF8_STRING;
|
|
|
|
|
2003-03-23 19:48:09 -08:00
|
|
|
/* Window manager info */
|
2003-03-27 21:16:21 -08:00
|
|
|
Atom _NET_SUPPORTED;
|
|
|
|
Atom _NET_SUPPORTING_WM_CHECK;
|
2003-03-23 19:48:09 -08:00
|
|
|
|
|
|
|
/* Desktop status/requests */
|
2003-03-27 21:16:21 -08:00
|
|
|
Atom _NET_NUMBER_OF_DESKTOPS;
|
|
|
|
Atom _NET_DESKTOP_GEOMETRY;
|
|
|
|
Atom _NET_DESKTOP_NAMES;
|
|
|
|
Atom _NET_CURRENT_DESKTOP;
|
|
|
|
Atom _NET_DESKTOP_VIEWPORT;
|
2003-08-18 15:03:10 -07:00
|
|
|
Atom _NET_WORKAREA;
|
2003-06-11 12:41:30 -07:00
|
|
|
Atom _NET_VIRTUAL_ROOTS;
|
2004-05-04 17:17:15 -07:00
|
|
|
Atom _NET_SHOWING_DESKTOP;
|
2003-03-23 19:48:09 -08:00
|
|
|
|
2003-03-27 21:16:21 -08:00
|
|
|
Atom _NET_ACTIVE_WINDOW;
|
|
|
|
Atom _NET_CLIENT_LIST;
|
|
|
|
Atom _NET_CLIENT_LIST_STACKING;
|
2003-03-23 19:48:09 -08:00
|
|
|
|
|
|
|
/* Misc window ops */
|
2003-03-27 21:16:21 -08:00
|
|
|
Atom _NET_CLOSE_WINDOW;
|
2003-03-23 19:48:09 -08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* _NET_WM_MOVERESIZE
|
|
|
|
*
|
|
|
|
* Client message
|
|
|
|
*/
|
2003-03-27 21:16:21 -08:00
|
|
|
Atom _NET_WM_MOVERESIZE;
|
2003-03-23 19:48:09 -08:00
|
|
|
|
|
|
|
/* Move/resize actions */
|
|
|
|
#define _NET_WM_MOVERESIZE_SIZE_TOPLEFT 0
|
|
|
|
#define _NET_WM_MOVERESIZE_SIZE_TOP 1
|
|
|
|
#define _NET_WM_MOVERESIZE_SIZE_TOPRIGHT 2
|
|
|
|
#define _NET_WM_MOVERESIZE_SIZE_RIGHT 3
|
|
|
|
#define _NET_WM_MOVERESIZE_SIZE_BOTTOMRIGHT 4
|
|
|
|
#define _NET_WM_MOVERESIZE_SIZE_BOTTOM 5
|
|
|
|
#define _NET_WM_MOVERESIZE_SIZE_BOTTOMLEFT 6
|
|
|
|
#define _NET_WM_MOVERESIZE_SIZE_LEFT 7
|
|
|
|
#define _NET_WM_MOVERESIZE_MOVE 8
|
|
|
|
#define _NET_WM_MOVERESIZE_SIZE_KEYBOARD 9
|
|
|
|
#define _NET_WM_MOVERESIZE_MOVE_KEYBOARD 10
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Application Window Properties
|
|
|
|
*/
|
2004-02-28 17:30:18 -08:00
|
|
|
Atom _NET_WM_NAME;
|
|
|
|
Atom _NET_WM_ICON_NAME;
|
2003-03-27 21:16:21 -08:00
|
|
|
Atom _NET_WM_DESKTOP;
|
2003-03-23 19:48:09 -08:00
|
|
|
|
|
|
|
/* _NET_WM_WINDOW_TYPE (window property) */
|
2003-03-27 21:16:21 -08:00
|
|
|
Atom _NET_WM_WINDOW_TYPE;
|
2003-03-23 19:48:09 -08:00
|
|
|
|
2003-03-27 21:16:21 -08:00
|
|
|
Atom _NET_WM_WINDOW_TYPE_DESKTOP;
|
|
|
|
Atom _NET_WM_WINDOW_TYPE_DOCK;
|
|
|
|
Atom _NET_WM_WINDOW_TYPE_TOOLBAR;
|
|
|
|
Atom _NET_WM_WINDOW_TYPE_MENU;
|
|
|
|
Atom _NET_WM_WINDOW_TYPE_UTILITY;
|
|
|
|
Atom _NET_WM_WINDOW_TYPE_SPLASH;
|
|
|
|
Atom _NET_WM_WINDOW_TYPE_DIALOG;
|
|
|
|
Atom _NET_WM_WINDOW_TYPE_NORMAL;
|
2003-03-23 19:48:09 -08:00
|
|
|
|
|
|
|
/* _NET_WM_STATE (window property and client message) */
|
2003-03-27 21:16:21 -08:00
|
|
|
Atom _NET_WM_STATE;
|
|
|
|
|
|
|
|
Atom _NET_WM_STATE_MODAL;
|
|
|
|
Atom _NET_WM_STATE_STICKY;
|
|
|
|
Atom _NET_WM_STATE_MAXIMIZED_VERT;
|
|
|
|
Atom _NET_WM_STATE_MAXIMIZED_HORZ;
|
|
|
|
Atom _NET_WM_STATE_SHADED;
|
|
|
|
Atom _NET_WM_STATE_SKIP_TASKBAR;
|
|
|
|
Atom _NET_WM_STATE_SKIP_PAGER;
|
|
|
|
Atom _NET_WM_STATE_HIDDEN;
|
|
|
|
Atom _NET_WM_STATE_FULLSCREEN;
|
|
|
|
Atom _NET_WM_STATE_ABOVE;
|
|
|
|
Atom _NET_WM_STATE_BELOW;
|
2003-03-23 19:48:09 -08:00
|
|
|
|
|
|
|
/* Window state property change actions */
|
|
|
|
#define _NET_WM_STATE_REMOVE 0
|
|
|
|
#define _NET_WM_STATE_ADD 1
|
|
|
|
#define _NET_WM_STATE_TOGGLE 2
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Set/clear Atom in list
|
|
|
|
*/
|
2003-03-27 21:16:21 -08:00
|
|
|
static void
|
|
|
|
atom_list_set(Atom * atoms, int size, int *count, Atom atom, int set)
|
2003-03-23 19:48:09 -08:00
|
|
|
{
|
2003-03-27 21:16:21 -08:00
|
|
|
int i, n, in_list;
|
2003-03-23 19:48:09 -08:00
|
|
|
|
2003-03-27 21:16:21 -08:00
|
|
|
n = *count;
|
2003-03-23 19:48:09 -08:00
|
|
|
|
2003-03-27 21:16:21 -08:00
|
|
|
/* Check if atom is in list or not (+get index) */
|
|
|
|
for (i = 0; i < n; i++)
|
|
|
|
if (atoms[i] == atom)
|
2003-05-22 12:15:03 -07:00
|
|
|
break;
|
2003-03-27 21:16:21 -08:00
|
|
|
in_list = i < n;
|
2003-03-23 19:48:09 -08:00
|
|
|
|
2003-03-27 21:16:21 -08:00
|
|
|
if (set && !in_list)
|
|
|
|
{
|
2003-05-22 12:15:03 -07:00
|
|
|
/* Add it (if space left) */
|
|
|
|
if (n < size)
|
|
|
|
atoms[n++] = atom;
|
|
|
|
*count = n;
|
2003-03-27 21:16:21 -08:00
|
|
|
}
|
|
|
|
else if (!set && in_list)
|
|
|
|
{
|
2003-05-22 12:15:03 -07:00
|
|
|
/* Remove it */
|
|
|
|
atoms[i] = atoms[--n];
|
|
|
|
*count = n;
|
2003-03-27 21:16:21 -08:00
|
|
|
}
|
2003-03-23 19:48:09 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Initialize EWMH stuff
|
|
|
|
*/
|
|
|
|
void
|
2003-07-12 07:06:37 -07:00
|
|
|
EWMH_Init(Window win_wm_check)
|
2003-03-23 19:48:09 -08:00
|
|
|
{
|
2003-03-27 21:16:21 -08:00
|
|
|
Atom atom_list[64];
|
|
|
|
int atom_count;
|
|
|
|
|
|
|
|
EDBUG(6, "EWMH_Init");
|
|
|
|
|
2003-05-14 12:35:51 -07:00
|
|
|
E_XA_UTF8_STRING = XInternAtom(disp, "UTF8_STRING", False);;
|
|
|
|
|
2003-03-27 21:16:21 -08:00
|
|
|
atom_count = 0;
|
|
|
|
|
|
|
|
_ATOM_INIT(_NET_SUPPORTED);
|
|
|
|
_ATOM_INIT(_NET_SUPPORTING_WM_CHECK);
|
|
|
|
|
|
|
|
_ATOM_INIT(_NET_NUMBER_OF_DESKTOPS);
|
|
|
|
_ATOM_INIT(_NET_DESKTOP_GEOMETRY);
|
|
|
|
_ATOM_INIT(_NET_DESKTOP_NAMES);
|
|
|
|
_ATOM_INIT(_NET_CURRENT_DESKTOP);
|
|
|
|
_ATOM_INIT(_NET_DESKTOP_VIEWPORT);
|
2003-08-18 15:03:10 -07:00
|
|
|
_ATOM_INIT(_NET_WORKAREA);
|
2003-06-11 12:41:30 -07:00
|
|
|
_ATOM_INIT(_NET_VIRTUAL_ROOTS);
|
2004-05-04 17:17:15 -07:00
|
|
|
_ATOM_INIT(_NET_SHOWING_DESKTOP);
|
2003-03-27 21:16:21 -08:00
|
|
|
|
|
|
|
_ATOM_INIT(_NET_ACTIVE_WINDOW);
|
|
|
|
_ATOM_INIT(_NET_CLIENT_LIST);
|
|
|
|
_ATOM_INIT(_NET_CLIENT_LIST_STACKING);
|
|
|
|
|
|
|
|
_ATOM_INIT(_NET_CLOSE_WINDOW);
|
|
|
|
_ATOM_INIT(_NET_WM_MOVERESIZE);
|
|
|
|
|
2004-02-28 17:30:18 -08:00
|
|
|
_ATOM_INIT(_NET_WM_NAME);
|
|
|
|
_ATOM_INIT(_NET_WM_ICON_NAME);
|
2003-03-27 21:16:21 -08:00
|
|
|
_ATOM_INIT(_NET_WM_DESKTOP);
|
|
|
|
|
|
|
|
_ATOM_INIT(_NET_WM_WINDOW_TYPE);
|
|
|
|
_ATOM_INIT(_NET_WM_WINDOW_TYPE_DESKTOP);
|
|
|
|
_ATOM_INIT(_NET_WM_WINDOW_TYPE_DOCK);
|
|
|
|
_ATOM_INIT(_NET_WM_WINDOW_TYPE_TOOLBAR);
|
|
|
|
_ATOM_INIT(_NET_WM_WINDOW_TYPE_MENU);
|
|
|
|
_ATOM_INIT(_NET_WM_WINDOW_TYPE_UTILITY);
|
|
|
|
_ATOM_INIT(_NET_WM_WINDOW_TYPE_SPLASH);
|
|
|
|
_ATOM_INIT(_NET_WM_WINDOW_TYPE_DIALOG);
|
|
|
|
_ATOM_INIT(_NET_WM_WINDOW_TYPE_NORMAL);
|
|
|
|
|
|
|
|
_ATOM_INIT(_NET_WM_STATE);
|
|
|
|
_ATOM_INIT(_NET_WM_STATE_MODAL);
|
|
|
|
_ATOM_INIT(_NET_WM_STATE_STICKY);
|
|
|
|
_ATOM_INIT(_NET_WM_STATE_MAXIMIZED_VERT);
|
|
|
|
_ATOM_INIT(_NET_WM_STATE_MAXIMIZED_HORZ);
|
|
|
|
_ATOM_INIT(_NET_WM_STATE_SHADED);
|
|
|
|
_ATOM_INIT(_NET_WM_STATE_SKIP_TASKBAR);
|
2003-05-04 03:31:27 -07:00
|
|
|
_ATOM_INIT(_NET_WM_STATE_SKIP_PAGER);
|
2003-03-27 21:16:21 -08:00
|
|
|
_ATOM_INIT(_NET_WM_STATE_HIDDEN);
|
|
|
|
_ATOM_INIT(_NET_WM_STATE_FULLSCREEN);
|
|
|
|
_ATOM_INIT(_NET_WM_STATE_ABOVE);
|
|
|
|
_ATOM_INIT(_NET_WM_STATE_BELOW);
|
2003-03-23 19:48:09 -08:00
|
|
|
|
2004-05-04 12:04:42 -07:00
|
|
|
_ATOM_SET_ATOM(_NET_SUPPORTED, VRoot.win, atom_list, atom_count);
|
2003-03-23 19:48:09 -08:00
|
|
|
|
2003-03-27 21:16:21 -08:00
|
|
|
/* Set WM info properties */
|
2004-05-04 12:04:42 -07:00
|
|
|
_ATOM_SET_UTF8_STRING(_NET_WM_NAME, VRoot.win, e_wm_name);
|
2003-03-23 19:48:09 -08:00
|
|
|
|
2004-05-04 12:04:42 -07:00
|
|
|
_ATOM_SET_WINDOW(_NET_SUPPORTING_WM_CHECK, VRoot.win, &win_wm_check, 1);
|
2003-07-12 07:06:37 -07:00
|
|
|
_ATOM_SET_WINDOW(_NET_SUPPORTING_WM_CHECK, win_wm_check, &win_wm_check, 1);
|
|
|
|
_ATOM_SET_UTF8_STRING(_NET_WM_NAME, win_wm_check, e_wm_name);
|
2003-03-23 19:48:09 -08:00
|
|
|
|
2003-03-27 21:16:21 -08:00
|
|
|
EWMH_SetDesktopCount();
|
|
|
|
EWMH_SetDesktopNames();
|
|
|
|
EWMH_SetDesktopSize();
|
2003-08-18 15:03:10 -07:00
|
|
|
EWMH_SetWorkArea();
|
2003-03-23 19:48:09 -08:00
|
|
|
|
2003-03-27 21:16:21 -08:00
|
|
|
EDBUG_RETURN_;
|
2003-03-23 19:48:09 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Desktops
|
|
|
|
*/
|
|
|
|
|
|
|
|
void
|
|
|
|
EWMH_SetDesktopCount(void)
|
|
|
|
{
|
2003-06-11 12:41:30 -07:00
|
|
|
int i;
|
2003-03-27 21:16:21 -08:00
|
|
|
CARD32 val;
|
2003-06-11 12:41:30 -07:00
|
|
|
Window wl[ENLIGHTENMENT_CONF_NUM_DESKTOPS];
|
2003-03-23 19:48:09 -08:00
|
|
|
|
2003-03-27 21:16:21 -08:00
|
|
|
EDBUG(6, "EWMH_SetDesktopCount");
|
2003-06-11 12:41:30 -07:00
|
|
|
|
2004-03-20 07:49:05 -08:00
|
|
|
val = Conf.desks.num;
|
2004-05-04 12:04:42 -07:00
|
|
|
_ATOM_SET_CARD32(_NET_NUMBER_OF_DESKTOPS, VRoot.win, &val, 1);
|
2003-06-11 12:41:30 -07:00
|
|
|
|
2004-03-20 07:49:05 -08:00
|
|
|
for (i = 0; i < Conf.desks.num; i++)
|
2003-06-11 12:41:30 -07:00
|
|
|
{
|
|
|
|
wl[i] = desks.desk[i].win;
|
|
|
|
}
|
2004-05-04 12:04:42 -07:00
|
|
|
_ATOM_SET_WINDOW(_NET_VIRTUAL_ROOTS, VRoot.win, &wl, Conf.desks.num);
|
2003-06-11 12:41:30 -07:00
|
|
|
|
2003-03-27 21:16:21 -08:00
|
|
|
EDBUG_RETURN_;
|
2003-03-23 19:48:09 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
EWMH_SetDesktopNames(void)
|
|
|
|
{
|
2003-05-16 11:02:13 -07:00
|
|
|
char buf[10 * ENLIGHTENMENT_CONF_NUM_DESKTOPS], *s;
|
2003-03-27 21:16:21 -08:00
|
|
|
int i;
|
2003-03-23 19:48:09 -08:00
|
|
|
|
2003-03-27 21:16:21 -08:00
|
|
|
EDBUG(6, "EWMH_SetDesktopNames");
|
2003-05-14 12:35:51 -07:00
|
|
|
|
|
|
|
s = buf;
|
2004-03-20 07:49:05 -08:00
|
|
|
for (i = 0; i < Conf.desks.num; i++)
|
2003-05-14 12:35:51 -07:00
|
|
|
s += sprintf(s, "Desk-%d", i) + 1;
|
|
|
|
|
2004-05-04 12:04:42 -07:00
|
|
|
_ATOM_SET_UTF8_STRING_LIST(_NET_DESKTOP_NAMES, VRoot.win, buf, s - buf);
|
2003-05-14 12:35:51 -07:00
|
|
|
|
2003-03-27 21:16:21 -08:00
|
|
|
EDBUG_RETURN_;
|
2003-03-23 19:48:09 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
EWMH_SetDesktopSize(void)
|
|
|
|
{
|
2003-03-27 21:16:21 -08:00
|
|
|
CARD32 size[2];
|
|
|
|
int ax, ay;
|
|
|
|
|
|
|
|
EDBUG(6, "EWMH_SetDesktopSize");
|
|
|
|
GetAreaSize(&ax, &ay);
|
2004-05-04 12:04:42 -07:00
|
|
|
size[0] = ax * VRoot.w;
|
|
|
|
size[1] = ay * VRoot.h;
|
|
|
|
_ATOM_SET_CARD32(_NET_DESKTOP_GEOMETRY, VRoot.win, &size, 2);
|
2003-03-27 21:16:21 -08:00
|
|
|
EDBUG_RETURN_;
|
2003-03-23 19:48:09 -08:00
|
|
|
}
|
|
|
|
|
2003-08-18 15:03:10 -07:00
|
|
|
void
|
|
|
|
EWMH_SetWorkArea(void)
|
|
|
|
{
|
|
|
|
CARD32 *p_coord;
|
|
|
|
int n_coord, i;
|
|
|
|
|
|
|
|
EDBUG(6, "EWMH_SetWorkArea");
|
|
|
|
|
2004-03-20 07:49:05 -08:00
|
|
|
n_coord = 4 * Conf.desks.num;
|
2003-08-18 15:03:10 -07:00
|
|
|
p_coord = Emalloc(n_coord * sizeof(CARD32));
|
|
|
|
if (p_coord)
|
|
|
|
{
|
2004-03-20 07:49:05 -08:00
|
|
|
for (i = 0; i < Conf.desks.num; i++)
|
2003-08-18 15:03:10 -07:00
|
|
|
{
|
|
|
|
p_coord[4 * i] = 0;
|
|
|
|
p_coord[4 * i + 1] = 0;
|
2004-05-04 12:04:42 -07:00
|
|
|
p_coord[4 * i + 2] = VRoot.w;
|
|
|
|
p_coord[4 * i + 3] = VRoot.h;
|
2003-08-18 15:03:10 -07:00
|
|
|
}
|
2004-05-04 12:04:42 -07:00
|
|
|
_ATOM_SET_CARD32(_NET_WORKAREA, VRoot.win, p_coord, n_coord);
|
2003-08-18 15:03:10 -07:00
|
|
|
Efree(p_coord);
|
|
|
|
}
|
|
|
|
EDBUG_RETURN_;
|
|
|
|
}
|
|
|
|
|
2003-03-23 19:48:09 -08:00
|
|
|
void
|
|
|
|
EWMH_SetCurrentDesktop(void)
|
|
|
|
{
|
2003-03-27 21:16:21 -08:00
|
|
|
CARD32 val;
|
2003-03-23 19:48:09 -08:00
|
|
|
|
2003-03-27 21:16:21 -08:00
|
|
|
EDBUG(6, "EWMH_SetCurrentDesktop");
|
|
|
|
val = desks.current;
|
2004-05-04 12:04:42 -07:00
|
|
|
_ATOM_SET_CARD32(_NET_CURRENT_DESKTOP, VRoot.win, &val, 1);
|
2003-03-27 21:16:21 -08:00
|
|
|
EDBUG_RETURN_;
|
2003-03-23 19:48:09 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
EWMH_SetDesktopViewport(void)
|
|
|
|
{
|
2003-04-02 14:55:53 -08:00
|
|
|
CARD32 *p_coord;
|
|
|
|
int n_coord, i;
|
2003-03-27 21:16:21 -08:00
|
|
|
|
|
|
|
EDBUG(6, "EWMH_SetDesktopViewport");
|
2004-03-20 07:49:05 -08:00
|
|
|
n_coord = 2 * Conf.desks.num;
|
2003-04-02 14:55:53 -08:00
|
|
|
p_coord = Emalloc(n_coord * sizeof(CARD32));
|
|
|
|
if (p_coord)
|
|
|
|
{
|
2004-03-20 07:49:05 -08:00
|
|
|
for (i = 0; i < Conf.desks.num; i++)
|
2003-05-22 12:15:03 -07:00
|
|
|
{
|
2004-05-04 12:04:42 -07:00
|
|
|
p_coord[2 * i] = desks.desk[i].current_area_x * VRoot.w;
|
|
|
|
p_coord[2 * i + 1] = desks.desk[i].current_area_y * VRoot.h;
|
2003-05-22 12:15:03 -07:00
|
|
|
}
|
2004-05-04 12:04:42 -07:00
|
|
|
_ATOM_SET_CARD32(_NET_DESKTOP_VIEWPORT, VRoot.win, p_coord, n_coord);
|
2003-05-22 12:15:03 -07:00
|
|
|
Efree(p_coord);
|
2003-04-02 14:55:53 -08:00
|
|
|
}
|
2003-03-27 21:16:21 -08:00
|
|
|
EDBUG_RETURN_;
|
2003-03-23 19:48:09 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Window status
|
|
|
|
*/
|
|
|
|
|
|
|
|
void
|
|
|
|
EWMH_SetClientList(void)
|
|
|
|
{
|
2003-03-27 21:16:21 -08:00
|
|
|
Window *wl;
|
2004-04-30 13:05:22 -07:00
|
|
|
int i, num;
|
2003-03-27 21:16:21 -08:00
|
|
|
EWin **lst;
|
|
|
|
|
|
|
|
EDBUG(6, "EWMH_SetClientList");
|
2004-03-16 14:10:07 -08:00
|
|
|
|
2003-03-27 21:16:21 -08:00
|
|
|
/* Mapping order */
|
|
|
|
lst = (EWin **) ListItemType(&num, LIST_TYPE_EWIN);
|
2004-04-30 13:05:22 -07:00
|
|
|
if (num > 0)
|
2003-03-27 21:16:21 -08:00
|
|
|
{
|
2004-04-30 13:05:22 -07:00
|
|
|
wl = Emalloc(num * sizeof(Window));
|
2003-05-22 12:15:03 -07:00
|
|
|
for (i = 0; i < num; i++)
|
2004-04-30 13:05:22 -07:00
|
|
|
wl[i] = lst[i]->client.win;
|
2004-05-04 12:04:42 -07:00
|
|
|
_ATOM_SET_WINDOW(_NET_CLIENT_LIST, VRoot.win, wl, num);
|
2004-04-30 13:05:22 -07:00
|
|
|
Efree(wl);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2004-05-04 12:04:42 -07:00
|
|
|
_ATOM_SET_WINDOW(_NET_CLIENT_LIST, VRoot.win, NULL, 0);
|
2003-03-27 21:16:21 -08:00
|
|
|
}
|
2004-04-30 13:05:22 -07:00
|
|
|
if (lst)
|
|
|
|
Efree(lst);
|
|
|
|
|
|
|
|
EDBUG_RETURN_;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
EWMH_SetClientStacking(void)
|
|
|
|
{
|
|
|
|
Window *wl;
|
|
|
|
int i, num;
|
|
|
|
EWin *const *lst;
|
|
|
|
|
|
|
|
EDBUG(6, "EWMH_SetClientStacking");
|
2004-03-16 14:10:07 -08:00
|
|
|
|
|
|
|
/* Stacking order */
|
2004-04-30 13:05:22 -07:00
|
|
|
lst = EwinListGetStacking(&num);
|
|
|
|
if (num > 0)
|
|
|
|
{
|
|
|
|
wl = Emalloc(num * sizeof(Window));
|
|
|
|
for (i = 0; i < num; i++)
|
|
|
|
wl[i] = lst[num - i - 1]->client.win;
|
2004-05-04 12:04:42 -07:00
|
|
|
_ATOM_SET_WINDOW(_NET_CLIENT_LIST_STACKING, VRoot.win, wl, num);
|
2004-04-30 13:05:22 -07:00
|
|
|
Efree(wl);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2004-05-04 12:04:42 -07:00
|
|
|
_ATOM_SET_WINDOW(_NET_CLIENT_LIST_STACKING, VRoot.win, NULL, 0);
|
2004-04-30 13:05:22 -07:00
|
|
|
}
|
2004-03-16 14:10:07 -08:00
|
|
|
|
2003-03-27 21:16:21 -08:00
|
|
|
EDBUG_RETURN_;
|
2003-03-23 19:48:09 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2004-05-22 12:31:13 -07:00
|
|
|
EWMH_SetActiveWindow(Window win)
|
2003-03-23 19:48:09 -08:00
|
|
|
{
|
2003-03-27 21:16:21 -08:00
|
|
|
static Window win_last_set;
|
|
|
|
|
|
|
|
EDBUG(6, "EWMH_SetActiveWindow");
|
|
|
|
if (win != win_last_set)
|
|
|
|
{
|
2004-05-04 12:04:42 -07:00
|
|
|
_ATOM_SET_WINDOW(_NET_ACTIVE_WINDOW, VRoot.win, &win, 1);
|
2003-05-22 12:15:03 -07:00
|
|
|
win_last_set = win;
|
2003-03-27 21:16:21 -08:00
|
|
|
}
|
|
|
|
EDBUG_RETURN_;
|
2003-03-23 19:48:09 -08:00
|
|
|
}
|
|
|
|
|
2004-05-04 17:17:15 -07:00
|
|
|
void
|
|
|
|
EWMH_SetShowingDesktop(int on)
|
|
|
|
{
|
|
|
|
CARD32 val;
|
|
|
|
|
|
|
|
EDBUG(6, "EWMH_SetShowingDesktop");
|
|
|
|
val = on;
|
|
|
|
_ATOM_SET_CARD32(_NET_SHOWING_DESKTOP, VRoot.win, &val, 1);
|
|
|
|
EDBUG_RETURN_;
|
|
|
|
}
|
|
|
|
|
2003-03-23 19:48:09 -08:00
|
|
|
/*
|
|
|
|
* Functions that set X11-properties from E-window internals
|
|
|
|
*/
|
|
|
|
|
2004-05-22 12:31:13 -07:00
|
|
|
void
|
|
|
|
EWMH_SetWindowName(Window win, const char *name)
|
|
|
|
{
|
2004-05-23 09:11:36 -07:00
|
|
|
const char *str;
|
|
|
|
|
|
|
|
EDBUG(6, "EWMH_SetWindowName");
|
|
|
|
str = EstrInt2Enc(name, 1);
|
|
|
|
_ATOM_SET_UTF8_STRING(_NET_WM_NAME, win, str);
|
|
|
|
EstrInt2EncFree(str, 1);
|
|
|
|
EDBUG_RETURN_;
|
2004-05-22 12:31:13 -07:00
|
|
|
}
|
|
|
|
|
2003-03-23 19:48:09 -08:00
|
|
|
void
|
2003-03-27 21:16:21 -08:00
|
|
|
EWMH_SetWindowDesktop(const EWin * ewin)
|
2003-03-23 19:48:09 -08:00
|
|
|
{
|
2003-03-27 21:16:21 -08:00
|
|
|
CARD32 val;
|
|
|
|
|
|
|
|
EDBUG(6, "EWMH_SetWindowDesktop");
|
|
|
|
if (ewin->sticky == 1)
|
|
|
|
val = 0xFFFFFFFF;
|
|
|
|
else
|
|
|
|
val = ewin->desktop;
|
|
|
|
_ATOM_SET_CARD32(_NET_WM_DESKTOP, ewin->client.win, &val, 1);
|
|
|
|
EDBUG_RETURN_;
|
2003-03-23 19:48:09 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2003-03-27 21:16:21 -08:00
|
|
|
EWMH_SetWindowState(const EWin * ewin)
|
2003-03-23 19:48:09 -08:00
|
|
|
{
|
2003-03-27 21:16:21 -08:00
|
|
|
Atom atom_list[64];
|
|
|
|
int len = sizeof(atom_list) / sizeof(Atom);
|
|
|
|
int atom_count;
|
|
|
|
|
|
|
|
EDBUG(6, "EWMH_SetWindowState");
|
|
|
|
atom_count = 0;
|
|
|
|
atom_list_set(atom_list, len, &atom_count, _NET_WM_STATE_STICKY,
|
2003-05-22 12:15:03 -07:00
|
|
|
ewin->sticky);
|
2003-03-27 21:16:21 -08:00
|
|
|
atom_list_set(atom_list, len, &atom_count, _NET_WM_STATE_SHADED,
|
2003-05-22 12:15:03 -07:00
|
|
|
ewin->shaded);
|
2003-03-27 21:16:21 -08:00
|
|
|
atom_list_set(atom_list, len, &atom_count, _NET_WM_STATE_SKIP_TASKBAR,
|
2003-05-22 12:15:03 -07:00
|
|
|
ewin->skiptask);
|
2003-03-27 21:16:21 -08:00
|
|
|
atom_list_set(atom_list, len, &atom_count, _NET_WM_STATE_HIDDEN,
|
2003-06-14 04:57:07 -07:00
|
|
|
ewin->iconified || ewin->shaded);
|
2003-03-27 21:16:21 -08:00
|
|
|
atom_list_set(atom_list, len, &atom_count, _NET_WM_STATE_MAXIMIZED_VERT,
|
2004-05-31 13:30:12 -07:00
|
|
|
ewin->st.maximized_vert);
|
2003-03-27 21:16:21 -08:00
|
|
|
atom_list_set(atom_list, len, &atom_count, _NET_WM_STATE_MAXIMIZED_HORZ,
|
2004-05-31 13:30:12 -07:00
|
|
|
ewin->st.maximized_horz);
|
|
|
|
atom_list_set(atom_list, len, &atom_count, _NET_WM_STATE_FULLSCREEN,
|
|
|
|
ewin->st.fullscreen);
|
2003-03-27 21:16:21 -08:00
|
|
|
atom_list_set(atom_list, len, &atom_count, _NET_WM_STATE_SKIP_PAGER,
|
2003-05-22 12:15:03 -07:00
|
|
|
ewin->skip_ext_pager);
|
2003-03-27 21:16:21 -08:00
|
|
|
atom_list_set(atom_list, len, &atom_count, _NET_WM_STATE_ABOVE,
|
2003-05-22 12:15:03 -07:00
|
|
|
ewin->layer >= 6);
|
2003-03-27 21:16:21 -08:00
|
|
|
atom_list_set(atom_list, len, &atom_count, _NET_WM_STATE_BELOW,
|
2003-05-22 12:15:03 -07:00
|
|
|
ewin->layer <= 2);
|
2003-03-27 21:16:21 -08:00
|
|
|
_ATOM_SET_ATOM(_NET_WM_STATE, ewin->client.win, atom_list, atom_count);
|
|
|
|
EDBUG_RETURN_;
|
2003-03-23 19:48:09 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Functions that set E-window internals from X11-properties
|
|
|
|
*/
|
|
|
|
|
2004-02-28 17:30:18 -08:00
|
|
|
void
|
|
|
|
EWMH_GetWindowName(EWin * ewin)
|
|
|
|
{
|
|
|
|
char *val;
|
|
|
|
int size;
|
|
|
|
|
|
|
|
EDBUG(6, "EWMH_GetWindowName");
|
|
|
|
|
|
|
|
val = AtomGet(ewin->client.win, _NET_WM_NAME, E_XA_UTF8_STRING, &size);
|
|
|
|
if (!val)
|
2004-03-20 07:49:05 -08:00
|
|
|
goto done;
|
2004-02-28 17:30:18 -08:00
|
|
|
|
|
|
|
if (ewin->ewmh.wm_name)
|
|
|
|
Efree(ewin->ewmh.wm_name);
|
2004-05-23 09:11:36 -07:00
|
|
|
ewin->ewmh.wm_name = EstrUtf82Int(val, size);
|
2004-02-28 17:30:18 -08:00
|
|
|
|
|
|
|
Efree(val);
|
|
|
|
EwinChange(ewin, EWIN_CHANGE_NAME);
|
|
|
|
|
2004-03-20 07:49:05 -08:00
|
|
|
done:
|
2004-02-28 17:30:18 -08:00
|
|
|
EDBUG_RETURN_;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
EWMH_GetWindowIconName(EWin * ewin)
|
|
|
|
{
|
|
|
|
char *val;
|
|
|
|
int size;
|
|
|
|
|
|
|
|
EDBUG(6, "EWMH_GetWindowIconName");
|
|
|
|
|
|
|
|
val = AtomGet(ewin->client.win, _NET_WM_ICON_NAME, E_XA_UTF8_STRING, &size);
|
|
|
|
if (!val)
|
2004-03-20 07:49:05 -08:00
|
|
|
goto done;
|
2004-02-28 17:30:18 -08:00
|
|
|
|
|
|
|
if (ewin->ewmh.wm_icon_name)
|
|
|
|
Efree(ewin->ewmh.wm_icon_name);
|
2004-05-23 09:11:36 -07:00
|
|
|
ewin->ewmh.wm_icon_name = EstrUtf82Int(val, size);
|
2004-02-28 17:30:18 -08:00
|
|
|
|
|
|
|
Efree(val);
|
|
|
|
EwinChange(ewin, EWIN_CHANGE_ICON_NAME);
|
|
|
|
|
2004-03-20 07:49:05 -08:00
|
|
|
done:
|
2004-02-28 17:30:18 -08:00
|
|
|
EDBUG_RETURN_;
|
|
|
|
}
|
|
|
|
|
2003-03-23 19:48:09 -08:00
|
|
|
void
|
2003-03-27 21:16:21 -08:00
|
|
|
EWMH_GetWindowDesktop(EWin * ewin)
|
2003-03-23 19:48:09 -08:00
|
|
|
{
|
2003-03-27 21:16:21 -08:00
|
|
|
CARD32 *val;
|
|
|
|
int size;
|
2003-03-23 19:48:09 -08:00
|
|
|
|
2003-03-27 21:16:21 -08:00
|
|
|
EDBUG(6, "EWMH_GetWindowDesktop");
|
2003-03-23 19:48:09 -08:00
|
|
|
|
2004-07-01 14:04:42 -07:00
|
|
|
if (ewin->props.vroot)
|
|
|
|
goto done;
|
|
|
|
|
2003-03-27 21:16:21 -08:00
|
|
|
val = AtomGet(ewin->client.win, _NET_WM_DESKTOP, XA_CARDINAL, &size);
|
|
|
|
if (!val)
|
2004-03-20 07:49:05 -08:00
|
|
|
goto done;
|
2003-03-23 19:48:09 -08:00
|
|
|
|
2003-05-04 18:16:57 -07:00
|
|
|
if ((unsigned)val[0] == 0xFFFFFFFF)
|
2003-03-27 21:16:21 -08:00
|
|
|
{
|
2003-05-22 12:15:03 -07:00
|
|
|
/* It is possible to distinguish between "sticky" and "on all desktops". */
|
|
|
|
/* E doesn't */
|
|
|
|
ewin->sticky = 1;
|
2003-03-27 21:16:21 -08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2003-05-22 12:15:03 -07:00
|
|
|
ewin->desktop = val[0];
|
|
|
|
ewin->sticky = 0;
|
2003-03-27 21:16:21 -08:00
|
|
|
}
|
|
|
|
Efree(val);
|
2004-02-28 17:30:18 -08:00
|
|
|
EwinChange(ewin, EWIN_CHANGE_DESKTOP);
|
2003-03-23 19:48:09 -08:00
|
|
|
|
2004-03-20 07:49:05 -08:00
|
|
|
done:
|
2003-03-27 21:16:21 -08:00
|
|
|
EDBUG_RETURN_;
|
2003-03-23 19:48:09 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2003-03-27 21:16:21 -08:00
|
|
|
EWMH_GetWindowState(EWin * ewin)
|
2003-03-23 19:48:09 -08:00
|
|
|
{
|
2003-03-27 21:16:21 -08:00
|
|
|
Atom *p_atoms, atom;
|
|
|
|
int i, n_atoms;
|
2003-03-23 19:48:09 -08:00
|
|
|
|
2003-03-27 21:16:21 -08:00
|
|
|
EDBUG(6, "EWMH_GetWindowState");
|
2003-03-23 19:48:09 -08:00
|
|
|
|
2003-03-27 21:16:21 -08:00
|
|
|
n_atoms = 0;
|
|
|
|
p_atoms = AtomGet(ewin->client.win, _NET_WM_STATE, XA_ATOM, &n_atoms);
|
2003-05-22 12:15:03 -07:00
|
|
|
n_atoms /= sizeof(Atom); /* Silly */
|
2003-03-27 21:16:21 -08:00
|
|
|
if (!p_atoms)
|
2004-03-20 07:49:05 -08:00
|
|
|
goto done;
|
2003-03-23 19:48:09 -08:00
|
|
|
|
2003-06-14 04:57:07 -07:00
|
|
|
/* We must clear/set all according to not present/present */
|
|
|
|
ewin->sticky = ewin->shaded = 0;
|
|
|
|
ewin->skiptask = ewin->skip_ext_pager = 0;
|
2004-05-31 13:30:12 -07:00
|
|
|
ewin->st.maximized_horz = ewin->st.maximized_vert = 0;
|
|
|
|
ewin->st.fullscreen = 0;
|
2003-06-14 04:57:07 -07:00
|
|
|
/* ewin->layer = No ... TBD */
|
|
|
|
|
2003-03-27 21:16:21 -08:00
|
|
|
for (i = 0; i < n_atoms; i++)
|
|
|
|
{
|
2003-05-22 12:15:03 -07:00
|
|
|
atom = p_atoms[i];
|
|
|
|
if (atom == _NET_WM_STATE_STICKY)
|
|
|
|
ewin->sticky = 1;
|
|
|
|
else if (atom == _NET_WM_STATE_SHADED)
|
|
|
|
ewin->shaded = 1;
|
|
|
|
else if (atom == _NET_WM_STATE_SKIP_TASKBAR)
|
|
|
|
ewin->skiptask = 1;
|
|
|
|
else if (atom == _NET_WM_STATE_SKIP_PAGER)
|
|
|
|
ewin->skip_ext_pager = 1;
|
|
|
|
else if (atom == _NET_WM_STATE_HIDDEN)
|
2003-06-14 04:57:07 -07:00
|
|
|
; /* ewin->iconified = 1; No - WM_STATE does this */
|
2003-05-22 12:15:03 -07:00
|
|
|
else if (atom == _NET_WM_STATE_MAXIMIZED_VERT)
|
2004-05-31 13:30:12 -07:00
|
|
|
ewin->st.maximized_vert = 1;
|
2003-05-22 12:15:03 -07:00
|
|
|
else if (atom == _NET_WM_STATE_MAXIMIZED_HORZ)
|
2004-05-31 13:30:12 -07:00
|
|
|
ewin->st.maximized_horz = 1;
|
|
|
|
else if (atom == _NET_WM_STATE_FULLSCREEN)
|
|
|
|
ewin->st.fullscreen = 1;
|
2003-05-22 12:15:03 -07:00
|
|
|
else if (atom == _NET_WM_STATE_ABOVE)
|
|
|
|
ewin->layer = 6;
|
|
|
|
else if (atom == _NET_WM_STATE_BELOW)
|
|
|
|
ewin->layer = 2;
|
2003-03-27 21:16:21 -08:00
|
|
|
}
|
|
|
|
Efree(p_atoms);
|
2003-03-23 19:48:09 -08:00
|
|
|
|
2004-03-20 07:49:05 -08:00
|
|
|
done:
|
2003-03-27 21:16:21 -08:00
|
|
|
EDBUG_RETURN_;
|
2003-03-23 19:48:09 -08:00
|
|
|
}
|
|
|
|
|
2003-05-04 18:16:57 -07:00
|
|
|
static void
|
2003-03-27 21:16:21 -08:00
|
|
|
EWMH_GetWindowType(EWin * ewin)
|
2003-03-23 19:48:09 -08:00
|
|
|
{
|
2003-03-27 21:16:21 -08:00
|
|
|
Atom *p_atoms, atom;
|
|
|
|
int n_atoms;
|
2003-03-23 19:48:09 -08:00
|
|
|
|
2003-03-27 21:16:21 -08:00
|
|
|
EDBUG(6, "EWMH_GetWindowType");
|
2003-03-23 19:48:09 -08:00
|
|
|
|
2003-03-27 21:16:21 -08:00
|
|
|
n_atoms = 0;
|
|
|
|
p_atoms = AtomGet(ewin->client.win, _NET_WM_WINDOW_TYPE, XA_ATOM, &n_atoms);
|
2003-05-22 12:15:03 -07:00
|
|
|
n_atoms /= sizeof(Atom); /* Silly */
|
2003-03-27 21:16:21 -08:00
|
|
|
if (!p_atoms)
|
2004-03-20 07:49:05 -08:00
|
|
|
goto done;
|
2003-03-27 21:16:21 -08:00
|
|
|
|
|
|
|
atom = p_atoms[0];
|
|
|
|
if (atom == _NET_WM_WINDOW_TYPE_DESKTOP)
|
|
|
|
{
|
2003-05-22 12:15:03 -07:00
|
|
|
ewin->layer = 0;
|
|
|
|
ewin->sticky = 1;
|
2003-11-22 08:20:13 -08:00
|
|
|
#if 0 /* Should be configurable */
|
2003-05-22 12:15:03 -07:00
|
|
|
ewin->focusclick = 1;
|
2003-11-21 16:18:31 -08:00
|
|
|
#endif
|
2003-05-22 12:15:03 -07:00
|
|
|
ewin->skipfocus = 1;
|
2003-09-28 11:55:07 -07:00
|
|
|
ewin->fixedpos = 1;
|
2003-12-27 11:20:15 -08:00
|
|
|
EwinSetBorderByName(ewin, "BORDERLESS", 0);
|
2003-03-27 21:16:21 -08:00
|
|
|
}
|
|
|
|
else if (atom == _NET_WM_WINDOW_TYPE_DOCK)
|
|
|
|
{
|
2003-05-22 12:15:03 -07:00
|
|
|
ewin->skiptask = 1;
|
|
|
|
ewin->skipwinlist = 1;
|
|
|
|
ewin->skipfocus = 1;
|
2003-10-02 11:54:18 -07:00
|
|
|
ewin->sticky = 1;
|
2003-05-22 12:15:03 -07:00
|
|
|
ewin->never_use_area = 1;
|
2003-03-27 21:16:21 -08:00
|
|
|
}
|
2003-04-06 17:54:55 -07:00
|
|
|
else if (atom == _NET_WM_WINDOW_TYPE_UTILITY)
|
|
|
|
{
|
2003-05-22 12:15:03 -07:00
|
|
|
/* Epplets hit this */
|
|
|
|
ewin->skiptask = 1;
|
|
|
|
ewin->skipwinlist = 1;
|
|
|
|
ewin->skipfocus = 1;
|
|
|
|
ewin->never_use_area = 1;
|
2003-04-06 17:54:55 -07:00
|
|
|
}
|
2004-03-14 01:03:26 -08:00
|
|
|
#if 0 /* Not used by E (yet?) */
|
2003-03-27 21:16:21 -08:00
|
|
|
else if (atom == _NET_WM_WINDOW_TYPE_TOOLBAR)
|
2003-07-11 12:49:57 -07:00
|
|
|
{
|
|
|
|
}
|
|
|
|
else if (atom == _NET_WM_WINDOW_TYPE_MENU)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
else if (atom == _NET_WM_WINDOW_TYPE_SPLASH)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
else if (atom == _NET_WM_WINDOW_TYPE_DIALOG)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
else if (atom == _NET_WM_WINDOW_TYPE_NORMAL)
|
|
|
|
{
|
|
|
|
}
|
2003-03-23 19:48:09 -08:00
|
|
|
#endif
|
2003-07-11 12:49:57 -07:00
|
|
|
Efree(p_atoms);
|
2003-03-23 19:48:09 -08:00
|
|
|
|
2004-03-20 07:49:05 -08:00
|
|
|
done:
|
2003-03-27 21:16:21 -08:00
|
|
|
EDBUG_RETURN_;
|
2003-03-23 19:48:09 -08:00
|
|
|
}
|
|
|
|
|
2004-07-01 14:04:42 -07:00
|
|
|
static void
|
|
|
|
EWMH_GetWindowMisc(EWin * ewin)
|
|
|
|
{
|
|
|
|
CARD32 *val;
|
|
|
|
int size;
|
|
|
|
|
|
|
|
EDBUG(6, "EWMH_GetWindowMisc");
|
|
|
|
|
|
|
|
val = AtomGet(ewin->client.win, _NET_SUPPORTING_WM_CHECK, XA_WINDOW, &size);
|
|
|
|
if (val)
|
|
|
|
{
|
|
|
|
ewin->props.vroot = 1;
|
|
|
|
Efree(val);
|
|
|
|
}
|
|
|
|
|
|
|
|
EDBUG_RETURN_;
|
|
|
|
}
|
|
|
|
|
2003-03-23 19:48:09 -08:00
|
|
|
void
|
2003-03-27 21:16:21 -08:00
|
|
|
EWMH_GetWindowHints(EWin * ewin)
|
2003-03-23 19:48:09 -08:00
|
|
|
{
|
2003-03-27 21:16:21 -08:00
|
|
|
EDBUG(6, "EWMH_GetWindowHints");
|
2004-07-01 14:04:42 -07:00
|
|
|
EWMH_GetWindowMisc(ewin);
|
2004-02-28 17:30:18 -08:00
|
|
|
EWMH_GetWindowName(ewin);
|
|
|
|
EWMH_GetWindowIconName(ewin);
|
2003-03-27 21:16:21 -08:00
|
|
|
EWMH_GetWindowDesktop(ewin);
|
|
|
|
EWMH_GetWindowState(ewin);
|
|
|
|
EWMH_GetWindowType(ewin);
|
2003-03-23 19:48:09 -08:00
|
|
|
/* EWMH_GetWindowIcons(ewin); TBD */
|
2003-03-27 21:16:21 -08:00
|
|
|
EDBUG_RETURN_;
|
2003-03-23 19:48:09 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Delete all (_NET_...) properties set on window
|
|
|
|
*/
|
|
|
|
void
|
2003-03-27 21:16:21 -08:00
|
|
|
EWMH_DelWindowHints(const EWin * ewin)
|
2003-03-23 19:48:09 -08:00
|
|
|
{
|
2003-03-27 21:16:21 -08:00
|
|
|
EDBUG(6, "EWMH_DelWindowHints");
|
|
|
|
XDeleteProperty(disp, ewin->client.win, _NET_WM_DESKTOP);
|
|
|
|
XDeleteProperty(disp, ewin->client.win, _NET_WM_STATE);
|
|
|
|
EDBUG_RETURN_;
|
2003-03-23 19:48:09 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Process configuration requests from clients
|
|
|
|
*/
|
2003-03-27 21:16:21 -08:00
|
|
|
static int
|
|
|
|
do_set(int is_set, int action)
|
2003-03-23 19:48:09 -08:00
|
|
|
{
|
2003-03-27 21:16:21 -08:00
|
|
|
switch (action)
|
|
|
|
{
|
2003-05-22 12:15:03 -07:00
|
|
|
case _NET_WM_STATE_REMOVE:
|
|
|
|
return 0;
|
|
|
|
break;
|
|
|
|
case _NET_WM_STATE_ADD:
|
|
|
|
return 1;
|
|
|
|
break;
|
|
|
|
case _NET_WM_STATE_TOGGLE:
|
|
|
|
return !is_set;
|
|
|
|
break;
|
2003-03-27 21:16:21 -08:00
|
|
|
}
|
2003-05-04 18:16:57 -07:00
|
|
|
return -1;
|
2003-03-23 19:48:09 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2003-03-27 21:16:21 -08:00
|
|
|
EWMH_ProcessClientMessage(XClientMessageEvent * event)
|
2003-03-23 19:48:09 -08:00
|
|
|
{
|
2003-03-27 21:16:21 -08:00
|
|
|
EWin *ewin;
|
2003-03-23 19:48:09 -08:00
|
|
|
|
2003-03-27 21:16:21 -08:00
|
|
|
EDBUG(6, "EWMH_ProcessClientMessage");
|
2003-03-23 19:48:09 -08:00
|
|
|
|
2003-03-27 21:16:21 -08:00
|
|
|
/*
|
|
|
|
* The ones that don't target an application window
|
|
|
|
*/
|
|
|
|
if (event->message_type == _NET_CURRENT_DESKTOP)
|
|
|
|
{
|
2003-05-22 12:15:03 -07:00
|
|
|
GotoDesktop(event->data.l[0]);
|
2004-03-20 07:49:05 -08:00
|
|
|
goto done;
|
2003-03-27 21:16:21 -08:00
|
|
|
}
|
2003-03-31 09:31:24 -08:00
|
|
|
else if (event->message_type == _NET_DESKTOP_VIEWPORT)
|
|
|
|
{
|
2004-05-04 12:04:42 -07:00
|
|
|
SetCurrentArea(event->data.l[0] / VRoot.w, event->data.l[1] / VRoot.h);
|
2004-03-20 07:49:05 -08:00
|
|
|
goto done;
|
2003-03-31 09:31:24 -08:00
|
|
|
}
|
2004-05-04 17:17:15 -07:00
|
|
|
else if (event->message_type == _NET_SHOWING_DESKTOP)
|
|
|
|
{
|
|
|
|
Eprintf("EWMH_ProcessClientMessage: _NET_SHOWING_DESKTOP: %d\n",
|
|
|
|
event->data.l[0]);
|
|
|
|
EWMH_SetShowingDesktop(event->data.l[0]);
|
|
|
|
goto done;
|
|
|
|
}
|
2003-03-23 19:48:09 -08:00
|
|
|
|
2003-03-27 21:16:21 -08:00
|
|
|
/*
|
|
|
|
* The ones that do target an application window
|
|
|
|
*/
|
|
|
|
ewin = FindItem(NULL, event->window, LIST_FINDBY_ID, LIST_TYPE_EWIN);
|
|
|
|
if (ewin == NULL)
|
2004-03-20 07:49:05 -08:00
|
|
|
goto done;
|
2003-03-23 19:48:09 -08:00
|
|
|
|
2003-03-27 21:16:21 -08:00
|
|
|
if (event->message_type == _NET_ACTIVE_WINDOW)
|
|
|
|
{
|
2003-05-22 12:15:03 -07:00
|
|
|
if (ewin->iconified)
|
2003-06-05 02:00:39 -07:00
|
|
|
DeIconifyEwin(ewin);
|
|
|
|
RaiseEwin(ewin);
|
|
|
|
if (ewin->shaded)
|
2004-06-04 12:23:47 -07:00
|
|
|
EwinUnShade(ewin);
|
2004-01-21 15:32:45 -08:00
|
|
|
FocusToEWin(ewin, FOCUS_SET);
|
2003-03-27 21:16:21 -08:00
|
|
|
}
|
|
|
|
else if (event->message_type == _NET_CLOSE_WINDOW)
|
|
|
|
{
|
2004-04-10 03:43:55 -07:00
|
|
|
ActionsCall(ACTION_KILL, ewin, NULL);
|
2003-03-27 21:16:21 -08:00
|
|
|
}
|
|
|
|
else if (event->message_type == _NET_WM_DESKTOP)
|
|
|
|
{
|
2003-05-22 12:15:03 -07:00
|
|
|
if ((unsigned)event->data.l[0] == 0xFFFFFFFF)
|
|
|
|
{
|
|
|
|
if (!ewin->sticky)
|
2004-06-04 12:23:47 -07:00
|
|
|
EwinStick(ewin);
|
2003-05-22 12:15:03 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (ewin->sticky)
|
2004-06-04 12:23:47 -07:00
|
|
|
EwinUnStick(ewin);
|
2003-05-22 12:15:03 -07:00
|
|
|
else
|
|
|
|
MoveEwinToDesktop(ewin, event->data.l[0]);
|
|
|
|
}
|
2003-03-27 21:16:21 -08:00
|
|
|
}
|
|
|
|
else if (event->message_type == _NET_WM_STATE)
|
|
|
|
{
|
2003-05-22 12:15:03 -07:00
|
|
|
/*
|
|
|
|
* It is assumed(!) that only the MAXIMIZE H/V ones can be set
|
|
|
|
* in one message.
|
|
|
|
*/
|
|
|
|
int action;
|
|
|
|
Atom atom, atom2;
|
|
|
|
|
|
|
|
action = event->data.l[0];
|
|
|
|
atom = event->data.l[1];
|
|
|
|
atom2 = event->data.l[2];
|
|
|
|
if (atom == _NET_WM_STATE_STICKY)
|
|
|
|
{
|
|
|
|
action = do_set(ewin->sticky, action);
|
|
|
|
if (action)
|
2004-06-04 12:23:47 -07:00
|
|
|
EwinStick(ewin);
|
2003-05-22 12:15:03 -07:00
|
|
|
else
|
2004-06-04 12:23:47 -07:00
|
|
|
EwinUnStick(ewin);
|
2003-05-22 12:15:03 -07:00
|
|
|
ewin->sticky = action;
|
|
|
|
}
|
|
|
|
else if (atom == _NET_WM_STATE_SHADED)
|
|
|
|
{
|
|
|
|
action = do_set(ewin->shaded, action);
|
|
|
|
if (action)
|
2004-06-04 12:23:47 -07:00
|
|
|
EwinShade(ewin);
|
2003-05-22 12:15:03 -07:00
|
|
|
else
|
2004-06-04 12:23:47 -07:00
|
|
|
EwinUnShade(ewin);
|
2003-05-22 12:15:03 -07:00
|
|
|
ewin->shaded = action;
|
|
|
|
}
|
|
|
|
else if (atom == _NET_WM_STATE_SKIP_TASKBAR)
|
|
|
|
{
|
|
|
|
action = do_set(ewin->skiptask, action);
|
|
|
|
ewin->skiptask = action;
|
|
|
|
/* Set _NET_WM_STATE ? */
|
|
|
|
}
|
|
|
|
else if (atom == _NET_WM_STATE_SKIP_PAGER)
|
|
|
|
{
|
|
|
|
action = do_set(ewin->skip_ext_pager, action);
|
|
|
|
ewin->skip_ext_pager = action;
|
|
|
|
/* Set _NET_WM_STATE ? */
|
|
|
|
}
|
|
|
|
else if (atom == _NET_WM_STATE_MAXIMIZED_VERT ||
|
|
|
|
atom == _NET_WM_STATE_MAXIMIZED_HORZ)
|
|
|
|
{
|
2004-03-20 17:39:40 -08:00
|
|
|
void (*func) (EWin *, const char *);
|
2004-05-31 13:30:12 -07:00
|
|
|
int maxh, maxv;
|
2003-05-22 12:15:03 -07:00
|
|
|
|
2004-05-31 13:30:12 -07:00
|
|
|
maxh = ewin->st.maximized_horz;
|
|
|
|
maxv = ewin->st.maximized_vert;
|
2003-05-22 12:15:03 -07:00
|
|
|
if (atom2 == _NET_WM_STATE_MAXIMIZED_VERT || atom2 == _NET_WM_STATE_MAXIMIZED_HORZ) /* (ok - ok) */
|
|
|
|
{
|
|
|
|
func = MaxSize;
|
2004-05-31 13:30:12 -07:00
|
|
|
maxh = do_set(maxh, action);
|
|
|
|
maxv = do_set(maxv, action);
|
2003-05-22 12:15:03 -07:00
|
|
|
}
|
|
|
|
else if (atom == _NET_WM_STATE_MAXIMIZED_VERT)
|
|
|
|
{
|
|
|
|
func = MaxHeight;
|
2004-05-31 13:30:12 -07:00
|
|
|
maxv = do_set(maxv, action);
|
2003-05-22 12:15:03 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
func = MaxWidth;
|
2004-05-31 13:30:12 -07:00
|
|
|
maxh = do_set(maxh, action);
|
2003-05-22 12:15:03 -07:00
|
|
|
}
|
|
|
|
|
2004-05-31 13:30:12 -07:00
|
|
|
if ((ewin->st.maximized_horz == maxh) &&
|
|
|
|
(ewin->st.maximized_vert == maxv))
|
|
|
|
goto done;
|
|
|
|
|
|
|
|
if ((ewin->st.maximized_horz && !maxh) ||
|
|
|
|
(ewin->st.maximized_vert && !maxv))
|
|
|
|
ewin->toggle = 1;
|
2003-05-22 12:15:03 -07:00
|
|
|
else
|
2004-05-31 13:30:12 -07:00
|
|
|
ewin->toggle = 0;
|
|
|
|
|
2003-05-22 12:15:03 -07:00
|
|
|
func(ewin, "available");
|
|
|
|
EWMH_SetWindowState(ewin);
|
|
|
|
}
|
|
|
|
else if (atom == _NET_WM_STATE_FULLSCREEN)
|
|
|
|
{
|
2004-05-31 13:30:12 -07:00
|
|
|
action = do_set(ewin->st.fullscreen, action);
|
|
|
|
if (ewin->st.fullscreen == action)
|
|
|
|
goto done;
|
|
|
|
|
|
|
|
ActionsCall(ACTION_FULLSCREEN, ewin, (action) ? "on" : "off");
|
2003-05-22 12:15:03 -07:00
|
|
|
}
|
|
|
|
else if (atom == _NET_WM_STATE_ABOVE)
|
|
|
|
{
|
|
|
|
action = do_set(ewin->layer >= 6, action);
|
|
|
|
if (action)
|
2004-01-18 02:24:06 -08:00
|
|
|
ActionsCall(ACTION_SET_LAYER, ewin, "6");
|
2003-05-22 12:15:03 -07:00
|
|
|
else
|
2004-01-18 02:24:06 -08:00
|
|
|
ActionsCall(ACTION_SET_LAYER, ewin, "4");
|
2003-05-22 12:15:03 -07:00
|
|
|
}
|
|
|
|
else if (atom == _NET_WM_STATE_BELOW)
|
|
|
|
{
|
|
|
|
action = do_set(ewin->layer <= 2, action);
|
|
|
|
if (action)
|
2004-01-18 02:24:06 -08:00
|
|
|
ActionsCall(ACTION_SET_LAYER, ewin, "2");
|
2003-05-22 12:15:03 -07:00
|
|
|
else
|
2004-01-18 02:24:06 -08:00
|
|
|
ActionsCall(ACTION_SET_LAYER, ewin, "4");
|
2003-05-22 12:15:03 -07:00
|
|
|
}
|
2003-03-27 21:16:21 -08:00
|
|
|
}
|
|
|
|
else if (event->message_type == _NET_WM_MOVERESIZE)
|
|
|
|
{
|
2003-05-22 12:15:03 -07:00
|
|
|
switch (event->data.l[2])
|
|
|
|
{
|
|
|
|
case _NET_WM_MOVERESIZE_SIZE_KEYBOARD:
|
2004-01-18 02:24:06 -08:00
|
|
|
/* doResize(NULL); */
|
2003-05-22 12:15:03 -07:00
|
|
|
break;
|
|
|
|
case _NET_WM_MOVERESIZE_MOVE_KEYBOARD:
|
2004-01-18 02:24:06 -08:00
|
|
|
/* doMove(NULL); */
|
2003-05-22 12:15:03 -07:00
|
|
|
break;
|
|
|
|
}
|
2003-03-27 21:16:21 -08:00
|
|
|
}
|
|
|
|
|
2004-03-20 07:49:05 -08:00
|
|
|
done:
|
2003-03-27 21:16:21 -08:00
|
|
|
EDBUG_RETURN_;
|
2003-03-23 19:48:09 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Process received window property change
|
|
|
|
*/
|
|
|
|
void
|
2003-03-27 21:16:21 -08:00
|
|
|
EWMH_ProcessPropertyChange(EWin * ewin, Atom atom_change)
|
2003-03-23 19:48:09 -08:00
|
|
|
{
|
2003-03-27 21:16:21 -08:00
|
|
|
EDBUG(6, "EWMH_ProcessPropertyChange");
|
2004-02-28 17:30:18 -08:00
|
|
|
|
|
|
|
if (atom_change == _NET_WM_NAME)
|
|
|
|
EWMH_GetWindowName(ewin);
|
|
|
|
else if (atom_change == _NET_WM_ICON_NAME)
|
|
|
|
EWMH_GetWindowIconName(ewin);
|
|
|
|
|
2003-03-27 21:16:21 -08:00
|
|
|
EDBUG_RETURN_;
|
2003-03-23 19:48:09 -08:00
|
|
|
}
|