still nothing here. adding ipc stuff in
SVN revision: 2021
This commit is contained in:
parent
aafe74b024
commit
3d038fb94e
2
Makefile
2
Makefile
|
@ -2,7 +2,7 @@
|
||||||
PACKAGE = efm-test
|
PACKAGE = efm-test
|
||||||
VERSION = 0.0.0
|
VERSION = 0.0.0
|
||||||
SRCS = \
|
SRCS = \
|
||||||
viewer.c menus.c
|
viewer.c menus.c ipc.c
|
||||||
HEADERS = \
|
HEADERS = \
|
||||||
viewer.h menus.h
|
viewer.h menus.h
|
||||||
DATA =
|
DATA =
|
||||||
|
|
637
ipc.c
637
ipc.c
|
@ -1,371 +1,340 @@
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
#include <gdk/gdkx.h>
|
#include <gdk/gdkx.h>
|
||||||
#include <gnome.h>
|
|
||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include "ipc.h"
|
||||||
|
#include "viewer.h"
|
||||||
|
|
||||||
typedef struct _client
|
typedef struct _client {
|
||||||
{
|
gchar *name;
|
||||||
gchar *name;
|
Window win;
|
||||||
Window win;
|
gchar *msg;
|
||||||
gchar *msg;
|
gchar *clientname;
|
||||||
gchar *clientname;
|
gchar *version;
|
||||||
gchar *version;
|
gchar *author;
|
||||||
gchar *author;
|
gchar *email;
|
||||||
gchar *email;
|
gchar *web;
|
||||||
gchar *web;
|
gchar *address;
|
||||||
gchar *address;
|
gchar *info;
|
||||||
gchar *info;
|
} Client;
|
||||||
}
|
|
||||||
Client;
|
|
||||||
|
|
||||||
Client *e_client = NULL;
|
Client *e_client = NULL;
|
||||||
|
|
||||||
static Window comms_win = 0;
|
static Window comms_win = 0;
|
||||||
static Window my_win = 0;
|
static Window my_win = 0;
|
||||||
static GdkWindow *gdkwin = NULL;
|
static GdkWindow *gdkwin = NULL;
|
||||||
static GdkWindow *gdkwin2 = NULL;
|
static GdkWindow *gdkwin2 = NULL;
|
||||||
static void (*msg_recieve_callback) (gchar * msg) = NULL;
|
static void (*msg_receive_callback) (gchar * msg) = NULL;
|
||||||
|
|
||||||
gint CommsInit(void (*msg_recieve_func) (gchar * msg));
|
static void CommsSetup(void);
|
||||||
void CommsSend(gchar * s);
|
static GdkFilterReturn CommsFilter(GdkXEvent * gdk_xevent, GdkEvent * event,
|
||||||
|
gpointer data);
|
||||||
|
static Window CommsFindCommsWindow(void);
|
||||||
|
static gchar *CommsGet(Client ** c, XEvent * ev);
|
||||||
|
static Client *MakeClient(Window win);
|
||||||
|
static void ListFreeClient(void *ptr);
|
||||||
|
extern gchar in_init;
|
||||||
|
extern gint gdk_error_warnings;
|
||||||
|
|
||||||
static void CommsSetup(void);
|
gint CommsInit(void (*msg_receive_func) (gchar * msg))
|
||||||
static GdkFilterReturn CommsFilter(GdkXEvent * gdk_xevent, GdkEvent * event, gpointer data);
|
|
||||||
static Window CommsFindCommsWindow(void);
|
|
||||||
static gchar *CommsGet(Client ** c, XEvent * ev);
|
|
||||||
static Client *MakeClient(Window win);
|
|
||||||
static void ListFreeClient(void *ptr);
|
|
||||||
extern gchar in_init;
|
|
||||||
extern gint gdk_error_warnings;
|
|
||||||
|
|
||||||
gint
|
|
||||||
CommsInit(void (*msg_recieve_func) (gchar * msg))
|
|
||||||
{
|
{
|
||||||
Window win;
|
Window win;
|
||||||
gchar st[32];
|
gchar st[32];
|
||||||
Client *cl;
|
Client *cl;
|
||||||
|
|
||||||
CommsSetup();
|
CommsSetup();
|
||||||
comms_win = win = CommsFindCommsWindow();
|
comms_win = win = CommsFindCommsWindow();
|
||||||
cl = MakeClient(win);
|
cl = MakeClient(win);
|
||||||
g_snprintf(st, sizeof(st), "%8x", (int)win);
|
g_snprintf(st, sizeof(st), "%8x", (int) win);
|
||||||
cl->name = g_strdup(st);
|
cl->name = g_strdup(st);
|
||||||
e_client = cl;
|
e_client = cl;
|
||||||
gdkwin = gdk_window_foreign_new(win);
|
gdkwin = gdk_window_foreign_new(win);
|
||||||
gdk_window_add_filter(gdkwin, CommsFilter, NULL);
|
gdk_window_add_filter(gdkwin, CommsFilter, NULL);
|
||||||
gdkwin2 = gdk_window_foreign_new(my_win);
|
gdkwin2 = gdk_window_foreign_new(my_win);
|
||||||
gdk_window_add_filter(gdkwin2, CommsFilter, NULL);
|
gdk_window_add_filter(gdkwin2, CommsFilter, NULL);
|
||||||
XSelectInput(GDK_DISPLAY(), win, StructureNotifyMask | SubstructureNotifyMask);
|
XSelectInput(GDK_DISPLAY(), win,
|
||||||
msg_recieve_callback = msg_recieve_func;
|
StructureNotifyMask | SubstructureNotifyMask);
|
||||||
return 1;
|
msg_receive_callback = msg_receive_func;
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void CommsSend(gchar * s)
|
||||||
CommsSend(gchar * s)
|
|
||||||
{
|
{
|
||||||
gchar ss[21];
|
gchar ss[21];
|
||||||
int i, j, k, len;
|
int i, j, k, len;
|
||||||
XEvent ev;
|
XEvent ev;
|
||||||
static Atom a = 0;
|
static Atom a = 0;
|
||||||
Client *c;
|
Client *c;
|
||||||
|
|
||||||
c = e_client;
|
c = e_client;
|
||||||
if ((!s) || (!c))
|
if ((!s) || (!c))
|
||||||
return;
|
return;
|
||||||
len = strlen(s);
|
len = strlen(s);
|
||||||
if (!a)
|
if (!a)
|
||||||
a = XInternAtom(GDK_DISPLAY(), "ENL_MSG", True);
|
a = XInternAtom(GDK_DISPLAY(), "ENL_MSG", True);
|
||||||
ev.xclient.type = ClientMessage;
|
ev.xclient.type = ClientMessage;
|
||||||
ev.xclient.serial = 0;
|
ev.xclient.serial = 0;
|
||||||
ev.xclient.send_event = True;
|
ev.xclient.send_event = True;
|
||||||
ev.xclient.window = c->win;
|
ev.xclient.window = c->win;
|
||||||
ev.xclient.message_type = a;
|
ev.xclient.message_type = a;
|
||||||
ev.xclient.format = 8;
|
ev.xclient.format = 8;
|
||||||
|
|
||||||
for (i = 0; i < len + 1; i += 12)
|
for (i = 0; i < len + 1; i += 12) {
|
||||||
{
|
g_snprintf(ss, sizeof(ss), "%8x", (int) my_win);
|
||||||
g_snprintf(ss, sizeof(ss), "%8x", (int)my_win);
|
for (j = 0; j < 12; j++) {
|
||||||
for (j = 0; j < 12; j++)
|
ss[8 + j] = s[i + j];
|
||||||
{
|
if (!s[i + j])
|
||||||
ss[8 + j] = s[i + j];
|
j = 12;
|
||||||
if (!s[i + j])
|
}
|
||||||
j = 12;
|
ss[20] = 0;
|
||||||
|
for (k = 0; k < 20; k++)
|
||||||
|
ev.xclient.data.b[k] = ss[k];
|
||||||
|
XSendEvent(GDK_DISPLAY(), c->win, False, 0, (XEvent *) & ev);
|
||||||
}
|
}
|
||||||
ss[20] = 0;
|
return;
|
||||||
for (k = 0; k < 20; k++)
|
|
||||||
ev.xclient.data.b[k] = ss[k];
|
|
||||||
XSendEvent(GDK_DISPLAY(), c->win, False, 0, (XEvent *) & ev);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
static GdkFilterReturn
|
||||||
e_ipc_cb_quit(GtkWidget *widget, gpointer data)
|
|
||||||
{
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static GdkFilterReturn
|
|
||||||
CommsFilter(GdkXEvent * gdk_xevent, GdkEvent * event, gpointer data)
|
CommsFilter(GdkXEvent * gdk_xevent, GdkEvent * event, gpointer data)
|
||||||
{
|
{
|
||||||
XEvent *xevent;
|
XEvent *xevent;
|
||||||
gchar *msg = NULL;
|
gchar *msg = NULL;
|
||||||
Client *c = NULL;
|
Client *c = NULL;
|
||||||
static Atom a;
|
static Atom a;
|
||||||
|
|
||||||
if (!a)
|
data = NULL;
|
||||||
a = XInternAtom(GDK_DISPLAY(), "ENL_MSG", True);
|
|
||||||
xevent = (XEvent *) gdk_xevent;
|
if (!a)
|
||||||
switch (xevent->type)
|
a = XInternAtom(GDK_DISPLAY(), "ENL_MSG", True);
|
||||||
{
|
xevent = (XEvent *) gdk_xevent;
|
||||||
case DestroyNotify:
|
switch (xevent->type) {
|
||||||
if (xevent->xdestroywindow.window == comms_win)
|
case DestroyNotify:
|
||||||
{
|
if (xevent->xdestroywindow.window == comms_win) {
|
||||||
gint i;
|
gint i;
|
||||||
|
|
||||||
comms_win = 0;
|
comms_win = 0;
|
||||||
if (!in_init)
|
if (!in_init) {
|
||||||
{
|
for (i = 0; ((i < 20) && (!comms_win)); i++) {
|
||||||
for (i = 0; ((i < 20) && (!comms_win)); i++)
|
if ((comms_win = CommsFindCommsWindow())) {
|
||||||
{
|
gchar st[256];
|
||||||
if (comms_win = CommsFindCommsWindow())
|
|
||||||
{
|
ListFreeClient(e_client);
|
||||||
gchar st[256];
|
e_client = MakeClient(comms_win);
|
||||||
|
g_snprintf(st, sizeof(st), "%8x", (int) comms_win);
|
||||||
ListFreeClient(e_client);
|
e_client->name = g_strdup(st);
|
||||||
e_client = MakeClient(comms_win);
|
if (gdkwin)
|
||||||
g_snprintf(st, sizeof(st), "%8x", (int)comms_win);
|
gdk_window_unref(gdkwin);
|
||||||
e_client->name = g_strdup(st);
|
gdkwin = gdk_window_foreign_new(comms_win);
|
||||||
if (gdkwin)
|
gdk_window_add_filter(gdkwin, CommsFilter, NULL);
|
||||||
gdk_window_unref(gdkwin);
|
XSelectInput(GDK_DISPLAY(), comms_win,
|
||||||
gdkwin = gdk_window_foreign_new(comms_win);
|
StructureNotifyMask |
|
||||||
gdk_window_add_filter(gdkwin, CommsFilter, NULL);
|
SubstructureNotifyMask);
|
||||||
XSelectInput(GDK_DISPLAY(), comms_win, StructureNotifyMask | SubstructureNotifyMask);
|
}
|
||||||
}
|
sleep(1);
|
||||||
sleep(1);
|
}
|
||||||
|
}
|
||||||
|
if (!comms_win) {
|
||||||
|
GtkWidget *win, *label, *align, *frame, *button, *vbox;
|
||||||
|
|
||||||
|
win = gtk_window_new(GTK_WINDOW_DIALOG);
|
||||||
|
gtk_window_set_policy(GTK_WINDOW(win), 0, 0, 1);
|
||||||
|
gtk_window_set_position(GTK_WINDOW(win), GTK_WIN_POS_CENTER);
|
||||||
|
frame = gtk_frame_new(NULL);
|
||||||
|
gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_OUT);
|
||||||
|
align = gtk_alignment_new(0.0, 0.0, 0.0, 0.0);
|
||||||
|
gtk_container_set_border_width(GTK_CONTAINER(align), 32);
|
||||||
|
vbox = gtk_vbox_new(FALSE, 5);
|
||||||
|
button = gtk_button_new_with_label("Bye bye!");
|
||||||
|
gtk_signal_connect(GTK_OBJECT(button), "clicked",
|
||||||
|
GTK_SIGNAL_FUNC(on_exit_application), NULL);
|
||||||
|
label = gtk_label_new("EEEEEEEEEEEEEEK! HELP! HEEEEEEEEEELP!\n"
|
||||||
|
"\n"
|
||||||
|
"Enlightenemnt dissapeared on me!\n"
|
||||||
|
"\n"
|
||||||
|
"Someone help me - I'm drowning - drowning\n"
|
||||||
|
"\n"
|
||||||
|
"That's it. I'm out of here. I can't deal with the\n"
|
||||||
|
"idea of losing Enlightenment. I'm going to jump and\n"
|
||||||
|
"don't try and stop me.\n" "\n");
|
||||||
|
gtk_container_add(GTK_CONTAINER(win), frame);
|
||||||
|
gtk_container_add(GTK_CONTAINER(frame), align);
|
||||||
|
gtk_container_add(GTK_CONTAINER(align), vbox);
|
||||||
|
gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
|
||||||
|
gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 0);
|
||||||
|
gtk_widget_show_all(win);
|
||||||
|
gtk_main();
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
gdk_window_destroy_notify(((GdkEventAny *) event)->window);
|
||||||
}
|
}
|
||||||
}
|
return GDK_FILTER_REMOVE;
|
||||||
if (!comms_win)
|
break;
|
||||||
{
|
case ClientMessage:
|
||||||
GtkWidget *win, *label, *align, *frame, *button, *vbox;
|
if (xevent->xclient.message_type != a)
|
||||||
|
return GDK_FILTER_CONTINUE;
|
||||||
win = gtk_window_new(GTK_WINDOW_DIALOG);
|
msg = CommsGet(&c, xevent);
|
||||||
gtk_window_set_policy(GTK_WINDOW(win), 0, 0, 1);
|
if (msg) {
|
||||||
gtk_window_set_position(GTK_WINDOW(win), GTK_WIN_POS_CENTER);
|
if (msg_receive_callback)
|
||||||
frame = gtk_frame_new(NULL);
|
(*msg_receive_callback) (msg);
|
||||||
gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_OUT);
|
g_free(msg);
|
||||||
align = gtk_alignment_new(0.0, 0.0, 0.0, 0.0);
|
return GDK_FILTER_REMOVE;
|
||||||
gtk_container_set_border_width(GTK_CONTAINER(align), 32);
|
}
|
||||||
vbox = gtk_vbox_new(FALSE, 5);
|
break;
|
||||||
button = gtk_button_new_with_label(_("Bye bye!"));
|
default:
|
||||||
gtk_signal_connect(GTK_OBJECT(button), "clicked",
|
return GDK_FILTER_REMOVE;
|
||||||
GTK_SIGNAL_FUNC(e_ipc_cb_quit), NULL);
|
|
||||||
label = gtk_label_new(_("EEEEEEEEEEEEEEK! HELP! HEEEEEEEEEELP!\n"
|
|
||||||
"\n"
|
|
||||||
"Enlightenemnt dissapeared on me!\n"
|
|
||||||
"\n"
|
|
||||||
"Someone help me - I'm drowning - drowning\n"
|
|
||||||
"\n"
|
|
||||||
"That's it. I'm out of here. I can't deal with the\n"
|
|
||||||
"idea of losing Enlightenment. I'm going to jump and\n"
|
|
||||||
"don't try and stop me.\n"
|
|
||||||
"\n"
|
|
||||||
));
|
|
||||||
gtk_container_add(GTK_CONTAINER(win), frame);
|
|
||||||
gtk_container_add(GTK_CONTAINER(frame), align);
|
|
||||||
gtk_container_add(GTK_CONTAINER(align), vbox);
|
|
||||||
gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
|
|
||||||
gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 0);
|
|
||||||
gtk_widget_show_all(win);
|
|
||||||
gtk_main();
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
return GDK_FILTER_REMOVE;
|
||||||
{
|
}
|
||||||
gdk_window_destroy_notify(((GdkEventAny *) event)->window);
|
|
||||||
|
static void CommsSetup(void)
|
||||||
|
{
|
||||||
|
my_win = XCreateSimpleWindow(GDK_DISPLAY(), GDK_ROOT_WINDOW(),
|
||||||
|
-100, -100, 5, 5, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Window CommsFindCommsWindow(void)
|
||||||
|
{
|
||||||
|
unsigned char *s;
|
||||||
|
Atom a, ar;
|
||||||
|
unsigned long num, after;
|
||||||
|
int format;
|
||||||
|
Window win = 0;
|
||||||
|
Window rt;
|
||||||
|
int dint;
|
||||||
|
unsigned int duint;
|
||||||
|
|
||||||
|
a = XInternAtom(GDK_DISPLAY(), "ENLIGHTENMENT_COMMS", True);
|
||||||
|
if (a != None) {
|
||||||
|
s = NULL;
|
||||||
|
XGetWindowProperty(GDK_DISPLAY(), GDK_ROOT_WINDOW(), a, 0, 14, False,
|
||||||
|
AnyPropertyType, &ar, &format, &num, &after, &s);
|
||||||
|
if (s) {
|
||||||
|
sscanf((char *) s, "%*s %x", (unsigned int *) &win);
|
||||||
|
XFree(s);
|
||||||
|
}
|
||||||
|
if (win) {
|
||||||
|
gint p;
|
||||||
|
|
||||||
|
p = gdk_error_warnings;
|
||||||
|
gdk_error_warnings = 0;
|
||||||
|
if (!XGetGeometry(GDK_DISPLAY(), win, &rt, &dint, &dint,
|
||||||
|
&duint, &duint, &duint, &duint))
|
||||||
|
win = 0;
|
||||||
|
gdk_flush();
|
||||||
|
gdk_error_warnings = p;
|
||||||
|
s = NULL;
|
||||||
|
if (win) {
|
||||||
|
XGetWindowProperty(GDK_DISPLAY(), win, a, 0, 14, False,
|
||||||
|
AnyPropertyType, &ar, &format, &num, &after,
|
||||||
|
&s);
|
||||||
|
if (s)
|
||||||
|
XFree(s);
|
||||||
|
else
|
||||||
|
win = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return GDK_FILTER_REMOVE;
|
return win;
|
||||||
break;
|
}
|
||||||
case ClientMessage:
|
|
||||||
if (xevent->xclient.message_type != a)
|
static gchar *CommsGet(Client ** c, XEvent * ev)
|
||||||
return GDK_FILTER_CONTINUE;
|
{
|
||||||
msg = CommsGet(&c, xevent);
|
gchar s[13], s2[9], *msg;
|
||||||
if (msg)
|
int i;
|
||||||
{
|
Window win;
|
||||||
if (msg_recieve_callback)
|
Client *cl;
|
||||||
(*msg_recieve_callback) (msg);
|
static Atom a;
|
||||||
g_free(msg);
|
|
||||||
return GDK_FILTER_REMOVE;
|
if (!a)
|
||||||
|
a = XInternAtom(GDK_DISPLAY(), "ENL_MSG", True);
|
||||||
|
if ((!ev) || (!c))
|
||||||
|
return (NULL);
|
||||||
|
if (ev->type != ClientMessage)
|
||||||
|
return (NULL);
|
||||||
|
if (ev->xclient.message_type != a)
|
||||||
|
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);
|
||||||
|
cl = e_client;
|
||||||
|
if (!cl)
|
||||||
|
return (NULL);
|
||||||
|
if (cl->msg) {
|
||||||
|
/* append text to end of msg */
|
||||||
|
cl->msg = g_realloc(cl->msg, strlen(cl->msg) + strlen(s) + 1);
|
||||||
|
if (!cl->msg)
|
||||||
|
return (NULL);
|
||||||
|
strcat(cl->msg, s);
|
||||||
|
} else {
|
||||||
|
/* new msg */
|
||||||
|
cl->msg = g_malloc(strlen(s) + 1);
|
||||||
|
if (!cl->msg)
|
||||||
|
return (NULL);
|
||||||
|
strcpy(cl->msg, s);
|
||||||
}
|
}
|
||||||
break;
|
if (strlen(s) < 12) {
|
||||||
default:
|
msg = cl->msg;
|
||||||
return GDK_FILTER_REMOVE;
|
cl->msg = NULL;
|
||||||
}
|
*c = cl;
|
||||||
return GDK_FILTER_REMOVE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
CommsSetup(void)
|
|
||||||
{
|
|
||||||
my_win = XCreateSimpleWindow(GDK_DISPLAY(), GDK_ROOT_WINDOW(),
|
|
||||||
-100, -100, 5, 5, 0, 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static Window
|
|
||||||
CommsFindCommsWindow(void)
|
|
||||||
{
|
|
||||||
unsigned char *s;
|
|
||||||
Atom a, ar;
|
|
||||||
unsigned long num, after;
|
|
||||||
int format;
|
|
||||||
Window win = 0;
|
|
||||||
Window rt;
|
|
||||||
int dint;
|
|
||||||
unsigned int duint;
|
|
||||||
|
|
||||||
a = XInternAtom(GDK_DISPLAY(), "ENLIGHTENMENT_COMMS", True);
|
|
||||||
if (a != None)
|
|
||||||
{
|
|
||||||
s = NULL;
|
|
||||||
XGetWindowProperty(GDK_DISPLAY(), GDK_ROOT_WINDOW(), a, 0, 14, False,
|
|
||||||
AnyPropertyType, &ar, &format, &num, &after, &s);
|
|
||||||
if (s)
|
|
||||||
{
|
|
||||||
sscanf((char *)s, "%*s %x", (unsigned int *)&win);
|
|
||||||
XFree(s);
|
|
||||||
}
|
}
|
||||||
if (win)
|
return (msg);
|
||||||
{
|
|
||||||
gint p;
|
|
||||||
|
|
||||||
p = gdk_error_warnings;
|
|
||||||
gdk_error_warnings = 0;
|
|
||||||
if (!XGetGeometry(GDK_DISPLAY(), win, &rt, &dint, &dint,
|
|
||||||
&duint, &duint, &duint, &duint))
|
|
||||||
win = 0;
|
|
||||||
gdk_flush();
|
|
||||||
gdk_error_warnings = p;
|
|
||||||
s = NULL;
|
|
||||||
if (win)
|
|
||||||
{
|
|
||||||
XGetWindowProperty(GDK_DISPLAY(), win, a, 0, 14, False,
|
|
||||||
AnyPropertyType, &ar, &format, &num, &after,
|
|
||||||
&s);
|
|
||||||
if (s)
|
|
||||||
XFree(s);
|
|
||||||
else
|
|
||||||
win = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return win;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gchar *
|
static Client *MakeClient(Window win)
|
||||||
CommsGet(Client ** c, XEvent * ev)
|
|
||||||
{
|
{
|
||||||
gchar s[13], s2[9], *msg;
|
Client *c;
|
||||||
int i;
|
|
||||||
Window win;
|
c = g_malloc(sizeof(Client));
|
||||||
Client *cl;
|
if (!c)
|
||||||
static Atom a;
|
return (NULL);
|
||||||
|
c->name = NULL;
|
||||||
if (!a)
|
c->win = win;
|
||||||
a = XInternAtom(GDK_DISPLAY(), "ENL_MSG", True);
|
c->msg = NULL;
|
||||||
if ((!ev) || (!c))
|
c->clientname = NULL;
|
||||||
return (NULL);
|
c->version = NULL;
|
||||||
if (ev->type != ClientMessage)
|
c->author = NULL;
|
||||||
return (NULL);
|
c->email = NULL;
|
||||||
if (ev->xclient.message_type != a)
|
c->web = NULL;
|
||||||
return (NULL);
|
c->address = NULL;
|
||||||
s[12] = 0;
|
c->info = NULL;
|
||||||
s2[8] = 0;
|
return (c);
|
||||||
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);
|
|
||||||
cl = e_client;
|
|
||||||
if (!cl)
|
|
||||||
return (NULL);
|
|
||||||
if (cl->msg)
|
|
||||||
{
|
|
||||||
/* append text to end of msg */
|
|
||||||
cl->msg = g_realloc(cl->msg, strlen(cl->msg) + strlen(s) + 1);
|
|
||||||
if (!cl->msg)
|
|
||||||
return (NULL);
|
|
||||||
strcat(cl->msg, s);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* new msg */
|
|
||||||
cl->msg = g_malloc(strlen(s) + 1);
|
|
||||||
if (!cl->msg)
|
|
||||||
return (NULL);
|
|
||||||
strcpy(cl->msg, s);
|
|
||||||
}
|
|
||||||
if (strlen(s) < 12)
|
|
||||||
{
|
|
||||||
msg = cl->msg;
|
|
||||||
cl->msg = NULL;
|
|
||||||
*c = cl;
|
|
||||||
}
|
|
||||||
return (msg);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static Client *
|
static void ListFreeClient(void *ptr)
|
||||||
MakeClient(Window win)
|
|
||||||
{
|
{
|
||||||
Client *c;
|
Client *c;
|
||||||
|
|
||||||
c = g_malloc(sizeof(Client));
|
c = (Client *) ptr;
|
||||||
if (!c)
|
if (!c)
|
||||||
return (NULL);
|
return;
|
||||||
c->name = NULL;
|
if (c->name)
|
||||||
c->win = win;
|
g_free(c->name);
|
||||||
c->msg = NULL;
|
if (c->msg)
|
||||||
c->clientname = NULL;
|
g_free(c->msg);
|
||||||
c->version = NULL;
|
if (c->clientname)
|
||||||
c->author = NULL;
|
g_free(c->clientname);
|
||||||
c->email = NULL;
|
if (c->version)
|
||||||
c->web = NULL;
|
g_free(c->version);
|
||||||
c->address = NULL;
|
if (c->author)
|
||||||
c->info = NULL;
|
g_free(c->author);
|
||||||
return (c);
|
if (c->email)
|
||||||
}
|
g_free(c->email);
|
||||||
|
if (c->web)
|
||||||
static void
|
g_free(c->web);
|
||||||
ListFreeClient(void *ptr)
|
if (c->address)
|
||||||
{
|
g_free(c->address);
|
||||||
Client *c;
|
if (c->info)
|
||||||
|
g_free(c->info);
|
||||||
c = (Client *) ptr;
|
g_free(c);
|
||||||
if (!c)
|
return;
|
||||||
return;
|
|
||||||
if (c->name)
|
|
||||||
g_free(c->name);
|
|
||||||
if (c->msg)
|
|
||||||
g_free(c->msg);
|
|
||||||
if (c->clientname)
|
|
||||||
g_free(c->clientname);
|
|
||||||
if (c->version)
|
|
||||||
g_free(c->version);
|
|
||||||
if (c->author)
|
|
||||||
g_free(c->author);
|
|
||||||
if (c->email)
|
|
||||||
g_free(c->email);
|
|
||||||
if (c->web)
|
|
||||||
g_free(c->web);
|
|
||||||
if (c->address)
|
|
||||||
g_free(c->address);
|
|
||||||
if (c->info)
|
|
||||||
g_free(c->info);
|
|
||||||
g_free(c);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
70
viewer.c
70
viewer.c
|
@ -6,12 +6,17 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "viewer.h"
|
#include "viewer.h"
|
||||||
#include "menus.h"
|
#include "menus.h"
|
||||||
|
#include "ipc.h"
|
||||||
|
|
||||||
extern GtkTooltips *tooltips;
|
extern GtkTooltips *tooltips;
|
||||||
extern GtkAccelGroup *accel_group;
|
extern GtkAccelGroup *accel_group;
|
||||||
|
|
||||||
GtkWidget *clist;
|
GtkWidget *clist;
|
||||||
|
|
||||||
|
static void receive_ipc_msg(gchar * msg);
|
||||||
|
gchar *e_ipc_msg = NULL;
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
selection_made(GtkWidget *clist, gint row, gint column, GdkEventButton *event,
|
selection_made(GtkWidget *clist, gint row, gint column, GdkEventButton *event,
|
||||||
gpointer data)
|
gpointer data)
|
||||||
|
@ -72,6 +77,9 @@ create_list_window(void)
|
||||||
GtkWidget *panes;
|
GtkWidget *panes;
|
||||||
GtkWidget *scrollybit;
|
GtkWidget *scrollybit;
|
||||||
GtkWidget *vbox;
|
GtkWidget *vbox;
|
||||||
|
GtkWidget *frames;
|
||||||
|
GtkWidget *alignment;
|
||||||
|
GtkWidget *frame_vbox;
|
||||||
|
|
||||||
|
|
||||||
list_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
|
list_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
|
||||||
|
@ -139,11 +147,35 @@ create_list_window(void)
|
||||||
gtk_signal_connect(GTK_OBJECT(clist), "click_column",
|
gtk_signal_connect(GTK_OBJECT(clist), "click_column",
|
||||||
GTK_SIGNAL_FUNC(on_resort_columns), NULL);
|
GTK_SIGNAL_FUNC(on_resort_columns), NULL);
|
||||||
|
|
||||||
|
vbox = gtk_vbox_new(FALSE,0);
|
||||||
|
gtk_widget_show(vbox);
|
||||||
|
frames = gtk_frame_new("Edit Keybinding Properties");
|
||||||
|
gtk_container_set_border_width(GTK_CONTAINER(frames),2);
|
||||||
|
gtk_widget_show(frames);
|
||||||
|
gtk_paned_pack2(GTK_PANED(panes),vbox,FALSE,TRUE);
|
||||||
|
gtk_box_pack_start(GTK_BOX(vbox), frames, TRUE, TRUE, 0);
|
||||||
|
|
||||||
|
|
||||||
|
frame_vbox = gtk_vbox_new(FALSE,3);
|
||||||
|
gtk_widget_show(frame_vbox);
|
||||||
|
|
||||||
|
gtk_container_set_border_width(GTK_CONTAINER(frame_vbox),4);
|
||||||
|
gtk_container_add(GTK_CONTAINER(frames), frame_vbox);
|
||||||
|
|
||||||
|
|
||||||
return list_window;
|
return list_window;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void receive_ipc_msg(gchar * msg)
|
||||||
|
{
|
||||||
|
gdk_flush();
|
||||||
|
e_ipc_msg = g_strdup(msg);
|
||||||
|
/* */
|
||||||
|
gtk_main_quit();
|
||||||
|
/* got_e_ipc_msg = 1;*/
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
GtkWidget *lister;
|
GtkWidget *lister;
|
||||||
|
@ -154,6 +186,44 @@ int main(int argc, char *argv[])
|
||||||
tooltips = gtk_tooltips_new();
|
tooltips = gtk_tooltips_new();
|
||||||
accel_group = gtk_accel_group_new();
|
accel_group = gtk_accel_group_new();
|
||||||
|
|
||||||
|
if(!CommsInit(receive_ipc_msg)) {
|
||||||
|
GtkWidget *win, *label, *align, *frame, *button, *vbox;
|
||||||
|
|
||||||
|
win = gtk_window_new(GTK_WINDOW_POPUP);
|
||||||
|
gtk_window_set_policy(GTK_WINDOW(win), 0, 0, 1);
|
||||||
|
gtk_window_set_position(GTK_WINDOW(win), GTK_WIN_POS_CENTER);
|
||||||
|
frame = gtk_frame_new(NULL);
|
||||||
|
gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_OUT);
|
||||||
|
align = gtk_alignment_new(0.0, 0.0, 0.0, 0.0);
|
||||||
|
gtk_container_set_border_width(GTK_CONTAINER(align), 32);
|
||||||
|
vbox = gtk_vbox_new(FALSE, 5);
|
||||||
|
button = gtk_button_new_with_label("Quit");
|
||||||
|
gtk_signal_connect(GTK_OBJECT(button), "clicked",
|
||||||
|
GTK_SIGNAL_FUNC(on_exit_application), NULL);
|
||||||
|
label = gtk_label_new("You are not running Enlightenment\n"
|
||||||
|
"\n"
|
||||||
|
"This window manager has to be running in order\n"
|
||||||
|
"to configure it.\n" "\n");
|
||||||
|
gtk_container_add(GTK_CONTAINER(win), frame);
|
||||||
|
gtk_container_add(GTK_CONTAINER(frame), align);
|
||||||
|
gtk_container_add(GTK_CONTAINER(align), vbox);
|
||||||
|
gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
|
||||||
|
gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 0);
|
||||||
|
gtk_widget_show_all(win);
|
||||||
|
gtk_main();
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
CommsSend("set clientname Enlightenment Configuration Utility");
|
||||||
|
CommsSend("set version 0.1.0");
|
||||||
|
CommsSend("set author Mandrake (Geoff Harrison)");
|
||||||
|
CommsSend("set email mandrake@mandrake.net");
|
||||||
|
CommsSend("set web http://mandrake.net/");
|
||||||
|
CommsSend("set address C/O VA Linux Systems, USA");
|
||||||
|
CommsSend("set info "
|
||||||
|
"This is the Enlightenemnt KeyBindings Configuration Utility\n"
|
||||||
|
"that uses Enlightenment's IPC mechanism to configure\n"
|
||||||
|
"it remotely.");
|
||||||
|
|
||||||
lister = create_list_window();
|
lister = create_list_window();
|
||||||
|
|
||||||
gtk_widget_show(lister);
|
gtk_widget_show(lister);
|
||||||
|
|
Loading…
Reference in New Issue