This is an automated email from the git hooks/post-receive script.

git pushed a commit to branch master
in repository e16-epplets.

View the commit online.

commit 4ff99896e0843dd916c60acb79a077050f22cbe9
Author: Kim Woelders <k...@woelders.dk>
AuthorDate: Sat Dec 9 21:44:52 2023 +0100

    api: Move comms stuff to separate file
---
 api/Makefile.am |   2 +-
 api/comms.c     | 209 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 api/comms.h     |  16 +++++
 api/epplet.c    | 213 ++------------------------------------------------------
 4 files changed, 232 insertions(+), 208 deletions(-)

diff --git a/api/Makefile.am b/api/Makefile.am
index 7a6865c..c3dc49c 100644
--- a/api/Makefile.am
+++ b/api/Makefile.am
@@ -10,7 +10,7 @@ lib_LTLIBRARIES = libepplet.la $(EPPLET_LIB_GLX)
 
 include_HEADERS = epplet.h
 
-libepplet_la_SOURCES = epplet.c
+libepplet_la_SOURCES = epplet.c comms.c comms.h
 libepplet_la_CPPFLAGS = $(AM_CPPFLAGS) $(IMLIB2_CFLAGS) $(X_CFLAGS) -D ENLIGHTENMENT_ROOT=\"$(datadir)/e16\"
 libepplet_la_LIBADD = $(IMLIB2_LIBS) $(X_LIBS) -lXext -lX11 -lm
 libepplet_la_LDFLAGS = -version-info 4:0:1
