#include #include #include //Header file for sleep(). man 3 sleep for details. #include #include #include #include #include #include #include #include "moc_library.h" void *xmalloc (size_t size) { void *p; if ((p = malloc(size)) == NULL) { fprintf(stderr, "Can't allocate memory!"); exit(0); } return p; } /* Obtains the next X11 event with specified timeout. */ static int XNextEventTimed(Display* dsp, XEvent* event_return, long millis) { if (millis == 0) { XNextEvent(dsp, event_return); return True; } struct timeval tv; tv.tv_sec = millis / 1000; tv.tv_usec = (millis % 1000) * 1000; XFlush(dsp); if (XPending(dsp)) { XNextEvent(dsp, event_return); return True; } else { int fd = ConnectionNumber(dsp); fd_set readset; FD_ZERO(&readset); FD_SET(fd, &readset); if (select(fd+1, &readset, NULL, NULL, &tv) <= 0) { return False; } else { if (XPending(dsp)) { XNextEvent(dsp, event_return); return True; } else { return False; } } } } char *time_format(int sec) { int h = (sec/3600); int m = (sec -(3600*h))/60; int s = (sec -(3600*h)-(m*60)); char *str = xmalloc(256); if(h) { sprintf(str, "%d:%2d:%02d",h,m,s); } else { sprintf(str, "%02d:%02d",m,s); } return str; } int main() { Display* dpy = XOpenDisplay(NULL); if (dpy == NULL) { fprintf(stderr, "Cannot open display\n"); exit(1); } int s = DefaultScreen(dpy); Window win = XCreateSimpleWindow(dpy, RootWindow(dpy, s), 10, 10, 660, 200, 1, BlackPixel(dpy, s), WhitePixel(dpy, s)); XSelectInput(dpy, win, ExposureMask | ButtonPress | KeyPressMask); XMapWindow(dpy, win); XStoreName(dpy, win, "mocicon"); Atom WM_DELETE_WINDOW = XInternAtom(dpy, "WM_DELETE_WINDOW", False); XSetWMProtocols(dpy, win, &WM_DELETE_WINDOW, 1); struct moc *mh = moc_init(); if(mh == NULL) { return 1; } XEvent e; while(1) { XNextEventTimed(dpy, &e, 250); XClearWindow(dpy, win); if(mh->status != CONNECTED) { XDrawString(dpy, win, DefaultGC(dpy, s), 0, 20, moc_str_status(mh->status), strlen(moc_str_status(mh->status))); continue; } int y_offset = 20; int x = 10; pthread_mutex_lock(&mh->lock); XDrawString(dpy, win, DefaultGC(dpy, s), x, y_offset, moc_str_state(mh->state), strlen(moc_str_state(mh->state))); y_offset += 15; if(mh->state == PLAYING || mh->state == PAUSED) { if(mh->title) { XDrawString(dpy, win, DefaultGC(dpy, s), x, y_offset, mh->title, strlen(mh->title)); y_offset += 15; } if(mh->artist) { XDrawString(dpy, win, DefaultGC(dpy, s), x, y_offset, mh->artist, strlen(mh->artist)); y_offset += 15; } if(mh->artist) { XDrawString(dpy, win, DefaultGC(dpy, s), x, y_offset, mh->album, strlen(mh->album)); y_offset += 15; } if(mh->time >= 0) { char *timestr= time_format(mh->time); XDrawString(dpy, win, DefaultGC(dpy, s), x, y_offset, timestr, strlen(timestr)); free(timestr); y_offset += 15; } if(mh->length >= 0) { char *timestr= time_format(mh->length); XDrawString(dpy, win, DefaultGC(dpy, s), x, y_offset, timestr, strlen(timestr)); free(timestr); y_offset += 15; } } pthread_mutex_unlock(&mh->lock); } };