diff --git a/legacy/ecore/configure.in b/legacy/ecore/configure.in index 1be172ad38..70760a7169 100644 --- a/legacy/ecore/configure.in +++ b/legacy/ecore/configure.in @@ -396,6 +396,40 @@ if test "x$have_ecore_x" = "xyes"; then AC_SUBST(Xrandr_cflags) AC_SUBST(Xrandr_libs) + + Xss_libs="" + Xss_cflags="" + use_Xss="no" + PCFLAGS=$CFLAGS + CFLAGS=$x_cflags" "$x_includes + AC_CHECK_HEADER(X11/extensions/scrnsaver.h, + [ + AC_CHECK_LIB(Xss, XScreenSaverSelectInput, + [ + AC_DEFINE(ECORE_XSS, 1, [Build support for Xss]) + Xss_cflags="" + Xss_libs="-lXss" + use_Xss="yes" + ], [ + Xss_cflags="" + Xss_libs="" + use_Xss="no" + ], [ + $x_libs $x_ldflags + ] + ) + ], [ + Xss_cflags="" + Xss_libs="" + use_Xss="no" + ], [ + #include + ] + ) + CFLAGS=$PCFLAGS + + AC_SUBST(Xss_cflags) + AC_SUBST(Xss_libs) fi AC_SUBST(ecore_x_cflags) @@ -1153,7 +1187,7 @@ echo echo " Ecore_Job....................: $have_ecore_job" echo " Ecore_Con....................: $have_ecore_con (OpenSSL: $use_openssl)" echo " Ecore_Txt....................: $have_ecore_txt" -echo " Ecore_X......................: $have_ecore_x (Xcursor: $use_Xcursor) (Xprint: $use_Xprint) (Xinerama: $use_Xinerama) (Xrandr: $use_Xrandr)" +echo " Ecore_X......................: $have_ecore_x (Xcursor: $use_Xcursor) (Xprint: $use_Xprint) (Xinerama: $use_Xinerama) (Xrandr: $use_Xrandr) (Xscreensaver: $use_Xss)" echo " Ecore_FB.....................: $have_ecore_fb" echo " Ecore_DFB....................: $have_ecore_dfb" echo " Ecore_Evas...................: $have_ecore_evas" diff --git a/legacy/ecore/src/lib/ecore_x/Ecore_X.h b/legacy/ecore/src/lib/ecore_x/Ecore_X.h index 67fb1706c3..d023baec53 100644 --- a/legacy/ecore/src/lib/ecore_x/Ecore_X.h +++ b/legacy/ecore/src/lib/ecore_x/Ecore_X.h @@ -254,6 +254,7 @@ 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_Client_Message Ecore_X_Event_Client_Message; typedef struct _Ecore_X_Event_Window_Shape Ecore_X_Event_Window_Shape; +typedef struct _Ecore_X_Event_Screensaver_Notify Ecore_X_Event_Screensaver_Notify; typedef struct _Ecore_X_Event_Sync_Counter Ecore_X_Event_Sync_Counter; typedef struct _Ecore_X_Event_Sync_Alarm Ecore_X_Event_Sync_Alarm; typedef struct _Ecore_X_Event_Screen_Change Ecore_X_Event_Screen_Change; @@ -644,6 +645,13 @@ struct _Ecore_X_Event_Window_Shape Ecore_X_Time time; }; +struct _Ecore_X_Event_Screensaver_Notify +{ + Ecore_X_Window win; + int on; + Ecore_X_Time time; +}; + struct _Ecore_X_Event_Sync_Counter { Ecore_X_Time time; @@ -798,6 +806,7 @@ EAPI extern int ECORE_X_EVENT_SELECTION_REQUEST; EAPI extern int ECORE_X_EVENT_SELECTION_NOTIFY; EAPI extern int ECORE_X_EVENT_CLIENT_MESSAGE; EAPI extern int ECORE_X_EVENT_WINDOW_SHAPE; +EAPI extern int ECORE_X_EVENT_SCREENSAVER_NOTIFY; EAPI extern int ECORE_X_EVENT_SYNC_COUNTER; EAPI extern int ECORE_X_EVENT_SYNC_ALARM; EAPI extern int ECORE_X_EVENT_SCREEN_CHANGE; @@ -1338,7 +1347,12 @@ EAPI void ecore_x_e_frame_size_set(Ecore_X_Window win, int fl, in EAPI int ecore_x_xinerama_screen_count_get(void); EAPI int ecore_x_xinerama_screen_geometry_get(int screen, int *x, int *y, int *w, int *h); - + +EAPI int ecore_x_screensaver_event_avaialable_get(void); +EAPI void ecore_x_screensaver_timeout_set(double timeout); +EAPI double ecore_x_screensaver_timeout_get(void); +EAPI void ecore_x_screensaver_event_listen_set(int on); + /* FIXME: these funcs need categorising */ typedef struct _Ecore_X_Window_Attributes diff --git a/legacy/ecore/src/lib/ecore_x/Makefile.am b/legacy/ecore/src/lib/ecore_x/Makefile.am index 8d60e9d144..4a15eb2d92 100644 --- a/legacy/ecore/src/lib/ecore_x/Makefile.am +++ b/legacy/ecore/src/lib/ecore_x/Makefile.am @@ -5,6 +5,7 @@ INCLUDES = \ @Xprint_cflags@ \ @Xinerama_cflags@ \ @Xrandr_cflags@ \ +@Xss_cflags@ \ @x_cflags@ \ -I$(top_srcdir)/src/lib/ecore \ -I$(top_srcdir)/src/lib/ecore_txt \ @@ -44,6 +45,7 @@ ecore_x_window_shape.c \ ecore_x_pixmap.c \ ecore_x_gc.c \ ecore_x_xinerama.c \ +ecore_x_screensaver.c \ ecore_x_private.h libecore_x_la_LIBADD = \ @@ -51,6 +53,7 @@ libecore_x_la_LIBADD = \ @Xprint_libs@ \ @Xinerama_libs@ \ @Xrandr_libs@ \ +@Xss_libs@ \ @x_ldflags@ \ @x_libs@ \ $(top_builddir)/src/lib/ecore/libecore.la \ @@ -76,10 +79,14 @@ ecore_x_error.c \ ecore_x_events.c \ ecore_x_icccm.c \ ecore_x_netwm.c \ +ecore_x_mwm.c \ +ecore_x_e.c \ ecore_x_selection.c \ ecore_x_window.c \ ecore_x_window_prop.c \ ecore_x_window_shape.c \ ecore_x_pixmap.c \ ecore_x_gc.c \ +ecore_x_xinerama.c \ +ecore_x_screensaver.c \ ecore_x_private.h diff --git a/legacy/ecore/src/lib/ecore_x/ecore_x.c b/legacy/ecore/src/lib/ecore_x/ecore_x.c index 897bc60acb..9943404d32 100644 --- a/legacy/ecore/src/lib/ecore_x/ecore_x.c +++ b/legacy/ecore/src/lib/ecore_x/ecore_x.c @@ -17,6 +17,7 @@ static void _ecore_x_event_filter_end(void *data, void *loop_data); static Ecore_Fd_Handler *_ecore_x_fd_handler_handle = NULL; static Ecore_Event_Filter *_ecore_x_filter_handler = NULL; static int _ecore_x_event_shape_id = 0; +static int _ecore_x_event_screensaver_id = 0; static int _ecore_x_event_sync_id = 0; #ifdef ECORE_XRANDR static int _ecore_x_event_randr_id = 0; @@ -95,6 +96,7 @@ EAPI int ECORE_X_EVENT_SELECTION_REQUEST = 0; EAPI int ECORE_X_EVENT_SELECTION_NOTIFY = 0; EAPI int ECORE_X_EVENT_CLIENT_MESSAGE = 0; EAPI int ECORE_X_EVENT_WINDOW_SHAPE = 0; +EAPI int ECORE_X_EVENT_SCREENSAVER_NOTIFY = 0; EAPI int ECORE_X_EVENT_SYNC_COUNTER = 0; EAPI int ECORE_X_EVENT_SYNC_ALARM = 0; EAPI int ECORE_X_EVENT_SCREEN_CHANGE = 0; @@ -150,6 +152,8 @@ ecore_x_init(const char *name) { int shape_base = 0; int shape_err_base = 0; + int screensaver_base = 0; + int screensaver_err_base = 0; int sync_base = 0; int sync_err_base = 0; #ifdef ECORE_XRANDR @@ -171,6 +175,12 @@ ecore_x_init(const char *name) _ecore_x_event_shape_id = shape_base + ShapeNotify; if (_ecore_x_event_shape_id >= LASTEvent) _ecore_x_event_handlers_num = _ecore_x_event_shape_id + 1; +#ifdef ECORE_XSS + if (XScreenSaverQueryExtension(_ecore_x_disp, &screensaver_base, &screensaver_err_base)) + _ecore_x_event_screensaver_id = screensaver_base + ScreenSaverNotify; +#endif + if (_ecore_x_event_screensaver_id >= LASTEvent) + _ecore_x_event_handlers_num = _ecore_x_event_screensaver_id + 1; if (XSyncQueryExtension(_ecore_x_disp, &sync_base, &sync_err_base)) { @@ -235,6 +245,8 @@ ecore_x_init(const char *name) _ecore_x_event_handlers[ClientMessage] = _ecore_x_event_handle_client_message; if (_ecore_x_event_shape_id) _ecore_x_event_handlers[_ecore_x_event_shape_id] = _ecore_x_event_handle_shape_change; + if (_ecore_x_event_screensaver_id) + _ecore_x_event_handlers[_ecore_x_event_screensaver_id] = _ecore_x_event_handle_screensaver_notify; if (_ecore_x_event_sync_id) { _ecore_x_event_handlers[_ecore_x_event_sync_id + XSyncCounterNotify] = @@ -281,6 +293,7 @@ ecore_x_init(const char *name) ECORE_X_EVENT_SELECTION_NOTIFY = ecore_event_type_new(); ECORE_X_EVENT_CLIENT_MESSAGE = ecore_event_type_new(); ECORE_X_EVENT_WINDOW_SHAPE = ecore_event_type_new(); + ECORE_X_EVENT_SCREENSAVER_NOTIFY = ecore_event_type_new(); ECORE_X_EVENT_SYNC_COUNTER = ecore_event_type_new(); ECORE_X_EVENT_SYNC_ALARM = ecore_event_type_new(); ECORE_X_EVENT_SCREEN_CHANGE = ecore_event_type_new(); @@ -550,24 +563,24 @@ ecore_x_killall(Ecore_X_Window root) /* Tranverse window tree starting from root, and drag each * before the firing squad */ for (i = 0; i < screens; ++i) - { - Window root_r; - Window parent_r; - Window *children_r = NULL; - unsigned int num_children = 0; - - while (XQueryTree(_ecore_x_disp, root, &root_r, &parent_r, - &children_r, &num_children) && (num_children > 0)) - { - for (j = 0; j < num_children; ++j) - { - XKillClient(_ecore_x_disp, children_r[j]); - } - - XFree(children_r); - } - } - + { + Window root_r; + Window parent_r; + Window *children_r = NULL; + unsigned int num_children = 0; + + while (XQueryTree(_ecore_x_disp, root, &root_r, &parent_r, + &children_r, &num_children) && (num_children > 0)) + { + for (j = 0; j < num_children; ++j) + { + XKillClient(_ecore_x_disp, children_r[j]); + } + + XFree(children_r); + } + } + XUngrabServer(_ecore_x_disp); XSync(_ecore_x_disp, False); } diff --git a/legacy/ecore/src/lib/ecore_x/ecore_x_events.c b/legacy/ecore/src/lib/ecore_x/ecore_x_events.c index 19ab61de39..7a52e1a961 100644 --- a/legacy/ecore/src/lib/ecore_x/ecore_x_events.c +++ b/legacy/ecore/src/lib/ecore_x/ecore_x_events.c @@ -1604,6 +1604,26 @@ _ecore_x_event_handle_shape_change(XEvent *xevent) ecore_event_add(ECORE_X_EVENT_WINDOW_SHAPE, e, NULL, NULL); } +void +_ecore_x_event_handle_screensaver_notify(XEvent *xevent) +{ +#ifdef ECORE_XSS + XScreenSaverNotifyEvent *screensaver_event; + Ecore_X_Event_Screensaver_Notify *e; + + screensaver_event = (XScreenSaverNotifyEvent *)xevent; + e = calloc(1, sizeof(Ecore_X_Event_Screensaver_Notify)); + if (!e) return; + e->win = screensaver_event->window; + if (screensaver_event->state == ScreenSaverOn) + e->on = 1; + else + e->on = 0; + e->time = screensaver_event->time; + ecore_event_add(ECORE_X_EVENT_SCREENSAVER_NOTIFY, e, NULL, NULL); +#endif +} + void _ecore_x_event_handle_sync_counter(XEvent *xevent) { diff --git a/legacy/ecore/src/lib/ecore_x/ecore_x_private.h b/legacy/ecore/src/lib/ecore_x/ecore_x_private.h index 69c865750e..24d82e325b 100644 --- a/legacy/ecore/src/lib/ecore_x/ecore_x_private.h +++ b/legacy/ecore/src/lib/ecore_x/ecore_x_private.h @@ -30,6 +30,9 @@ #ifdef ECORE_XRANDR #include #endif +#ifdef ECORE_XSS +#include +#endif #include "ecore_private.h" #include "Ecore_X.h" @@ -181,6 +184,7 @@ void _ecore_x_event_handle_colormap_notify(XEvent *xevent); void _ecore_x_event_handle_client_message(XEvent *xevent); void _ecore_x_event_handle_mapping_notify(XEvent *xevent); void _ecore_x_event_handle_shape_change(XEvent *xevent); +void _ecore_x_event_handle_screensaver_notify(XEvent *xevent); void _ecore_x_event_handle_sync_counter(XEvent *xevent); void _ecore_x_event_handle_sync_alarm(XEvent *xevent); #ifdef ECORE_XRANDR diff --git a/legacy/ecore/src/lib/ecore_x/ecore_x_screensaver.c b/legacy/ecore/src/lib/ecore_x/ecore_x_screensaver.c new file mode 100644 index 0000000000..09a557d359 --- /dev/null +++ b/legacy/ecore/src/lib/ecore_x/ecore_x_screensaver.c @@ -0,0 +1,52 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ +/* + * Screensaver code + */ +#include "Ecore.h" +#include "ecore_x_private.h" +#include "Ecore_X.h" +#include "Ecore_X_Atoms.h" + +EAPI int +ecore_x_screensaver_event_avaialable_get(void) +{ +#ifdef ECORE_XSS + return 1; +#endif + return 0; +} + +EAPI void +ecore_x_screensaver_timeout_set(double timeout) +{ + int pto, pint, pblank, pexpo; + + XGetScreenSaver(_ecore_x_disp, &pto, &pint, &pblank, &pexpo); + XSetScreenSaver(_ecore_x_disp, (int)timeout, + pint, pblank, pexpo); +} + +EAPI double +ecore_x_screensaver_timeout_get(void) +{ + int pto, pint, pblank, pexpo; + + XGetScreenSaver(_ecore_x_disp, &pto, &pint, &pblank, &pexpo); + return (double)pto; +} + +EAPI void +ecore_x_screensaver_event_listen_set(int on) +{ +#ifdef ECORE_XSS + Ecore_X_Window root; + + root = DefaultRootWindow(_ecore_x_disp); + if (on) + XScreenSaverSelectInput(_ecore_x_disp, root, ScreenSaverNotifyMask); + else + XScreenSaverSelectInput(_ecore_x_disp, root, 0); +#endif +} \ No newline at end of file