[Pommed-commits] r513 - in trunk: . wmpomme

jblache at alioth.debian.org jblache at alioth.debian.org
Sun Nov 9 15:52:24 UTC 2008


Author: jblache
Date: 2008-11-09 15:52:23 +0000 (Sun, 09 Nov 2008)
New Revision: 513

Added:
   trunk/wmpomme/timerfd-syscalls.h
Modified:
   trunk/ChangeLog
   trunk/wmpomme/Makefile
   trunk/wmpomme/wmgeneral.c
   trunk/wmpomme/wmgeneral.h
   trunk/wmpomme/wmpomme.1
   trunk/wmpomme/wmpomme.c
Log:
Turn wmpomme into an event-driven dockapp.


Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2008-11-09 10:45:42 UTC (rev 512)
+++ trunk/ChangeLog	2008-11-09 15:52:23 UTC (rev 513)
@@ -12,6 +12,9 @@
 	sysfs power class support for pmac machines.
 	- pommed: added partial support for the October 2008 laptops
 	(MacBook5,1, MacBookPro5,1, MacBookAir2,1), LCD backlight missing.
+	- wmpomme: turn wmpomme into an event-driven dockapp, eliminating
+	the fixed update rate (and, thus, wakeups). Thanks to Kalle
+	A. Sandström for the prodding.
 
 version 1.21:
 	- gpomme: use compositing if available, patch by Soeren Sonnenburg.

Modified: trunk/wmpomme/Makefile
===================================================================
--- trunk/wmpomme/Makefile	2008-11-09 10:45:42 UTC (rev 512)
+++ trunk/wmpomme/Makefile	2008-11-09 15:52:23 UTC (rev 513)
@@ -4,7 +4,7 @@
 DBUS_LIBS = $(shell pkg-config dbus-1 --libs)
 
 CFLAGS = -g -O2 -Wall $(DBUS_CFLAGS)
-LDFLAGS = -lXpm -lXext -lX11 $(DBUS_LIBS)
+LDFLAGS = -lrt -lXpm -lXext -lX11 $(DBUS_LIBS)
 
 SOURCES = wmgeneral.c wmpomme.c \
 	../client-common/dbus-client.c \

Added: trunk/wmpomme/timerfd-syscalls.h
===================================================================
--- trunk/wmpomme/timerfd-syscalls.h	                        (rev 0)
+++ trunk/wmpomme/timerfd-syscalls.h	2008-11-09 15:52:23 UTC (rev 513)
@@ -0,0 +1,47 @@
+/*
+ * timerfd syscall numbers and definitions
+ */
+
+#ifndef _LINUX_TIMERFD_SYSCALLS_H_
+#define _LINUX_TIMERFD_SYSCALLS_H_
+
+#ifndef __NR_timerfd_create
+# if defined(__x86_64__)
+#  define __NR_timerfd_create  283
+#  define __NR_timerfd_settime 286
+#  define __NR_timerfd_gettime 287
+# elif defined(__i386__)
+#  define __NR_timerfd_create  322
+#  define __NR_timerfd_settime 325
+#  define __NR_timerfd_gettime 326
+# elif defined(__powerpc__)
+#  define __NR_timerfd_create  306
+#  define __NR_timerfd_settime 311
+#  define __NR_timerfd_gettime 312
+# else
+#  error Unsupported architecture
+# endif
+#endif
+
+/* Defined in include/linux/timerfd.h */
+#define TFD_TIMER_ABSTIME (1 << 0)
+
+static inline int
+timerfd_create(int clockid, int flags)
+{
+  return syscall(__NR_timerfd_create, clockid, flags);
+}
+
+static inline int
+timerfd_settime(int fd, int flags, const struct itimerspec *new_value, struct itimerspec *curr_value)
+{
+  return syscall(__NR_timerfd_settime, fd, flags, new_value, curr_value);
+}
+
+static inline int
+timerfd_gettime(int fd, struct itimerspec *curr_value)
+{
+  return syscall(__NR_timerfd_gettime, fd, curr_value);
+}
+
+#endif /* _LINUX_TIMERFD_SYSCALLS_H_ */

Modified: trunk/wmpomme/wmgeneral.c
===================================================================
--- trunk/wmpomme/wmgeneral.c	2008-11-09 10:45:42 UTC (rev 512)
+++ trunk/wmpomme/wmgeneral.c	2008-11-09 15:52:23 UTC (rev 513)
@@ -65,6 +65,7 @@
 /* X11 Variables */
 /*****************/
 
