| Index: chrome/browser/renderer_host/resource_message_filter_gtk.cc
|
| diff --git a/chrome/browser/renderer_host/resource_message_filter_gtk.cc b/chrome/browser/renderer_host/resource_message_filter_gtk.cc
|
| index 0616cd9ad17441fc4f07edbad693cc255fe372b9..750356a936e6a0e23aa362cb8afcc2794c40f42c 100644
|
| --- a/chrome/browser/renderer_host/resource_message_filter_gtk.cc
|
| +++ b/chrome/browser/renderer_host/resource_message_filter_gtk.cc
|
| @@ -6,42 +6,106 @@
|
|
|
| #include <gtk/gtk.h>
|
|
|
| +#include "chrome/browser/chrome_thread.h"
|
| +#include "chrome/common/render_messages.h"
|
| +#include "chrome/common/x11_util.h"
|
| +
|
| +#include "third_party/WebKit/WebKit/chromium/public/WebScreenInfo.h"
|
| +#include "third_party/WebKit/WebKit/chromium/public/x11/WebScreenInfoFactory.h"
|
| +
|
| +using WebKit::WebScreenInfo;
|
| +using WebKit::WebScreenInfoFactory;
|
| +
|
| // We get null window_ids passed into the two functions below; please see
|
| // http://crbug.com/9060 for more details.
|
|
|
| -void ResourceMessageFilter::OnGetWindowRect(gfx::NativeViewId window_id,
|
| - gfx::Rect* rect) {
|
| - if (!window_id) {
|
| - *rect = gfx::Rect();
|
| - return;
|
| +// Called on the IO thread.
|
| +void ResourceMessageFilter::SendBackgroundX11Reply(IPC::Message* reply_msg) {
|
| + Send(reply_msg);
|
| +}
|
| +
|
| +// Called on the BACKGROUND_X11 thread.
|
| +void ResourceMessageFilter::DoOnGetScreenInfo(gfx::NativeViewId view,
|
| + IPC::Message* reply_msg) {
|
| + Display* display = x11_util::GetSecondaryDisplay();
|
| + int screen = x11_util::GetDefaultScreen(display);
|
| + WebScreenInfo results = WebScreenInfoFactory::screenInfo(display, screen);
|
| + ViewHostMsg_GetScreenInfo::WriteReplyParams(reply_msg, results);
|
| +
|
| + ChromeThread::GetMessageLoop(ChromeThread::IO)->PostTask(
|
| + FROM_HERE, NewRunnableMethod(
|
| + this, &ResourceMessageFilter::SendBackgroundX11Reply, reply_msg));
|
| +}
|
| +
|
| +// Called on the BACKGROUND_X11 thread.
|
| +void ResourceMessageFilter::DoOnGetWindowRect(gfx::NativeViewId view,
|
| + IPC::Message* reply_msg) {
|
| + gfx::Rect rect;
|
| +
|
| + if (view) {
|
| + XID window = x11_util::GetX11WindowFromGtkWidget(
|
| + gfx::NativeViewFromId(view));
|
| +
|
| + int x, y;
|
| + unsigned width, height;
|
| + x11_util::GetWindowGeometry(&x, &y, &width, &height, window);
|
| + rect = gfx::Rect(x, y, width, height);
|
| }
|
|
|
| - // Ideally this would be gtk_widget_get_window but that's only
|
| - // from gtk 2.14 onwards. :(
|
| - GdkWindow* window = gfx::NativeViewFromId(window_id)->window;
|
| - DCHECK(window);
|
| - gint x, y, width, height;
|
| - // This is the "position of a window in root window coordinates".
|
| - gdk_window_get_origin(window, &x, &y);
|
| - gdk_window_get_size(window, &width, &height);
|
| - *rect = gfx::Rect(x, y, width, height);
|
| + ViewHostMsg_GetWindowRect::WriteReplyParams(reply_msg, rect);
|
| +
|
| + ChromeThread::GetMessageLoop(ChromeThread::IO)->PostTask(
|
| + FROM_HERE, NewRunnableMethod(
|
| + this, &ResourceMessageFilter::SendBackgroundX11Reply, reply_msg));
|
| }
|
|
|
| -void ResourceMessageFilter::OnGetRootWindowRect(gfx::NativeViewId window_id,
|
| - gfx::Rect* rect) {
|
| - if (!window_id) {
|
| - *rect = gfx::Rect();
|
| - return;
|
| +// Called on the BACKGROUND_X11 thread.
|
| +void ResourceMessageFilter::DoOnGetRootWindowRect(gfx::NativeViewId view,
|
| + IPC::Message* reply_msg) {
|
| + gfx::Rect rect;
|
| +
|
| + if (view && gfx::NativeViewFromId(view)->window) {
|
| + // Windows uses GetAncestor(window, GA_ROOT) here which probably means
|
| + // we want the top level window.
|
| + // TODO(agl): calling GTK from this thread is not safe. However, we still
|
| + // have to solve the issue where we pass GtkWidget* into the renderer and
|
| + // the solution to that should also fix this problem.
|
| + GdkWindow* gdk_window =
|
| + gdk_window_get_toplevel(gfx::NativeViewFromId(view)->window);
|
| + XID window = x11_util::GetX11WindowFromGdkWindow(gdk_window);
|
| + int x, y;
|
| + unsigned width, height;
|
| + x11_util::GetWindowGeometry(&x, &y, &width, &height, window);
|
| + rect = gfx::Rect(x, y, width, height);
|
| }
|
|
|
| - // Windows uses GetAncestor(window, GA_ROOT) here which probably means
|
| - // we want the top level window.
|
| - GdkWindow* window =
|
| - gdk_window_get_toplevel(gfx::NativeViewFromId(window_id)->window);
|
| - DCHECK(window);
|
| - gint x, y, width, height;
|
| - // This is the "position of a window in root window coordinates".
|
| - gdk_window_get_origin(window, &x, &y);
|
| - gdk_window_get_size(window, &width, &height);
|
| - *rect = gfx::Rect(x, y, width, height);
|
| + ViewHostMsg_GetRootWindowRect::WriteReplyParams(reply_msg, rect);
|
| +
|
| + ChromeThread::GetMessageLoop(ChromeThread::IO)->PostTask(
|
| + FROM_HERE, NewRunnableMethod(
|
| + this, &ResourceMessageFilter::SendBackgroundX11Reply, reply_msg));
|
| +}
|
| +
|
| +// Called on the IO thread.
|
| +void ResourceMessageFilter::OnGetScreenInfo(gfx::NativeViewId view,
|
| + IPC::Message* reply_msg) {
|
| + ChromeThread::GetMessageLoop(ChromeThread::BACKGROUND_X11)->PostTask(
|
| + FROM_HERE, NewRunnableMethod(
|
| + this, &ResourceMessageFilter::DoOnGetScreenInfo, view, reply_msg));
|
| +}
|
| +
|
| +// Called on the IO thread.
|
| +void ResourceMessageFilter::OnGetWindowRect(gfx::NativeViewId view,
|
| + IPC::Message* reply_msg) {
|
| + ChromeThread::GetMessageLoop(ChromeThread::BACKGROUND_X11)->PostTask(
|
| + FROM_HERE, NewRunnableMethod(
|
| + this, &ResourceMessageFilter::DoOnGetWindowRect, view, reply_msg));
|
| +}
|
| +
|
| +// Called on the IO thread.
|
| +void ResourceMessageFilter::OnGetRootWindowRect(gfx::NativeViewId view,
|
| + IPC::Message* reply_msg) {
|
| + ChromeThread::GetMessageLoop(ChromeThread::BACKGROUND_X11)->PostTask(
|
| + FROM_HERE, NewRunnableMethod(
|
| + this, &ResourceMessageFilter::DoOnGetRootWindowRect, view, reply_msg));
|
| }
|
|
|