[Toxine-cvs] CVS: toxine/src/plugins Makefile.am,1.1.1.1,1.2 vo_x11.c,1.3,1.4 xscreensaver-remote.c,
Brought to you by:
f1rmb
From: Daniel Caujolle-B. <f1...@us...> - 2002-06-21 13:15:07
|
Update of /cvsroot/toxine/toxine/src/plugins In directory usw-pr-cvs1:/tmp/cvs-serv1429/src/plugins Modified Files: Makefile.am vo_x11.c Removed Files: xscreensaver-remote.c xscreensaver-remote.h Log Message: Fixed missposition (X/Y) report on fullscreen->window mode. Backport fake events (no more kill xscreensaver/deactivate X ScreenSaver. Index: Makefile.am =================================================================== RCS file: /cvsroot/toxine/toxine/src/plugins/Makefile.am,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -r1.1.1.1 -r1.2 --- Makefile.am 13 May 2002 20:46:45 -0000 1.1.1.1 +++ Makefile.am 21 Jun 2002 13:14:59 -0000 1.2 @@ -14,8 +14,8 @@ lib_LTLIBRARIES = $(aa_plugin) toxine_vo_plugin_x11.la toxine_vo_plugin_dxr3.la -toxine_vo_plugin_x11_la_SOURCES = vo_x11.c xscreensaver-remote.c -toxine_vo_plugin_x11_la_LDFLAGS = -avoid-version -module $(X_LIBS) $(DPMS_LIBS) \ +toxine_vo_plugin_x11_la_SOURCES = vo_x11.c +toxine_vo_plugin_x11_la_LDFLAGS = -avoid-version -module $(X_LIBS) $(XTEST_LIBS) \ -lX11 -lm -lXext $(X_EXTRA_LIBS) toxine_vo_plugin_aa_la_SOURCES = vo_aa.c @@ -24,7 +24,7 @@ toxine_vo_plugin_dxr3_la_SOURCES = vo_dxr3.c toxine_vo_plugin_dxr3_la_LDFLAGS = -avoid-version -module -noinst_HEADERS = vo_plugin.h xscreensaver-remote.h +noinst_HEADERS = vo_plugin.h debug: @$(MAKE) CFLAGS="$(DEBUG_CFLAGS)" Index: vo_x11.c =================================================================== RCS file: /cvsroot/toxine/toxine/src/plugins/vo_x11.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- vo_x11.c 21 Jun 2002 08:57:25 -0000 1.3 +++ vo_x11.c 21 Jun 2002 13:14:59 -0000 1.4 @@ -28,6 +28,7 @@ #include <errno.h> #include <sys/types.h> #include <signal.h> +#include <time.h> #include <X11/Xlib.h> #include <X11/Xatom.h> @@ -36,12 +37,11 @@ #include <X11/keysym.h> #include <X11/cursorfont.h> #include <X11/extensions/XShm.h> -#ifdef HAVE_DPMS -# include <X11/extensions/dpms.h> +#ifdef HAVE_XTESTEXTENSION +#include <X11/extensions/XTest.h> #endif #include "common.h" -#include "xscreensaver-remote.h" #include <xine/video_out_x11.h> @@ -61,35 +61,6 @@ uint32_t status; } MWMHints; -/* - * Screensavers parameters - */ -typedef struct { - /* XFree86 */ - struct { - int timeout; - int interval; - int prefer_blanking; - int allow_exposures; - } screensaver; - - /* Jamie's Zawinski xscreensaver */ - struct { - int was_running; - } xscreensaver; - -#ifdef HAVE_DPMS - /* XFree DPMS */ - struct { - int was_running; - CARD16 standby; - CARD16 suspend; - CARD16 off; - CARD16 level; - } xdpms; -#endif -} screen_savers_t; - typedef struct { Window video_window; GC gc; @@ -107,24 +78,28 @@ typedef struct { Display *display; - + int fullscreen; x11_drawable_t x11_drawable[2]; - + cursors_t cursor; - + int screen; XColor black, white; int completion_event; Visual *visual; Colormap colormap; int depth; - + XWMHints *wm_hint; - screen_savers_t screen_savers; - pthread_t timed_thread; + Bool have_xtest; +#ifdef HAVE_XTESTEXTENSION + KeyCode fake_key; /* Fake key to send */ +#endif + pthread_t timed_thread; + pthread_mutex_t mutex; } x11_private_t; @@ -145,21 +120,132 @@ }; /* + * A thread-safe usecond sleep + */ +static void usec_sleep(unsigned long usec) { +#if HAVE_NANOSLEEP + /* nanosleep is prefered on solaris, because it's mt-safe */ + struct timespec ts; + + ts.tv_sec = usec / 1000000; + ts.tv_nsec = (usec % 1000000) * 1000; + nanosleep(&ts, NULL); +#else + usleep(usec); +#endif +} + +static Bool have_xtestextention(Display *display) { +#ifdef HAVE_XTESTEXTENSION + int dummy1, dummy2, dummy3, dummy4; + + return (XTestQueryExtension(display, &dummy1, &dummy2, &dummy3, &dummy4)); +#endif + return False; +} + +/* + * + */ +void reset_screensaver(toxine_vo_plugin_t *vop) { + x11_private_t *private = (x11_private_t *) vop->private; + +#ifdef HAVE_XTESTEXTENSION + if(private->have_xtest == True) { + XLockDisplay(private->display); + XTestFakeKeyEvent(private->display, private->fake_key, True, CurrentTime); + XTestFakeKeyEvent(private->display, private->fake_key, False, CurrentTime); + XSync(private->display, False); + XUnlockDisplay(private->display); + } + else +#endif + { + XLockDisplay(private->display); + XResetScreenSaver(private->display); + XUnlockDisplay(private->display); + } +} + +/* + * + */ +static void translate_coords(Display *display, Window win, int *x, int *y) { + Window tmp_win; + + if(display && (win != None) && x && y) { + XLockDisplay(display); + XTranslateCoordinates(display, win, DefaultRootWindow(display), 0, 0, &*x, &*y, &tmp_win); + XUnlockDisplay(display); + } +} + +/* + * Is window is size match with given args + */ +static int is_window_visible(Display *display, Window window) { + XWindowAttributes wattr; + Status status; + + if((display == NULL) || (window == None)) + return -1; + + XLockDisplay(display); + status = XGetWindowAttributes(display, window, &wattr); + XUnlockDisplay(display); + + if((status != BadDrawable) && (status != BadWindow) && (wattr.map_state == IsViewable)) + return 1; + + return 0; +} + +/* * */ static void toggle_fullscreen(toxine_t *tox) { x11_private_t *private = (x11_private_t *) tox->video.cur_plugin->private; + pthread_mutex_lock(&private->mutex); + XLockDisplay(private->display); + XUnmapWindow(private->display, private->x11_drawable[private->fullscreen].video_window); + private->fullscreen = !private->fullscreen; + XMapRaised(private->display, private->x11_drawable[private->fullscreen].video_window); + XMoveResizeWindow (private->display, private->x11_drawable[private->fullscreen].video_window, + private->x11_drawable[private->fullscreen].x, + private->x11_drawable[private->fullscreen].y, + private->x11_drawable[private->fullscreen].video_width, + private->x11_drawable[private->fullscreen].video_height); + + XSync(private->display, False); XUnlockDisplay(private->display); + while(!is_window_visible(private->display, + private->x11_drawable[private->fullscreen].video_window)) + usec_sleep(5000); + + translate_coords(private->display, + private->x11_drawable[private->fullscreen].video_window, + &private->x11_drawable[private->fullscreen].x, + &private->x11_drawable[private->fullscreen].y); + +#if 0 + printf("FULLSCREEN X %d, Y %d **\n", + private->x11_drawable[private->fullscreen].x, + private->x11_drawable[private->fullscreen].y); +#endif + if(tox->video.driver) - tox->video.driver->gui_data_exchange (tox->video.driver, + tox->video.driver->gui_data_exchange (tox->video.driver, GUI_DATA_EX_DRAWABLE_CHANGED, - (void*)private->x11_drawable[private->fullscreen].video_window); + (void*) private->x11_drawable[private->fullscreen].video_window); + + pthread_mutex_unlock(&private->mutex); + } /* @@ -188,10 +274,24 @@ toxine_t *tox = (toxine_t *) data; toxine_vo_plugin_t *vop = (toxine_vo_plugin_t *) tox->video.cur_plugin; x11_private_t *private = (x11_private_t *) vop->private; + int screensaver_timer = 0; // pthread_detach(pthread_self()); + while(tox->xine == NULL) + usec_sleep(100000); + while(tox->running) { + int status = xine_get_status(tox->xine); + + if(status == XINE_PLAY) { + screensaver_timer++; +#warning FIXME + if(screensaver_timer >= 10) { + screensaver_timer = 0; + reset_screensaver(vop); + } + } if(private->cursor.visible) { private->cursor.visible = !private->cursor.visible; @@ -205,121 +305,6 @@ } /* - * Disable all screensaver. - */ -static void disable_screensavers(toxine_vo_plugin_t *vop) { - x11_private_t *private = (x11_private_t *) vop->private; - - XLockDisplay(private->display); - -#ifdef HAVE_DPMS - { /* XFree DPMS */ - - int dummy; - - private->screen_savers.xdpms.was_running = 0; - - if(DPMSQueryExtension(private->display, &dummy, &dummy)) { - BOOL enabled; - - DPMSInfo(private->display, &private->screen_savers.xdpms.level, &enabled); - - if(enabled) { - - if(DPMSGetTimeouts(private->display, - &private->screen_savers.xdpms.standby, - &private->screen_savers.xdpms.suspend, &private->screen_savers.xdpms.off) != True) { - fprintf(stderr, "DPMSGetTimeouts() failed\n"); - } - - /* monitor powersave off */ - (void) DPMSDisable(private->display); - private->screen_savers.xdpms.was_running = 1; - } - } - } -#endif - - /* XFree screensaver */ - XGetScreenSaver(private->display ,&private->screen_savers.screensaver.timeout, - &private->screen_savers.screensaver.interval, - &private->screen_savers.screensaver.prefer_blanking, - &private->screen_savers.screensaver.allow_exposures); - - if((XSetScreenSaver(private->display, 0, 0, - DontPreferBlanking, DontAllowExposures)) == BadValue) { - fprintf(stderr, "XSetScreenSaver() failed: %s\n", strerror(errno)); - } - - /* XScreenSaver specific. */ - xscreensaver_remote_init(private->display); - private->screen_savers.xscreensaver.was_running = is_xscreensaver_running(private->display); - - if(private->screen_savers.xscreensaver.was_running == 1) { - if(xscreensaver_kill_server(private->display) < 0) - private->screen_savers.xscreensaver.was_running = 0; - } - - XUnlockDisplay(private->display); -} - -/* - * Reenable previously disabled screensaver. - */ -static void reenable_screensavers(toxine_vo_plugin_t *vop) { - x11_private_t *private = (x11_private_t *) vop->private; - - XLockDisplay(private->display); - -#ifdef HAVE_DPMS - { /* XFree DPMS */ - - int dummy; - - if(private->screen_savers.xdpms.was_running) { - - if(DPMSQueryExtension(private->display, &dummy, &dummy)) { - - /* restoring power saving settings */ - if((DPMSEnable(private->display)) == True) { - CARD16 state; - BOOL enabled; - - (void) DPMSSetTimeouts(private->display, - private->screen_savers.xdpms.standby, - private->screen_savers.xdpms.suspend, - private->screen_savers.xdpms.off); - - (void) DPMSForceLevel(private->display, private->screen_savers.xdpms.level); - - /* DPMS does not seem to be enabled unless we call DPMSInfo */ - DPMSInfo(private->display, &state, &enabled); - - if(enabled) - private->screen_savers.xdpms.was_running = 0; - - } - } - } - } -#endif - - /* XFree screensaver */ - if((XSetScreenSaver(private->display, private->screen_savers.screensaver.timeout, - private->screen_savers.screensaver.interval, - private->screen_savers.screensaver.prefer_blanking, - private->screen_savers.screensaver.allow_exposures)) == BadValue) { - fprintf(stderr, "XSetScreenSaver() failed: %s\n", strerror(errno)); - } - - /* Restart XScreenSaver. */ - if(private->screen_savers.xscreensaver.was_running == 1) - xscreensaver_start_server(); - - XUnlockDisplay(private->display); -} - -/* * */ static int video_window_translate_point(toxine_t *tox, toxine_vo_plugin_t *vop, @@ -423,10 +408,10 @@ *dest_width = private->x11_drawable[private->fullscreen].video_width; *dest_height = private->x11_drawable[private->fullscreen].video_height; - + *win_x = private->x11_drawable[private->fullscreen].x; *win_y = private->x11_drawable[private->fullscreen].y; - + } /* @@ -489,7 +474,8 @@ if(getenv("DISPLAY")) display_name = getenv("DISPLAY"); - private->display = XOpenDisplay(display_name); + private->display = XOpenDisplay(display_name); + private->have_xtest = have_xtestextention(private->display); pthread_mutex_init(&private->mutex, NULL); @@ -502,6 +488,10 @@ private->colormap = DefaultColormap(private->display, private->screen); private->depth = DefaultDepth(private->display, private->screen); + +#ifdef HAVE_XTESTEXTENSION + private->fake_key = XKeysymToKeycode(private->display, XK_Shift_L); +#endif video_out_select_visual(tox, vop); @@ -731,10 +721,16 @@ exit(1); } else - fprintf(stderr, "video driver '%s' successfuly loaded.\n", tox->video.name); + fprintf(stderr, "video driver '%s' successfuly loaded.\n", tox->video.name); } + translate_coords(private->display, + private->x11_drawable[private->fullscreen].video_window, + &private->x11_drawable[private->fullscreen].x, + &private->x11_drawable[private->fullscreen].y); + + { pthread_attr_t pth_attrs; struct sched_param pth_params; @@ -747,7 +743,6 @@ pthread_create(&private->timed_thread, &pth_attrs, timed_loop, (void *)tox); } - disable_screensavers(vop); } /* @@ -763,7 +758,7 @@ static void video_window_handle_event(XEvent *xev, toxine_t *tox) { toxine_vo_plugin_t *vop = (toxine_vo_plugin_t *) tox->video.cur_plugin; x11_private_t *private = (x11_private_t *) vop->private; - + switch(xev->type) { case KeyPress: @@ -773,7 +768,11 @@ char kbuf[256]; int len; - if(!private->cursor.visible) { + if((!private->cursor.visible) +#ifdef HAVE_XTESTEXTENSION + && (xev->xkey.keycode != private->fake_key) +#endif + ) { private->cursor.visible = !private->cursor.visible; update_cursor_visibility(tox); } @@ -854,13 +853,25 @@ break; case ConfigureNotify: + pthread_mutex_lock(&private->mutex); + if(xev->xany.window == private->x11_drawable[private->fullscreen].video_window) { - XConfigureEvent *cev = (XConfigureEvent *) xev; - private->x11_drawable[private->fullscreen].x = cev->x; - private->x11_drawable[private->fullscreen].y = cev->y; - + translate_coords(private->display, + private->x11_drawable[private->fullscreen].video_window, + &private->x11_drawable[private->fullscreen].x, + &private->x11_drawable[private->fullscreen].y); +#if 0 + printf("CONFIGURE X %d, Y %d ** w %d, h %d ** 0x%lx\n", + private->x11_drawable[private->fullscreen].x, + private->x11_drawable[private->fullscreen].y, + private->x11_drawable[private->fullscreen].video_width, + private->x11_drawable[private->fullscreen].video_height, + private->x11_drawable[private->fullscreen].video_window); +#endif + } + pthread_mutex_unlock(&private->mutex); break; } @@ -932,8 +943,6 @@ XCloseDisplay(private->display); pthread_mutex_unlock(&private->mutex); - - reenable_screensavers(vop); pthread_mutex_destroy(&private->mutex); free(private); --- xscreensaver-remote.c DELETED --- --- xscreensaver-remote.h DELETED --- |