diff options
Diffstat (limited to 'xnest-plugin')
-rw-r--r-- | xnest-plugin/NewNDest.c | 65 | ||||
-rw-r--r-- | xnest-plugin/PProcess.c | 71 | ||||
-rw-r--r-- | xnest-plugin/RxPlugin.h | 119 | ||||
-rw-r--r-- | xnest-plugin/SetWin.c | 216 | ||||
-rw-r--r-- | xnest-plugin/XnestDis.c | 106 |
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; +} |