#include "wx/utils.h"
#include "wx/dialog.h"
#include "wx/msgdlg.h"
+#include "wx/module.h"
#if wxUSE_DRAG_AND_DROP
#include "wx/dnd.h"
#endif // wxUSE_CARET
#if wxUSE_TEXTCTRL
-#include "wx/textctrl.h"
+ #include "wx/textctrl.h"
#endif
#include "wx/menu.h"
#endif
#endif
+#ifdef __WXGTK20__
+extern GtkContainerClass *pizza_parent_class;
+#endif
+
//-----------------------------------------------------------------------------
// documentation on internals
//-----------------------------------------------------------------------------
return p;
}
-
static void draw_frame( GtkWidget *widget, wxWindowGTK *win )
{
// wxUniversal widgets draw the borders and scrollbars themselves
draw_frame( widget, win );
+#ifdef __WXGTK20__
+
+ (* GTK_WIDGET_CLASS (pizza_parent_class)->expose_event) (widget, gdk_event);
+
+#endif
return TRUE;
}
// "draw" of m_widget
//-----------------------------------------------------------------------------
+#ifndef __WXGTK20__
+
static void gtk_window_own_draw_callback( GtkWidget *widget, GdkRectangle *WXUNUSED(rect), wxWindowGTK *win )
{
draw_frame( widget, win );
}
+#endif
+
//-----------------------------------------------------------------------------
// key code mapping routines
//-----------------------------------------------------------------------------
// Actual redrawing takes place in idle time.
win->Update();
+#ifdef __WXGTK20__
+
+ (* GTK_WIDGET_CLASS (pizza_parent_class)->expose_event) (widget, gdk_event);
+
+#endif
+
return TRUE;
}
// "draw" of m_wxwindow
//-----------------------------------------------------------------------------
+#ifndef __WXGTK20__
+
// This callback is a complete replacement of the gtk_pizza_draw() function,
-// which disabled.
+// which is disabled.
static void gtk_window_draw_callback( GtkWidget *widget,
GdkRectangle *rect,
win->GetUpdateRegion().Union( rect->x, rect->y, rect->width, rect->height );
// Actual redrawing takes place in idle time.
-
+
win->Update();
#ifndef __WXUNIVERSAL__
#endif
}
+#endif
+
//-----------------------------------------------------------------------------
// "key_press_event" from any window
//-----------------------------------------------------------------------------
event.m_metaDown = (gdk_event->state & GDK_MOD2_MASK);
event.m_keyCode = key_code;
event.m_scanCode = gdk_event->keyval;
+ event.m_rawCode = (wxUint32) gdk_event->keyval;
+ event.m_rawFlags = 0;
event.m_x = x;
event.m_y = y;
event.SetEventObject( win );
event.m_metaDown = (gdk_event->state & GDK_MOD2_MASK);
event.m_keyCode = key_code;
event.m_scanCode = gdk_event->keyval;
+ event.m_rawCode = (wxUint32) gdk_event->keyval;
+ event.m_rawFlags = 0;
event.m_x = x;
event.m_y = y;
event.SetEventObject( win );
}
m_insertCallback = wxInsertChildInWindow;
+
+ // always needed for background clearing
+ m_delayedBackgroundColour = TRUE;
m_widget = gtk_scrolled_window_new( (GtkAdjustment *) NULL, (GtkAdjustment *) NULL );
GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS );
m_vAdjust = gtk_range_get_adjustment( GTK_RANGE(scrolledWindow->vscrollbar) );
m_wxwindow = gtk_pizza_new();
-
+
#ifndef __WXUNIVERSAL__
GtkPizza *pizza = GTK_PIZZA(m_wxwindow);
#ifndef __WXGTK20__
gtk_signal_connect( GTK_OBJECT(m_wxwindow), "draw",
GTK_SIGNAL_FUNC(gtk_window_draw_callback), (gpointer)this );
-
+
if (HasFlag(wxNO_FULL_REPAINT_ON_RESIZE))
{
gtk_signal_connect( GTK_OBJECT(m_wxwindow), "event",
#endif
}
- // these are called when the "sunken" or "raised" borders are drawn */
+ // these are called when the "sunken" or "raised" borders are drawn
gtk_signal_connect( GTK_OBJECT(m_widget), "expose_event",
GTK_SIGNAL_FUNC(gtk_window_own_expose_callback), (gpointer)this );
int border = 0;
int bottom_border = 0;
+#ifndef __WXGTK20__
if (GTK_WIDGET_CAN_DEFAULT(m_widget))
{
/* the default button has a border around it */
border = 6;
bottom_border = 5;
}
+#endif
DoMoveWindow( m_x-border,
m_y-border,
{
// Update invalidated regions.
Update();
-
+
// Synthetize activate events.
if ( g_sendActivateEvent != -1 )
{
{
wxWindowDC dc( (wxWindow*)this );
dc.SetClippingRegion( m_clearRegion );
-
+
wxEraseEvent erase_event( GetId(), &dc );
erase_event.SetEventObject( this );
-
+
if (!GetEventHandler()->ProcessEvent(erase_event))
{
+ if (!g_eraseGC)
+ {
+ g_eraseGC = gdk_gc_new( GTK_PIZZA(m_wxwindow)->bin_window );
+ gdk_gc_set_fill( g_eraseGC, GDK_SOLID );
+ }
gdk_gc_set_foreground( g_eraseGC, m_backgroundColour.GetColor() );
-
+
wxRegionIterator upd( m_clearRegion );
while (upd)
{
- gdk_draw_rectangle( GTK_PIZZA(m_wxwindow)->bin_window, g_eraseGC, 0,
+ gdk_draw_rectangle( GTK_PIZZA(m_wxwindow)->bin_window, g_eraseGC, 1,
upd.GetX(), upd.GetY(), upd.GetWidth(), upd.GetHeight() );
upd ++;
}
// The following code will result in all window-less widgets
// being redrawn because the wxWindows class is allowed to
// paint over the window-less widgets.
-
+
GtkPizza *pizza = GTK_PIZZA(m_wxwindow);
-
+
GList *children = pizza->children;
while (children)
{
{
// Get intersection of widget area and update region
wxRegion region( m_updateRegion );
-
+
GdkEventExpose gdk_event;
gdk_event.type = GDK_EXPOSE;
gdk_event.window = pizza->bin_window;
gdk_event.count = 0;
-
+
wxRegionIterator upd( m_updateRegion );
while (upd)
{
rect.y = upd.GetY();
rect.width = upd.GetWidth();
rect.height = upd.GetHeight();
-
+
if (gtk_widget_intersect (child->widget, &rect, &gdk_event.area))
{
gtk_widget_event (child->widget, (GdkEvent*) &gdk_event);
}
-
+
upd ++;
}
}
if (m_wxwindow && m_wxwindow->window)
{
-// gdk_window_clear( m_wxwindow->window );
+ gdk_window_clear( m_wxwindow->window );
}
}
m_delayedBackgroundColour = TRUE;
}
+ if (window)
+ {
+ // We need the pixel value e.g. for background clearing.
+ m_backgroundColour.CalcPixel( gdk_window_get_colormap( window ) );
+ }
+
if ((m_wxwindow) &&
(m_wxwindow->window) &&
(m_backgroundColour != wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE)))
/* wxMSW doesn't clear the window here. I don't do that either to
provide compatibility. call Clear() to do the job. */
- m_backgroundColour.CalcPixel( gdk_window_get_colormap( window ) );
gdk_window_set_background( window, m_backgroundColour.GetColor() );
}
// No scrolling requested.
if ((dx == 0) && (dy == 0)) return;
-
+
#ifndef __WXGTK20__
if (!m_updateRegion.IsEmpty())
{
m_updateRegion.Offset( dx, dy );
-
+
int cw = 0;
int ch = 0;
GetClientSize( &cw, &ch );
m_updateRegion.Intersect( 0, 0, cw, ch );
}
-
+
if (!m_clearRegion.IsEmpty())
{
m_clearRegion.Offset( dx, dy );
-
+
int cw = 0;
int ch = 0;
GetClientSize( &cw, &ch );
m_clearRegion.Intersect( 0, 0, cw, ch );
}
-
+
m_clipPaintRegion = TRUE;
-
+
gtk_pizza_scroll( GTK_PIZZA(m_wxwindow), -dx, -dy );
-
+
m_clipPaintRegion = FALSE;
#else
- gdk_window_scroll( GTK_PIZZA(m_wxwindow)->bin_window, -dx, -dy );
-
- GTK_PIZZA(m_wxwindow)->xoffset -= dx;
- GTK_PIZZA(m_wxwindow)->yoffset -= dy;
-
-#endif
-
+ gdk_window_scroll( GTK_PIZZA(m_wxwindow)->bin_window, dx, dy );
+
+ GTK_PIZZA(m_wxwindow)->xoffset += dx;
+ GTK_PIZZA(m_wxwindow)->yoffset += dy;
+
+#endif
+
}
bool wxWinModule::OnInit()
{
- g_eraseGC = gdk_gc_new( GDK_ROOT_PARENT() );
- gdk_gc_set_fill( g_eraseGC, GDK_SOLID );
-
+ // g_eraseGC = gdk_gc_new( GDK_ROOT_PARENT() );
+ // gdk_gc_set_fill( g_eraseGC, GDK_SOLID );
+
return TRUE;
}
void wxWinModule::OnExit()
{
- gdk_gc_unref( g_eraseGC );
+ if (g_eraseGC)
+ gdk_gc_unref( g_eraseGC );
}