Update datetime

This commit is contained in:
Alex Kotov 2021-11-12 14:05:43 +05:00
parent 8416d8f8ff
commit 8e18605139
Signed by: kotovalexarian
GPG Key ID: 553C0EBBEB5D5F08
5 changed files with 48 additions and 5 deletions

View File

@ -26,6 +26,7 @@ AtomValues atoms_create(Display *const dpy)
atom_values->netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False);
atom_values->netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False);
atom_values->netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False);
atom_values->netatom[NetDateTime] = XInternAtom(dpy, "_NET_DATE_TIME", False);
atom_values->xatom[Manager] = XInternAtom(dpy, "MANAGER", False);
atom_values->xatom[Xembed] = XInternAtom(dpy, "_XEMBED", False);

View File

@ -8,7 +8,7 @@ enum {
NetSupported, NetWMName, NetWMState, NetWMCheck, NetSystemTray,
NetSystemTrayOP, NetSystemTrayOrientation, NetSystemTrayOrientationHorz,
NetWMFullscreen, NetActiveWindow, NetWMWindowType, NetWMWindowTypeDialog,
NetClientList, NetLast,
NetClientList, NetDateTime, NetLast,
};
/* Xembed atoms */

View File

@ -1,10 +1,12 @@
#include "datetime.h"
#include "atoms.h"
#include <pthread.h>
#include <stdbool.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <X11/Xlib.h>
#define BUFFER_SIZE 32
@ -12,20 +14,33 @@ static void *run(void *vargp);
static const char *const default_text = "date & time";
static Display *display = None;
static AtomValues atom_values = NULL;
static bool running = true;
static pthread_t thread;
static pthread_mutex_t mutex;
static char buffer[BUFFER_SIZE];
void datetime_start()
bool datetime_start()
{
strcpy(buffer, default_text);
if ((display = XOpenDisplay(NULL)) == NULL) {
return false;
}
atom_values = atoms_create(display);
pthread_create(&thread, NULL, run, NULL);
return true;
}
void datetime_stop()
{
running = false;
atoms_destroy(atom_values);
XCloseDisplay(display);
pthread_join(thread, NULL);
}
@ -41,6 +56,24 @@ void *run(void *vargp)
strftime(buffer, sizeof(buffer), "%a, %e %b %Y, %H:%M:%S", time_info);
datetime_unlock();
XEvent event;
memset(&event, 0, sizeof(event));
event.xclient.type = ClientMessage;
event.xclient.serial = 0;
event.xclient.send_event = True;
event.xclient.display = display; // TODO: was undefined in xclimsg
event.xclient.window = DefaultRootWindow(display);
event.xclient.message_type = atom_values->netatom[NetDateTime];
event.xclient.format = 32;
XSendEvent(
display,
event.xclient.window,
False,
SubstructureRedirectMask | SubstructureNotifyMask,
&event
);
XFlush(display);
sleep(1);
}

View File

@ -1,7 +1,9 @@
#ifndef _DATETIME_H
#define _DATETIME_H
void datetime_start();
#include <stdbool.h>
bool datetime_start();
void datetime_stop();
void datetime_lock();

9
dwm.c
View File

@ -601,6 +601,12 @@ clientmessage(XEvent *e)
}
return;
}
if (cme->message_type == atom_values->netatom[NetDateTime]) {
updatestatus(); // TODO: maybe we need some filtering
return;
}
if (!c)
return;
if (cme->message_type == atom_values->netatom[NetWMState]) {
@ -2476,7 +2482,8 @@ main(int argc, char *argv[])
if (!(dpy = XOpenDisplay(NULL)))
die("dwm: cannot open display");
checkotherwm();
datetime_start();
if (!datetime_start())
die("dwm: cannot start datetime service");
setup();
#ifdef __OpenBSD__
if (pledge("stdio rpath proc exec", NULL) == -1)