Modified patch from kwo. Makes ecore_x_window_prop_withdrawn_set etc. do

the right thing, provides a proper framework for the initial_state
WMHint; fix a bug with client message event in prop_desktop_request()


SVN revision: 8980
This commit is contained in:
xcomputerman 2004-02-15 21:37:34 +00:00 committed by xcomputerman
parent a1ddf4c17c
commit 50a3cd34cf
2 changed files with 82 additions and 41 deletions

View File

@ -612,6 +612,20 @@ typedef enum _Ecore_X_Window_Input_Mode {
ECORE_X_WINDOW_INPUT_MODE_ACTIVE_GLOBAL
} Ecore_X_Window_Input_Mode;
typedef enum _Ecore_X_Window_State_Hint {
/** Do not provide any state hint to the window manager */
ECORE_X_WINDOW_STATE_HINT_NONE = -1,
/** The window wants to remain hidden and NOT iconified */
ECORE_X_WINDOW_STATE_HINT_WITHDRAWN,
/** The window wants to be mapped normally */
ECORE_X_WINDOW_STATE_HINT_NORMAL,
/** The window wants to start in an iconified state */
ECORE_X_WINDOW_STATE_HINT_ICONIC,
} Ecore_X_Window_State_Hint;
typedef enum _Ecore_X_Window_State {
/** The window is a modal dialog box. */
ECORE_X_WINDOW_STATE_MODAL,

View File

@ -679,6 +679,49 @@ ecore_x_window_prop_input_mode_set(Ecore_X_Window win, Ecore_X_Window_Input_Mode
return 1;
}
/**
* Set the initial state of an Ecore_X_Window.
*
* @param win The window whose initial state is set.
* @param withdrawn The window's new initial state.
*
* @return 1 if the input mode could be set, else 0
*
* <hr><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
*/
int
ecore_x_window_prop_initial_state_set(Ecore_X_Window win, Ecore_X_Window_State_Hint state)
{
XWMHints *hints;
if (!(hints = XGetWMHints(_ecore_x_disp, win)))
if (!(hints = XAllocWMHints()))
return 0;
switch (state) {
case ECORE_X_WINDOW_STATE_HINT_NONE:
hints->flags &= ~StateHint;
break;
case ECORE_X_WINDOW_STATE_HINT_WITHDRAWN:
hints->initial_state = WithdrawnState;
hints->flags |= StateHint;
break;
case ECORE_X_WINDOW_STATE_HINT_NORMAL:
hints->initial_state = NormalState;
hints->flags |= StateHint;
break;
case ECORE_X_WINDOW_STATE_HINT_ICONIC:
hints->initial_state = IconicState;
hints->flags |= StateHint;
break;
}
XSetWMHints(_ecore_x_disp, win, hints);
XFree(hints);
return 1;
}
/**
* To be documented.
*
@ -751,6 +794,7 @@ ecore_x_window_prop_layer_set(Ecore_X_Window win, int layer)
void
ecore_x_window_prop_withdrawn_set(Ecore_X_Window win, int withdrawn)
{
#if 0
XWMHints hints;
long ret;
@ -765,6 +809,12 @@ ecore_x_window_prop_withdrawn_set(Ecore_X_Window win, int withdrawn)
hints.flags = WindowGroupHint | StateHint;
XSetWMHints(_ecore_x_disp, win, &hints);
XSetWMNormalHints(_ecore_x_disp, win, (XSizeHints *) &hints);
#else
if (withdrawn)
ecore_x_window_prop_initial_state_set(win, ECORE_X_WINDOW_STATE_HINT_WITHDRAWN);
else
ecore_x_window_prop_initial_state_set(win, ECORE_X_WINDOW_STATE_HINT_NONE);
#endif
}
/**
@ -778,23 +828,18 @@ ecore_x_window_prop_withdrawn_set(Ecore_X_Window win, int withdrawn)
void
ecore_x_window_prop_desktop_request(Ecore_X_Window win, long desktop)
{
XEvent *xev;
XClientMessageEvent xclient;
XEvent xev;
xev = calloc(1, sizeof(XClientMessageEvent));
xev->xclient = xclient;
memset(&xclient, 0, sizeof(XClientMessageEvent));
memset(&xev, 0, sizeof(XEvent));
xclient.type = ClientMessage;
xclient.display = _ecore_x_disp;
xclient.window = win;
xclient.message_type = _ecore_x_atom_net_wm_desktop;
xclient.format = 32;
xclient.data.l[0] = desktop;
XSendEvent(_ecore_x_disp, DefaultRootWindow(_ecore_x_disp), False, 0, xev);
XFree(xev);
xev.xclient.type = ClientMessage;
xev.xclient.display = _ecore_x_disp;
xev.xclient.window = win;
xev.xclient.message_type = _ecore_x_atom_net_wm_desktop;
xev.xclient.format = 32;
xev.xclient.data.l[0] = desktop;
XSendEvent(_ecore_x_disp, DefaultRootWindow(_ecore_x_disp), False, 0, &xev);
}
/**
@ -809,26 +854,20 @@ ecore_x_window_prop_desktop_request(Ecore_X_Window win, long desktop)
void
ecore_x_window_prop_state_request(Ecore_X_Window win, Ecore_X_Window_State state, int action)
{
XEvent *xev;
XClientMessageEvent xclient;
XEvent xev;
if (action < 0 || action > 2)
return;
xev = calloc(1, sizeof(XClientMessageEvent));
xev->xclient = xclient;
memset(&xclient, 0, sizeof(XClientMessageEvent));
xev.xclient.type = ClientMessage;
xev.xclient.display = _ecore_x_disp;
xev.xclient.window = win;
xev.xclient.message_type = _ecore_x_atom_net_wm_state;
xev.xclient.format = 32;
xev.xclient.data.l[0] = action;
xev.xclient.data.l[1] = _ecore_x_window_prop_state_atom_get(state);
xclient.type = ClientMessage;
xclient.display = _ecore_x_disp;
xclient.window = win;
xclient.message_type = _ecore_x_atom_net_wm_state;
xclient.format = 32;
xclient.data.l[0] = action;
xclient.data.l[1] = _ecore_x_window_prop_state_atom_get(state);
XSendEvent(_ecore_x_disp, DefaultRootWindow(_ecore_x_disp), False, 0, xev);
XFree(xev);
XSendEvent(_ecore_x_disp, DefaultRootWindow(_ecore_x_disp), False, 0, &xev);
}
@ -873,18 +912,6 @@ ecore_x_window_prop_desktop_get(Ecore_X_Window win)
}
/*
* Suggesting a slight change of API.
* The ECORE_X_WINDOW_TYPE_...'s I think we want in Ecore_X.h anyway.
* It makes things more similar to ecore_x_window_prop_state_set().
* It also avoids having to define all the different
* ecore_x_window_prop_window_type_..._set()'s.
* Setting a window to type desktop would then become
* ecore_x_window_prop_window_type_set(win, ECORE_X_WINDOW_TYPE_DESKTOP);
* /Kim
* Addendum: API change enforced by xcomp
*/
static Ecore_X_Atom
_ecore_x_window_prop_type_atom_get(Ecore_X_Window_Type type)
{