WebCore/platform/gtk/GtkPluginWidget.cpp
changeset 0 4f2f89ce4247
equal deleted inserted replaced
-1:000000000000 0:4f2f89ce4247
       
     1 /*
       
     2  * Copyright (C) 2009 Holger Hans Peter Freyther
       
     3  * All rights reserved.
       
     4  *
       
     5  * Redistribution and use in source and binary forms, with or without
       
     6  * modification, are permitted provided that the following conditions
       
     7  * are met:
       
     8  * 1. Redistributions of source code must retain the above copyright
       
     9  *    notice, this list of conditions and the following disclaimer.
       
    10  * 2. Redistributions in binary form must reproduce the above copyright
       
    11  *    notice, this list of conditions and the following disclaimer in the
       
    12  *    documentation and/or other materials provided with the distribution.
       
    13  *
       
    14  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
       
    15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
       
    16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
       
    17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
       
    18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
       
    19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
       
    20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
       
    21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
       
    22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
    23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
    24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
    25  */
       
    26 
       
    27 #include "config.h"
       
    28 #include "GtkPluginWidget.h"
       
    29 
       
    30 #include "GraphicsContext.h"
       
    31 #include "GtkVersioning.h"
       
    32 #include "ScrollView.h"
       
    33 
       
    34 #include <gtk/gtk.h>
       
    35 
       
    36 namespace WebCore {
       
    37 
       
    38 GtkPluginWidget::GtkPluginWidget(GtkWidget* widget)
       
    39     : Widget(widget)
       
    40 {
       
    41     gtk_widget_hide(widget);
       
    42 }
       
    43 
       
    44 void GtkPluginWidget::invalidateRect(const IntRect& _rect)
       
    45 {
       
    46     /* no need to */
       
    47     if (!gtk_widget_get_has_window(platformWidget()))
       
    48         return;
       
    49 
       
    50     GdkWindow* window = gtk_widget_get_window(platformWidget());
       
    51     if (!window)
       
    52         return;
       
    53 
       
    54     GdkRectangle rect = _rect;
       
    55     gdk_window_invalidate_rect(window, &rect, FALSE);
       
    56 }
       
    57 
       
    58 void GtkPluginWidget::frameRectsChanged()
       
    59 {
       
    60     IntRect rect = frameRect();
       
    61     IntPoint loc = parent()->contentsToWindow(rect.location());
       
    62     GtkAllocation allocation = { loc.x(), loc.y(), rect.width(), rect.height() };
       
    63 
       
    64     gtk_widget_set_size_request(platformWidget(), rect.width(), rect.height());
       
    65     gtk_widget_size_allocate(platformWidget(), &allocation);
       
    66     gtk_widget_show(platformWidget());
       
    67 }
       
    68 
       
    69 void GtkPluginWidget::paint(GraphicsContext* context, const IntRect& rect)
       
    70 {
       
    71     if (!context->gdkExposeEvent())
       
    72         return;
       
    73 
       
    74     /* only paint widgets with no window this way */
       
    75     if (gtk_widget_get_has_window(platformWidget()))
       
    76         return;
       
    77 
       
    78     GtkWidget* widget = platformWidget();
       
    79     ASSERT(!gtk_widget_get_has_window(widget));
       
    80 
       
    81     GdkEvent* event = gdk_event_new(GDK_EXPOSE);
       
    82     event->expose = *context->gdkExposeEvent();
       
    83     event->expose.area = static_cast<GdkRectangle>(rect);
       
    84 
       
    85     IntPoint loc = parent()->contentsToWindow(rect.location());
       
    86 
       
    87     event->expose.area.x = loc.x();
       
    88     event->expose.area.y = loc.y();
       
    89 
       
    90 #ifdef GTK_API_VERSION_2
       
    91     event->expose.region = gdk_region_rectangle(&event->expose.area);
       
    92 #else
       
    93     event->expose.region = cairo_region_create_rectangle(&event->expose.area);
       
    94 #endif
       
    95 
       
    96     /*
       
    97      * This will be unref'ed by gdk_event_free.
       
    98      */
       
    99     g_object_ref(event->expose.window);
       
   100 
       
   101     /*
       
   102      * If we are going to paint do the translation and GtkAllocation manipulation.
       
   103      */
       
   104 #ifdef GTK_API_VERSION_2
       
   105     if (!gdk_region_empty(event->expose.region))
       
   106 #else
       
   107     if (!cairo_region_is_empty(event->expose.region))
       
   108 #endif
       
   109         gtk_widget_send_expose(widget, event);
       
   110 
       
   111     gdk_event_free(event);
       
   112 }
       
   113 
       
   114 }