Put some life into GTK 2.0 drawing.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14852 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -418,8 +418,10 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent,
|
|||||||
// for m_mainWidget themes
|
// for m_mainWidget themes
|
||||||
gtk_signal_connect( GTK_OBJECT(m_mainWidget), "expose_event",
|
gtk_signal_connect( GTK_OBJECT(m_mainWidget), "expose_event",
|
||||||
GTK_SIGNAL_FUNC(gtk_window_expose_callback), (gpointer)this );
|
GTK_SIGNAL_FUNC(gtk_window_expose_callback), (gpointer)this );
|
||||||
|
#ifndef __WXGTK20__
|
||||||
gtk_signal_connect( GTK_OBJECT(m_mainWidget), "draw",
|
gtk_signal_connect( GTK_OBJECT(m_mainWidget), "draw",
|
||||||
GTK_SIGNAL_FUNC(gtk_window_draw_callback), (gpointer)this );
|
GTK_SIGNAL_FUNC(gtk_window_draw_callback), (gpointer)this );
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __WXDEBUG__
|
#ifdef __WXDEBUG__
|
||||||
debug_focus_in( m_mainWidget, wxT("wxTopLevelWindowGTK::m_mainWidget"), name );
|
debug_focus_in( m_mainWidget, wxT("wxTopLevelWindowGTK::m_mainWidget"), name );
|
||||||
|
@@ -766,6 +766,12 @@ gtk_pizza_expose (GtkWidget *widget,
|
|||||||
|
|
||||||
pizza = GTK_PIZZA (widget);
|
pizza = GTK_PIZZA (widget);
|
||||||
|
|
||||||
|
#ifdef __WXGTK20__
|
||||||
|
|
||||||
|
(* GTK_WIDGET_CLASS (parent_class)->expose_event) (widget, event);
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
/* Sometimes, We handle all expose events in window.cpp now. */
|
/* Sometimes, We handle all expose events in window.cpp now. */
|
||||||
if (pizza->external_expose)
|
if (pizza->external_expose)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@@ -788,6 +794,7 @@ gtk_pizza_expose (GtkWidget *widget,
|
|||||||
gtk_widget_event (child->widget, (GdkEvent*) &child_event);
|
gtk_widget_event (child->widget, (GdkEvent*) &child_event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@@ -70,6 +70,12 @@
|
|||||||
#define SET_CONTAINER_FOCUS(w, d) gtk_container_focus(GTK_CONTAINER(w), (d))
|
#define SET_CONTAINER_FOCUS(w, d) gtk_container_focus(GTK_CONTAINER(w), (d))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __WXGTK20__
|
||||||
|
#ifdef HAVE_XIM
|
||||||
|
#undef HAVE_XIM
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// documentation on internals
|
// documentation on internals
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@@ -209,6 +215,8 @@ extern bool g_blockEventsOnDrag;
|
|||||||
extern bool g_blockEventsOnScroll;
|
extern bool g_blockEventsOnScroll;
|
||||||
extern wxCursor g_globalCursor;
|
extern wxCursor g_globalCursor;
|
||||||
|
|
||||||
|
static GdkGC *g_eraseGC = NULL;
|
||||||
|
|
||||||
// mouse capture state: the window which has it and if the mouse is currently
|
// mouse capture state: the window which has it and if the mouse is currently
|
||||||
// inside it
|
// inside it
|
||||||
static wxWindowGTK *g_captureWindow = (wxWindowGTK*) NULL;
|
static wxWindowGTK *g_captureWindow = (wxWindowGTK*) NULL;
|
||||||
@@ -2336,12 +2344,8 @@ bool wxWindowGTK::Create( wxWindow *parent,
|
|||||||
m_vAdjust = gtk_range_get_adjustment( GTK_RANGE(scrolledWindow->vscrollbar) );
|
m_vAdjust = gtk_range_get_adjustment( GTK_RANGE(scrolledWindow->vscrollbar) );
|
||||||
|
|
||||||
m_wxwindow = gtk_pizza_new();
|
m_wxwindow = gtk_pizza_new();
|
||||||
|
|
||||||
gtk_container_add( GTK_CONTAINER(m_widget), m_wxwindow );
|
|
||||||
|
|
||||||
#ifndef __WXUNIVERSAL__
|
#ifndef __WXUNIVERSAL__
|
||||||
|
|
||||||
#if GTK_CHECK_VERSION(1, 2, 0)
|
|
||||||
GtkPizza *pizza = GTK_PIZZA(m_wxwindow);
|
GtkPizza *pizza = GTK_PIZZA(m_wxwindow);
|
||||||
|
|
||||||
if (HasFlag(wxRAISED_BORDER))
|
if (HasFlag(wxRAISED_BORDER))
|
||||||
@@ -2360,34 +2364,13 @@ bool wxWindowGTK::Create( wxWindow *parent,
|
|||||||
{
|
{
|
||||||
gtk_pizza_set_shadow_type( pizza, GTK_MYSHADOW_NONE );
|
gtk_pizza_set_shadow_type( pizza, GTK_MYSHADOW_NONE );
|
||||||
}
|
}
|
||||||
#else // GTK+ 1.0
|
|
||||||
GtkViewport *viewport = GTK_VIEWPORT(scrolledWindow->viewport);
|
|
||||||
|
|
||||||
if (HasFlag(wxRAISED_BORDER))
|
|
||||||
{
|
|
||||||
gtk_viewport_set_shadow_type( viewport, GTK_SHADOW_OUT );
|
|
||||||
}
|
|
||||||
else if (HasFlag(wxSUNKEN_BORDER))
|
|
||||||
{
|
|
||||||
gtk_viewport_set_shadow_type( viewport, GTK_SHADOW_IN );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
gtk_viewport_set_shadow_type( viewport, GTK_SHADOW_NONE );
|
|
||||||
}
|
|
||||||
#endif // GTK+ > 1.0/<= 1.0
|
|
||||||
|
|
||||||
#endif // __WXUNIVERSAL__
|
#endif // __WXUNIVERSAL__
|
||||||
|
|
||||||
|
gtk_container_add( GTK_CONTAINER(m_widget), m_wxwindow );
|
||||||
|
|
||||||
GTK_WIDGET_SET_FLAGS( m_wxwindow, GTK_CAN_FOCUS );
|
GTK_WIDGET_SET_FLAGS( m_wxwindow, GTK_CAN_FOCUS );
|
||||||
m_acceptsFocus = TRUE;
|
m_acceptsFocus = TRUE;
|
||||||
|
|
||||||
#if !GTK_CHECK_VERSION(1, 2, 0)
|
|
||||||
// shut the viewport up
|
|
||||||
gtk_viewport_set_hadjustment( viewport, (GtkAdjustment*) gtk_adjustment_new( 0.0, 0.0, 0.0, 0.0, 0.0, 0.0) );
|
|
||||||
gtk_viewport_set_vadjustment( viewport, (GtkAdjustment*) gtk_adjustment_new( 0.0, 0.0, 0.0, 0.0, 0.0, 0.0) );
|
|
||||||
#endif // GTK+ 1.0
|
|
||||||
|
|
||||||
// I _really_ don't want scrollbars in the beginning
|
// I _really_ don't want scrollbars in the beginning
|
||||||
m_vAdjust->lower = 0.0;
|
m_vAdjust->lower = 0.0;
|
||||||
m_vAdjust->upper = 1.0;
|
m_vAdjust->upper = 1.0;
|
||||||
@@ -2539,22 +2522,28 @@ void wxWindowGTK::PostCreation()
|
|||||||
gtk_signal_connect( GTK_OBJECT(m_wxwindow), "expose_event",
|
gtk_signal_connect( GTK_OBJECT(m_wxwindow), "expose_event",
|
||||||
GTK_SIGNAL_FUNC(gtk_window_expose_callback), (gpointer)this );
|
GTK_SIGNAL_FUNC(gtk_window_expose_callback), (gpointer)this );
|
||||||
|
|
||||||
|
#ifndef __WXGTK20__
|
||||||
gtk_signal_connect( GTK_OBJECT(m_wxwindow), "draw",
|
gtk_signal_connect( GTK_OBJECT(m_wxwindow), "draw",
|
||||||
GTK_SIGNAL_FUNC(gtk_window_draw_callback), (gpointer)this );
|
GTK_SIGNAL_FUNC(gtk_window_draw_callback), (gpointer)this );
|
||||||
|
|
||||||
if (HasFlag(wxNO_FULL_REPAINT_ON_RESIZE))
|
if (HasFlag(wxNO_FULL_REPAINT_ON_RESIZE))
|
||||||
{
|
{
|
||||||
gtk_signal_connect( GTK_OBJECT(m_wxwindow), "event",
|
gtk_signal_connect( GTK_OBJECT(m_wxwindow), "event",
|
||||||
GTK_SIGNAL_FUNC(gtk_window_event_event_callback), (gpointer)this );
|
GTK_SIGNAL_FUNC(gtk_window_event_event_callback), (gpointer)this );
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
gtk_widget_set_redraw_on_allocate( GTK_WIDGET(m_wxwindow), HasFlag( wxNO_FULL_REPAINT_ON_RESIZE ) );
|
||||||
|
#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_connect( GTK_OBJECT(m_widget), "expose_event",
|
||||||
GTK_SIGNAL_FUNC(gtk_window_own_expose_callback), (gpointer)this );
|
GTK_SIGNAL_FUNC(gtk_window_own_expose_callback), (gpointer)this );
|
||||||
|
|
||||||
|
#ifndef __WXGTK20__
|
||||||
gtk_signal_connect( GTK_OBJECT(m_widget), "draw",
|
gtk_signal_connect( GTK_OBJECT(m_widget), "draw",
|
||||||
GTK_SIGNAL_FUNC(gtk_window_own_draw_callback), (gpointer)this );
|
GTK_SIGNAL_FUNC(gtk_window_own_draw_callback), (gpointer)this );
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// focus handling
|
// focus handling
|
||||||
@@ -2562,12 +2551,6 @@ void wxWindowGTK::PostCreation()
|
|||||||
if (m_focusWidget == NULL)
|
if (m_focusWidget == NULL)
|
||||||
m_focusWidget = m_widget;
|
m_focusWidget = m_widget;
|
||||||
|
|
||||||
#if 0
|
|
||||||
if (GetClassInfo() && GetClassInfo()->GetClassName())
|
|
||||||
wxPrintf( GetClassInfo()->GetClassName() );
|
|
||||||
wxPrintf( ".\n" );
|
|
||||||
#endif
|
|
||||||
|
|
||||||
gtk_signal_connect( GTK_OBJECT(m_focusWidget), "focus_in_event",
|
gtk_signal_connect( GTK_OBJECT(m_focusWidget), "focus_in_event",
|
||||||
GTK_SIGNAL_FUNC(gtk_window_focus_in_callback), (gpointer)this );
|
GTK_SIGNAL_FUNC(gtk_window_focus_in_callback), (gpointer)this );
|
||||||
|
|
||||||
@@ -2683,7 +2666,6 @@ void wxWindowGTK::DoSetSize( int x, int y, int width, int height, int sizeFlags
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
GtkPizza *pizza = GTK_PIZZA(m_parent->m_wxwindow);
|
GtkPizza *pizza = GTK_PIZZA(m_parent->m_wxwindow);
|
||||||
|
|
||||||
if ((sizeFlags & wxSIZE_ALLOW_MINUS_ONE) == 0)
|
if ((sizeFlags & wxSIZE_ALLOW_MINUS_ONE) == 0)
|
||||||
{
|
{
|
||||||
if (x != -1) m_x = x + pizza->xoffset;
|
if (x != -1) m_x = x + pizza->xoffset;
|
||||||
@@ -3289,12 +3271,7 @@ void wxWindowGTK::Refresh( bool eraseBackground, const wxRect *rect )
|
|||||||
if (!m_widget) return;
|
if (!m_widget) return;
|
||||||
if (!m_widget->window) return;
|
if (!m_widget->window) return;
|
||||||
|
|
||||||
// temporarily hide the caret to avoid nasty interactions between caret
|
#ifndef __WXGTK20__
|
||||||
// drawing and the window contents redraw
|
|
||||||
#if 0 // def wxUSE_CARET -- doesn't seem to help :-(
|
|
||||||
wxCaretSuspend cs((wxWindow *)this);
|
|
||||||
#endif // wxUSE_CARET
|
|
||||||
|
|
||||||
if (eraseBackground && m_wxwindow && m_wxwindow->window)
|
if (eraseBackground && m_wxwindow && m_wxwindow->window)
|
||||||
{
|
{
|
||||||
if (rect)
|
if (rect)
|
||||||
@@ -3340,14 +3317,35 @@ void wxWindowGTK::Refresh( bool eraseBackground, const wxRect *rect )
|
|||||||
gtk_widget_draw( m_widget, (GdkRectangle*) NULL );
|
gtk_widget_draw( m_widget, (GdkRectangle*) NULL );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
if (m_wxwindow)
|
||||||
|
{
|
||||||
|
if (rect)
|
||||||
|
{
|
||||||
|
GdkRectangle gdk_rect;
|
||||||
|
gdk_rect.x = rect->x;
|
||||||
|
gdk_rect.y = rect->y;
|
||||||
|
gdk_rect.width = rect->width;
|
||||||
|
gdk_rect.height = rect->height;
|
||||||
|
gdk_window_invalidate_rect( GTK_PIZZA(m_wxwindow)->bin_window, &gdk_rect, TRUE );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gdk_window_invalidate_rect( GTK_PIZZA(m_wxwindow)->bin_window, NULL, TRUE );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxWindowGTK::Update()
|
void wxWindowGTK::Update()
|
||||||
{
|
{
|
||||||
|
#ifdef __WXGTK20__
|
||||||
|
if (m_wxwindow && GTK_PIZZA(m_wxwindow)->bin_window)
|
||||||
|
gdk_window_process_updates( GTK_PIZZA(m_wxwindow)->bin_window, FALSE );
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!m_updateRegion.IsEmpty())
|
if (!m_updateRegion.IsEmpty())
|
||||||
{
|
|
||||||
GtkSendPaintEvents();
|
GtkSendPaintEvents();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxWindowGTK::GtkSendPaintEvents()
|
void wxWindowGTK::GtkSendPaintEvents()
|
||||||
@@ -3371,10 +3369,12 @@ void wxWindowGTK::GtkSendPaintEvents()
|
|||||||
|
|
||||||
if (!GetEventHandler()->ProcessEvent(erase_event))
|
if (!GetEventHandler()->ProcessEvent(erase_event))
|
||||||
{
|
{
|
||||||
|
gdk_gc_set_foreground( g_eraseGC, m_backgroundColour.GetColor() );
|
||||||
|
|
||||||
wxRegionIterator upd( m_clearRegion );
|
wxRegionIterator upd( m_clearRegion );
|
||||||
while (upd)
|
while (upd)
|
||||||
{
|
{
|
||||||
gdk_window_clear_area( GTK_PIZZA(m_wxwindow)->bin_window,
|
gdk_draw_rectangle( GTK_PIZZA(m_wxwindow)->bin_window, g_eraseGC, 0,
|
||||||
upd.GetX(), upd.GetY(), upd.GetWidth(), upd.GetHeight() );
|
upd.GetX(), upd.GetY(), upd.GetWidth(), upd.GetHeight() );
|
||||||
upd ++;
|
upd ++;
|
||||||
}
|
}
|
||||||
@@ -3393,6 +3393,7 @@ void wxWindowGTK::GtkSendPaintEvents()
|
|||||||
m_clipPaintRegion = FALSE;
|
m_clipPaintRegion = FALSE;
|
||||||
|
|
||||||
#ifndef __WXUNIVERSAL__
|
#ifndef __WXUNIVERSAL__
|
||||||
|
#ifndef __WXGTK20__
|
||||||
// The following code will result in all window-less widgets
|
// The following code will result in all window-less widgets
|
||||||
// being redrawn because the wxWindows class is allowed to
|
// being redrawn because the wxWindows class is allowed to
|
||||||
// paint over the window-less widgets.
|
// paint over the window-less widgets.
|
||||||
@@ -3434,6 +3435,7 @@ void wxWindowGTK::GtkSendPaintEvents()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
m_updateRegion.Clear();
|
m_updateRegion.Clear();
|
||||||
@@ -4038,6 +4040,7 @@ void wxWindowGTK::ScrollWindow( int dx, int dy, const wxRect* WXUNUSED(rect) )
|
|||||||
// No scrolling requested.
|
// No scrolling requested.
|
||||||
if ((dx == 0) && (dy == 0)) return;
|
if ((dx == 0) && (dy == 0)) return;
|
||||||
|
|
||||||
|
#ifndef __WXGTK20__
|
||||||
if (!m_updateRegion.IsEmpty())
|
if (!m_updateRegion.IsEmpty())
|
||||||
{
|
{
|
||||||
m_updateRegion.Offset( dx, dy );
|
m_updateRegion.Offset( dx, dy );
|
||||||
@@ -4058,68 +4061,23 @@ void wxWindowGTK::ScrollWindow( int dx, int dy, const wxRect* WXUNUSED(rect) )
|
|||||||
m_clearRegion.Intersect( 0, 0, cw, ch );
|
m_clearRegion.Intersect( 0, 0, cw, ch );
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 1
|
|
||||||
|
|
||||||
m_clipPaintRegion = TRUE;
|
m_clipPaintRegion = TRUE;
|
||||||
|
|
||||||
gtk_pizza_scroll( GTK_PIZZA(m_wxwindow), -dx, -dy );
|
gtk_pizza_scroll( GTK_PIZZA(m_wxwindow), -dx, -dy );
|
||||||
|
|
||||||
m_clipPaintRegion = FALSE;
|
m_clipPaintRegion = FALSE;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
if (m_children.GetCount() > 0)
|
gdk_window_scroll( GTK_PIZZA(m_wxwindow)->bin_window, -dx, -dy );
|
||||||
{
|
|
||||||
gtk_pizza_scroll( GTK_PIZZA(m_wxwindow), -dx, -dy );
|
GTK_PIZZA(m_wxwindow)->xoffset -= dx;
|
||||||
}
|
GTK_PIZZA(m_wxwindow)->yoffset -= dy;
|
||||||
else
|
|
||||||
{
|
#endif
|
||||||
GtkPizza *pizza = GTK_PIZZA(m_wxwindow);
|
|
||||||
|
|
||||||
pizza->xoffset -= dx;
|
|
||||||
pizza->yoffset -= dy;
|
|
||||||
|
|
||||||
GdkGC *m_scrollGC = gdk_gc_new( pizza->bin_window );
|
|
||||||
gdk_gc_set_exposures( m_scrollGC, TRUE );
|
|
||||||
|
|
||||||
int cw = 0;
|
|
||||||
int ch = 0;
|
|
||||||
GetClientSize( &cw, &ch );
|
|
||||||
int w = cw - abs(dx);
|
|
||||||
int h = ch - abs(dy);
|
|
||||||
|
|
||||||
if ((h < 0) || (w < 0))
|
|
||||||
{
|
|
||||||
Refresh();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int s_x = 0;
|
|
||||||
int s_y = 0;
|
|
||||||
if (dx < 0) s_x = -dx;
|
|
||||||
if (dy < 0) s_y = -dy;
|
|
||||||
int d_x = 0;
|
|
||||||
int d_y = 0;
|
|
||||||
if (dx > 0) d_x = dx;
|
|
||||||
if (dy > 0) d_y = dy;
|
|
||||||
|
|
||||||
gdk_window_copy_area( pizza->bin_window, m_scrollGC, d_x, d_y,
|
|
||||||
pizza->bin_window, s_x, s_y, w, h );
|
|
||||||
|
|
||||||
wxRect rect;
|
|
||||||
if (dx < 0) rect.x = cw+dx; else rect.x = 0;
|
|
||||||
if (dy < 0) rect.y = ch+dy; else rect.y = 0;
|
|
||||||
if (dy != 0) rect.width = cw; else rect.width = abs(dx);
|
|
||||||
if (dx != 0) rect.height = ch; else rect.height = abs(dy);
|
|
||||||
|
|
||||||
Refresh( TRUE, &rect );
|
|
||||||
}
|
|
||||||
|
|
||||||
gdk_gc_unref( m_scrollGC );
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Find the wxWindow at the current mouse position, also returning the mouse
|
// Find the wxWindow at the current mouse position, also returning the mouse
|
||||||
// position.
|
// position.
|
||||||
wxWindow* wxFindWindowAtPointer(wxPoint& pt)
|
wxWindow* wxFindWindowAtPointer(wxPoint& pt)
|
||||||
@@ -4161,3 +4119,32 @@ wxPoint wxGetMousePosition()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxDCModule
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class wxWinModule : public wxModule
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
bool OnInit();
|
||||||
|
void OnExit();
|
||||||
|
|
||||||
|
private:
|
||||||
|
DECLARE_DYNAMIC_CLASS(wxWinModule)
|
||||||
|
};
|
||||||
|
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxWinModule, wxModule)
|
||||||
|
|
||||||
|
bool wxWinModule::OnInit()
|
||||||
|
{
|
||||||
|
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 );
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -418,8 +418,10 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent,
|
|||||||
// for m_mainWidget themes
|
// for m_mainWidget themes
|
||||||
gtk_signal_connect( GTK_OBJECT(m_mainWidget), "expose_event",
|
gtk_signal_connect( GTK_OBJECT(m_mainWidget), "expose_event",
|
||||||
GTK_SIGNAL_FUNC(gtk_window_expose_callback), (gpointer)this );
|
GTK_SIGNAL_FUNC(gtk_window_expose_callback), (gpointer)this );
|
||||||
|
#ifndef __WXGTK20__
|
||||||
gtk_signal_connect( GTK_OBJECT(m_mainWidget), "draw",
|
gtk_signal_connect( GTK_OBJECT(m_mainWidget), "draw",
|
||||||
GTK_SIGNAL_FUNC(gtk_window_draw_callback), (gpointer)this );
|
GTK_SIGNAL_FUNC(gtk_window_draw_callback), (gpointer)this );
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __WXDEBUG__
|
#ifdef __WXDEBUG__
|
||||||
debug_focus_in( m_mainWidget, wxT("wxTopLevelWindowGTK::m_mainWidget"), name );
|
debug_focus_in( m_mainWidget, wxT("wxTopLevelWindowGTK::m_mainWidget"), name );
|
||||||
|
@@ -766,6 +766,12 @@ gtk_pizza_expose (GtkWidget *widget,
|
|||||||
|
|
||||||
pizza = GTK_PIZZA (widget);
|
pizza = GTK_PIZZA (widget);
|
||||||
|
|
||||||
|
#ifdef __WXGTK20__
|
||||||
|
|
||||||
|
(* GTK_WIDGET_CLASS (parent_class)->expose_event) (widget, event);
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
/* Sometimes, We handle all expose events in window.cpp now. */
|
/* Sometimes, We handle all expose events in window.cpp now. */
|
||||||
if (pizza->external_expose)
|
if (pizza->external_expose)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@@ -788,6 +794,7 @@ gtk_pizza_expose (GtkWidget *widget,
|
|||||||
gtk_widget_event (child->widget, (GdkEvent*) &child_event);
|
gtk_widget_event (child->widget, (GdkEvent*) &child_event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@@ -70,6 +70,12 @@
|
|||||||
#define SET_CONTAINER_FOCUS(w, d) gtk_container_focus(GTK_CONTAINER(w), (d))
|
#define SET_CONTAINER_FOCUS(w, d) gtk_container_focus(GTK_CONTAINER(w), (d))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __WXGTK20__
|
||||||
|
#ifdef HAVE_XIM
|
||||||
|
#undef HAVE_XIM
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// documentation on internals
|
// documentation on internals
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@@ -209,6 +215,8 @@ extern bool g_blockEventsOnDrag;
|
|||||||
extern bool g_blockEventsOnScroll;
|
extern bool g_blockEventsOnScroll;
|
||||||
extern wxCursor g_globalCursor;
|
extern wxCursor g_globalCursor;
|
||||||
|
|
||||||
|
static GdkGC *g_eraseGC = NULL;
|
||||||
|
|
||||||
// mouse capture state: the window which has it and if the mouse is currently
|
// mouse capture state: the window which has it and if the mouse is currently
|
||||||
// inside it
|
// inside it
|
||||||
static wxWindowGTK *g_captureWindow = (wxWindowGTK*) NULL;
|
static wxWindowGTK *g_captureWindow = (wxWindowGTK*) NULL;
|
||||||
@@ -2336,12 +2344,8 @@ bool wxWindowGTK::Create( wxWindow *parent,
|
|||||||
m_vAdjust = gtk_range_get_adjustment( GTK_RANGE(scrolledWindow->vscrollbar) );
|
m_vAdjust = gtk_range_get_adjustment( GTK_RANGE(scrolledWindow->vscrollbar) );
|
||||||
|
|
||||||
m_wxwindow = gtk_pizza_new();
|
m_wxwindow = gtk_pizza_new();
|
||||||
|
|
||||||
gtk_container_add( GTK_CONTAINER(m_widget), m_wxwindow );
|
|
||||||
|
|
||||||
#ifndef __WXUNIVERSAL__
|
#ifndef __WXUNIVERSAL__
|
||||||
|
|
||||||
#if GTK_CHECK_VERSION(1, 2, 0)
|
|
||||||
GtkPizza *pizza = GTK_PIZZA(m_wxwindow);
|
GtkPizza *pizza = GTK_PIZZA(m_wxwindow);
|
||||||
|
|
||||||
if (HasFlag(wxRAISED_BORDER))
|
if (HasFlag(wxRAISED_BORDER))
|
||||||
@@ -2360,34 +2364,13 @@ bool wxWindowGTK::Create( wxWindow *parent,
|
|||||||
{
|
{
|
||||||
gtk_pizza_set_shadow_type( pizza, GTK_MYSHADOW_NONE );
|
gtk_pizza_set_shadow_type( pizza, GTK_MYSHADOW_NONE );
|
||||||
}
|
}
|
||||||
#else // GTK+ 1.0
|
|
||||||
GtkViewport *viewport = GTK_VIEWPORT(scrolledWindow->viewport);
|
|
||||||
|
|
||||||
if (HasFlag(wxRAISED_BORDER))
|
|
||||||
{
|
|
||||||
gtk_viewport_set_shadow_type( viewport, GTK_SHADOW_OUT );
|
|
||||||
}
|
|
||||||
else if (HasFlag(wxSUNKEN_BORDER))
|
|
||||||
{
|
|
||||||
gtk_viewport_set_shadow_type( viewport, GTK_SHADOW_IN );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
gtk_viewport_set_shadow_type( viewport, GTK_SHADOW_NONE );
|
|
||||||
}
|
|
||||||
#endif // GTK+ > 1.0/<= 1.0
|
|
||||||
|
|
||||||
#endif // __WXUNIVERSAL__
|
#endif // __WXUNIVERSAL__
|
||||||
|
|
||||||
|
gtk_container_add( GTK_CONTAINER(m_widget), m_wxwindow );
|
||||||
|
|
||||||
GTK_WIDGET_SET_FLAGS( m_wxwindow, GTK_CAN_FOCUS );
|
GTK_WIDGET_SET_FLAGS( m_wxwindow, GTK_CAN_FOCUS );
|
||||||
m_acceptsFocus = TRUE;
|
m_acceptsFocus = TRUE;
|
||||||
|
|
||||||
#if !GTK_CHECK_VERSION(1, 2, 0)
|
|
||||||
// shut the viewport up
|
|
||||||
gtk_viewport_set_hadjustment( viewport, (GtkAdjustment*) gtk_adjustment_new( 0.0, 0.0, 0.0, 0.0, 0.0, 0.0) );
|
|
||||||
gtk_viewport_set_vadjustment( viewport, (GtkAdjustment*) gtk_adjustment_new( 0.0, 0.0, 0.0, 0.0, 0.0, 0.0) );
|
|
||||||
#endif // GTK+ 1.0
|
|
||||||
|
|
||||||
// I _really_ don't want scrollbars in the beginning
|
// I _really_ don't want scrollbars in the beginning
|
||||||
m_vAdjust->lower = 0.0;
|
m_vAdjust->lower = 0.0;
|
||||||
m_vAdjust->upper = 1.0;
|
m_vAdjust->upper = 1.0;
|
||||||
@@ -2539,22 +2522,28 @@ void wxWindowGTK::PostCreation()
|
|||||||
gtk_signal_connect( GTK_OBJECT(m_wxwindow), "expose_event",
|
gtk_signal_connect( GTK_OBJECT(m_wxwindow), "expose_event",
|
||||||
GTK_SIGNAL_FUNC(gtk_window_expose_callback), (gpointer)this );
|
GTK_SIGNAL_FUNC(gtk_window_expose_callback), (gpointer)this );
|
||||||
|
|
||||||
|
#ifndef __WXGTK20__
|
||||||
gtk_signal_connect( GTK_OBJECT(m_wxwindow), "draw",
|
gtk_signal_connect( GTK_OBJECT(m_wxwindow), "draw",
|
||||||
GTK_SIGNAL_FUNC(gtk_window_draw_callback), (gpointer)this );
|
GTK_SIGNAL_FUNC(gtk_window_draw_callback), (gpointer)this );
|
||||||
|
|
||||||
if (HasFlag(wxNO_FULL_REPAINT_ON_RESIZE))
|
if (HasFlag(wxNO_FULL_REPAINT_ON_RESIZE))
|
||||||
{
|
{
|
||||||
gtk_signal_connect( GTK_OBJECT(m_wxwindow), "event",
|
gtk_signal_connect( GTK_OBJECT(m_wxwindow), "event",
|
||||||
GTK_SIGNAL_FUNC(gtk_window_event_event_callback), (gpointer)this );
|
GTK_SIGNAL_FUNC(gtk_window_event_event_callback), (gpointer)this );
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
gtk_widget_set_redraw_on_allocate( GTK_WIDGET(m_wxwindow), HasFlag( wxNO_FULL_REPAINT_ON_RESIZE ) );
|
||||||
|
#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_connect( GTK_OBJECT(m_widget), "expose_event",
|
||||||
GTK_SIGNAL_FUNC(gtk_window_own_expose_callback), (gpointer)this );
|
GTK_SIGNAL_FUNC(gtk_window_own_expose_callback), (gpointer)this );
|
||||||
|
|
||||||
|
#ifndef __WXGTK20__
|
||||||
gtk_signal_connect( GTK_OBJECT(m_widget), "draw",
|
gtk_signal_connect( GTK_OBJECT(m_widget), "draw",
|
||||||
GTK_SIGNAL_FUNC(gtk_window_own_draw_callback), (gpointer)this );
|
GTK_SIGNAL_FUNC(gtk_window_own_draw_callback), (gpointer)this );
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// focus handling
|
// focus handling
|
||||||
@@ -2562,12 +2551,6 @@ void wxWindowGTK::PostCreation()
|
|||||||
if (m_focusWidget == NULL)
|
if (m_focusWidget == NULL)
|
||||||
m_focusWidget = m_widget;
|
m_focusWidget = m_widget;
|
||||||
|
|
||||||
#if 0
|
|
||||||
if (GetClassInfo() && GetClassInfo()->GetClassName())
|
|
||||||
wxPrintf( GetClassInfo()->GetClassName() );
|
|
||||||
wxPrintf( ".\n" );
|
|
||||||
#endif
|
|
||||||
|
|
||||||
gtk_signal_connect( GTK_OBJECT(m_focusWidget), "focus_in_event",
|
gtk_signal_connect( GTK_OBJECT(m_focusWidget), "focus_in_event",
|
||||||
GTK_SIGNAL_FUNC(gtk_window_focus_in_callback), (gpointer)this );
|
GTK_SIGNAL_FUNC(gtk_window_focus_in_callback), (gpointer)this );
|
||||||
|
|
||||||
@@ -2683,7 +2666,6 @@ void wxWindowGTK::DoSetSize( int x, int y, int width, int height, int sizeFlags
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
GtkPizza *pizza = GTK_PIZZA(m_parent->m_wxwindow);
|
GtkPizza *pizza = GTK_PIZZA(m_parent->m_wxwindow);
|
||||||
|
|
||||||
if ((sizeFlags & wxSIZE_ALLOW_MINUS_ONE) == 0)
|
if ((sizeFlags & wxSIZE_ALLOW_MINUS_ONE) == 0)
|
||||||
{
|
{
|
||||||
if (x != -1) m_x = x + pizza->xoffset;
|
if (x != -1) m_x = x + pizza->xoffset;
|
||||||
@@ -3289,12 +3271,7 @@ void wxWindowGTK::Refresh( bool eraseBackground, const wxRect *rect )
|
|||||||
if (!m_widget) return;
|
if (!m_widget) return;
|
||||||
if (!m_widget->window) return;
|
if (!m_widget->window) return;
|
||||||
|
|
||||||
// temporarily hide the caret to avoid nasty interactions between caret
|
#ifndef __WXGTK20__
|
||||||
// drawing and the window contents redraw
|
|
||||||
#if 0 // def wxUSE_CARET -- doesn't seem to help :-(
|
|
||||||
wxCaretSuspend cs((wxWindow *)this);
|
|
||||||
#endif // wxUSE_CARET
|
|
||||||
|
|
||||||
if (eraseBackground && m_wxwindow && m_wxwindow->window)
|
if (eraseBackground && m_wxwindow && m_wxwindow->window)
|
||||||
{
|
{
|
||||||
if (rect)
|
if (rect)
|
||||||
@@ -3340,14 +3317,35 @@ void wxWindowGTK::Refresh( bool eraseBackground, const wxRect *rect )
|
|||||||
gtk_widget_draw( m_widget, (GdkRectangle*) NULL );
|
gtk_widget_draw( m_widget, (GdkRectangle*) NULL );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
if (m_wxwindow)
|
||||||
|
{
|
||||||
|
if (rect)
|
||||||
|
{
|
||||||
|
GdkRectangle gdk_rect;
|
||||||
|
gdk_rect.x = rect->x;
|
||||||
|
gdk_rect.y = rect->y;
|
||||||
|
gdk_rect.width = rect->width;
|
||||||
|
gdk_rect.height = rect->height;
|
||||||
|
gdk_window_invalidate_rect( GTK_PIZZA(m_wxwindow)->bin_window, &gdk_rect, TRUE );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gdk_window_invalidate_rect( GTK_PIZZA(m_wxwindow)->bin_window, NULL, TRUE );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxWindowGTK::Update()
|
void wxWindowGTK::Update()
|
||||||
{
|
{
|
||||||
|
#ifdef __WXGTK20__
|
||||||
|
if (m_wxwindow && GTK_PIZZA(m_wxwindow)->bin_window)
|
||||||
|
gdk_window_process_updates( GTK_PIZZA(m_wxwindow)->bin_window, FALSE );
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!m_updateRegion.IsEmpty())
|
if (!m_updateRegion.IsEmpty())
|
||||||
{
|
|
||||||
GtkSendPaintEvents();
|
GtkSendPaintEvents();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxWindowGTK::GtkSendPaintEvents()
|
void wxWindowGTK::GtkSendPaintEvents()
|
||||||
@@ -3371,10 +3369,12 @@ void wxWindowGTK::GtkSendPaintEvents()
|
|||||||
|
|
||||||
if (!GetEventHandler()->ProcessEvent(erase_event))
|
if (!GetEventHandler()->ProcessEvent(erase_event))
|
||||||
{
|
{
|
||||||
|
gdk_gc_set_foreground( g_eraseGC, m_backgroundColour.GetColor() );
|
||||||
|
|
||||||
wxRegionIterator upd( m_clearRegion );
|
wxRegionIterator upd( m_clearRegion );
|
||||||
while (upd)
|
while (upd)
|
||||||
{
|
{
|
||||||
gdk_window_clear_area( GTK_PIZZA(m_wxwindow)->bin_window,
|
gdk_draw_rectangle( GTK_PIZZA(m_wxwindow)->bin_window, g_eraseGC, 0,
|
||||||
upd.GetX(), upd.GetY(), upd.GetWidth(), upd.GetHeight() );
|
upd.GetX(), upd.GetY(), upd.GetWidth(), upd.GetHeight() );
|
||||||
upd ++;
|
upd ++;
|
||||||
}
|
}
|
||||||
@@ -3393,6 +3393,7 @@ void wxWindowGTK::GtkSendPaintEvents()
|
|||||||
m_clipPaintRegion = FALSE;
|
m_clipPaintRegion = FALSE;
|
||||||
|
|
||||||
#ifndef __WXUNIVERSAL__
|
#ifndef __WXUNIVERSAL__
|
||||||
|
#ifndef __WXGTK20__
|
||||||
// The following code will result in all window-less widgets
|
// The following code will result in all window-less widgets
|
||||||
// being redrawn because the wxWindows class is allowed to
|
// being redrawn because the wxWindows class is allowed to
|
||||||
// paint over the window-less widgets.
|
// paint over the window-less widgets.
|
||||||
@@ -3434,6 +3435,7 @@ void wxWindowGTK::GtkSendPaintEvents()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
m_updateRegion.Clear();
|
m_updateRegion.Clear();
|
||||||
@@ -4038,6 +4040,7 @@ void wxWindowGTK::ScrollWindow( int dx, int dy, const wxRect* WXUNUSED(rect) )
|
|||||||
// No scrolling requested.
|
// No scrolling requested.
|
||||||
if ((dx == 0) && (dy == 0)) return;
|
if ((dx == 0) && (dy == 0)) return;
|
||||||
|
|
||||||
|
#ifndef __WXGTK20__
|
||||||
if (!m_updateRegion.IsEmpty())
|
if (!m_updateRegion.IsEmpty())
|
||||||
{
|
{
|
||||||
m_updateRegion.Offset( dx, dy );
|
m_updateRegion.Offset( dx, dy );
|
||||||
@@ -4058,68 +4061,23 @@ void wxWindowGTK::ScrollWindow( int dx, int dy, const wxRect* WXUNUSED(rect) )
|
|||||||
m_clearRegion.Intersect( 0, 0, cw, ch );
|
m_clearRegion.Intersect( 0, 0, cw, ch );
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 1
|
|
||||||
|
|
||||||
m_clipPaintRegion = TRUE;
|
m_clipPaintRegion = TRUE;
|
||||||
|
|
||||||
gtk_pizza_scroll( GTK_PIZZA(m_wxwindow), -dx, -dy );
|
gtk_pizza_scroll( GTK_PIZZA(m_wxwindow), -dx, -dy );
|
||||||
|
|
||||||
m_clipPaintRegion = FALSE;
|
m_clipPaintRegion = FALSE;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
if (m_children.GetCount() > 0)
|
gdk_window_scroll( GTK_PIZZA(m_wxwindow)->bin_window, -dx, -dy );
|
||||||
{
|
|
||||||
gtk_pizza_scroll( GTK_PIZZA(m_wxwindow), -dx, -dy );
|
GTK_PIZZA(m_wxwindow)->xoffset -= dx;
|
||||||
}
|
GTK_PIZZA(m_wxwindow)->yoffset -= dy;
|
||||||
else
|
|
||||||
{
|
#endif
|
||||||
GtkPizza *pizza = GTK_PIZZA(m_wxwindow);
|
|
||||||
|
|
||||||
pizza->xoffset -= dx;
|
|
||||||
pizza->yoffset -= dy;
|
|
||||||
|
|
||||||
GdkGC *m_scrollGC = gdk_gc_new( pizza->bin_window );
|
|
||||||
gdk_gc_set_exposures( m_scrollGC, TRUE );
|
|
||||||
|
|
||||||
int cw = 0;
|
|
||||||
int ch = 0;
|
|
||||||
GetClientSize( &cw, &ch );
|
|
||||||
int w = cw - abs(dx);
|
|
||||||
int h = ch - abs(dy);
|
|
||||||
|
|
||||||
if ((h < 0) || (w < 0))
|
|
||||||
{
|
|
||||||
Refresh();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int s_x = 0;
|
|
||||||
int s_y = 0;
|
|
||||||
if (dx < 0) s_x = -dx;
|
|
||||||
if (dy < 0) s_y = -dy;
|
|
||||||
int d_x = 0;
|
|
||||||
int d_y = 0;
|
|
||||||
if (dx > 0) d_x = dx;
|
|
||||||
if (dy > 0) d_y = dy;
|
|
||||||
|
|
||||||
gdk_window_copy_area( pizza->bin_window, m_scrollGC, d_x, d_y,
|
|
||||||
pizza->bin_window, s_x, s_y, w, h );
|
|
||||||
|
|
||||||
wxRect rect;
|
|
||||||
if (dx < 0) rect.x = cw+dx; else rect.x = 0;
|
|
||||||
if (dy < 0) rect.y = ch+dy; else rect.y = 0;
|
|
||||||
if (dy != 0) rect.width = cw; else rect.width = abs(dx);
|
|
||||||
if (dx != 0) rect.height = ch; else rect.height = abs(dy);
|
|
||||||
|
|
||||||
Refresh( TRUE, &rect );
|
|
||||||
}
|
|
||||||
|
|
||||||
gdk_gc_unref( m_scrollGC );
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Find the wxWindow at the current mouse position, also returning the mouse
|
// Find the wxWindow at the current mouse position, also returning the mouse
|
||||||
// position.
|
// position.
|
||||||
wxWindow* wxFindWindowAtPointer(wxPoint& pt)
|
wxWindow* wxFindWindowAtPointer(wxPoint& pt)
|
||||||
@@ -4161,3 +4119,32 @@ wxPoint wxGetMousePosition()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxDCModule
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class wxWinModule : public wxModule
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
bool OnInit();
|
||||||
|
void OnExit();
|
||||||
|
|
||||||
|
private:
|
||||||
|
DECLARE_DYNAMIC_CLASS(wxWinModule)
|
||||||
|
};
|
||||||
|
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxWinModule, wxModule)
|
||||||
|
|
||||||
|
bool wxWinModule::OnInit()
|
||||||
|
{
|
||||||
|
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 );
|
||||||
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user