summaryrefslogtreecommitdiff
path: root/Build/source/utils/pdfopen/sendx.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/utils/pdfopen/sendx.c')
-rw-r--r--Build/source/utils/pdfopen/sendx.c290
1 files changed, 290 insertions, 0 deletions
diff --git a/Build/source/utils/pdfopen/sendx.c b/Build/source/utils/pdfopen/sendx.c
new file mode 100644
index 00000000000..238f97f7f82
--- /dev/null
+++ b/Build/source/utils/pdfopen/sendx.c
@@ -0,0 +1,290 @@
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#include <X11/keysym.h>
+#include <X11/cursorfont.h>
+
+static char *display_name = NULL;
+static Display *display;
+static Window root;
+static Window window = None;
+static XKeyEvent event;
+
+static char error_message[256];
+static int error_status = 0;
+
+static void
+throw_exception3(char *msg, char *s, int i) {
+ sprintf(error_message, msg, s, i);
+ error_status = 1;
+}
+
+static void
+throw_exception3s(char *msg1, char *msg2, char *msg3) {
+ sprintf(error_message, msg1, msg2, msg3);
+ error_status = 1;
+}
+
+static void
+throw_exception(char *msg) {
+ strncpy(error_message,msg,256);
+ error_status = 1;
+}
+
+/* Added for window managers like swm and tvtwm that follow solbourne's
+ * virtual root window concept
+ */
+static Window
+GetRootWindow (Display * disp, int scrn)
+{
+ Atom __SWM_VROOT = None;
+ Window root, rootReturn, parentReturn, *children;
+ unsigned int numChildren;
+ unsigned i;
+
+ root = RootWindow (disp, scrn);
+
+ /* see if there is a virtual root */
+ __SWM_VROOT = XInternAtom (disp, "__SWM_VROOT", False);
+ XQueryTree (disp, root, &rootReturn, &parentReturn, &children, &numChildren);
+ for (i = 0; i < numChildren; i++)
+ {
+ Atom actual_type;
+ int actual_format;
+ unsigned long nitems, bytesafter;
+ Window *newRoot = (Window) 0;
+
+ if (XGetWindowProperty (disp, children[i], __SWM_VROOT, 0, 1,
+ False, XA_WINDOW, &actual_type, &actual_format,
+ &nitems, &bytesafter,
+ (unsigned char**) &newRoot) ==
+ Success && newRoot)
+ {
+ root = *newRoot;
+ break;
+ }
+ }
+ if (children)
+ XFree ((char *) children);
+ return (root);
+}
+
+
+/* - - - - - - - - -
+
+ * [These functions are from the file "dsimple.c" used with xwininfo.]
+ *
+ * Written by Mark Lillibridge. Last updated 7/1/87
+ *
+ *
+ * Window_With_Name: routine to locate a window with a given name on a display.
+ * If no window with the given name is found, 0 is returned.
+ * If more than one window has the given name, the first
+ * one found will be returned. Only top and its subwindows
+ * are looked at. Normally, top should be the Root Window.
+ */
+static Window
+Window_With_Name (Display * dpy, Window top, char *name)
+{
+ Window *children, dummy;
+ unsigned int nchildren;
+ unsigned i;
+ Window w = 0;
+ char *window_name;
+
+ if (XFetchName (dpy, top, &window_name) && !strcmp (window_name, name))
+ return (top);
+
+ if (!XQueryTree (dpy, top, &dummy, &dummy, &children, &nchildren))
+ return (0);
+
+ for (i = 0; i < nchildren; i++)
+ {
+ w = Window_With_Name (dpy, children[i], name);
+ if (w)
+ break;
+ }
+ if (children)
+ XFree ((char *) children);
+ return (w);
+}
+
+
+
+static int
+open_channel (char *wname)
+{
+/* display_name = ":0.0"; */
+ if ((display = XOpenDisplay (display_name)) == NULL)
+ {
+ throw_exception ("can't open display");
+ return 1;
+ }
+ if ((root = GetRootWindow (display, DefaultScreen (display))) == 0)
+ {
+ throw_exception ("Cannot get DefaultScreen");
+ return 1;
+ }
+
+ if ((wname[0] == '\0') && (window != None))
+ {} /* take selected window */
+ else if (wname[0] != '\0')
+ {
+ if ((window = Window_With_Name (display, root, wname)) == None)
+ {
+ throw_exception3s ("Display %s: can't open window named \"%s\"",
+ XDisplayName (display_name), wname);
+ return 1;
+ }
+ }
+ else
+ {
+ throw_exception3 ("bad condition in %s at line %d", __FILE__, __LINE__);
+ return 1;
+ }
+
+ event.type = KeyPress;
+ event.serial = 0;
+ event.send_event = False;
+ event.display = display;
+ event.x = event.y = event.x_root = event.y_root = 0;
+ event.time = CurrentTime;
+ event.same_screen = True;
+ event.subwindow = None;
+ event.window = window;
+ event.root = root;
+ return 0;
+}
+
+static void
+close_channel ()
+{
+/* XFlush(display); */
+ XCloseDisplay (display);
+}
+
+static void
+sendx_channel (KeySym ks, int km)
+{
+/* 0=regular, 1=shift, 2=lock, 4=control */
+ if (ks < 256)
+ {
+ event.state = isupper ((char) ks);
+ switch (ks)
+ {
+ case 0x08:
+ ks = XK_BackSpace;
+ break;
+ case 0x09:
+ ks = XK_Tab;
+ break;
+ case 0x0A:
+ ks = XK_Linefeed;
+ break;
+ case 0x0B:
+ ks = XK_Clear;
+ break;
+ case 0x0D:
+ ks = XK_Return;
+ break;
+ case 0x13:
+ ks = XK_Pause;
+ break;
+ case 0x14:
+ ks = XK_Scroll_Lock;
+ break;
+ case 0x15:
+ ks = XK_Sys_Req;
+ break;
+ case 0x1B:
+ ks = XK_Escape;
+ break;
+ }
+ }
+ else
+ event.state = 0;
+ event.type = KeyPress;
+ event.state = km ; // Mod1Mask
+ event.keycode = XKeysymToKeycode (display, ks);
+ if (XSendEvent (display, window, True, 0xfff, (XEvent *) & event) == 0)
+ throw_exception ("Error in XSendEvent");
+ event.type = KeyRelease;
+ if (XSendEvent (display, window, True, 0xfff, (XEvent *) & event) == 0)
+ throw_exception ("Error in XSendEvent");
+ return;
+}
+
+int
+sendx_string (char *string, char *window)
+{
+ char *p;
+ if (open_channel (window))
+ return error_status;
+ p = string;
+ while (*p)
+ sendx_channel (*p++,0);
+ close_channel ();
+ return error_status;
+}
+
+int
+sendx_token (char *string, char *window)
+{
+ if (open_channel (window))
+ return error_status;
+ sendx_channel (XStringToKeysym (string),0);
+ close_channel ();
+ return error_status;
+}
+
+
+int
+sendx_alt_token (char *string, char *window)
+{
+ if (open_channel (window))
+ return error_status;
+ sendx_channel (XStringToKeysym (string),Mod1Mask);
+ close_channel ();
+ return error_status;
+}
+
+int
+sendx_controlalt_token (char *string, char *window)
+{
+ if (open_channel (window))
+ return error_status;
+ sendx_channel (XStringToKeysym (string), Mod1Mask | ControlMask);
+ close_channel ();
+ return error_status;
+}
+
+
+int
+sendx_control_token (char *string, char *window)
+{
+ if (open_channel (window))
+ return error_status;
+ sendx_channel (XStringToKeysym (string),ControlMask);
+ close_channel ();
+ return error_status;
+}
+
+/*
+ void
+ PrintKeySyms ()
+ {
+ int i;
+ for (i = 32; i < 127; i++)
+ {
+ printf ("%s[%c] ", XKeysymToString (i), i);
+ }
+ for (i = 128 + 32; i < 128 + 127; i++)
+ {
+ printf ("%s[%c] ", XKeysymToString (i), i);
+ }
+ printf ("\n");
+ }
+ */