+Display *display;
 Window		Root;
 int			screen;
 int			x_fd;

Modified: trunk/wmpomme/wmgeneral.h
===================================================================
--- trunk/wmpomme/wmgeneral.h	2008-11-09 10:45:42 UTC (rev 512)
+++ trunk/wmpomme/wmgeneral.h	2008-11-09 15:52:23 UTC (rev 513)
@@ -36,7 +36,8 @@
  /* Global variable */
 /*******************/
 
-Display		*display;
+extern Display *display;
+extern int x_fd;
 
   /***********************/
  /* Function Prototypes */

Modified: trunk/wmpomme/wmpomme.1
===================================================================
--- trunk/wmpomme/wmpomme.1	2008-11-09 10:45:42 UTC (rev 512)
+++ trunk/wmpomme/wmpomme.1	2008-11-09 15:52:23 UTC (rev 513)
@@ -1,4 +1,4 @@
-.TH WMPOMME 1 "2006-12-16"
+.TH WMPOMME 1 "2008-11-09"
 .SH NAME
 wmpomme \- WindowMaker dockapp for use with pommed
 
@@ -16,9 +16,6 @@
 .BI \-v
 Display the version
 .TP
-.BI \-r \ time
-Sets the update interval (in milliseconds), default: 100
-.TP
 .BI \-display \ display
 This option specifies the X server to contact; see X(1).
 

Modified: trunk/wmpomme/wmpomme.c
===================================================================
--- trunk/wmpomme/wmpomme.c	2008-11-09 10:45:42 UTC (rev 512)
+++ trunk/wmpomme/wmpomme.c	2008-11-09 15:52:23 UTC (rev 513)
@@ -3,7 +3,7 @@
  *
  * $Id$
  *
- * Copyright (C) 2006-2007 Julien BLACHE <jb at jblache.org>
+ * Copyright (C) 2006-2008 Julien BLACHE <jb at jblache.org>
  *
  * Based on wmwave by Carsten Schuermann <carsten at schuermann.org>
  * wmwave derived from:
@@ -33,16 +33,24 @@
 #include <unistd.h>
 #include <ctype.h>
 
+#include <stdint.h>
 #include <sys/types.h>
 #include <sys/wait.h>
 
+#include <time.h>
+#include <poll.h>
+
 #include <signal.h>
 
+#include <errno.h>
+
 #include <X11/Xlib.h>
 #include <X11/xpm.h>
 
 #include <dbus/dbus.h>
 
+#include "timerfd-syscalls.h"
+
 #include "wmgeneral.h"
 #include "wmpomme-master.xpm"
 
@@ -65,21 +73,28 @@
 } mbp;
 
 
-#define DISPLAY_DBUS_NOK  0
-#define DISPLAY_NO_DATA   1
-#define DISPLAY_MACBOOK   2
-#define DISPLAY_AMBIENT   3
-int mbpdisplay = DISPLAY_DBUS_NOK;
+#define DISPLAY_TYPE_DBUS_NOK  (1 << 0)
+#define DISPLAY_TYPE_NO_DATA   (1 << 1)
+#define DISPLAY_TYPE_MACBOOK   (1 << 2)
+#define DISPLAY_TYPE_AMBIENT   (1 << 3)
 
+#define DISPLAY_MASK_TYPE      (0xffff)
+#define DISPLAY_TYPE(d)        (d & DISPLAY_MASK_TYPE)
 
+#define DISPLAY_FLAG_UPDATE    (1 << 16)
+
+#define DISPLAY_MASK_FLAGS     (0xffff0000)
+#define DISPLAY_FLAGS(d)       (d & DISPLAY_MASK_FLAGS)
+
+unsigned int mbpdisplay = DISPLAY_TYPE_DBUS_NOK;
+
+
 char wmmbp_mask_bits[64*64];
 int wmmbp_mask_width = 64;
 int wmmbp_mask_height = 64;
 
-#define WMPOMME_VERSION "0.1"
+#define WMPOMME_VERSION "0.2"
 
-int update_rate = 100;
-
 char *ProgName;
 
 
@@ -102,7 +117,7 @@
 
   if (conn == NULL)
     {
-      mbpdisplay = DISPLAY_DBUS_NOK;
+      mbpdisplay = DISPLAY_FLAG_UPDATE | DISPLAY_TYPE_DBUS_NOK;
 
       return -1;
     }
@@ -113,26 +128,18 @@
 }
 
 void
