summaryrefslogtreecommitdiff
path: root/xnest-plugin
diff options
context:
space:
mode:
Diffstat (limited to 'xnest-plugin')
-rw-r--r--xnest-plugin/NewNDest.c65
-rw-r--r--xnest-plugin/PProcess.c71
-rw-r--r--xnest-plugin/RxPlugin.h119
-rw-r--r--xnest-plugin/SetWin.c216
-rw-r--r--xnest-plugin/XnestDis.c106
5 files changed, 577 insertions, 0 deletions
diff --git a/xnest-plugin/NewNDest.c b/xnest-plugin/NewNDest.c
new file mode 100644
index 0000000..52b038c
--- /dev/null
+++ b/xnest-plugin/NewNDest.c
@@ -0,0 +1,65 @@
+/* $Xorg: NewNDest.c,v 1.4 2001/02/09 02:05:58 xorgcvs Exp $ */
+/*
+
+Copyright 1996, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
+ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABIL-
+ITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization from
+The Open Group.
+
+*/
+
+#include "RxPlugin.h"
+#include <sys/types.h>
+#include <signal.h>
+
+
+NPError
+NPP_Initialize(void)
+{
+ RxpInitXnestDisplayNumbers();
+ return NPERR_NO_ERROR;
+}
+
+void
+NPP_Shutdown(void)
+{
+}
+
+/***********************************************************************
+ * Functions to init and free private members
+ ***********************************************************************/
+
+void
+RxpNew(PluginInstance *This)
+{
+ This->window = None;
+ This->child_pid = 0;
+ This->toplevel_widget = NULL;
+}
+
+void
+RxpDestroy(PluginInstance *This)
+{
+ /* kill child process */
+ kill(This->child_pid, SIGKILL);
+ RxpFreeXnestDisplayNumber(This->display_num);
+}
diff --git a/xnest-plugin/PProcess.c b/xnest-plugin/PProcess.c
new file mode 100644
index 0000000..b90ae6c
--- /dev/null
+++ b/xnest-plugin/PProcess.c
@@ -0,0 +1,71 @@
+/* $Xorg: PProcess.c,v 1.4 2001/02/09 02:05:58 xorgcvs Exp $ */
+/*
+
+Copyright 1996, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
+ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABIL-
+ITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization from
+The Open Group.
+
+*/
+
+#include "RxPlugin.h"
+#include "XUrls.h"
+
+/***********************************************************************
+ * Process the given RxParams and make the RxReturnParams
+ ***********************************************************************/
+int
+RxpProcessParams(PluginInstance* This, RxParams *in, RxReturnParams *out)
+{
+ /* init return struture */
+ memset(out, 0, sizeof(RxReturnParams));
+ out->x_ui_lbx = RxUndef;
+ out->x_print_lbx = RxUndef;
+
+ out->action = in->action;
+ if (in->embedded != RxUndef)
+ out->embedded = RxTrue; /* we do support embbeding! */
+ else
+ out->embedded = RxUndef;
+
+ out->width = in->width;
+ out->height = in->height;
+
+ if (in->ui[0] == XUI) { /* X display needed */
+ out->ui = GetXUrl(RxpXnestDisplay(This->display_num), NULL, in->action);
+
+ if (in->x_ui_lbx != RxUndef)
+ out->x_ui_lbx = RxFalse; /* we do not support LBX */
+ else
+ out->x_ui_lbx = RxUndef;
+ }
+
+ if (in->print[0] == XPrint) { /* XPrint server needed */
+ out->print = NULL;
+
+ if (in->x_print_lbx != RxUndef)
+ out->x_print_lbx = RxFalse; /* we do not support LBX */
+ else
+ out->x_print_lbx = RxUndef;
+ }
+ return 0;
+}
diff --git a/xnest-plugin/RxPlugin.h b/xnest-plugin/RxPlugin.h
new file mode 100644
index 0000000..ce7c420
--- /dev/null
+++ b/xnest-plugin/RxPlugin.h
@@ -0,0 +1,119 @@
+/* $Xorg: RxPlugin.h,v 1.4 2001/02/09 02:05:58 xorgcvs Exp $ */
+/*
+
+Copyright 1996, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
+ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABIL-
+ITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization from
+The Open Group.
+
+*/
+
+/*
+ * RX plug-in header file, based on the UnixTemplate file provided by Netcape.
+ */
+
+/* -*- Mode: C; tab-width: 4; -*- */
+/******************************************************************************
+ * Copyright 1996 Netscape Communications. All rights reserved.
+ ******************************************************************************/
+/*
+ * UnixShell.c
+ *
+ * Netscape Client Plugin API
+ * - Function that need to be implemented by plugin developers
+ *
+ * This file defines a "Template" plugin that plugin developers can use
+ * as the basis for a real plugin. This shell just provides empty
+ * implementations of all functions that the plugin can implement
+ * that will be called by Netscape (the NPP_xxx methods defined in
+ * npapi.h).
+ *
+ * dp Suresh <dp@netscape.com>
+ *
+ */
+
+#ifndef _RxPlugin_h
+#define _RxPLugin_h
+
+#include "npapi.h"
+#include <X11/Xos.h>
+#include <X11/Intrinsic.h>
+#include <stdio.h>
+#include "Rx.h"
+
+
+/***********************************************************************
+ * Instance state information about the plugin.
+ *
+ * PLUGIN DEVELOPERS:
+ * Use this struct to hold per-instance information that you'll
+ * need in the various functions in this file.
+ ***********************************************************************/
+
+typedef enum { LOADING, /* STARTING, */ WAITING, RUNNING} PluginState;
+
+typedef struct _PluginInstance
+{
+ NPP instance;
+ int16 argc; /* HTML arguments given by Netscape */
+ char **argn;
+ char **argv;
+ short parse_reply; /* 0 - no
+ 1 - look for status line
+ 2 - done */
+ short status; /* returned application status */
+ RxBool dont_reparent; /* whether client windows need reparent*/
+ char *query;
+ PluginState state;
+ Widget status_widget;
+ Widget plugin_widget;
+ Dimension width, height;
+ /* The following fields need to be taken care by RxpNew & RxpDestroy */
+ Window window;
+ pid_t child_pid;
+ int display_num; /* Xnest display number */
+ Widget toplevel_widget;
+} PluginInstance;
+
+#define PLUGIN_NAME "RX Xnest Plug-in"
+#define PLUGIN_DESCRIPTION "This X Remote Activation Plug-in uses the \
+Xnest program to perform embedding of X applications."
+#define PLUGIN_MIME_DESCRIPTION \
+ "application/x-rx:xrx:X Remote Activation Plug-in"
+
+
+/* functions to init and free private members */
+extern void RxpNew(PluginInstance *This);
+extern void RxpDestroy(PluginInstance *This);
+
+extern int
+RxpProcessParams(PluginInstance* This, RxParams *in, RxReturnParams *out);
+
+extern void
+RxpSetStatusWidget(PluginInstance*, PluginState);
+
+extern void RxpInitXnestDisplayNumbers();
+extern int RxpXnestDisplayNumber();
+extern void RxpFreeXnestDisplayNumber(int i);
+extern char * RxpXnestDisplay(int display_number);
+
+#endif
diff --git a/xnest-plugin/SetWin.c b/xnest-plugin/SetWin.c
new file mode 100644
index 0000000..33e80a6
--- /dev/null
+++ b/xnest-plugin/SetWin.c
@@ -0,0 +1,216 @@
+/* $Xorg: SetWin.c,v 1.4 2001/02/09 02:05:58 xorgcvs Exp $ */
+/*
+
+Copyright 1996, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
+ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABIL-
+ITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization from
+The Open Group.
+
+*/
+
+/*
+ * RX plug-in module based on the UnixTemplate file provided by Netcape.
+ */
+
+/* -*- Mode: C; tab-width: 4; -*- */
+/******************************************************************************
+ * Copyright 1996 Netscape Communications. All rights reserved.
+ ******************************************************************************/
+/*
+ * UnixShell.c
+ *
+ * Netscape Client Plugin API
+ * - Function that need to be implemented by plugin developers
+ *
+ * This file defines a "Template" plugin that plugin developers can use
+ * as the basis for a real plugin. This shell just provides empty
+ * implementations of all functions that the plugin can implement
+ * that will be called by Netscape (the NPP_xxx methods defined in
+ * npapi.h).
+ *
+ * dp Suresh <dp@netscape.com>
+ *
+ */
+
+#include "RxPlugin.h"
+#include <X11/StringDefs.h>
+
+/***********************************************************************
+ * Sometimes the plugin widget gets stupidly destroyed, that is whenever
+ * Netscape relayouts the page. This callback reparents the Xnest
+ * window to the root window so it does not get destroyed as well.
+ * Eventually the NPP_SetWindow function should be called and we'll
+ * reparent it back under the plugin.
+ ***********************************************************************/
+static void
+DestroyCB (Widget widget, XtPointer client_data, XtPointer call_data)
+{
+ PluginInstance* This = (PluginInstance*) client_data;
+ int i;
+#ifdef PLUGIN_TRACE
+ fprintf (stderr, "DestroyCB, This: 0x%x\n", This);
+#endif
+ This->plugin_widget = NULL;
+ This->status_widget = NULL;
+ if (This->dont_reparent == RxFalse) {
+ XUnmapWindow(XtDisplay(widget), This->window);
+ XReparentWindow(XtDisplay(widget), This->window,
+ RootWindowOfScreen(XtScreen(widget)), 0, 0);
+ This->dont_reparent = RxTrue;
+ } else
+ This->dont_reparent = RxFalse;
+ /*
+ * not worth removing event handlers on this widget since it's
+ * about to be destroyed anyway.
+ */
+}
+
+
+/***********************************************************************
+ * Sometimes the plugin widget gets stupidly resized, because of poor
+ * geometry when its child (that is the status widget) gets destroyed.
+ * So this callback resizes it back to the right size.
+ * Note that this could lead to an endless battle, but it appears that
+ * it doesn't so far...
+ ***********************************************************************/
+static void
+ResizeCB (Widget widget, XtPointer client_data, XtPointer call_data)
+{
+ PluginInstance* This = (PluginInstance*) client_data;
+ Arg args[5];
+ int n;
+
+#ifdef PLUGIN_TRACE
+ fprintf (stderr, "ResizeCB, This: 0x%x\n", This);
+#endif
+ /* make sure plugin widget gets the same size back */
+ n = 0;
+ XtSetArg(args[n], XtNwidth, This->width); n++;
+ XtSetArg(args[n], XtNheight, This->height); n++;
+ XtSetValues(This->plugin_widget, args, n);
+}
+
+static Widget
+FindToplevel(Widget widget)
+{
+ while (XtParent(widget) != NULL && !XtIsTopLevelShell(widget))
+ widget = XtParent(widget);
+
+ return widget;
+}
+
+/***********************************************************************
+ * This function gets called first when the plugin widget is created and
+ * then whenever the plugin is changed.
+ ***********************************************************************/
+NPError
+NPP_SetWindow(NPP instance, NPWindow* window)
+{
+ PluginInstance* This;
+ Display *display;
+ Widget netscape_widget;
+ pid_t pid;
+
+ if (instance == NULL)
+ return NPERR_INVALID_INSTANCE_ERROR;
+
+ if (window == NULL)
+ return NPERR_NO_ERROR;
+
+ This = (PluginInstance*) instance->pdata;
+
+ /*
+ * PLUGIN DEVELOPERS:
+ * Before setting window to point to the
+ * new window, you may wish to compare the new window
+ * info to the previous window (if any) to note window
+ * size changes, etc.
+ */
+ display = ((NPSetWindowCallbackStruct *)window->ws_info)->display;
+ netscape_widget = XtWindowToWidget(display, (Window) window->window);
+ if (This->toplevel_widget == NULL)
+ This->toplevel_widget = FindToplevel(netscape_widget);
+
+ if (This->plugin_widget != netscape_widget) {
+
+ /* We have a new widget store it */
+ This->plugin_widget = netscape_widget;
+ This->width = window->width;
+ This->height = window->height;
+
+ XtAddCallback (This->plugin_widget, XtNdestroyCallback,
+ DestroyCB, (XtPointer) This);
+ XtAddCallback (This->plugin_widget, "resizeCallback",
+ ResizeCB, (XtPointer) This);
+
+ if (This->window == None) {
+
+ This->window = XCreateSimpleWindow(display, (Window)window->window,
+ 0, 0,
+ window->width, window->height,
+ 0, 0, 0);
+ XMapWindow(display, This->window);
+
+ This->display_num = RxpXnestDisplayNumber();
+#ifdef PLUGIN_TRACE
+ fprintf(stderr, "Windows: %ld %ld\n",
+ (Window) window->window, XtWindow(This->window));
+#endif
+ pid = fork();
+ if (pid == 0) { /* child process */
+ static char *argv[] = {
+ "Xnest",
+ "-ac", /* no access control (sic!) */
+ ":00", /* display number */
+ "-parent",
+ "01234567890123456789", /* parent window id */
+ NULL
+ };
+ close(ConnectionNumber(display));
+
+ sprintf(argv[2], ":%d", This->display_num);
+ sprintf(argv[4], "%ld", This->window);
+ /* exec Xnest */
+ execvp("Xnest", argv);
+ perror("Xnest");
+ return NPERR_GENERIC_ERROR;
+ } else { /* parent process */
+ /* store child pid so we can kill it later on */
+ This->child_pid = pid;
+ }
+ } else {
+ /* Xnest is either under the RootWindow or the old widget */
+ XReparentWindow(display, This->window, (Window)window->window,
+ 0, 0);
+ if (This->dont_reparent == RxTrue)
+ XMapWindow(display, This->window);
+ if (This->state != RUNNING)
+ RxpSetStatusWidget(This, This->state);
+ }
+ if (This->dont_reparent != RxFalse) /* can be True or Undef */
+ This->dont_reparent = RxFalse;
+ else
+ This->dont_reparent = RxTrue;
+ }
+
+ return NPERR_NO_ERROR;
+}
diff --git a/xnest-plugin/XnestDis.c b/xnest-plugin/XnestDis.c
new file mode 100644
index 0000000..10dddf0
--- /dev/null
+++ b/xnest-plugin/XnestDis.c
@@ -0,0 +1,106 @@
+/* $Xorg: XnestDis.c,v 1.4 2001/02/09 02:05:58 xorgcvs Exp $ */
+/*
+
+Copyright 1996, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
+ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABIL-
+ITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization from
+The Open Group.
+
+*/
+
+#include "RxPlugin.h"
+
+/***********************************************************************
+ * Utility functions and global variable to manage display numbers
+ ***********************************************************************/
+
+/* maximum numbers of concurrent instances */
+#define MAX_PLUGINS 10
+
+/* start from 5 to avoid possible conflict with multi-display X server */
+#define XNEST_OFFSET 5
+
+/* global allowing to know which display numbers are in use */
+static int16 xnest_display_numbers[MAX_PLUGINS];
+
+void
+RxpInitXnestDisplayNumbers()
+{
+ memset(xnest_display_numbers, 0, sizeof(int16) * MAX_PLUGINS);
+}
+
+/* function returning first display number available */
+int
+RxpXnestDisplayNumber()
+{
+ int i;
+ for (i = 0; i < MAX_PLUGINS; i++)
+ if (xnest_display_numbers[i] == 0) {
+ xnest_display_numbers[i] = 1;
+ return i + XNEST_OFFSET;
+ }
+ /* no more available */
+ return -1;
+}
+
+/* function returning first display number available */
+void
+RxpFreeXnestDisplayNumber(int i)
+{
+ xnest_display_numbers[i - XNEST_OFFSET] = 0;
+}
+
+/* function returning display name with specified display number */
+char *
+RxpXnestDisplay(int display_number)
+{
+ static char name[1024];
+ char *display_name, *dpy_name, *display_num, *screen_num;
+
+ display_name = getenv("DISPLAY");
+ if (display_name == NULL)
+ return NULL;
+
+ /* if of the form x11:display skip scheme part */
+ if (strncmp(display_name, "x11:", 4) == 0)
+ dpy_name = display_name + 4;
+ else
+ dpy_name = display_name;
+
+ /* display number is after next ":" character */
+ display_num = strchr(dpy_name, ':');
+ if (display_num == NULL) /* invalid display specification */
+ return NULL;
+
+ /* copy display name up to the display number */
+ strncpy(name, display_name, display_num - display_name);
+
+ /* override display_number */
+ sprintf(name + (display_num - display_name), ":%d", display_number);
+
+ /* append screen number */
+ screen_num = strchr(display_num, '.');
+ if (screen_num != NULL)
+ strcat(name, screen_num);
+
+ return name;
+}