~ubuntu-branches/ubuntu/warty/xplanet/warty

« back to all changes in this revision

Viewing changes to src/libdisplay/TimerX11.cpp

  • Committer: Bazaar Package Importer
  • Author(s): LaMont Jones
  • Date: 2004-08-24 07:14:00 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20040824071400-2dr4qnjbjmm8z3ia
Tags: 1.0.6-1ubuntu1
Build-depend: libtiff4-dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include <cstdlib>
 
2
#include <sstream>
 
3
using namespace std;
 
4
 
 
5
#include <sys/time.h>
 
6
#include <unistd.h>
 
7
 
 
8
#include "config.h"
 
9
 
 
10
#include "keywords.h"
 
11
#include "Options.h"
 
12
#include "xpUtil.h"
 
13
 
 
14
#include "TimerX11.h"
 
15
 
 
16
#include "libdisplay/DisplayX11.h"
 
17
 
 
18
Display *TimerX11::display_ = NULL;
 
19
 
 
20
TimerX11::TimerX11(const int w, const unsigned long h, 
 
21
                   const unsigned long i) : Timer(w, h, i)
 
22
{
 
23
    display_ = XOpenDisplay(NULL);
 
24
 
 
25
#ifdef HAVE_XSS
 
26
    screenSaverInfo_ = NULL;
 
27
    if (display_)
 
28
    {
 
29
        const int screen_num = DefaultScreen(display_);
 
30
        root_ = RootWindow(display_, screen_num);
 
31
        int event_base, error_base;
 
32
        
 
33
        if (XScreenSaverQueryExtension(display_, &event_base, &error_base))
 
34
            screenSaverInfo_ = XScreenSaverAllocInfo();
 
35
    }
 
36
#endif
 
37
}
 
38
 
 
39
TimerX11::~TimerX11()
 
40
{
 
41
    XCloseDisplay(display_);
 
42
 
 
43
#ifdef HAVE_XSS
 
44
    XFree(screenSaverInfo_);
 
45
#endif
 
46
}
 
47
 
 
48
// Sleep for sleep_time seconds.  Also check if this is a window
 
49
// that's been closed, in which case the program should quit.
 
50
bool
 
51
TimerX11::Sleep(time_t sleep_time)
 
52
{
 
53
    Options *options = Options::getInstance();
 
54
    if (options->DisplayMode() == WINDOW)
 
55
    {
 
56
        Window window = DisplayX11::WindowID();
 
57
        Atom wmDeleteWindow = XInternAtom(display_, 
 
58
                                          "WM_DELETE_WINDOW", 
 
59
                                          False);
 
60
        
 
61
        XSetWMProtocols(display_, window, &wmDeleteWindow, 1);
 
62
        XSelectInput(display_, window, KeyPressMask);
 
63
        XEvent event;
 
64
 
 
65
        // Check every 1/10th of a second if there's been a request to
 
66
        // kill the window
 
67
        for (int i = 0; i < sleep_time * 10; i++)
 
68
        {
 
69
            if (XCheckTypedWindowEvent(display_, window, 
 
70
                                       ClientMessage, &event) == True) 
 
71
            {
 
72
                if ((unsigned int) event.xclient.data.l[0] 
 
73
                    == wmDeleteWindow)
 
74
                    return(false);
 
75
            }
 
76
            else if (XCheckTypedWindowEvent(display_, window,
 
77
                                            KeyPress, &event) == True)
 
78
            {
 
79
                KeySym keysym;
 
80
                char keybuf;
 
81
                XLookupString(&(event.xkey), &keybuf, 1, &keysym, NULL);
 
82
                if (keybuf == 'q' || keybuf == 'Q') 
 
83
                    return(false);
 
84
            }
 
85
            else
 
86
            {
 
87
                usleep(100000);  // sleep for 1/10 second
 
88
            }
 
89
        }
 
90
    }
 
91
    else
 
92
    {
 
93
        sleep(sleep_time);
 
94
    }
 
95
    return(true);
 
96
}
 
97
 
 
98
 
 
99
// returns false if the program should exit after this sleep
 
100
bool
 
101
TimerX11::Sleep()
 
102
{
 
103
    // Sleep until the next update
 
104
    gettimeofday(&currentTime_, NULL);
 
105
    time_t sleep_time = nextUpdate_ - currentTime_.tv_sec;
 
106
    if (sleep_time > 0) 
 
107
    {
 
108
        Options *options = Options::getInstance();
 
109
        if (options->Verbosity() > 0)
 
110
        {
 
111
            ostringstream msg;
 
112
            msg << "sleeping for " << static_cast<int> (sleep_time) 
 
113
                << " seconds until "
 
114
                <<  ctime((time_t *) &nextUpdate_);
 
115
            xpMsg(msg.str(), __FILE__, __LINE__);
 
116
        }
 
117
        if (!Sleep(sleep_time)) return(false);
 
118
    }
 
119
 
 
120
#ifdef HAVE_XSS
 
121
    if (screenSaverInfo_ != NULL)
 
122
    {
 
123
        if (idlewait_ > 0) 
 
124
        {
 
125
            XScreenSaverQueryInfo(display_, root_, screenSaverInfo_);
 
126
            while (screenSaverInfo_->idle < idlewait_) 
 
127
            {
 
128
                if (!Sleep((idlewait_ - screenSaverInfo_->idle) / 1000))
 
129
                    return(false);
 
130
                XScreenSaverQueryInfo(display_, root_, screenSaverInfo_);
 
131
            }
 
132
        }
 
133
 
 
134
        if (hibernate_ > 0)
 
135
        {
 
136
            XScreenSaverQueryInfo(display_, root_, screenSaverInfo_);
 
137
            while (screenSaverInfo_->idle > hibernate_) 
 
138
            {
 
139
                if (!Sleep(1)) return(false);
 
140
                XScreenSaverQueryInfo(display_, root_, screenSaverInfo_);
 
141
            }
 
142
        }
 
143
    }
 
144
#endif
 
145
 
 
146
    return(true);
 
147
}