-mbp_dbus_listen(int timeout)
+mbp_dbus_listen(void)
 {
   DBusMessage *msg;
 
   int scratch;
 
-  /* Disconnected, try to reconnect */
   if (conn == NULL)
-    {
-      if (wmmbp_dbus_init() < 0)
-	usleep(timeout * 1000);
+    return;
 
-      return;
-    }
-
   while (1)
     {
-      dbus_connection_read_write(conn, timeout);
-      /* next iterations in this call, to drain the queue */
-      timeout = 0;
+      dbus_connection_read_write(conn, 0);
 
       msg = dbus_connection_pop_message(conn);
 
@@ -148,6 +155,9 @@
 				DBUS_TYPE_UINT32, &scratch, /* previous right */
 				DBUS_TYPE_UINT32, &mbp.ambient_max,
 				DBUS_TYPE_INVALID);
+
+	  if (mbpdisplay & DISPLAY_TYPE_AMBIENT)
+	    mbpdisplay |= DISPLAY_FLAG_UPDATE;
 	}
       else if (dbus_message_is_signal(msg, "org.pommed.signal.lcdBacklight", "lcdBacklight"))
 	{
@@ -157,6 +167,9 @@
 				DBUS_TYPE_UINT32, &mbp.lcd_max,
 				DBUS_TYPE_UINT32, &scratch, /* who */
 				DBUS_TYPE_INVALID);
+
+	  if (mbpdisplay & DISPLAY_TYPE_MACBOOK)
+	    mbpdisplay |= DISPLAY_FLAG_UPDATE;
 	}
       else if (dbus_message_is_signal(msg, "org.pommed.signal.kbdBacklight", "kbdBacklight"))
 	{
@@ -166,6 +179,9 @@
 				DBUS_TYPE_UINT32, &mbp.kbd_max,
 				DBUS_TYPE_UINT32, &scratch, /* who */
 				DBUS_TYPE_INVALID);
+
+	  if (mbpdisplay & (DISPLAY_TYPE_MACBOOK | DISPLAY_TYPE_AMBIENT))
+	    mbpdisplay |= DISPLAY_FLAG_UPDATE;
 	}
       else if (dbus_message_is_signal(msg, "org.pommed.signal.audioVolume", "audioVolume"))
 	{
@@ -174,12 +190,18 @@
 				DBUS_TYPE_UINT32, &scratch, /* previous */
 				DBUS_TYPE_UINT32, &mbp.snd_max,
 				DBUS_TYPE_INVALID);
+
+	  if (mbpdisplay & DISPLAY_TYPE_MACBOOK)
+	    mbpdisplay |= DISPLAY_FLAG_UPDATE;
 	}
       else if (dbus_message_is_signal(msg, "org.pommed.signal.audioMute", "audioMute"))
 	{
 	  dbus_message_get_args(msg, &dbus_err,
 				DBUS_TYPE_BOOLEAN, &mbp.snd_mute,
 				DBUS_TYPE_INVALID);
+
+	  if (mbpdisplay & DISPLAY_TYPE_MACBOOK)
+	    mbpdisplay |= DISPLAY_FLAG_UPDATE;
 	}
       else if (dbus_message_is_signal(msg, "org.pommed.signal.videoSwitch", "videoSwitch"))
 	{
@@ -189,7 +211,7 @@
 	{
 	  printf("DBus disconnected\n");
 
-	  mbpdisplay = DISPLAY_DBUS_NOK;
+	  mbpdisplay = DISPLAY_FLAG_UPDATE | DISPLAY_TYPE_DBUS_NOK;
 
 	  mbp_dbus_cleanup();
 	  conn = NULL;
@@ -402,11 +424,15 @@
       goto mcall_error;
     }
 
+  if (DISPLAY_TYPE(mbpdisplay) <= DISPLAY_TYPE_NO_DATA)
+    mbpdisplay = DISPLAY_TYPE_MACBOOK;
+
+  mbpdisplay |= DISPLAY_FLAG_UPDATE;
+
+  return;
+
  mcall_error:
-  if ((ret < 0) || (cbret < 0))
-    mbpdisplay = DISPLAY_NO_DATA;
-  else if (mbpdisplay <= DISPLAY_NO_DATA)
-    mbpdisplay = DISPLAY_MACBOOK;
+  mbpdisplay = DISPLAY_FLAG_UPDATE | DISPLAY_TYPE_NO_DATA;
 }
 
 
