diff options
author | Adam Moss <moss@lindenlab.com> | 2007-02-12 17:20:51 +0000 |
---|---|---|
committer | Adam Moss <moss@lindenlab.com> | 2007-02-12 17:20:51 +0000 |
commit | d1daa178599ac6320be641258931417bc2dd8b0e (patch) | |
tree | 68b5481c834d10bf530b3e2c157fb7fc34d307f3 | |
parent | 5cc44523f79b6cf495d2649fce9bf9e5181787e8 (diff) |
Landing embedded Mozilla support for the Linux Client.
svn merge svn+ssh://svn.lindenlab.com/svn/linden/release@57782
svn+ssh://svn.lindenlab.com/svn/linden/branches/moss/linuxmozilla-r57782base
-rw-r--r-- | indra/llcommon/llpreprocessor.h | 2 | ||||
-rw-r--r-- | indra/llwindow/llwindowsdl.cpp | 304 | ||||
-rw-r--r-- | indra/llwindow/llwindowsdl.h | 26 | ||||
-rwxr-xr-x | indra/newview/linux_tools/wrapper.sh | 2 | ||||
-rw-r--r-- | indra/newview/llfilepicker.cpp | 16 |
5 files changed, 241 insertions, 109 deletions
diff --git a/indra/llcommon/llpreprocessor.h b/indra/llcommon/llpreprocessor.h index 1b3bcf7919..f86a9b5a9e 100644 --- a/indra/llcommon/llpreprocessor.h +++ b/indra/llcommon/llpreprocessor.h @@ -32,7 +32,7 @@ #define LL_LIBXUL_ENABLED 1 #elif LL_LINUX #define LL_QUICKTIME_ENABLED 0 - #define LL_LIBXUL_ENABLED 0 + #define LL_LIBXUL_ENABLED 1 #endif #if LL_LIBXUL_ENABLED && !defined(MOZILLA_INTERNAL_API) diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index 9f9f762663..84c7d07085 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -49,20 +49,12 @@ const S32 MAX_NUM_RESOLUTIONS = 32; #if LL_X11 # include <X11/Xutil.h> -// A global! Well, SDL isn't really designed for communicating -// with multiple physical X11 displays. Heck, it's not really -// designed for multiple X11 windows. -// So, we need this for the SDL/X11 event filter callback (which -// doesnt have a userdata parameter) and more. -static Display *SDL_Display = NULL; -static Window SDL_XWindowID = None; #endif //LL_X11 -// TOFU HACK -- (*exactly* the same hack as LLWindowMacOSX for the same reasons) -// For SDL, to put up an OS dialog in full screen mode, we must first switch OUT of full screen mode. -// The proper way to do this is to bracket the dialog with calls to beforeDialog() and afterDialog(), but these -// require a pointer to the LLWindowMacSDL object. Stash it here and maintain in the constructor and destructor. -// This assumes that there will be only one object of this class at any time. Hopefully this is true. +// TOFU HACK -- (*exactly* the same hack as LLWindowMacOSX for a similar +// set of reasons): Stash a pointer to the LLWindowSDL object here and +// maintain in the constructor and destructor. This assumes that there will +// be only one object of this class at any time. Hopefully this is true. static LLWindowSDL *gWindowImplementation = NULL; static BOOL was_fullscreen = FALSE; @@ -94,14 +86,51 @@ void show_window_creation_error(const char* title) } +void maybe_lock_display(void) +{ + if (gWindowImplementation) { + gWindowImplementation->Lock_Display(); + } +} + + +void maybe_unlock_display(void) +{ + if (gWindowImplementation) { + gWindowImplementation->Unlock_Display(); + } +} + + #if LL_GTK -// Check the runtime GTK version for goodness. -static BOOL maybe_do_gtk_diagnostics(void) +// Lazily initialize and check the runtime GTK version for goodness. +BOOL ll_try_gtk_init(void) { static BOOL done_gtk_diag = FALSE; - static BOOL is_good = TRUE; - gtk_disable_setlocale(); - if ((!done_gtk_diag) && gtk_init_check(NULL, NULL)) + static BOOL gtk_is_good = FALSE; + static BOOL done_setlocale = FALSE; + static BOOL tried_gtk_init = FALSE; + + if (!done_setlocale) + { + llinfos << "Starting GTK Initialization." << llendl; + maybe_lock_display(); + gtk_disable_setlocale(); + maybe_unlock_display(); + done_setlocale = TRUE; + } + + if (!tried_gtk_init) + { + tried_gtk_init = TRUE; + maybe_lock_display(); + gtk_is_good = gtk_init_check(NULL, NULL); + maybe_unlock_display(); + if (!gtk_is_good) + llwarns << "GTK Initialization failed." << llendl; + } + + if (gtk_is_good && !done_gtk_diag) { llinfos << "GTK Initialized." << llendl; llinfos << "- Compiled against GTK version " @@ -113,23 +142,45 @@ static BOOL maybe_do_gtk_diagnostics(void) << gtk_minor_version << "." << gtk_micro_version << llendl; gchar *gtk_warning; + maybe_lock_display(); gtk_warning = gtk_check_version(GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION); + maybe_unlock_display(); if (gtk_warning) { llwarns << "- GTK COMPATIBILITY WARNING: " << gtk_warning << llendl; - is_good = FALSE; + gtk_is_good = FALSE; } done_gtk_diag = TRUE; } - return is_good; + + return gtk_is_good; } #endif // LL_GTK +#if LL_X11 +Window get_SDL_XWindowID(void) +{ + if (gWindowImplementation) { + return gWindowImplementation->mSDL_XWindowID; + } + return None; +} + +Display* get_SDL_Display(void) +{ + if (gWindowImplementation) { + return gWindowImplementation->mSDL_Display; + } + return NULL; +} +#endif // LL_X11 + + BOOL check_for_card(const char* RENDERER, const char* bad_card) { if (!strncasecmp(RENDERER, bad_card, strlen(bad_card))) @@ -190,6 +241,11 @@ LLWindowSDL::LLWindowSDL(char *title, S32 x, S32 y, S32 width, mHaveInputFocus = -1; mIsMinimized = -1; +#if LL_X11 + mSDL_XWindowID = None; + mSDL_Display = NULL; +#endif // LL_X11 + // Get the original aspect ratio of the main device. mOriginalAspectRatio = 1024.0 / 768.0; // !!! FIXME //(double)CGDisplayPixelsWide(mDisplay) / (double)CGDisplayPixelsHigh(mDisplay); @@ -934,24 +990,29 @@ void LLWindowSDL::beforeDialog() } #if LL_X11 - if (SDL_Display) + if (mSDL_Display) { // Everything that we/SDL asked for should happen before we // potentially hand control over to GTK. - XSync(SDL_Display, False); + XSync(mSDL_Display, False); } #endif // LL_X11 #if LL_GTK // this is a good time to grab some GTK version information for // diagnostics - maybe_do_gtk_diagnostics(); + ll_try_gtk_init(); #endif // LL_GTK + + maybe_lock_display(); } void LLWindowSDL::afterDialog() { llinfos << "LLWindowSDL::afterDialog()" << llendl; + + maybe_unlock_display(); + if (old_fullscreen && !was_fullscreen) { // *FIX: NOT YET WORKING (see below) @@ -971,13 +1032,13 @@ S32 LLWindowSDL::stat(const char* file_name, struct stat* stat_info) // set/reset the XWMHints flag for 'urgency' that usually makes the icon flash void LLWindowSDL::x11_set_urgent(BOOL urgent) { - if (SDL_Display && !mFullscreen) + if (mSDL_Display && !mFullscreen) { XWMHints *wm_hints; llinfos << "X11 hint for urgency, " << urgent << llendl; - wm_hints = XGetWMHints(SDL_Display, mSDL_XWindowID); + wm_hints = XGetWMHints(mSDL_Display, mSDL_XWindowID); if (!wm_hints) wm_hints = XAllocWMHints(); @@ -986,9 +1047,9 @@ void LLWindowSDL::x11_set_urgent(BOOL urgent) else wm_hints->flags &= ~XUrgencyHint; - XSetWMHints(SDL_Display, mSDL_XWindowID, wm_hints); + XSetWMHints(mSDL_Display, mSDL_XWindowID, wm_hints); XFree(wm_hints); - XSync(SDL_Display, False); + XSync(mSDL_Display, False); } } #endif // LL_X11 @@ -1021,6 +1082,8 @@ void LLWindowSDL::flashIcon(F32 seconds) right now it has the rare and desirable trait of being generally stable and working. */ +typedef Atom x11clipboard_type; + /* PRIMARY and CLIPBOARD are the two main kinds of X11 clipboard. A third are the CUT_BUFFERs which an obsolete holdover from X10 days and use a quite orthogonal @@ -1033,26 +1096,52 @@ void LLWindowSDL::flashIcon(F32 seconds) we support (to as full an extent as the clipboard content type allows) CLIPBOARD, PRIMARY, and CUT_BUFFER0. */ -#define SL_READWRITE_XCLIPBOARD_TYPE XInternAtom(SDL_Display, "CLIPBOARD", False) -#define SL_WRITE_XCLIPBOARD_TYPE XA_PRIMARY +static x11clipboard_type get_x11_readwrite_clipboard_type(void) +{ + return XInternAtom(get_SDL_Display(), "CLIPBOARD", False); +} + +static x11clipboard_type get_x11_write_clipboard_type(void) +{ + return XA_PRIMARY; +} /* This is where our own private cutbuffer goes - we don't use a regular cutbuffer (XA_CUT_BUFFER0 etc) for intermediate storage because their use isn't really defined for holding UTF8. */ -#define SL_CUTBUFFER_TYPE XInternAtom(SDL_Display, "SECONDLIFE_CUTBUFFER", False) +static x11clipboard_type get_x11_cutbuffer_clipboard_type(void) +{ + return XInternAtom(get_SDL_Display(), "SECONDLIFE_CUTBUFFER", False); +} + +/* Some X11 atom-generators */ +static Atom get_x11_targets_atom(void) +{ + return XInternAtom(get_SDL_Display(), "TARGETS", False); +} + +static Atom get_x11_text_atom(void) +{ + return XInternAtom(get_SDL_Display(), "TEXT", False); +} /* These defines, and convert_data/convert_x11clipboard, mostly exist to support non-text or unusually-encoded clipboard data, which we don't really have a need for at the moment. */ -#define SDLCLIPTYPE(A, B, C, D) (int)((A<<24)|(B<<16)|(C<<8)|(D<<0)) +#define SDLCLIPTYPE(A, B, C, D) (int)(((A)<<24)|((B)<<16)|((C)<<8)|((D)<<0)) #define FORMAT_PREFIX "SECONDLIFE_x11clipboard_0x" -typedef Atom x11clipboard_type; - static x11clipboard_type convert_format(int type) { + if (!gWindowImplementation) + { + llwarns << "!gWindowImplementation in convert_format()" + << llendl; + return XA_STRING; + } + switch (type) { case SDLCLIPTYPE('T', 'E', 'X', 'T'): @@ -1060,7 +1149,8 @@ x11clipboard_type convert_format(int type) return XA_STRING; case SDLCLIPTYPE('U', 'T', 'F', '8'): // newer de-facto UTF8 clipboard atom - return XInternAtom(SDL_Display, "UTF8_STRING", False); + return XInternAtom(gWindowImplementation->mSDL_Display, + "UTF8_STRING", False); default: { /* completely arbitrary clipboard types... we don't actually use @@ -1068,7 +1158,8 @@ x11clipboard_type convert_format(int type) char format[sizeof(FORMAT_PREFIX)+8+1]; /* Flawfinder: ignore */ snprintf(format, sizeof(format), "%s%08lx", FORMAT_PREFIX, (unsigned long)type); /* Flawfinder: ignore */ - return XInternAtom(SDL_Display, format, False); + return XInternAtom(gWindowImplementation->mSDL_Display, + format, False); } } } @@ -1149,9 +1240,9 @@ LLWindowSDL::is_empty_x11clipboard(void) { int retval; - Lock_Display(); - retval = ( XGetSelectionOwner(SDL_Display, SL_READWRITE_XCLIPBOARD_TYPE) == None ); - Unlock_Display(); + maybe_lock_display(); + retval = ( XGetSelectionOwner(mSDL_Display, get_x11_readwrite_clipboard_type()) == None ); + maybe_unlock_display(); return(retval); } @@ -1169,8 +1260,8 @@ LLWindowSDL::put_x11clipboard(int type, int srclen, const char *src) dst = (char *)malloc(dstlen); if ( dst != NULL ) { - Window root = DefaultRootWindow(SDL_Display); - Lock_Display(); + maybe_lock_display(); + Window root = DefaultRootWindow(mSDL_Display); convert_data(type, dst, src, srclen); // Cutbuffers are only allowed to have STRING atom types, // but Emacs puts UTF8 inside them anyway. We cautiously @@ -1179,7 +1270,7 @@ LLWindowSDL::put_x11clipboard(int type, int srclen, const char *src) { // dstlen-1 so we don't include the trailing \0 llinfos << "X11: Populating cutbuffer." <<llendl; - XChangeProperty(SDL_Display, root, + XChangeProperty(mSDL_Display, root, XA_CUT_BUFFER0, XA_STRING, 8, PropModeReplace, (unsigned char*)dst, dstlen-1); } else { @@ -1188,18 +1279,18 @@ LLWindowSDL::put_x11clipboard(int type, int srclen, const char *src) //XDeleteProperty(SDL_Display, root, XA_CUT_BUFFER0); } // Private cutbuffer of an appropriate type. - XChangeProperty(SDL_Display, root, - SL_CUTBUFFER_TYPE, format, 8, PropModeReplace, + XChangeProperty(mSDL_Display, root, + get_x11_cutbuffer_clipboard_type(), format, 8, PropModeReplace, (unsigned char*)dst, dstlen-1); free(dst); /* Claim ownership of both PRIMARY and CLIPBOARD */ - XSetSelectionOwner(SDL_Display, SL_READWRITE_XCLIPBOARD_TYPE, + XSetSelectionOwner(mSDL_Display, get_x11_readwrite_clipboard_type(), mSDL_XWindowID, CurrentTime); - XSetSelectionOwner(SDL_Display, SL_WRITE_XCLIPBOARD_TYPE, + XSetSelectionOwner(mSDL_Display, get_x11_write_clipboard_type(), mSDL_XWindowID, CurrentTime); - Unlock_Display(); + maybe_unlock_display(); } } @@ -1219,19 +1310,19 @@ LLWindowSDL::get_x11clipboard(int type, int *dstlen, char **dst) unsigned long overflow; char *src; - Lock_Display(); - owner = XGetSelectionOwner(SDL_Display, SL_READWRITE_XCLIPBOARD_TYPE); - Unlock_Display(); + maybe_lock_display(); + owner = XGetSelectionOwner(mSDL_Display, get_x11_readwrite_clipboard_type()); + maybe_unlock_display(); if (owner == None) { // Fall right back to ancient X10 cut-buffers - owner = DefaultRootWindow(SDL_Display); + owner = DefaultRootWindow(mSDL_Display); selection = XA_CUT_BUFFER0; } else if (owner == mSDL_XWindowID) { // Use our own uncooked opaque string property - owner = DefaultRootWindow(SDL_Display); - selection = SL_CUTBUFFER_TYPE; + owner = DefaultRootWindow(mSDL_Display); + selection = get_x11_cutbuffer_clipboard_type(); } else { @@ -1240,11 +1331,11 @@ LLWindowSDL::get_x11clipboard(int type, int *dstlen, char **dst) SDL_Event event; owner = mSDL_XWindowID; - Lock_Display(); - selection = XInternAtom(SDL_Display, "SDL_SELECTION", False); - XConvertSelection(SDL_Display, SL_READWRITE_XCLIPBOARD_TYPE, format, + maybe_lock_display(); + selection = XInternAtom(mSDL_Display, "SDL_SELECTION", False); + XConvertSelection(mSDL_Display, get_x11_readwrite_clipboard_type(), format, selection, owner, CurrentTime); - Unlock_Display(); + maybe_unlock_display(); llinfos << "X11: Waiting for clipboard to arrive." <<llendl; while ( ! selection_response ) { @@ -1270,8 +1361,8 @@ LLWindowSDL::get_x11clipboard(int type, int *dstlen, char **dst) llinfos << "X11: Clipboard arrived." <<llendl; } - Lock_Display(); - if ( XGetWindowProperty(SDL_Display, owner, selection, 0, INT_MAX/4, + maybe_lock_display(); + if ( XGetWindowProperty(mSDL_Display, owner, selection, 0, INT_MAX/4, False, format, &seln_type, &seln_format, &nbytes, &overflow, (unsigned char **)&src) == Success ) { @@ -1286,8 +1377,7 @@ LLWindowSDL::get_x11clipboard(int type, int *dstlen, char **dst) } XFree(src); } - - Unlock_Display(); + maybe_unlock_display(); } int clipboard_filter_callback(const SDL_Event *event) @@ -1300,7 +1390,7 @@ int clipboard_filter_callback(const SDL_Event *event) /* Handle window-manager specific clipboard events */ switch (event->syswm.msg->event.xevent.type) { - /* Copy the selection from SL_CUTBUFFER_TYPE to the requested property */ + /* Copy the selection from SECONDLIFE_CUTBUFFER to the requested property */ case SelectionRequest: { XSelectionRequestEvent *req; XEvent sevent; @@ -1317,8 +1407,8 @@ int clipboard_filter_callback(const SDL_Event *event) sevent.xselection.property = None; sevent.xselection.requestor = req->requestor; sevent.xselection.time = req->time; - if ( XGetWindowProperty(SDL_Display, DefaultRootWindow(SDL_Display), - SL_CUTBUFFER_TYPE, 0, INT_MAX/4, False, req->target, + if ( XGetWindowProperty(get_SDL_Display(), DefaultRootWindow(get_SDL_Display()), + get_x11_cutbuffer_clipboard_type(), 0, INT_MAX/4, False, req->target, &sevent.xselection.target, &seln_format, &nbytes, &overflow, &seln_data) == Success ) { @@ -1331,21 +1421,20 @@ int clipboard_filter_callback(const SDL_Event *event) if ( seln_data[nbytes-1] == '\0' ) --nbytes; } - XChangeProperty(SDL_Display, req->requestor, req->property, + XChangeProperty(get_SDL_Display(), req->requestor, req->property, req->target, seln_format, PropModeReplace, seln_data, nbytes); sevent.xselection.property = req->property; -#define XA_TARGETS XInternAtom(SDL_Display, "TARGETS", False) - } else if (XA_TARGETS == req->target) { + } else if (get_x11_targets_atom() == req->target) { /* only advertise what we currently support */ const int num_supported = 3; Atom supported[num_supported] = { XA_STRING, // will be over-written below - XInternAtom(SDL_Display, "TEXT",False), - XA_TARGETS + get_x11_text_atom(), + get_x11_targets_atom() }; supported[0] = sevent.xselection.target; - XChangeProperty(SDL_Display, req->requestor, + XChangeProperty(get_SDL_Display(), req->requestor, req->property, XA_ATOM, 32, PropModeReplace, (unsigned char*)supported, num_supported); @@ -1358,10 +1447,10 @@ int clipboard_filter_callback(const SDL_Event *event) XFree(seln_data); } int sendret = - XSendEvent(SDL_Display,req->requestor,False,0,&sevent); + XSendEvent(get_SDL_Display(),req->requestor,False,0,&sevent); if ((sendret==BadValue) || (sendret==BadWindow)) llwarns << "Clipboard SendEvent failed" << llendl; - XSync(SDL_Display, False); + XSync(get_SDL_Display(), False); } break; } @@ -1386,8 +1475,7 @@ LLWindowSDL::init_x11clipboard(void) /* Save the information for later use */ if ( info.subsystem == SDL_SYSWM_X11 ) { - SDL_Display = info.info.x11.display; - SDL_XWindowID = info.info.x11.wmwindow; + mSDL_Display = info.info.x11.display; mSDL_XWindowID = info.info.x11.wmwindow; Lock_Display = info.info.x11.lock_func; Unlock_Display = info.info.x11.unlock_func; @@ -1409,8 +1497,7 @@ LLWindowSDL::init_x11clipboard(void) void LLWindowSDL::quit_x11clipboard(void) { - SDL_Display = NULL; - SDL_XWindowID = None; + mSDL_Display = NULL; mSDL_XWindowID = None; Lock_Display = NULL; Unlock_Display = NULL; @@ -1651,7 +1738,7 @@ BOOL LLWindowSDL::SDLReallyCaptureInput(BOOL capture) if (!mFullscreen) /* only bother if we're windowed anyway */ { #if LL_X11 - if (SDL_Display) + if (mSDL_Display) { /* we dirtily mix raw X11 with SDL so that our pointer isn't (as often) constrained to the limits of the @@ -1667,7 +1754,7 @@ BOOL LLWindowSDL::SDLReallyCaptureInput(BOOL capture) { //llinfos << "X11 POINTER GRABBY" << llendl; //newmode = SDL_WM_GrabInput(wantmode); - result = XGrabPointer(SDL_Display, mSDL_XWindowID, + result = XGrabPointer(mSDL_Display, mSDL_XWindowID, True, 0, GrabModeAsync, GrabModeAsync, None, None, CurrentTime); @@ -1681,9 +1768,9 @@ BOOL LLWindowSDL::SDLReallyCaptureInput(BOOL capture) newmode = SDL_GRAB_OFF; //newmode = SDL_WM_GrabInput(SDL_GRAB_OFF); - XUngrabPointer(SDL_Display, CurrentTime); + XUngrabPointer(mSDL_Display, CurrentTime); // Make sure the ungrab happens RIGHT NOW. - XSync(SDL_Display, False); + XSync(mSDL_Display, False); } else { newmode = SDL_GRAB_QUERY; // neutral @@ -1749,6 +1836,20 @@ void LLWindowSDL::gatherInput() static Uint32 lastRightDown = 0; SDL_Event event; +#if LL_GTK && LL_LIBXUL_ENABLED + // Pump GTK events so embedded Gecko doesn't starve. + if (ll_try_gtk_init()) + { + // Do a limited number of pumps so SL doesn't starve! + // FIXME - this should ideally be time-limited, not count-limited. + gtk_main_iteration_do(0); // Always do one non-blocking pump + for (int iter=0; iter<10; ++iter) + if (gtk_events_pending()) + gtk_main_iteration(); + } +#endif // LL_GTK && LL_LIBXUL_ENABLED + + // Handle all outstanding SDL events while (SDL_PollEvent(&event)) { switch (event.type) @@ -2236,14 +2337,13 @@ S32 OSMessageBoxSDL(const char* text, const char* caption, U32 type) S32 rtn = OSBTN_CANCEL; #if LL_GTK - maybe_do_gtk_diagnostics(); + ll_try_gtk_init(); #endif // LL_GTK if(gWindowImplementation != NULL) gWindowImplementation->beforeDialog(); - gtk_disable_setlocale(); - if (gtk_init_check(NULL, NULL) + if (ll_try_gtk_init() // We can NOT expect to combine GTK and SDL's aggressive fullscreen && ((NULL==gWindowImplementation) || (!was_fullscreen)) ) @@ -2279,10 +2379,11 @@ S32 OSMessageBoxSDL(const char* text, const char* caption, U32 type) // Make GTK tell the window manager to associate this // dialog with our non-GTK SDL window, which should try // to keep it on top etc. - if (SDL_XWindowID != None) + if (gWindowImplementation && + gWindowImplementation->mSDL_XWindowID != None) { gtk_widget_realize(GTK_WIDGET(win)); // so we can get its gdkwin - GdkWindow *gdkwin = gdk_window_foreign_new(SDL_XWindowID); + GdkWindow *gdkwin = gdk_window_foreign_new(gWindowImplementation->mSDL_XWindowID); gdk_window_set_transient_for(GTK_WIDGET(win)->window, gdkwin); } @@ -2351,8 +2452,7 @@ BOOL LLWindowSDL::dialog_color_picker ( F32 *r, F32 *g, F32 *b) beforeDialog(); - gtk_disable_setlocale(); - if (gtk_init_check(NULL, NULL) + if (ll_try_gtk_init() // We can NOT expect to combine GTK and SDL's aggressive fullscreen && !was_fullscreen ) @@ -2365,10 +2465,10 @@ BOOL LLWindowSDL::dialog_color_picker ( F32 *r, F32 *g, F32 *b) // Get GTK to tell the window manager to associate this // dialog with our non-GTK SDL window, which should try // to keep it on top etc. - if (SDL_XWindowID != None) + if (mSDL_XWindowID != None) { gtk_widget_realize(GTK_WIDGET(win)); // so we can get its gdkwin - GdkWindow *gdkwin = gdk_window_foreign_new(SDL_XWindowID); + GdkWindow *gdkwin = gdk_window_foreign_new(mSDL_XWindowID); gdk_window_set_transient_for(GTK_WIDGET(win)->window, gdkwin); } @@ -2440,8 +2540,9 @@ void spawn_web_browser(const char* escaped_url) #if LL_LINUX # if LL_X11 - if (SDL_Display) // Just in case - before forking. - XSync(SDL_Display, False); + if (gWindowImplementation && + gWindowImplementation->mSDL_Display) // Just in case - before forking. + XSync(gWindowImplementation->mSDL_Display, False); # endif // LL_X11 std::string cmd; @@ -2486,13 +2587,26 @@ void shell_open( const char* file_path ) void *LLWindowSDL::getPlatformWindow() { -#if LL_X11 - // pointer to our static raw X window - return (void*)&SDL_XWindowID; -#else - // doubt we really want to return a high-level SDL structure here. +#if LL_GTK && LL_LIBXUL_ENABLED + if (ll_try_gtk_init()) + { + GtkWidget *win = gtk_window_new(GTK_WINDOW_TOPLEVEL); + + // These hacks were attempts to get Gecko to see the keyboard, + // but I think they're doomed to fail. + //GdkWindow *gdkwin = gdk_window_foreign_new(SDL_XWindowID); + //GTK_WIDGET(win)->window = gdkwin; + //gtk_widget_set_parent_window(win, gdkwin); + + // show the hidden-widget while debugging (needs mozlib change) + //gtk_widget_show_all(GTK_WIDGET(win)); + + gtk_widget_realize(GTK_WIDGET(win)); + return win; + } +#endif // LL_GTK && LL_LIBXUL_ENABLED + // Unixoid mozilla really needs GTK. return NULL; -#endif } void LLWindowSDL::bringToFront() diff --git a/indra/llwindow/llwindowsdl.h b/indra/llwindow/llwindowsdl.h index 704262061a..f9fed99206 100644 --- a/indra/llwindow/llwindowsdl.h +++ b/indra/llwindow/llwindowsdl.h @@ -93,7 +93,17 @@ public: /*virtual*/ void *getPlatformWindow(); /*virtual*/ void bringToFront(); - + + // Not great that these are public, but they have to be accessible + // by non-class code and it's better than making them global. +#if LL_X11 + // These are set up by the X11 clipboard initialization code + Window mSDL_XWindowID; + Display *mSDL_Display; +#endif + void (*Lock_Display)(void); + void (*Unlock_Display)(void); + protected: LLWindowSDL( char *title, int x, int y, int width, int height, U32 flags, @@ -160,10 +170,6 @@ protected: #if LL_X11 private: - // These are set up by the X11 clipboard initialization code - Window mSDL_XWindowID; - void (*Lock_Display)(void); - void (*Unlock_Display)(void); // more X11 clipboard stuff int init_x11clipboard(void); void quit_x11clipboard(void); @@ -195,4 +201,14 @@ S32 OSMessageBoxSDL(const char* text, const char* caption, U32 type); void load_url_external(const char* url); void shell_open( const char* file_path ); +#if LL_GTK +// Lazily initialize and check the runtime GTK version for goodness. +BOOL ll_try_gtk_init(void); +#endif // LL_GTK + +#if LL_X11 +Window get_SDL_XWindowID(void); +Display* get_SDL_Display(void); +#endif // LL_X11 + #endif //LL_LLWINDOWSDL_H diff --git a/indra/newview/linux_tools/wrapper.sh b/indra/newview/linux_tools/wrapper.sh index 222ce98c73..fd571cacfd 100755 --- a/indra/newview/linux_tools/wrapper.sh +++ b/indra/newview/linux_tools/wrapper.sh @@ -38,7 +38,7 @@ export SDL_VIDEO_X11_DGAMOUSE=0 RUN_PATH=`dirname "$0" || echo .` cd "${RUN_PATH}" -LD_LIBRARY_PATH="`pwd`"/lib:"${LD_LIBRARY_PATH}" bin/do-not-directly-run-secondlife-bin `cat gridargs.dat` $@ | cat +LD_LIBRARY_PATH="`pwd`"/lib:"`pwd`"/app_settings/mozilla:"${LD_LIBRARY_PATH}" bin/do-not-directly-run-secondlife-bin `cat gridargs.dat` $@ | cat echo echo '*********************************************************' diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp index 9d698931b0..98bbf23502 100644 --- a/indra/newview/llfilepicker.cpp +++ b/indra/newview/llfilepicker.cpp @@ -17,6 +17,10 @@ #include "lldir.h" #include "llframetimer.h" +#if LL_SDL +#include "llwindowsdl.h" // for some X/GTK utils to help with filepickers +#endif // LL_SDL + // // Globals // @@ -954,8 +958,7 @@ static void store_filenames(GtkWidget *widget, gpointer user_data) { GtkWindow* LLFilePicker::buildFilePicker(void) { - gtk_disable_setlocale(); - if (gtk_init_check(NULL, NULL) && + if (ll_try_gtk_init() && ! gViewerWindow->getWindow()->getFullscreen()) { GtkWidget *win = NULL; @@ -967,18 +970,17 @@ GtkWindow* LLFilePicker::buildFilePicker(void) // Make GTK tell the window manager to associate this // dialog with our non-GTK raw X11 window, which should try // to keep it on top etc. - Window *XWindowID_ptr = (Window*) gViewerWindow-> - getWindow()->getPlatformWindow(); - if (XWindowID_ptr && None != *XWindowID_ptr) + Window XWindowID = get_SDL_XWindowID(); + if (None != XWindowID) { gtk_widget_realize(GTK_WIDGET(win)); // so we can get its gdkwin - GdkWindow *gdkwin = gdk_window_foreign_new(*XWindowID_ptr); + GdkWindow *gdkwin = gdk_window_foreign_new(XWindowID); gdk_window_set_transient_for(GTK_WIDGET(win)->window, gdkwin); } else { - llwarns << "Hmm, couldn't get xwid from LLWindow." << llendl; + llwarns << "Hmm, couldn't get xwid to use for transient." << llendl; } # endif //LL_X11 |