minui: events: add ability to poll on non-input fds

Change-Id: Iad52a6f2adcae0068d252d6163586f9d7b93121d
Signed-off-by: Dima Zavin <dima@android.com>
diff --git a/minui/events.c b/minui/events.c
index eca3bc7..8458b2d 100644
--- a/minui/events.c
+++ b/minui/events.c
@@ -25,17 +25,19 @@
 #include "minui.h"
 
 #define MAX_DEVICES 16
+#define MAX_MISC_FDS 16
 
 struct fd_info {
     ev_callback cb;
     void *data;
 };
 
-static struct pollfd ev_fds[MAX_DEVICES];
-static struct fd_info ev_fdinfo[MAX_DEVICES];
+static struct pollfd ev_fds[MAX_DEVICES + MAX_MISC_FDS];
+static struct fd_info ev_fdinfo[MAX_DEVICES + MAX_MISC_FDS];
 
 static unsigned ev_count = 0;
 static unsigned ev_dev_count = 0;
+static unsigned ev_misc_count = 0;
 
 int ev_init(ev_callback input_cb, void *data)
 {
@@ -56,18 +58,35 @@
             ev_fdinfo[ev_count].cb = input_cb;
             ev_fdinfo[ev_count].data = data;
             ev_count++;
-            if(ev_count == MAX_DEVICES) break;
+            ev_dev_count++;
+            if(ev_dev_count == MAX_DEVICES) break;
         }
     }
 
     return 0;
 }
 
+int ev_add_fd(int fd, ev_callback cb, void *data)
+{
+    if (ev_misc_count == MAX_MISC_FDS || cb == NULL)
+        return -1;
+
+    ev_fds[ev_count].fd = fd;
+    ev_fds[ev_count].events = POLLIN;
+    ev_fdinfo[ev_count].cb = cb;
+    ev_fdinfo[ev_count].data = data;
+    ev_count++;
+    ev_misc_count++;
+    return 0;
+}
+
 void ev_exit(void)
 {
     while (ev_count > 0) {
         close(ev_fds[--ev_count].fd);
     }
+    ev_misc_count = 0;
+    ev_dev_count = 0;
 }
 
 int ev_wait(int timeout)
diff --git a/minui/minui.h b/minui/minui.h
index 5a4168c..cb1ed65 100644
--- a/minui/minui.h
+++ b/minui/minui.h
@@ -49,6 +49,7 @@
 
 int ev_init(ev_callback input_cb, void *data);
 void ev_exit(void);
+int ev_add_fd(int fd, ev_callback cb, void *data);
 
 /* timeout has the same semantics as for poll
  *    0 : don't block