@@ -474,9 +500,9 @@
 void
 DisplayMBPStatus(void)
 {
-  switch (mbpdisplay)
+  switch (DISPLAY_TYPE(mbpdisplay))
     {
-      case DISPLAY_MACBOOK:
+      case DISPLAY_TYPE_MACBOOK:
 	BlitString("MacBook", 4, 4);
 	DrawGreenDot();
 
@@ -493,7 +519,7 @@
 	DrawGreenBar(((float)mbp.snd_lvl / (float)mbp.snd_max) * 100.0, 4, 55);
 	break;
 
-      case DISPLAY_AMBIENT:
+      case DISPLAY_TYPE_AMBIENT:
 	BlitString("Ambient", 4, 4);
 	DrawYellowDot();
 
@@ -507,7 +533,7 @@
 	DrawGreenBar(((float)mbp.kbd_lvl / (float)mbp.kbd_max) * 100.0, 4, 55);
 	break;
 
-      case DISPLAY_DBUS_NOK:
+      case DISPLAY_TYPE_DBUS_NOK:
 	BlitString(" Error ", 4, 4);
 	DrawRedDot();
 
@@ -521,7 +547,7 @@
 	DrawGreenBar(0.0, 4, 55);
 	break;
 
-      case DISPLAY_NO_DATA:
+      case DISPLAY_TYPE_NO_DATA:
 	BlitString("No Data", 4, 4);
 	DrawRedDot();
 
@@ -535,8 +561,60 @@
 	DrawGreenBar(0.0, 4, 55);
 	break;
     }
+
+  mbpdisplay = DISPLAY_TYPE(mbpdisplay);
 }
 
+
+static int
+mbp_create_timer(int timeout)
+{
+  int fd;
+  int ret;
+
+  struct itimerspec timing;
+
+  fd = timerfd_create(CLOCK_MONOTONIC, 0);
+  if (fd < 0)
+    {
+      fprintf(stderr, "Could not create timer: %s", strerror(errno));
+
+      return -1;
+    }
+
+  timing.it_interval.tv_sec = (timeout >= 1000) ? timeout / 1000 : 0;
+  timing.it_interval.tv_nsec = (timeout - (timing.it_interval.tv_sec * 1000)) * 1000000;
+
+  ret = clock_gettime(CLOCK_MONOTONIC, &timing.it_value);
+  if (ret < 0)
+    {
+      fprintf(stderr, "Could not get current time: %s", strerror(errno));
+
+      close(fd);
+      return -1;
+    }
+
+  timing.it_value.tv_sec += timing.it_interval.tv_sec;
+  timing.it_value.tv_nsec += timing.it_interval.tv_nsec;
+  if (timing.it_value.tv_nsec > 1000000000)
+    {
+      timing.it_value.tv_sec++;
+      timing.it_value.tv_nsec -= 1000000000;
+    }
+
+  ret = timerfd_settime(fd, TFD_TIMER_ABSTIME, &timing, NULL);
+  if (ret < 0)
+    {
+      fprintf(stderr, "Could not setup timer: %s", strerror(errno));
+
+      close(fd);
+      return -1;
+    }
+
+  return fd;
+}
+
+
 int running;
 
 void
@@ -600,14 +678,6 @@
 		exit(0);
 		break;
 
-	      case 'r':
-		if (argc > (i+1))
-		  {
-		    update_rate = (atoi(argv[i+1]));
-		    i++;
-		  }
-		break;
-
 	      default:
 		usage();
 		exit(0);
@@ -618,6 +688,10 @@
 
   wmmbp_dbus_init();
 
+  createXBMfromXPM(wmmbp_mask_bits, wmmbp_master_xpm, wmmbp_mask_width, wmmbp_mask_height);
+
+  openXwindow(argc, argv, wmmbp_master_xpm, wmmbp_mask_bits, wmmbp_mask_width, wmmbp_mask_height);
+
   wmmbp_routine(argc, argv);
 
   mbp_dbus_cleanup();
