Enlightenment CVS committal Author : sebastid Project : e17 Module : libs/ecore
Dir : e17/libs/ecore/src/lib/ecore_x Modified Files: Ecore_X.h ecore_x.c ecore_x_events.c ecore_x_netwm.c ecore_x_private.h Log Message: Create event for window state change. =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/Ecore_X.h,v retrieving revision 1.112 retrieving revision 1.113 diff -u -3 -r1.112 -r1.113 --- Ecore_X.h 28 Apr 2005 07:48:16 -0000 1.112 +++ Ecore_X.h 28 Apr 2005 12:26:32 -0000 1.113 @@ -56,6 +56,58 @@ 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_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 @@ 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_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 @@ 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, =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x.c,v retrieving revision 1.74 retrieving revision 1.75 diff -u -3 -r1.74 -r1.75 --- ecore_x.c 28 Apr 2005 07:48:16 -0000 1.74 +++ ecore_x.c 28 Apr 2005 12:26:33 -0000 1.75 @@ -113,6 +113,7 @@ 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_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(); =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x_events.c,v retrieving revision 1.52 retrieving revision 1.53 diff -u -3 -r1.52 -r1.53 --- ecore_x_events.c 13 Apr 2005 15:47:52 -0000 1.52 +++ ecore_x_events.c 28 Apr 2005 12:26:34 -0000 1.53 @@ -1359,12 +1359,37 @@ 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; =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x_netwm.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -3 -r1.14 -r1.15 --- ecore_x_netwm.c 28 Apr 2005 06:50:11 -0000 1.14 +++ ecore_x_netwm.c 28 Apr 2005 12:26:34 -0000 1.15 @@ -765,6 +765,37 @@ 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) { =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x_private.h,v retrieving revision 1.43 retrieving revision 1.44 diff -u -3 -r1.43 -r1.44 --- ecore_x_private.h 11 Apr 2005 21:41:45 -0000 1.43 +++ ecore_x_private.h 28 Apr 2005 12:26:34 -0000 1.44 @@ -186,10 +186,14 @@ 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 ------------------------------------------------------- SF.Net email is sponsored by: Tell us your software development plans! Take this survey and enter to win a one-year sub to SourceForge.net Plus IDC's 2005 look-ahead and a copy of this survey Click here to start! http://www.idcswdc.com/cgi-bin/survey?id=105hix _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs