| Index: webkit/glue/plugins/webplugin_delegate_impl_gtk.cc
|
| diff --git a/webkit/glue/plugins/webplugin_delegate_impl_gtk.cc b/webkit/glue/plugins/webplugin_delegate_impl_gtk.cc
|
| index cde9502ec38ec2b7782be38e85b6a541a3f87b6d..f6f7da6c0bb89e39d26517b71583461a010829b9 100644
|
| --- a/webkit/glue/plugins/webplugin_delegate_impl_gtk.cc
|
| +++ b/webkit/glue/plugins/webplugin_delegate_impl_gtk.cc
|
| @@ -108,8 +108,6 @@ bool WebPluginDelegateImpl::Initialize(const GURL& url,
|
| // a valid window handle causes subtle bugs with plugins which retreive
|
| // the window handle and validate the same. The window handle can be
|
| // retreived via NPN_GetValue of NPNVnetscapeWindow.
|
| - NOTIMPLEMENTED() << "windowless not implemented";
|
| - return false;
|
| // instance_->set_window_handle(parent_);
|
| // CreateDummyWindowForActivation();
|
| // handle_event_pump_messages_event_ = CreateEvent(NULL, TRUE, FALSE, NULL);
|
| @@ -161,8 +159,7 @@ void WebPluginDelegateImpl::UpdateGeometry(
|
|
|
| void WebPluginDelegateImpl::Paint(void* dc, const gfx::Rect& rect) {
|
| if (windowless_) {
|
| - // TODO(port): windowless painting.
|
| - // WindowlessPaint(dc, rect);
|
| + WindowlessPaint(dc, rect);
|
| }
|
| }
|
|
|
| @@ -411,7 +408,7 @@ void WebPluginDelegateImpl::WindowlessUpdateGeometry(
|
| // Only resend to the instance if the geometry has changed.
|
| if (window_rect == window_rect_ && clip_rect == clip_rect_)
|
| return;
|
| - /*
|
| +
|
| // Set this flag before entering the instance in case of side-effects.
|
| windowless_needs_set_window_ = true;
|
|
|
| @@ -423,40 +420,22 @@ void WebPluginDelegateImpl::WindowlessUpdateGeometry(
|
| window_rect_ = window_rect;
|
|
|
| WindowlessSetWindow(true);
|
| -
|
| - WINDOWPOS win_pos = {0};
|
| - win_pos.x = window_rect_.x();
|
| - win_pos.y = window_rect_.y();
|
| - win_pos.cx = window_rect_.width();
|
| - win_pos.cy = window_rect_.height();
|
| -
|
| - NPEvent pos_changed_event;
|
| - pos_changed_event.event = WM_WINDOWPOSCHANGED;
|
| - pos_changed_event.wParam = 0;
|
| - pos_changed_event.lParam = PtrToUlong(&win_pos);
|
| -
|
| - instance()->NPP_HandleEvent(&pos_changed_event);
|
| }
|
| - */
|
| }
|
|
|
| -#if 0
|
| -void WebPluginDelegateImpl::WindowlessPaint(HDC hdc,
|
| +void WebPluginDelegateImpl::WindowlessPaint(void* context,
|
| const gfx::Rect& damage_rect) {
|
| - DCHECK(hdc);
|
| + // Compare to:
|
| + // http://mxr.mozilla.org/firefox/source/layout/generic/nsObjectFrame.cpp#4222
|
|
|
| - RECT damage_rect_win;
|
| - damage_rect_win.left = damage_rect.x(); // + window_rect_.x();
|
| - damage_rect_win.top = damage_rect.y(); // + window_rect_.y();
|
| - damage_rect_win.right = damage_rect_win.left + damage_rect.width();
|
| - damage_rect_win.bottom = damage_rect_win.top + damage_rect.height();
|
| + DCHECK(context);
|
|
|
| - // We need to pass the HDC to the plugin via NPP_SetWindow in the
|
| + // We need to pass the DC to the plugin via NPP_SetWindow in the
|
| // first paint to ensure that it initiates rect invalidations.
|
| - if (window_.window == NULL)
|
| + // TODO(evanm): for now, it appears we always need to do this.
|
| + if (true)
|
| windowless_needs_set_window_ = true;
|
|
|
| - window_.window = hdc;
|
| // TODO(darin): we should avoid calling NPP_SetWindow here since it may
|
| // cause page layout to be invalidated.
|
|
|
| @@ -465,16 +444,20 @@ void WebPluginDelegateImpl::WindowlessPaint(HDC hdc,
|
| if (windowless_needs_set_window_)
|
| WindowlessSetWindow(false);
|
|
|
| - NPEvent paint_event;
|
| - paint_event.event = WM_PAINT;
|
| - // NOTE: NPAPI is not 64bit safe. It puts pointers into 32bit values.
|
| - paint_event.wParam = PtrToUlong(hdc);
|
| - paint_event.lParam = PtrToUlong(&damage_rect_win);
|
| + XGraphicsExposeEvent event = {0};
|
| + event.type = GraphicsExpose;
|
| + event.display = GDK_DISPLAY();
|
| + event.drawable = (Drawable)context;
|
| + event.x = damage_rect.x();
|
| + event.y = damage_rect.y();
|
| + event.width = damage_rect.width();
|
| + event.height = damage_rect.height();
|
| +
|
| static StatsRate plugin_paint("Plugin.Paint");
|
| StatsScope<StatsRate> scope(plugin_paint);
|
| - instance()->NPP_HandleEvent(&paint_event);
|
| + NPError err = instance()->NPP_HandleEvent(reinterpret_cast<XEvent*>(&event));
|
| + DCHECK(err == NPERR_NO_ERROR);
|
| }
|
| -#endif
|
|
|
| void WebPluginDelegateImpl::WindowlessSetWindow(bool force_set_window) {
|
| if (!instance())
|
| @@ -484,6 +467,9 @@ void WebPluginDelegateImpl::WindowlessSetWindow(bool force_set_window) {
|
| return;
|
|
|
| DCHECK(instance()->windowless());
|
| + // Mozilla docs say that this window param is not used for windowless
|
| + // plugins; rather, the window is passed during the GraphicsExpose event.
|
| + DCHECK(window_.window == 0);
|
|
|
| window_.clipRect.top = clip_rect_.y();
|
| window_.clipRect.left = clip_rect_.x();
|
| @@ -495,6 +481,19 @@ void WebPluginDelegateImpl::WindowlessSetWindow(bool force_set_window) {
|
| window_.y = window_rect_.y();
|
| window_.type = NPWindowTypeDrawable;
|
|
|
| + NPSetWindowCallbackStruct* extra = new NPSetWindowCallbackStruct;
|
| + extra->display = GDK_DISPLAY();
|
| + GdkVisual* visual = gdk_visual_get_system();
|
| + extra->visual = GDK_VISUAL_XVISUAL(visual);
|
| + extra->depth = visual->depth;
|
| + // XXX we leak the colormap.
|
| + GdkColormap* colormap = gdk_colormap_new(gdk_visual_get_system(), FALSE);
|
| + extra->colormap = GDK_COLORMAP_XCOLORMAP(colormap);
|
| + window_.ws_info = extra;
|
| +
|
| + if (!force_set_window)
|
| + windowless_needs_set_window_ = false;
|
| +
|
| NPError err = instance()->NPP_SetWindow(&window_);
|
| DCHECK(err == NPERR_NO_ERROR);
|
| }
|
|
|