@@ -631,59 +705,130 @@
 void
 wmmbp_routine(int argc, char **argv)
 {
+  int nfds;
+  struct pollfd fds[2];
+
+  int t_fd;
+  uint64_t ticks;
+
+  int ret;
+
   XEvent Event;
 
-  createXBMfromXPM(wmmbp_mask_bits, wmmbp_master_xpm, wmmbp_mask_width, wmmbp_mask_height);
+  /* X */
+  fds[0].fd = x_fd;
+  fds[0].events = POLLIN;
+  nfds = 1;
 
-  openXwindow(argc, argv, wmmbp_master_xpm, wmmbp_mask_bits, wmmbp_mask_width, wmmbp_mask_height);
+  /* DBus */
+  if (conn != NULL)
+    {
+      if (dbus_connection_get_unix_fd(conn, &fds[1].fd))
+	nfds = 2;
+    }
+  fds[1].events = POLLIN;
 
+  t_fd = -1;
+
+  wmmbp_get_values();
+
   RedrawWindow();
 
   running = 1;
   while (running)
     {
-      if (mbpdisplay == DISPLAY_NO_DATA)
-	wmmbp_get_values();
+      if ((conn == NULL) && (t_fd == -1))
+	{
+	  /* setup reconnect timer */
+	  t_fd = mbp_create_timer(200);
 
-      /*
-       * Update display
-       */
-      DisplayMBPStatus();
+	  if (t_fd != -1)
+	    {
+	      fds[1].fd = t_fd;
+	      nfds = 2;
+	    }
+	  else
+	    nfds = 1;
 
-      RedrawWindow();
+	  fds[1].revents = 0;
+	}
 
-      /*
-       * X Events
-       */
-      while (XPending(display))
+      ret = poll(fds, nfds, -1);
+
+      if (ret < 0)
+	continue;
+
+      /* DBus */
+      if ((nfds == 2) && (fds[1].revents != 0))
 	{
-	  XNextEvent(display, &Event);
-	  switch (Event.type)
+	  /* reconnection */
+	  if (conn == NULL)
 	    {
-	      case Expose:
-		RedrawWindow();
-		break;
+	      /* handle timer & reconnect, fd */
+	      read(fds[1].fd, &ticks, sizeof(ticks));
 
-	      case DestroyNotify:
-		XCloseDisplay(display);
-		exit(0);
-		break;
+	      if (wmmbp_dbus_init() == 0)
+		{
+		  close(t_fd);
+		  t_fd = -1;
 
-	      case ButtonPress:
-		if (mbpdisplay > DISPLAY_NO_DATA)
-		  {
-		    mbpdisplay++;
-		    if (mbpdisplay > DISPLAY_AMBIENT)
-		      mbpdisplay = DISPLAY_MACBOOK;
+		  if (!dbus_connection_get_unix_fd(conn, &fds[1].fd))
+		    {
+		      fds[1].fd = -1;
+		      nfds = 1;
+		    }
+		}
+	    }
+	  else /* events */
+	    {
+	      mbp_dbus_listen();
+	    }
+	}
 
-		    DisplayMBPStatus();
-		    RedrawWindow();
-		  }
-		break;
+      if ((mbpdisplay & DISPLAY_TYPE_NO_DATA) && (conn != NULL))
+	wmmbp_get_values();
+
+      /* X Events */
+      if (fds[0].revents != 0)
+	{
+	  while (XPending(display))
+	    {
+	      XNextEvent(display, &Event);
+	      switch (Event.type)
+		{
+		  case Expose:
+		    mbpdisplay |= DISPLAY_FLAG_UPDATE;
+		    break;
+
+		  case DestroyNotify:
+		    XCloseDisplay(display);
+		    return;
+
+		  case ButtonPress:
+		    if (DISPLAY_TYPE(mbpdisplay) > DISPLAY_TYPE_NO_DATA)
+		      {
+			switch (DISPLAY_TYPE(mbpdisplay))
+			  {
+			    case DISPLAY_TYPE_MACBOOK:
+			      mbpdisplay = DISPLAY_FLAG_UPDATE | DISPLAY_TYPE_AMBIENT;
+			      break;
+
+			    case DISPLAY_TYPE_AMBIENT:
+			      mbpdisplay = DISPLAY_FLAG_UPDATE | DISPLAY_TYPE_MACBOOK;
+			      break;
+			  }
+		      }
+		    break;
+		}
 	    }
 	}
 
-      mbp_dbus_listen(update_rate);
+      /* Update display */
+      if (mbpdisplay & DISPLAY_FLAG_UPDATE)
+	{
+	  DisplayMBPStatus();
+	  RedrawWindow();
+	}
     }
 }
 
@@ -742,7 +887,6 @@
   fprintf(stderr, "Based on wmwave by Carsten Schuermann <carsten at schuermann.org>\n\n");
   fprintf(stderr, "Usage:\n");
   fprintf(stderr, "\t-display <display name>\n");
-  fprintf(stderr, "\t-r\t\tupdate rate in milliseconds (default:100)\n");
 }
 
 void




More information about the Pommed-commits mailing list