diff --git a/api/comms.c b/api/comms.c
new file mode 100644
index 0000000..ca373e0
--- /dev/null
+++ b/api/comms.c
@@ -0,0 +1,209 @@
+#include "config.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include "comms.h"
+
+static Window   comms_win = 0;
+static Window   my_win = 0;
+
+static void
+_CommsFindCommsWindow(void)
+{
+    unsigned char  *s;
+    Atom            a, ar;
+    unsigned long   num, after;
+    int             format;
+    Window          rt;
+    int             dint;
+    unsigned int    duint;
+
+    a = XInternAtom(disp, "ENLIGHTENMENT_COMMS", True);
+    if (a != None)
+    {
+        s = NULL;
+        XGetWindowProperty(disp, root, a, 0, 14, False, AnyPropertyType, &ar,
+                           &format, &num, &after, &s);
+        if (s)
+        {
+            sscanf((char *)s, "%*s %x", (unsigned int *)&comms_win);
+            XFree(s);
+        }
+        else
+            comms_win = 0;
+
+        if (comms_win)
+        {
+            if (!XGetGeometry(disp, comms_win, &rt, &dint, &dint,
+                              &duint, &duint, &duint, &duint))
+                comms_win = 0;
+            s = NULL;
+            if (comms_win)
+            {
+                XGetWindowProperty(disp, comms_win, a, 0, 14, False,
+                                   AnyPropertyType, &ar, &format, &num,
+                                   &after, &s);
+                if (s)
+                    XFree(s);
+                else
+                    comms_win = 0;
+            }
+        }
+    }
+    if (comms_win)
+        XSelectInput(disp, comms_win,
+                     StructureNotifyMask | SubstructureNotifyMask);
+}
+
+void
+CommsSetup(void)
+{
+    for (;;)
+    {
+        _CommsFindCommsWindow();
+        if (comms_win != None)
+            break;
+        sleep(1);
+    }
+
+    if (!my_win)
+    {
+        my_win = XCreateWindow(disp, root, -10, -10, 1, 1, 0,
+                               CopyFromParent, InputOnly, CopyFromParent,
+                               0, NULL);
+        XSelectInput(disp, my_win,
+                     StructureNotifyMask | SubstructureNotifyMask);
+    }
+}
+
+void
+CommsHandleDestroy(Window xwin)
+{
+    if (xwin == comms_win)
+        comms_win = 0;
+}
+
+int
+CommsHandlePropertyNotify(XEvent *ev)
+{
+    Atom            a = 0;
+
+    if (comms_win)
+        return 0;
+    if (!a)
+        a = XInternAtom(disp, "ENLIGHTENMENT_COMMS", True);
+    if (a == ev->xproperty.atom)
+        CommsSetup();
+    if (comms_win)
+        return 1;
+    return 0;
+}
+
+int
+CommsSend(const char *buf, unsigned int len)
+{
+    static Atom     a = None;
+    char            ss[21];
+    unsigned int    i, j, k;
+    XEvent          ev;
+
+    if (!a)
+        a = XInternAtom(disp, "ENL_MSG", False);
+
+    ev.xclient.type = ClientMessage;
+    ev.xclient.serial = 0;
+    ev.xclient.send_event = True;
+    ev.xclient.window = comms_win;
+    ev.xclient.message_type = a;
+    ev.xclient.format = 8;
+
+    for (i = 0; i < len + 1; i += 12)
+    {
+        snprintf(ss, sizeof(ss), "%8x", (int)my_win);
+        for (j = 0; j < 12; j++)
+        {
+            ss[8 + j] = buf[i + j];
+            if (!buf[i + j])
+                j = 12;
+        }
+        ss[20] = 0;
+        for (k = 0; k < 20; k++)
+            ev.xclient.data.b[k] = ss[k];
+        XSendEvent(disp, comms_win, False, 0, &ev);
+    }
+
+    return len;
+}
+
+static          Bool
+ev_check(Display *d __UNUSED__, XEvent *ev, XPointer p __UNUSED__)
+{
+    if (((ev->type == ClientMessage) && (ev->xclient.window == my_win)) ||
+        ((ev->type == DestroyNotify) &&
+         (ev->xdestroywindow.window == comms_win)))
+        return True;
+    return False;
+}
+
+char           *
+CommsWaitForMessage(void)
+{
+    XEvent          ev;
+    char           *msg = NULL;
+
+    while ((!msg) && (comms_win))
+    {
+        XIfEvent(disp, &ev, ev_check, NULL);
+        if (ev.type == DestroyNotify)
+            comms_win = 0;
+        else
+            msg = CommsHandleClientMessage(&ev);
+    }
+    return msg;
+}
+
+char           *
+CommsHandleClientMessage(XEvent *ev)
+{
+    char            s[13], s2[9], *msg = NULL;
+    int             i;
+    Window          win = 0;
+    static char    *c_msg = NULL;
+
+    if (!ev)
+        return NULL;
+    if (ev->type != ClientMessage)
+        return NULL;
+    s[12] = 0;
+    s2[8] = 0;
+    msg = NULL;
+    for (i = 0; i < 8; i++)
+        s2[i] = ev->xclient.data.b[i];
+    for (i = 0; i < 12; i++)
+        s[i] = ev->xclient.data.b[i + 8];
+    sscanf(s2, "%x", (int *)&win);
+    if (win == comms_win)
+    {
+        if (c_msg)
+        {
+            c_msg = realloc(c_msg, strlen(c_msg) + strlen(s) + 1);
+            if (!c_msg)
+                return NULL;
+            strcat(c_msg, s);
+        }
+        else
+        {
+            c_msg = malloc(strlen(s) + 1);
+            if (!c_msg)
+                return NULL;
+            strcpy(c_msg, s);
+        }
+        if (strlen(s) < 12)
+        {
+            msg = c_msg;
+            c_msg = NULL;
+        }
+    }
+    return msg;
+}
diff --git a/api/comms.h b/api/comms.h
new file mode 100644
index 0000000..2e506c1
--- /dev/null
+++ b/api/comms.h
@@ -0,0 +1,16 @@
+#ifndef COMMS_H
+#define COMMS_H 1
+
+#include <X11/Xlib.h>
+
+extern Display *disp;
+extern Window   root;
+
+void            CommsSetup(void);
+int             CommsSend(const char *buf, unsigned int len);
+char           *CommsWaitForMessage(void);
+void            CommsHandleDestroy(Window xwin);
+int             CommsHandlePropertyNotify(XEvent * ev);
+char           *CommsHandleClientMessage(XEvent * ev);
+
+#endif                          /* COMMS_H */
diff --git a/api/epplet.c b/api/epplet.c
index fe1b433..a7fd405 100644
--- a/api/epplet.c
+++ b/api/epplet.c
@@ -1,5 +1,4 @@
 #include "config.h"
