Home | History | Annotate | Download | only in gtk
      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 }
    115