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:
@@ -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
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
Referência em uma Nova Issue
Bloquear um usuário