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.