-#include "epplet.h"
 #include <errno.h>
 #include <fcntl.h>
 #include <sys/resource.h>
@@ -13,6 +12,9 @@
 #include <X11/keysym.h>
 #include <X11/extensions/shape.h>
 
+#include "comms.h"
+#include "epplet.h"
+
 #define DEPTH() DefaultDepth(disp, DefaultScreen(disp))
 
 #define DEBUG_EVENTS 0
@@ -33,6 +35,7 @@ typedef struct {
 typedef EppWindow *Epplet_window;
 
 EAPI Display   *disp = NULL;
+Window          root = 0;
 
 static int      window_num = 0; /* For window list */
 static Epplet_window *windows = NULL;   /* List of windows to loop though */
@@ -44,9 +47,6 @@ static Epplet_window mainwin;   /* Always the main epplet window */
 
 static Atom     wmDeleteWindow;
 
-static Window   comms_win = 0;
-static Window   my_win = 0;
-static Window   root = 0;
 static ETimer  *q_first = NULL;
 static XContext xid_context = 0;
 
@@ -138,17 +138,9 @@ typedef struct {
 
 static ConfigDict *config_dict = NULL;
 
-static void     CommsSetup(void);
-static void     CommsFindCommsWindow(void);
-static void     CommsHandleDestroy(Window win);
-static int      CommsHandlePropertyNotify(XEvent * ev);
-static char    *CommsHandleClientMessage(XEvent * ev);
-static char    *CommsWaitForMessage(void);
-
 static void     Epplet_handle_timer(void);
 static ETimer  *Epplet_get_first(void);
 static void     Epplet_handle_event(XEvent * ev);
-static Bool     ev_check(Display * d, XEvent * ev, XPointer p);
 static const char *win_name = NULL;
 static const char *win_version = NULL;
 static const char *win_info = NULL;
@@ -1663,113 +1655,12 @@ Epplet_Loop(void)
     }
 }
 
-static void
-CommsSetup(void)
-{
-    for (;;)
-    {
-        CommsFindCommsWindow();
-        if (comms_win != None)
-            break;
-        sleep(1);
-    }
-
-    if (!my_win)
-    {
-        my_win = XCreateWindow(disp, root, -10, -10, 1, 1, 0,
-                               CopyFromParent, InputOnly, CopyFromParent,
-                               0, NULL);
-        XSelectInput(disp, my_win,
-                     StructureNotifyMask | SubstructureNotifyMask);
-    }
-}
-
-static void
-CommsHandleDestroy(Window win)
-{
-    if (win == comms_win)
-        comms_win = 0;
-}
-
-static int
-CommsHandlePropertyNotify(XEvent *ev)
-{
-    Atom            a = 0;
-
-    if (comms_win)
-        return 0;
-    if (!a)
-        a = XInternAtom(disp, "ENLIGHTENMENT_COMMS", True);
-    if (a == ev->xproperty.atom)
-        CommsSetup();
-    if (comms_win)
-        return 1;
-    return 0;
-}
-
-static void
-CommsFindCommsWindow(void)
-{
-    unsigned char  *s;
-    Atom            a, ar;
-    unsigned long   num, after;
-    int             format;
-    Window          rt;
-    int             dint;
-    unsigned int    duint;
-
-    a = XInternAtom(disp, "ENLIGHTENMENT_COMMS", True);
-    if (a != None)
-    {
-        s = NULL;
-        XGetWindowProperty(disp, root, a, 0, 14, False, AnyPropertyType, &ar,
-                           &format, &num, &after, &s);
-        if (s)
-        {
-            sscanf((char *)s, "%*s %x", (unsigned int *)&comms_win);
-            XFree(s);
-        }
-        else
-            comms_win = 0;
-
-        if (comms_win)
-        {
-            if (!XGetGeometry(disp, comms_win, &rt, &dint, &dint,
-                              &duint, &duint, &duint, &duint))
-                comms_win = 0;
-            s = NULL;
-            if (comms_win)
-            {
-                XGetWindowProperty(disp, comms_win, a, 0, 14, False,
-                                   AnyPropertyType, &ar, &format, &num,
-                                   &after, &s);
-                if (s)
-                    XFree(s);
-                else
-                    comms_win = 0;
-            }
-        }
-    }
-    if (comms_win)
-        XSelectInput(disp, comms_win,
-                     StructureNotifyMask | SubstructureNotifyMask);
-}
-
 void
 Epplet_send_ipc(const char *fmt, ...)
 {
-    static Atom     a = None;
     va_list         args;
     char            buf[1024];
-    char            ss[21];
-    int             i, j, k, len;
-    XEvent          ev;
-
-    if (!fmt || !disp)
-        return;
-
-    if (!a)
-        a = XInternAtom(disp, "ENL_MSG", False);
+    int             len;
 
     va_start(args, fmt);
     len = vsnprintf(buf, sizeof(buf), fmt, args);
@@ -1777,27 +1668,7 @@ Epplet_send_ipc(const char *fmt, ...)
     if (len >= (int)sizeof(buf))
         len = sizeof(buf) - 1;
 
-    ev.xclient.type = ClientMessage;
-    ev.xclient.serial = 0;
-    ev.xclient.send_event = True;
-    ev.xclient.window = comms_win;
-    ev.xclient.message_type = a;
-    ev.xclient.format = 8;
-
-    for (i = 0; i < len + 1; i += 12)
-    {
-        snprintf(ss, sizeof(ss), "%8x", (int)my_win);
-        for (j = 0; j < 12; j++)
-        {
-            ss[8 + j] = buf[i + j];
-            if (!buf[i + j])
-                j = 12;
-        }
-        ss[20] = 0;
-        for (k = 0; k < 20; k++)
-            ev.xclient.data.b[k] = ss[k];
-        XSendEvent(disp, comms_win, False, 0, (XEvent *) & ev);
-    }
+    CommsSend(buf, len);
 }
 
 char           *
