| Index: views/controls/native_view_host_gtk.cc
|
| ===================================================================
|
| --- views/controls/native_view_host_gtk.cc (revision 17161)
|
| +++ views/controls/native_view_host_gtk.cc (working copy)
|
| @@ -1,157 +0,0 @@
|
| -// Copyright (c) 2009 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "views/controls/native_view_host_gtk.h"
|
| -
|
| -#include <gtk/gtk.h>
|
| -
|
| -#include "base/logging.h"
|
| -#include "views/widget/widget_gtk.h"
|
| -
|
| -namespace views {
|
| -
|
| -NativeViewHostGtk::NativeViewHostGtk()
|
| - : NativeViewHost(),
|
| - destroy_signal_id_(0) {
|
| -}
|
| -
|
| -NativeViewHostGtk::~NativeViewHostGtk() {
|
| -}
|
| -
|
| -// static
|
| -View* NativeViewHostGtk::GetViewForNative(GtkWidget* widget) {
|
| - gpointer user_data = g_object_get_data(G_OBJECT(widget), "chrome-view");
|
| - return static_cast<View*>(user_data);
|
| -}
|
| -
|
| -// static
|
| -void NativeViewHostGtk::SetViewForNative(GtkWidget* widget, View* view) {
|
| - g_object_set_data(G_OBJECT(widget), "chrome-view", view);
|
| -}
|
| -
|
| -void NativeViewHostGtk::Attach(GtkWidget* widget) {
|
| - DCHECK(native_view() == NULL);
|
| - DCHECK(widget);
|
| -
|
| - // Adds a mapping between the GtkWidget and us.
|
| - SetViewForNative(widget, this);
|
| -
|
| - destroy_signal_id_ = g_signal_connect(G_OBJECT(widget), "destroy",
|
| - G_CALLBACK(CallDestroy), NULL);
|
| -
|
| - set_native_view(widget);
|
| -
|
| - // First hide the new window. We don't want anything to draw (like sub-hwnd
|
| - // borders), when we change the parent below.
|
| - gtk_widget_hide(widget);
|
| -
|
| - // Set the parent.
|
| - static_cast<WidgetGtk*>(GetWidget())->AddChild(widget);
|
| - Layout();
|
| -
|
| - // TODO: figure out focus.
|
| - // FocusManager::InstallFocusSubclass(
|
| - // hwnd, associated_focus_view()_ ? associated_focus_view() : this);
|
| -}
|
| -
|
| -void NativeViewHostGtk::Detach() {
|
| - DCHECK(native_view());
|
| -
|
| - g_signal_handler_disconnect(G_OBJECT(native_view()), destroy_signal_id_);
|
| - destroy_signal_id_ = 0;
|
| -
|
| - // TODO: focus.
|
| - // FocusManager::UninstallFocusSubclass(native_view());
|
| - set_native_view(NULL);
|
| - set_installed_clip(false);
|
| -}
|
| -
|
| -void NativeViewHostGtk::ViewHierarchyChanged(bool is_add, View* parent,
|
| - View* child) {
|
| - if (!native_view())
|
| - return;
|
| -
|
| - WidgetGtk* parent_widget = static_cast<WidgetGtk*>(GetWidget());
|
| - if (is_add && parent_widget) {
|
| - GtkWidget* widget_parent = gtk_widget_get_parent(native_view());
|
| - GtkWidget* parent_widget_widget = parent_widget->child_widget_parent();
|
| - if (widget_parent != parent_widget_widget) {
|
| - g_object_ref(native_view());
|
| - if (widget_parent)
|
| - gtk_container_remove(GTK_CONTAINER(widget_parent), native_view());
|
| - gtk_container_add(GTK_CONTAINER(parent_widget_widget), native_view());
|
| - g_object_unref(native_view());
|
| - }
|
| - if (IsVisibleInRootView())
|
| - gtk_widget_show(native_view());
|
| - else
|
| - gtk_widget_hide(native_view());
|
| - Layout();
|
| - } else if (!is_add) {
|
| - gtk_widget_hide(native_view());
|
| - if (parent_widget) {
|
| - gtk_container_remove(GTK_CONTAINER(parent_widget->child_widget_parent()),
|
| - native_view());
|
| - }
|
| - }
|
| -}
|
| -
|
| -void NativeViewHostGtk::Focus() {
|
| - NOTIMPLEMENTED();
|
| -}
|
| -
|
| -void NativeViewHostGtk::InstallClip(int x, int y, int w, int h) {
|
| - DCHECK(w > 0 && h > 0);
|
| -
|
| - bool has_window = (GTK_WIDGET_FLAGS(native_view()) & GTK_NO_WINDOW) == 0;
|
| - if (!has_window) {
|
| - // Clip is only supported on GtkWidgets that have windows. If this becomes
|
| - // an issue (as it may be in the options dialog) we'll need to wrap the
|
| - // widget in a GtkFixed with a window. We have to do this as not all widgets
|
| - // support turning on GTK_NO_WINDOW (for example, buttons don't appear to
|
| - // draw anything when they have a window).
|
| - NOTREACHED();
|
| - return;
|
| - }
|
| - DCHECK(has_window);
|
| - // Unset the current region.
|
| - gdk_window_shape_combine_region(native_view()->window, NULL, 0, 0);
|
| -
|
| - // Set a new region.
|
| - // TODO: using shapes is a bit expensive. Should investigated if there is
|
| - // another more efficient way to accomplish this.
|
| - GdkRectangle clip_rect = { x, y, w, h };
|
| - GdkRegion* clip_region = gdk_region_rectangle(&clip_rect);
|
| - gdk_window_shape_combine_region(native_view()->window, clip_region, x, y);
|
| - gdk_region_destroy(clip_region);
|
| -}
|
| -
|
| -void NativeViewHostGtk::UninstallClip() {
|
| - gtk_widget_shape_combine_mask(native_view(), NULL, 0, 0);
|
| -}
|
| -
|
| -void NativeViewHostGtk::ShowWidget(int x, int y, int w, int h) {
|
| - WidgetGtk* parent = static_cast<WidgetGtk*>(GetWidget());
|
| - parent->PositionChild(native_view(), x, y, w, h);
|
| - gtk_widget_show(native_view());
|
| -}
|
| -
|
| -void NativeViewHostGtk::HideWidget() {
|
| - gtk_widget_hide(native_view());
|
| -}
|
| -
|
| -void NativeViewHostGtk::OnDestroy() {
|
| - set_native_view(NULL);
|
| -}
|
| -
|
| -// static
|
| -void NativeViewHostGtk::CallDestroy(GtkObject* object) {
|
| - View* view = GetViewForNative(GTK_WIDGET(object));
|
| - if (!view)
|
| - return;
|
| -
|
| - return static_cast<NativeViewHostGtk*>(view)->OnDestroy();
|
| -}
|
| -
|
| -} // namespace views
|
|
|