forked from enlightenment/efl
Create event for window state change.
SVN revision: 14453
This commit is contained in:
parent
d3fc2471b2
commit
5544133f78
|
@ -56,6 +56,58 @@ typedef struct _Ecore_X_Rectangle {
|
|||
unsigned int width, height;
|
||||
} Ecore_X_Rectangle;
|
||||
|
||||
typedef enum _Ecore_X_Window_State {
|
||||
/** The window is iconified. */
|
||||
ECORE_X_WINDOW_STATE_ICONIFIED,
|
||||
|
||||
/** The window is a modal dialog box. */
|
||||
ECORE_X_WINDOW_STATE_MODAL,
|
||||
|
||||
/** The window manager should keep the window's position fixed
|
||||
* even if the virtual desktop scrolls. */
|
||||
ECORE_X_WINDOW_STATE_STICKY,
|
||||
|
||||
/** The window has the maximum vertical size. */
|
||||
ECORE_X_WINDOW_STATE_MAXIMIZED_VERT,
|
||||
|
||||
/** The window has the maximum horizontal size. */
|
||||
ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ,
|
||||
|
||||
/** The window is shaded. */
|
||||
ECORE_X_WINDOW_STATE_SHADED,
|
||||
|
||||
/** The window should not be included in the taskbar. */
|
||||
ECORE_X_WINDOW_STATE_SKIP_TASKBAR,
|
||||
|
||||
/** The window should not be included in the pager. */
|
||||
ECORE_X_WINDOW_STATE_SKIP_PAGER,
|
||||
|
||||
/** The window is invisible (i.e. minimized/iconified) */
|
||||
ECORE_X_WINDOW_STATE_HIDDEN,
|
||||
|
||||
/** The window should fill the entire screen and have no
|
||||
* window border/decorations */
|
||||
ECORE_X_WINDOW_STATE_FULLSCREEN,
|
||||
|
||||
/* The following are not documented because they are not
|
||||
* intended for use in applications. */
|
||||
ECORE_X_WINDOW_STATE_ABOVE,
|
||||
ECORE_X_WINDOW_STATE_BELOW,
|
||||
|
||||
/* FIXME: Documentation */
|
||||
ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION,
|
||||
|
||||
/* Unknown state */
|
||||
ECORE_X_WINDOW_STATE_UNKNOWN
|
||||
|
||||
} Ecore_X_Window_State;
|
||||
|
||||
typedef enum _Ecore_X_Window_State_Action {
|
||||
ECORE_X_WINDOW_STATE_ACTION_REMOVE,
|
||||
ECORE_X_WINDOW_STATE_ACTION_ADD,
|
||||
ECORE_X_WINDOW_STATE_ACTION_TOGGLE
|
||||
} Ecore_X_Window_State_Action;
|
||||
|
||||
#define ECORE_X_SELECTION_TARGET_TARGETS "TARGETS"
|
||||
#define ECORE_X_SELECTION_TARGET_TEXT "TEXT"
|
||||
#define ECORE_X_SELECTION_TARGET_COMPOUND_TEXT "COMPOUND_TEXT"
|
||||
|
@ -179,6 +231,7 @@ typedef struct _Ecore_X_Event_Xdnd_Status Ecore_X_Event_Xdnd_Status
|
|||
typedef struct _Ecore_X_Event_Xdnd_Leave Ecore_X_Event_Xdnd_Leave;
|
||||
typedef struct _Ecore_X_Event_Xdnd_Drop Ecore_X_Event_Xdnd_Drop;
|
||||
typedef struct _Ecore_X_Event_Xdnd_Finished Ecore_X_Event_Xdnd_Finished;
|
||||
typedef struct _Ecore_X_Event_Window_State Ecore_X_Event_Window_State;
|
||||
typedef struct _Ecore_X_Event_Client_Message Ecore_X_Event_Client_Message;
|
||||
typedef struct _Ecore_X_Event_Window_Shape Ecore_X_Event_Window_Shape;
|
||||
|
||||
|
@ -537,6 +590,14 @@ struct _Ecore_X_Event_Xdnd_Finished
|
|||
Ecore_X_Atom action;
|
||||
};
|
||||
|
||||
struct _Ecore_X_Event_Window_State
|
||||
{
|
||||
Ecore_X_Window win;
|
||||
Ecore_X_Window_State_Action action;
|
||||
Ecore_X_Window_State state[2];
|
||||
int source;
|
||||
};
|
||||
|
||||
struct _Ecore_X_Event_Client_Message
|
||||
{
|
||||
Ecore_X_Window win;
|
||||
|
@ -650,6 +711,7 @@ extern EAPI int ECORE_X_EVENT_WINDOW_MAPPING;
|
|||
extern EAPI int ECORE_X_EVENT_SELECTION_CLEAR;
|
||||
extern EAPI int ECORE_X_EVENT_SELECTION_REQUEST;
|
||||
extern EAPI int ECORE_X_EVENT_SELECTION_NOTIFY;
|
||||
extern EAPI int ECORE_X_EVENT_WINDOW_STATE;
|
||||
extern EAPI int ECORE_X_EVENT_CLIENT_MESSAGE;
|
||||
extern EAPI int ECORE_X_EVENT_WINDOW_SHAPE;
|
||||
|
||||
|
@ -740,49 +802,6 @@ typedef enum _Ecore_X_Window_State_Hint {
|
|||
ECORE_X_WINDOW_STATE_HINT_ICONIC,
|
||||
} Ecore_X_Window_State_Hint;
|
||||
|
||||
typedef enum _Ecore_X_Window_State {
|
||||
/** The window is iconified. */
|
||||
ECORE_X_WINDOW_STATE_ICONIFIED,
|
||||
|
||||
/** The window is a modal dialog box. */
|
||||
ECORE_X_WINDOW_STATE_MODAL,
|
||||
|
||||
/** The window manager should keep the window's position fixed
|
||||
* even if the virtual desktop scrolls. */
|
||||
ECORE_X_WINDOW_STATE_STICKY,
|
||||
|
||||
/** The window has the maximum vertical size. */
|
||||
ECORE_X_WINDOW_STATE_MAXIMIZED_VERT,
|
||||
|
||||
/** The window has the maximum horizontal size. */
|
||||
ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ,
|
||||
|
||||
/** The window is shaded. */
|
||||
ECORE_X_WINDOW_STATE_SHADED,
|
||||
|
||||
/** The window should not be included in the taskbar. */
|
||||
ECORE_X_WINDOW_STATE_SKIP_TASKBAR,
|
||||
|
||||
/** The window should not be included in the pager. */
|
||||
ECORE_X_WINDOW_STATE_SKIP_PAGER,
|
||||
|
||||
/** The window is invisible (i.e. minimized/iconified) */
|
||||
ECORE_X_WINDOW_STATE_HIDDEN,
|
||||
|
||||
/** The window should fill the entire screen and have no
|
||||
* window border/decorations */
|
||||
ECORE_X_WINDOW_STATE_FULLSCREEN,
|
||||
|
||||
/* The following are not documented because they are not
|
||||
* intended for use in applications. */
|
||||
ECORE_X_WINDOW_STATE_ABOVE,
|
||||
ECORE_X_WINDOW_STATE_BELOW,
|
||||
|
||||
/* FIXME: Documentation */
|
||||
ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION
|
||||
|
||||
} Ecore_X_Window_State;
|
||||
|
||||
typedef enum _Ecore_X_Window_Type {
|
||||
ECORE_X_WINDOW_TYPE_DESKTOP,
|
||||
ECORE_X_WINDOW_TYPE_DOCK,
|
||||
|
|
|
@ -113,6 +113,7 @@ int ECORE_X_EVENT_WINDOW_MAPPING = 0;
|
|||
int ECORE_X_EVENT_SELECTION_CLEAR = 0;
|
||||
int ECORE_X_EVENT_SELECTION_REQUEST = 0;
|
||||
int ECORE_X_EVENT_SELECTION_NOTIFY = 0;
|
||||
int ECORE_X_EVENT_WINDOW_STATE = 0;
|
||||
int ECORE_X_EVENT_CLIENT_MESSAGE = 0;
|
||||
int ECORE_X_EVENT_WINDOW_SHAPE = 0;
|
||||
|
||||
|
@ -254,6 +255,7 @@ ecore_x_init(const char *name)
|
|||
ECORE_X_EVENT_SELECTION_CLEAR = ecore_event_type_new();
|
||||
ECORE_X_EVENT_SELECTION_REQUEST = ecore_event_type_new();
|
||||
ECORE_X_EVENT_SELECTION_NOTIFY = ecore_event_type_new();
|
||||
ECORE_X_EVENT_WINDOW_STATE = ecore_event_type_new();
|
||||
ECORE_X_EVENT_CLIENT_MESSAGE = ecore_event_type_new();
|
||||
ECORE_X_EVENT_WINDOW_SHAPE = ecore_event_type_new();
|
||||
|
||||
|
|
|
@ -1359,12 +1359,37 @@ _ecore_x_event_handle_client_message(XEvent *xevent)
|
|||
|
||||
ecore_event_add(ECORE_X_EVENT_XDND_FINISHED, e, NULL, NULL);
|
||||
}
|
||||
else if (xevent->xclient.message_type == ECORE_X_ATOM_NET_WM_STATE)
|
||||
{
|
||||
Ecore_X_Event_Window_State *e;
|
||||
|
||||
e = calloc(1, sizeof(Ecore_X_Event_Window_State));
|
||||
if (!e) return;
|
||||
e->win = xevent->xclient.window;
|
||||
if (xevent->xclient.data.l[0] == 0)
|
||||
e->action = ECORE_X_WINDOW_STATE_ACTION_REMOVE;
|
||||
else if (xevent->xclient.data.l[0] == 1)
|
||||
e->action = ECORE_X_WINDOW_STATE_ACTION_ADD;
|
||||
else if (xevent->xclient.data.l[0] == 2)
|
||||
e->action = ECORE_X_WINDOW_STATE_ACTION_TOGGLE;
|
||||
else
|
||||
{
|
||||
free(e);
|
||||
return;
|
||||
}
|
||||
e->state[0] = _ecore_x_netwm_state_get(xevent->xclient.data.l[1]);
|
||||
e->state[1] = _ecore_x_netwm_state_get(xevent->xclient.data.l[2]);
|
||||
e->source = xevent->xclient.data.l[3];
|
||||
|
||||
ecore_event_add(ECORE_X_EVENT_WINDOW_STATE, e, NULL, NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
Ecore_X_Event_Client_Message *e;
|
||||
int i;
|
||||
|
||||
e = (Ecore_X_Event_Client_Message *) calloc(1, sizeof(Ecore_X_Event_Client_Message));
|
||||
e = calloc(1, sizeof(Ecore_X_Event_Client_Message));
|
||||
if (!e) return;
|
||||
e->win = xevent->xclient.window;
|
||||
e->message_type = xevent->xclient.message_type;
|
||||
e->format = xevent->xclient.format;
|
||||
|
|
|
@ -765,6 +765,37 @@ ecore_x_netwm_user_time_get(Ecore_X_Window win, int *time)
|
|||
return ret == 1 ? 1 : 0;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
static Ecore_X_Atom
|
||||
_ecore_x_netwm_state_atom_get(Ecore_X_Window_State s)
|
||||
{
|
||||
|
|
|
@ -186,10 +186,14 @@ int _ecore_x_selection_set(Window w, unsigned char *data, int len, Ecore_X_Ato
|
|||
int _ecore_x_selection_convert(Ecore_X_Atom selection, Ecore_X_Atom target, void **data_ret);
|
||||
void *_ecore_x_selection_parse(const char *target, unsigned char *data, int size);
|
||||
|
||||
/* from dnd */
|
||||
void _ecore_x_dnd_init(void);
|
||||
Ecore_X_DND_Source *_ecore_x_dnd_source_get(void);
|
||||
Ecore_X_DND_Target *_ecore_x_dnd_target_get(void);
|
||||
void _ecore_x_dnd_drag(int x, int y);
|
||||
void _ecore_x_dnd_shutdown(void);
|
||||
|
||||
/* from netwm */
|
||||
Ecore_X_Window_State _ecore_x_netwm_state_get(Ecore_X_Atom a);
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue