More appropriate run loop.
This commit is contained in:
1 parent
c4382470e6
commit
b89b2e566c
3 files changed
+49
-38
No files matched your search
@@ -88,5 +88,9 @@ perf:
|
|||||||
run:
|
run:
|
||||||
@ clear; ./$(EXE)
|
@ clear; ./$(EXE)
|
||||||
|
|
||||||
|
install:
|
||||||
|
chmod u+s ./$(EXE)
|
||||||
|
mv ./$(EXE) /usr/local/bin
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
@ rm -rf $(EXE) $(EXE).dSYM
|
@ rm -rf $(EXE) $(EXE).dSYM
|
||||||
@@ -10,8 +10,10 @@ In order to build slock you need the Xlib header files.
|
|||||||
|
|
||||||
Notes
|
Notes
|
||||||
------------
|
------------
|
||||||
As of right now, this implementation assumes that the user has no automatic
|
* As of right now, this implementation assumes that the user has no automatic
|
||||||
display management utilities, like mutter.
|
display management utilities, like mutter.
|
||||||
|
* Also, I have not tested this program with multiple displays. The assumption
|
||||||
|
is that you have one display, for now.
|
||||||
|
|
||||||
|
|
||||||
Installation
|
Installation
|
||||||
|
|||||||
@@ -628,11 +628,13 @@ readpw(struct arena *arena,
|
|||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
KeySym ksym;
|
KeySym ksym;
|
||||||
XEvent ev;
|
XEvent ev;
|
||||||
unsigned long long last_millis;
|
unsigned long long rendering_timeout_millis;
|
||||||
struct dpms_state dpms_state;
|
struct dpms_state dpms_state;
|
||||||
struct fonts fonts;
|
struct fonts fonts;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
|
int needs_rendering;
|
||||||
|
|
||||||
len = 0;
|
len = 0;
|
||||||
running = 1;
|
running = 1;
|
||||||
failure = 0;
|
failure = 0;
|
||||||
@@ -655,35 +657,35 @@ readpw(struct arena *arena,
|
|||||||
if(!load_fonts(&fonts))
|
if(!load_fonts(&fonts))
|
||||||
die("slock: load_fonts\n");
|
die("slock: load_fonts\n");
|
||||||
|
|
||||||
render_screen(arena,
|
needs_rendering = 1;
|
||||||
dpy, locks,
|
|
||||||
fonts.main_face, fonts.secondary_face,
|
rendering_timeout_millis = millis();
|
||||||
len);
|
|
||||||
|
|
||||||
last_millis = millis();
|
|
||||||
while(running) {
|
while(running) {
|
||||||
fd_set fds;
|
fd_set fds;
|
||||||
FD_ZERO(&fds);
|
FD_ZERO(&fds);
|
||||||
FD_SET(xfd, &fds);
|
FD_SET(xfd, &fds);
|
||||||
FD_SET(tfd, &fds);
|
FD_SET(tfd, &fds);
|
||||||
|
|
||||||
XFlush(dpy);
|
|
||||||
|
|
||||||
update_timerfd(tfd);
|
update_timerfd(tfd);
|
||||||
|
|
||||||
|
XFlush(dpy);
|
||||||
|
|
||||||
while(XPending(dpy)) {
|
while(XPending(dpy)) {
|
||||||
XNextEvent(dpy, &ev);
|
XNextEvent(dpy, &ev);
|
||||||
|
|
||||||
if(ev.type == MotionNotify) {
|
if(ev.type == MotionNotify) {
|
||||||
|
needs_rendering = 1;
|
||||||
dson = 1;
|
dson = 1;
|
||||||
set_screen_on(dpy);
|
set_screen_on(dpy);
|
||||||
} else if (ev.type == KeyPress) {
|
} else if (ev.type == KeyPress) {
|
||||||
explicit_bzero(&buf, sizeof(buf));
|
explicit_bzero(&buf, sizeof(buf));
|
||||||
num = XLookupString(&ev.xkey, buf, sizeof(buf), &ksym, 0);
|
num = XLookupString(&ev.xkey, buf, sizeof(buf), &ksym, 0);
|
||||||
|
|
||||||
|
needs_rendering = 1;
|
||||||
|
|
||||||
if(ksym != XK_Escape) {
|
if(ksym != XK_Escape) {
|
||||||
dson = 1;
|
dson = 1;
|
||||||
set_screen_on(dpy);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IsKeypadKey(ksym)) {
|
if (IsKeypadKey(ksym)) {
|
||||||
@@ -730,11 +732,6 @@ readpw(struct arena *arena,
|
|||||||
exit(1);
|
exit(1);
|
||||||
#else
|
#else
|
||||||
dson = !dson;
|
dson = !dson;
|
||||||
if(dson)
|
|
||||||
set_screen_on(dpy);
|
|
||||||
else
|
|
||||||
set_screen_off(dpy);
|
|
||||||
continue;
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -796,34 +793,42 @@ readpw(struct arena *arena,
|
|||||||
for(screen = 0; screen < nscreens; screen++)
|
for(screen = 0; screen < nscreens; screen++)
|
||||||
XRaiseWindow(dpy, locks[screen]->win);
|
XRaiseWindow(dpy, locks[screen]->win);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* cap redraw at roughly 30 FPS */
|
if(dson)
|
||||||
if(millis() - last_millis >= 33) {
|
set_screen_on(dpy);
|
||||||
render_screen(arena,
|
else
|
||||||
dpy, locks,
|
set_screen_off(dpy);
|
||||||
fonts.main_face, fonts.secondary_face,
|
|
||||||
len);
|
render_screen(arena,
|
||||||
last_millis = millis();
|
dpy, locks,
|
||||||
}
|
fonts.main_face, fonts.secondary_face,
|
||||||
|
len);
|
||||||
|
|
||||||
|
if(millis() - rendering_timeout_millis >= 500) {
|
||||||
|
needs_rendering = 0;
|
||||||
|
rendering_timeout_millis = millis();
|
||||||
}
|
}
|
||||||
|
|
||||||
int ret;
|
int ret;
|
||||||
if(displaytimeout > 0 && dson) {
|
if(needs_rendering) {
|
||||||
tv.tv_sec = displaytimeout;
|
tv.tv_sec = 0;
|
||||||
tv.tv_usec = 0;
|
tv.tv_usec = 33*1000; /* ~30 FPS */
|
||||||
ret = select(tfd + 1, &fds, 0, 0, &tv);
|
ret = select(0, 0, 0, 0, &tv);
|
||||||
} else {
|
} else {
|
||||||
ret = select(tfd + 1, &fds, 0, 0, 0);
|
if(displaytimeout > 0 && dson) {
|
||||||
}
|
tv.tv_sec = displaytimeout;
|
||||||
if (ret == 0) {
|
tv.tv_usec = 0;
|
||||||
dson = 0;
|
ret = select(tfd + 1, &fds, 0, 0, &tv);
|
||||||
set_screen_off(dpy);
|
} else {
|
||||||
} else if (ret > 0 && FD_ISSET(xfd, &fds)) {
|
ret = select(tfd + 1, &fds, 0, 0, 0);
|
||||||
} else if (ret > 0 && FD_ISSET(tfd, &fds)) {
|
}
|
||||||
render_screen(arena,
|
if(ret == 0) {
|
||||||
dpy, locks,
|
dson = 0;
|
||||||
fonts.main_face, fonts.secondary_face,
|
set_screen_off(dpy);
|
||||||
len);
|
} else if(ret > 0 && FD_ISSET(xfd, &fds)) {
|
||||||
|
} else if(ret > 0 && FD_ISSET(tfd, &fds)) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user