api: Move comms stuff to separate file
This commit is contained in:
parent
d7b1d0c813
commit
4ff99896e0
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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 */
|
213
api/epplet.c
213
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)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue