still nothing here. adding ipc stuff in

SVN revision: 2021
This commit is contained in:
Mandrake 2000-02-08 23:23:44 +00:00
parent aafe74b024
commit 3d038fb94e
3 changed files with 374 additions and 335 deletions

View File

@ -2,7 +2,7 @@
PACKAGE = efm-test
VERSION = 0.0.0
SRCS = \
viewer.c menus.c
viewer.c menus.c ipc.c
HEADERS = \
viewer.h menus.h
DATA =

133
ipc.c
View File

@ -1,14 +1,15 @@
#include <gtk/gtk.h>
#include <gdk/gdk.h>
#include <gdk/gdkx.h>
#include <gnome.h>
#include <X11/Xlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "ipc.h"
#include "viewer.h"
typedef struct _client
{
typedef struct _client {
gchar *name;
Window win;
gchar *msg;
@ -19,8 +20,7 @@ typedef struct _client
gchar *web;
gchar *address;
gchar *info;
}
Client;
} Client;
Client *e_client = NULL;
@ -28,13 +28,11 @@ static Window comms_win = 0;
static Window my_win = 0;
static GdkWindow *gdkwin = NULL;
static GdkWindow *gdkwin2 = NULL;
static void (*msg_recieve_callback) (gchar * msg) = NULL;
gint CommsInit(void (*msg_recieve_func) (gchar * msg));
void CommsSend(gchar * s);
static void (*msg_receive_callback) (gchar * msg) = NULL;
static void CommsSetup(void);
static GdkFilterReturn CommsFilter(GdkXEvent * gdk_xevent, GdkEvent * event, gpointer data);
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);
@ -42,8 +40,7 @@ static void ListFreeClient(void *ptr);
extern gchar in_init;
extern gint gdk_error_warnings;
gint
CommsInit(void (*msg_recieve_func) (gchar * msg))
gint CommsInit(void (*msg_receive_func) (gchar * msg))
{
Window win;
gchar st[32];
@ -52,20 +49,20 @@ CommsInit(void (*msg_recieve_func) (gchar * msg))
CommsSetup();
comms_win = win = CommsFindCommsWindow();
cl = MakeClient(win);
g_snprintf(st, sizeof(st), "%8x", (int)win);
g_snprintf(st, sizeof(st), "%8x", (int) win);
cl->name = g_strdup(st);
e_client = cl;
gdkwin = gdk_window_foreign_new(win);
gdk_window_add_filter(gdkwin, CommsFilter, NULL);
gdkwin2 = gdk_window_foreign_new(my_win);
gdk_window_add_filter(gdkwin2, CommsFilter, NULL);
XSelectInput(GDK_DISPLAY(), win, StructureNotifyMask | SubstructureNotifyMask);
msg_recieve_callback = msg_recieve_func;
XSelectInput(GDK_DISPLAY(), win,
StructureNotifyMask | SubstructureNotifyMask);
msg_receive_callback = msg_receive_func;
return 1;
}
void
CommsSend(gchar * s)
void CommsSend(gchar * s)
{
gchar ss[21];
int i, j, k, len;
@ -86,11 +83,9 @@ CommsSend(gchar * s)
ev.xclient.message_type = a;
ev.xclient.format = 8;
for (i = 0; i < len + 1; i += 12)
{
g_snprintf(ss, sizeof(ss), "%8x", (int)my_win);
for (j = 0; j < 12; j++)
{
for (i = 0; i < len + 1; i += 12) {
g_snprintf(ss, sizeof(ss), "%8x", (int) my_win);
for (j = 0; j < 12; j++) {
ss[8 + j] = s[i + j];
if (!s[i + j])
j = 12;
@ -103,12 +98,6 @@ CommsSend(gchar * s)
return;
}
void
e_ipc_cb_quit(GtkWidget *widget, gpointer data)
{
exit(1);
}
static GdkFilterReturn
CommsFilter(GdkXEvent * gdk_xevent, GdkEvent * event, gpointer data)
{
@ -117,40 +106,38 @@ CommsFilter(GdkXEvent * gdk_xevent, GdkEvent * event, gpointer data)
Client *c = NULL;
static Atom a;
data = NULL;
if (!a)
a = XInternAtom(GDK_DISPLAY(), "ENL_MSG", True);
xevent = (XEvent *) gdk_xevent;
switch (xevent->type)
{
switch (xevent->type) {
case DestroyNotify:
if (xevent->xdestroywindow.window == comms_win)
{
if (xevent->xdestroywindow.window == comms_win) {
gint i;
comms_win = 0;
if (!in_init)
{
for (i = 0; ((i < 20) && (!comms_win)); i++)
{
if (comms_win = CommsFindCommsWindow())
{
if (!in_init) {
for (i = 0; ((i < 20) && (!comms_win)); i++) {
if ((comms_win = CommsFindCommsWindow())) {
gchar st[256];
ListFreeClient(e_client);
e_client = MakeClient(comms_win);
g_snprintf(st, sizeof(st), "%8x", (int)comms_win);
g_snprintf(st, sizeof(st), "%8x", (int) comms_win);
e_client->name = g_strdup(st);
if (gdkwin)
gdk_window_unref(gdkwin);
gdkwin = gdk_window_foreign_new(comms_win);
gdk_window_add_filter(gdkwin, CommsFilter, NULL);
XSelectInput(GDK_DISPLAY(), comms_win, StructureNotifyMask | SubstructureNotifyMask);
XSelectInput(GDK_DISPLAY(), comms_win,
StructureNotifyMask |
SubstructureNotifyMask);
}
sleep(1);
}
}
if (!comms_win)
{
if (!comms_win) {
GtkWidget *win, *label, *align, *frame, *button, *vbox;
win = gtk_window_new(GTK_WINDOW_DIALOG);
@ -161,10 +148,10 @@ CommsFilter(GdkXEvent * gdk_xevent, GdkEvent * event, gpointer data)
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!"));
button = gtk_button_new_with_label("Bye bye!");
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(e_ipc_cb_quit), NULL);
label = gtk_label_new(_("EEEEEEEEEEEEEEK! HELP! HEEEEEEEEEELP!\n"
GTK_SIGNAL_FUNC(on_exit_application), NULL);
label = gtk_label_new("EEEEEEEEEEEEEEK! HELP! HEEEEEEEEEELP!\n"
"\n"
"Enlightenemnt dissapeared on me!\n"
"\n"
@ -172,9 +159,7 @@ CommsFilter(GdkXEvent * gdk_xevent, GdkEvent * event, gpointer data)
"\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"
));
"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);
@ -184,9 +169,7 @@ CommsFilter(GdkXEvent * gdk_xevent, GdkEvent * event, gpointer data)
gtk_main();
exit(1);
}
}
else
{
} else {
gdk_window_destroy_notify(((GdkEventAny *) event)->window);
}
return GDK_FILTER_REMOVE;
@ -195,10 +178,9 @@ CommsFilter(GdkXEvent * gdk_xevent, GdkEvent * event, gpointer data)
if (xevent->xclient.message_type != a)
return GDK_FILTER_CONTINUE;
msg = CommsGet(&c, xevent);
if (msg)
{
if (msg_recieve_callback)
(*msg_recieve_callback) (msg);
if (msg) {
if (msg_receive_callback)
(*msg_receive_callback) (msg);
g_free(msg);
return GDK_FILTER_REMOVE;
}
@ -209,15 +191,13 @@ CommsFilter(GdkXEvent * gdk_xevent, GdkEvent * event, gpointer data)
return GDK_FILTER_REMOVE;
}
static void
CommsSetup(void)
static void CommsSetup(void)
{
my_win = XCreateSimpleWindow(GDK_DISPLAY(), GDK_ROOT_WINDOW(),
-100, -100, 5, 5, 0, 0, 0);
}
static Window
CommsFindCommsWindow(void)
static Window CommsFindCommsWindow(void)
{
unsigned char *s;
Atom a, ar;
@ -229,18 +209,15 @@ CommsFindCommsWindow(void)
unsigned int duint;
a = XInternAtom(GDK_DISPLAY(), "ENLIGHTENMENT_COMMS", True);
if (a != None)
{
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);
if (s) {
sscanf((char *) s, "%*s %x", (unsigned int *) &win);
XFree(s);
}
if (win)
{
if (win) {
gint p;
p = gdk_error_warnings;
@ -251,8 +228,7 @@ CommsFindCommsWindow(void)
gdk_flush();
gdk_error_warnings = p;
s = NULL;
if (win)
{
if (win) {
XGetWindowProperty(GDK_DISPLAY(), win, a, 0, 14, False,
AnyPropertyType, &ar, &format, &num, &after,
&s);
@ -266,8 +242,7 @@ CommsFindCommsWindow(void)
return win;
}
static gchar *
CommsGet(Client ** c, XEvent * ev)
static gchar *CommsGet(Client ** c, XEvent * ev)
{
gchar s[13], s2[9], *msg;
int i;
@ -290,28 +265,24 @@ CommsGet(Client ** c, XEvent * ev)
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);
sscanf(s2, "%x", (int *) &win);
cl = e_client;
if (!cl)
return (NULL);
if (cl->msg)
{
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
{
} else {
/* new msg */
cl->msg = g_malloc(strlen(s) + 1);
if (!cl->msg)
return (NULL);
strcpy(cl->msg, s);
}
if (strlen(s) < 12)
{
if (strlen(s) < 12) {
msg = cl->msg;
cl->msg = NULL;
*c = cl;
@ -319,8 +290,7 @@ CommsGet(Client ** c, XEvent * ev)
return (msg);
}
static Client *
MakeClient(Window win)
static Client *MakeClient(Window win)
{
Client *c;
@ -340,8 +310,7 @@ MakeClient(Window win)
return (c);
}
static void
ListFreeClient(void *ptr)
static void ListFreeClient(void *ptr)
{
Client *c;

View File

@ -6,12 +6,17 @@
#include <string.h>
#include "viewer.h"
#include "menus.h"
#include "ipc.h"
extern GtkTooltips *tooltips;
extern GtkAccelGroup *accel_group;
GtkWidget *clist;
static void receive_ipc_msg(gchar * msg);
gchar *e_ipc_msg = NULL;
void
selection_made(GtkWidget *clist, gint row, gint column, GdkEventButton *event,
gpointer data)
@ -72,6 +77,9 @@ create_list_window(void)
GtkWidget *panes;
GtkWidget *scrollybit;
GtkWidget *vbox;
GtkWidget *frames;
GtkWidget *alignment;
GtkWidget *frame_vbox;
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_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;
}
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[])
{
GtkWidget *lister;
@ -154,6 +186,44 @@ int main(int argc, char *argv[])
tooltips = gtk_tooltips_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();
gtk_widget_show(lister);