@@ -1806,78 +1677,6 @@ Epplet_wait_for_ipc(void)
     return CommsWaitForMessage();
 }
 
-static          Bool
-ev_check(Display *d __UNUSED__, XEvent *ev, XPointer p __UNUSED__)
-{
-    if (((ev->type == ClientMessage) && (ev->xclient.window == my_win)) ||
-        ((ev->type == DestroyNotify) &&
-         (ev->xdestroywindow.window == comms_win)))
-        return True;
-    return False;
-}
-
-static char    *
-CommsWaitForMessage(void)
-{
-    XEvent          ev;
-    char           *msg = NULL;
-
-    while ((!msg) && (comms_win))
-    {
-        XIfEvent(disp, &ev, ev_check, NULL);
-        if (ev.type == DestroyNotify)
-            comms_win = 0;
-        else
-            msg = CommsHandleClientMessage(&ev);
-    }
-    return msg;
-}
-
-static char    *
-CommsHandleClientMessage(XEvent *ev)
-{
-    char            s[13], s2[9], *msg = NULL;
-    int             i;
-    Window          win = 0;
-    static char    *c_msg = NULL;
-
-    if (!ev)
-        return NULL;
-    if (ev->type != ClientMessage)
-        return NULL;
-    s[12] = 0;
-    s2[8] = 0;
-    msg = NULL;
-    for (i = 0; i < 8; i++)
-        s2[i] = ev->xclient.data.b[i];
-    for (i = 0; i < 12; i++)
-        s[i] = ev->xclient.data.b[i + 8];
-    sscanf(s2, "%x", (int *)&win);
-    if (win == comms_win)
-    {
-        if (c_msg)
-        {
-            c_msg = realloc(c_msg, strlen(c_msg) + strlen(s) + 1);
-            if (!c_msg)
-                return NULL;
-            strcat(c_msg, s);
-        }
-        else
-        {
-            c_msg = malloc(strlen(s) + 1);
-            if (!c_msg)
-                return NULL;
-            strcpy(c_msg, s);
-        }
-        if (strlen(s) < 12)
-        {
-            msg = c_msg;
-            c_msg = NULL;
-        }
-    }
-    return msg;
-}
-
 int
 Epplet_get_color(int r, int g, int b)
 {

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.

Reply via email to