#include "config.h"
#include "Widget.h"
#include "Cursor.h"
#include "FrameView.h"
#include "GraphicsContext.h"
#include "HostWindow.h"
#include "IntRect.h"
#include "NotImplemented.h"
#include "RenderObject.h"
#include <gdk/gdk.h>
#include <gtk/gtk.h>
namespace WebCore {
class WidgetPrivate {
public:
GdkCursor* cursor;
};
Widget::Widget(PlatformWidget widget)
: m_data(new WidgetPrivate)
{
init(widget);
m_data->cursor = 0;
}
Widget::~Widget()
{
ASSERT(!parent());
releasePlatformWidget();
delete m_data;
}
void Widget::setFocus()
{
gtk_widget_grab_focus(platformWidget() ? platformWidget() : GTK_WIDGET(root()->hostWindow()->platformWindow()));
}
Cursor Widget::cursor()
{
return Cursor(m_data->cursor);
}
static GdkDrawable* gdkDrawable(PlatformWidget widget)
{
return widget ? widget->window : 0;
}
void Widget::setCursor(const Cursor& cursor)
{
GdkCursor* pcur = cursor.impl();
if (pcur == m_data->cursor)
return;
gdk_window_set_cursor(gdkDrawable(platformWidget()) ? GDK_WINDOW(gdkDrawable(platformWidget())) : GTK_WIDGET(root()->hostWindow()->platformWindow())->window, pcur);
m_data->cursor = pcur;
}
void Widget::show()
{
if (!platformWidget())
return;
gtk_widget_show(platformWidget());
}
void Widget::hide()
{
if (!platformWidget())
return;
gtk_widget_hide(platformWidget());
}
void Widget::paint(GraphicsContext* context, const IntRect&)
{
if (!platformWidget())
return;
if (!context->gdkExposeEvent())
return;
GtkWidget* widget = platformWidget();
ASSERT(GTK_WIDGET_NO_WINDOW(widget));
GdkEvent* event = gdk_event_new(GDK_EXPOSE);
event->expose = *context->gdkExposeEvent();
event->expose.region = gtk_widget_region_intersect(widget, event->expose.region);
g_object_ref(event->expose.window);
if (!gdk_region_empty(event->expose.region)) {
gdk_region_get_clipbox(event->expose.region, &event->expose.area);
gtk_widget_send_expose(widget, event);
}
gdk_event_free(event);
}
void Widget::setIsSelected(bool)
{
notImplemented();
}
IntRect Widget::frameRect() const
{
return m_frame;
}
void Widget::setFrameRect(const IntRect& rect)
{
m_frame = rect;
}
void Widget::releasePlatformWidget()
{
if (!platformWidget())
return;
g_object_unref(platformWidget());
}
void Widget::retainPlatformWidget()
{
if (!platformWidget())
return;
#if GLIB_CHECK_VERSION(2,10,0)
g_object_ref_sink(platformWidget());
#else
g_object_ref(platformWidget());
gtk_object_sink(GTK_OBJECT(platformWidget()));
#endif
}
}