linux: move gtk_init to the right thread

In the plugin process, gtk_init needs to be called from the UI thread (PluginThread) not the main thread (PluginMain) which is an IO thread.

Review URL: http://codereview.chromium.org/149424


git-svn-id: svn://svn.chromium.org/chrome/trunk/src@20340 0039d316-1c4b-4281-b951-d872f2087c98
Esse commit está contido em:
piman@google.com
2009-07-10 00:13:24 +00:00
commit 9db0a52f60
2 arquivos alterados com 21 adições e 16 exclusões
-16
Ver Arquivo
@@ -67,22 +67,6 @@ int PluginMain(const MainFunctionParams& parameters) {
MB_OK | MB_SETFOREGROUND);
}
#else
#if defined(OS_LINUX)
{
// XEmbed plugins assume they are hosted in a Gtk application, so we need
// to initialize Gtk in the plugin process.
// TODO(evanm): hoist this up nearer to where we have argc/argv.
const std::vector<std::string>& args = parameters.command_line_.argv();
int argc = args.size();
scoped_array<const char *> argv(new const char *[argc + 1]);
for (int i = 0; i < argc; ++i) {
argv[i] = args[i].c_str();
}
argv[argc] = NULL;
const char **argv_pointer = argv.get();
gtk_init(&argc, const_cast<char***>(&argv_pointer));
}
#endif
NOTIMPLEMENTED() << " non-windows startup, plugin startup dialog etc.";
#endif
+21
Ver Arquivo
@@ -54,6 +54,27 @@ void PluginThread::OnControlMessageReceived(const IPC::Message& msg) {
void PluginThread::Init() {
lazy_tls.Pointer()->Set(this);
#if defined(OS_LINUX)
{
// XEmbed plugins assume they are hosted in a Gtk application, so we need
// to initialize Gtk in the plugin process.
const std::vector<std::string>& args =
CommandLine::ForCurrentProcess()->argv();
int argc = args.size();
scoped_array<char *> argv(new char *[argc + 1]);
for (size_t i = 0; i < args.size(); ++i) {
// TODO(piman@google.com): can gtk_init modify argv? Just being safe
// here.
argv[i] = strdup(args[i].c_str());
}
argv[argc] = NULL;
char **argv_pointer = argv.get();
gtk_init(&argc, &argv_pointer);
for (size_t i = 0; i < args.size(); ++i) {
free(argv[i]);
}
}
#endif
ChildThread::Init();
PatchNPNFunctions();