Fix bug #80051. Attach the user running the mozilla process to the x remote windows so that another user running mozilla can run another copy of the process tothe same display. r/sr=alecf,shaver

This commit is contained in:
blizzard%redhat.com 2001-09-18 21:45:43 +00:00
parent 5fa841a6c4
commit d5b3341812
5 changed files with 71 additions and 9 deletions

View File

@ -25,18 +25,21 @@
#include <nsIXRemoteService.h>
#include <nsCOMPtr.h>
#include <nsIServiceManager.h>
#include <prprf.h>
#include <prenv.h>
#include "nsGtkMozRemoteHelper.h"
#define MOZILLA_VERSION_PROP "_MOZILLA_VERSION"
#define MOZILLA_LOCK_PROP "_MOZILLA_LOCK"
#define MOZILLA_COMMAND_PROP "_MOZILLA_COMMAND"
#define MOZILLA_RESPONSE_PROP "_MOZILLA_RESPONSE"
#define MOZILLA_USER_PROP "_MOZILLA_USER"
Atom nsGtkMozRemoteHelper::sMozVersionAtom = 0;
Atom nsGtkMozRemoteHelper::sMozLockAtom = 0;
Atom nsGtkMozRemoteHelper::sMozCommandAtom = 0;
Atom nsGtkMozRemoteHelper::sMozResponseAtom = 0;
Atom nsGtkMozRemoteHelper::sMozUserAtom = 0;
// XXX get this dynamically
static char *sRemoteVersion = "5.0";
@ -49,9 +52,21 @@ nsGtkMozRemoteHelper::SetupVersion(GdkWindow *aWindow)
EnsureAtoms();
window = GDK_WINDOW_XWINDOW(aWindow);
// set our version
XChangeProperty(GDK_DISPLAY(), window, sMozVersionAtom, XA_STRING,
8, PropModeReplace, data, strlen(sRemoteVersion));
// get our username
char *logname;
logname = PR_GetEnv("LOGNAME");
if (logname) {
data = (unsigned char *)logname;
// set the property on the window if it's available
XChangeProperty(GDK_DISPLAY(), window, sMozUserAtom, XA_STRING,
8, PropModeReplace, data, strlen(logname));
}
}
gboolean
@ -157,7 +172,10 @@ nsGtkMozRemoteHelper::EnsureAtoms(void)
if (!sMozCommandAtom)
sMozCommandAtom = XInternAtom(GDK_DISPLAY(), MOZILLA_COMMAND_PROP, False);
if (!sMozResponseAtom)
sMozResponseAtom = XInternAtom(GDK_DISPLAY(), MOZILLA_RESPONSE_PROP, False);
sMozResponseAtom = XInternAtom(GDK_DISPLAY(), MOZILLA_RESPONSE_PROP,
False);
if (!sMozUserAtom)
sMozUserAtom = XInternAtom(GDK_DISPLAY(), MOZILLA_USER_PROP, False);
}

View File

@ -49,7 +49,7 @@ public:
static Atom sMozLockAtom;
static Atom sMozCommandAtom;
static Atom sMozResponseAtom;
static Atom sMozUserAtom;
};

View File

@ -47,3 +47,7 @@ EXPORTS = \
nsXRemoteClientCID.h
include $(topsrcdir)/config/rules.mk
ifeq ($(OS_ARCH), Linux)
DEFINES += -D_BSD_SOURCE
endif

View File

@ -36,6 +36,7 @@
#include "plstr.h"
#include "prsystem.h"
#include "prlog.h"
#include "prenv.h"
#include <stdlib.h>
#include <unistd.h>
#include <strings.h>
@ -51,6 +52,7 @@
#define MOZILLA_LOCK_PROP "_MOZILLA_LOCK"
#define MOZILLA_COMMAND_PROP "_MOZILLA_COMMAND"
#define MOZILLA_RESPONSE_PROP "_MOZILLA_RESPONSE"
#define MOZILLA_USER_PROP "_MOZILLA_USER"
static PRLogModuleInfo *sRemoteLm = NULL;
@ -64,6 +66,7 @@ XRemoteClient::XRemoteClient()
mMozCommandAtom = 0;
mMozResponseAtom = 0;
mMozWMStateAtom = 0;
mMozUserAtom = 0;
if (!sRemoteLm)
sRemoteLm = PR_NewLogModule("XRemoteClient");
PR_LOG(sRemoteLm, PR_LOG_DEBUG, ("XRemoteClient::XRemoteClient"));
@ -96,6 +99,7 @@ XRemoteClient::Init (void)
mMozCommandAtom = XInternAtom(mDisplay, MOZILLA_COMMAND_PROP, False);
mMozResponseAtom = XInternAtom(mDisplay, MOZILLA_RESPONSE_PROP, False);
mMozWMStateAtom = XInternAtom(mDisplay, "WM_STATE", False);
mMozUserAtom = XInternAtom(mDisplay, MOZILLA_USER_PROP, False);
mInitialized = PR_TRUE;
@ -188,7 +192,7 @@ XRemoteClient::FindWindow(void)
Atom type;
int format;
unsigned long nitems, bytesafter;
unsigned char *version = 0;
unsigned char *data_return = 0;
Window w;
w = kids[i];
// find the inner window with WM_STATE on it
@ -198,13 +202,48 @@ XRemoteClient::FindWindow(void)
0, (65536 / sizeof (long)),
False, XA_STRING,
&type, &format, &nitems, &bytesafter,
&version);
if (!version)
&data_return);
if (!data_return)
continue;
XFree(version);
XFree(data_return);
data_return = 0;
if (status == Success && type != None) {
result = w;
break;
// Check to see if it has the user atom on that window. If there
// is then we need to make sure that it matches what we have.
char *logname;
logname = PR_GetEnv("LOGNAME");
if (logname) {
status = XGetWindowProperty(mDisplay, w, mMozUserAtom,
0, (65536 / sizeof(long)),
False, XA_STRING,
&type, &format, &nitems, &bytesafter,
&data_return);
// if there's a username compare it with what we have
if (data_return) {
// if the IDs are equal then this is the window we want. if
// they aren't fall through to the next loop iteration.
if (!strcmp(logname, (const char *)data_return)) {
XFree(data_return);
result = w;
break;
}
XFree(data_return);
}
}
// ok, this is the one we want since there's no username attribute on
// it.
else {
result = w;
break;
}
}
}

View File

@ -63,6 +63,7 @@ private:
Atom mMozCommandAtom;
Atom mMozResponseAtom;
Atom mMozWMStateAtom;
Atom mMozUserAtom;
nsCString mLockData;