• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
GtkPluginWidget(GtkWidget * widget)38 GtkPluginWidget::GtkPluginWidget(GtkWidget* widget)
39     : Widget(widget)
40 {
41     gtk_widget_hide(widget);
42 }
43 
invalidateRect(const IntRect & _rect)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 
frameRectsChanged()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 
paint(GraphicsContext * context,const IntRect & rect)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