minimal xscreensaver wrapping so it can be used for lock

SVN revision: 20934
This commit is contained in:
Carsten Haitzler 2006-03-03 04:01:15 +00:00
parent 2e0b4a37e8
commit a9e37e3a66
7 changed files with 164 additions and 20 deletions

View File

@ -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 <X11/Xlib.h>
]
)
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"

View File

@ -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

View File

@ -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

View File

@ -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);
}

View File

@ -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)
{

View File

@ -30,6 +30,9 @@
#ifdef ECORE_XRANDR
#include <X11/extensions/Xrandr.h>
#endif
#ifdef ECORE_XSS
#include <X11/extensions/scrnsaver.h>
#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

View File

@ -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
}