New "pizza" widget implementation. Window border widths now match the GtkStyle they are drawn with.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@49687 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Paul Cornett
2007-11-06 18:14:15 +00:00
parent 1ca1b2b88f
commit 08f53168ac
17 changed files with 183 additions and 298 deletions

View File

@@ -15622,8 +15622,8 @@ monodll_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONODLL_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION__USE_GUI_1@monodll_utilsgtk.o: $(srcdir)/src/gtk1/utilsgtk.cpp $(MONODLL_ODEP) @COND_TOOLKIT_GTK_TOOLKIT_VERSION__USE_GUI_1@monodll_utilsgtk.o: $(srcdir)/src/gtk1/utilsgtk.cpp $(MONODLL_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION__USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/gtk1/utilsgtk.cpp @COND_TOOLKIT_GTK_TOOLKIT_VERSION__USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/gtk1/utilsgtk.cpp
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@monodll_win_gtk.o: $(srcdir)/src/gtk/win_gtk.c $(MONODLL_ODEP) @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@monodll_win_gtk.o: $(srcdir)/src/gtk/win_gtk.cpp $(MONODLL_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@ $(CCC) -c -o $@ $(MONODLL_CFLAGS) $(srcdir)/src/gtk/win_gtk.c @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/gtk/win_gtk.cpp
@COND_TOOLKIT_GTK_TOOLKIT_VERSION__USE_GUI_1@monodll_win_gtk.o: $(srcdir)/src/gtk1/win_gtk.c $(MONODLL_ODEP) @COND_TOOLKIT_GTK_TOOLKIT_VERSION__USE_GUI_1@monodll_win_gtk.o: $(srcdir)/src/gtk1/win_gtk.c $(MONODLL_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION__USE_GUI_1@ $(CCC) -c -o $@ $(MONODLL_CFLAGS) $(srcdir)/src/gtk1/win_gtk.c @COND_TOOLKIT_GTK_TOOLKIT_VERSION__USE_GUI_1@ $(CCC) -c -o $@ $(MONODLL_CFLAGS) $(srcdir)/src/gtk1/win_gtk.c
@@ -20074,8 +20074,8 @@ monolib_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONOLIB_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION__USE_GUI_1@monolib_utilsgtk.o: $(srcdir)/src/gtk1/utilsgtk.cpp $(MONOLIB_ODEP) @COND_TOOLKIT_GTK_TOOLKIT_VERSION__USE_GUI_1@monolib_utilsgtk.o: $(srcdir)/src/gtk1/utilsgtk.cpp $(MONOLIB_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION__USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/gtk1/utilsgtk.cpp @COND_TOOLKIT_GTK_TOOLKIT_VERSION__USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/gtk1/utilsgtk.cpp
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@monolib_win_gtk.o: $(srcdir)/src/gtk/win_gtk.c $(MONOLIB_ODEP) @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@monolib_win_gtk.o: $(srcdir)/src/gtk/win_gtk.cpp $(MONOLIB_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@ $(CCC) -c -o $@ $(MONOLIB_CFLAGS) $(srcdir)/src/gtk/win_gtk.c @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/gtk/win_gtk.cpp
@COND_TOOLKIT_GTK_TOOLKIT_VERSION__USE_GUI_1@monolib_win_gtk.o: $(srcdir)/src/gtk1/win_gtk.c $(MONOLIB_ODEP) @COND_TOOLKIT_GTK_TOOLKIT_VERSION__USE_GUI_1@monolib_win_gtk.o: $(srcdir)/src/gtk1/win_gtk.c $(MONOLIB_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION__USE_GUI_1@ $(CCC) -c -o $@ $(MONOLIB_CFLAGS) $(srcdir)/src/gtk1/win_gtk.c @COND_TOOLKIT_GTK_TOOLKIT_VERSION__USE_GUI_1@ $(CCC) -c -o $@ $(MONOLIB_CFLAGS) $(srcdir)/src/gtk1/win_gtk.c
@@ -25084,8 +25084,8 @@ coredll_win32.o: $(srcdir)/src/univ/themes/win32.cpp $(COREDLL_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION__USE_GUI_1@coredll_utilsgtk.o: $(srcdir)/src/gtk1/utilsgtk.cpp $(COREDLL_ODEP) @COND_TOOLKIT_GTK_TOOLKIT_VERSION__USE_GUI_1@coredll_utilsgtk.o: $(srcdir)/src/gtk1/utilsgtk.cpp $(COREDLL_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION__USE_GUI_1@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/gtk1/utilsgtk.cpp @COND_TOOLKIT_GTK_TOOLKIT_VERSION__USE_GUI_1@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/gtk1/utilsgtk.cpp
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@coredll_win_gtk.o: $(srcdir)/src/gtk/win_gtk.c $(COREDLL_ODEP) @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@coredll_win_gtk.o: $(srcdir)/src/gtk/win_gtk.cpp $(COREDLL_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@ $(CCC) -c -o $@ $(COREDLL_CFLAGS) $(srcdir)/src/gtk/win_gtk.c @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/gtk/win_gtk.cpp
@COND_TOOLKIT_GTK_TOOLKIT_VERSION__USE_GUI_1@coredll_win_gtk.o: $(srcdir)/src/gtk1/win_gtk.c $(COREDLL_ODEP) @COND_TOOLKIT_GTK_TOOLKIT_VERSION__USE_GUI_1@coredll_win_gtk.o: $(srcdir)/src/gtk1/win_gtk.c $(COREDLL_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION__USE_GUI_1@ $(CCC) -c -o $@ $(COREDLL_CFLAGS) $(srcdir)/src/gtk1/win_gtk.c @COND_TOOLKIT_GTK_TOOLKIT_VERSION__USE_GUI_1@ $(CCC) -c -o $@ $(COREDLL_CFLAGS) $(srcdir)/src/gtk1/win_gtk.c
@@ -28153,8 +28153,8 @@ corelib_win32.o: $(srcdir)/src/univ/themes/win32.cpp $(CORELIB_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION__USE_GUI_1@corelib_utilsgtk.o: $(srcdir)/src/gtk1/utilsgtk.cpp $(CORELIB_ODEP) @COND_TOOLKIT_GTK_TOOLKIT_VERSION__USE_GUI_1@corelib_utilsgtk.o: $(srcdir)/src/gtk1/utilsgtk.cpp $(CORELIB_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION__USE_GUI_1@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/gtk1/utilsgtk.cpp @COND_TOOLKIT_GTK_TOOLKIT_VERSION__USE_GUI_1@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/gtk1/utilsgtk.cpp
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@corelib_win_gtk.o: $(srcdir)/src/gtk/win_gtk.c $(CORELIB_ODEP) @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@corelib_win_gtk.o: $(srcdir)/src/gtk/win_gtk.cpp $(CORELIB_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@ $(CCC) -c -o $@ $(CORELIB_CFLAGS) $(srcdir)/src/gtk/win_gtk.c @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/gtk/win_gtk.cpp
@COND_TOOLKIT_GTK_TOOLKIT_VERSION__USE_GUI_1@corelib_win_gtk.o: $(srcdir)/src/gtk1/win_gtk.c $(CORELIB_ODEP) @COND_TOOLKIT_GTK_TOOLKIT_VERSION__USE_GUI_1@corelib_win_gtk.o: $(srcdir)/src/gtk1/win_gtk.c $(CORELIB_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION__USE_GUI_1@ $(CCC) -c -o $@ $(CORELIB_CFLAGS) $(srcdir)/src/gtk1/win_gtk.c @COND_TOOLKIT_GTK_TOOLKIT_VERSION__USE_GUI_1@ $(CCC) -c -o $@ $(CORELIB_CFLAGS) $(srcdir)/src/gtk1/win_gtk.c

View File

@@ -984,7 +984,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
src/gtk/tooltip.cpp src/gtk/tooltip.cpp
src/gtk/toplevel.cpp src/gtk/toplevel.cpp
src/gtk/utilsgtk.cpp src/gtk/utilsgtk.cpp
src/gtk/win_gtk.c src/gtk/win_gtk.cpp
src/gtk/window.cpp src/gtk/window.cpp
</set> </set>
<set var="GTK_LOWLEVEL_HDR" hints="files"> <set var="GTK_LOWLEVEL_HDR" hints="files">

View File

@@ -1,88 +1,34 @@
/* /////////////////////////////////////////////////////////////////////////// /* ///////////////////////////////////////////////////////////////////////////
// Name: win_gtk.h // Name: win_gtk.h
// Purpose: wxWidgets's GTK base widget = GtkPizza // Purpose: native GTK+ widget for wxWindow
// Author: Robert Roebling // Author: Robert Roebling
// Id: $Id$ // Id: $Id$
// Copyright: (c) 1998 Robert Roebling // Copyright: (c) 1998 Robert Roebling
// Licence: wxWindows licence // Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////// */ /////////////////////////////////////////////////////////////////////////// */
#ifndef _WX_GTK_PIZZA_H_
#define _WX_GTK_PIZZA_H_
#ifndef __GTK_PIZZA_H__ #include <gtk/gtkfixed.h>
#define __GTK_PIZZA_H__
#ifdef __cplusplus #define WX_PIZZA(obj) G_TYPE_CHECK_INSTANCE_CAST(obj, wxPizza::type(), wxPizza)
extern "C" { #define WX_IS_PIZZA(obj) G_TYPE_CHECK_INSTANCE_TYPE(obj, wxPizza::type())
#endif /* __cplusplus */
#include <gtk/gtkcontainer.h> struct WXDLLIMPEXP_CORE wxPizza
#include "wx/dlimpexp.h"
#define GTK_PIZZA(obj) GTK_CHECK_CAST (obj, gtk_pizza_get_type (), GtkPizza)
#define GTK_IS_PIZZA(obj) GTK_CHECK_TYPE (obj, gtk_pizza_get_type ())
typedef struct _GtkPizza GtkPizza;
struct _GtkPizza
{ {
GtkContainer container; static GtkWidget* New(long windowStyle = 0);
GList *children; static GType type();
void move(GtkWidget* widget, int x, int y);
void scroll(int dx, int dy);
void get_border_widths(int& x, int& y);
guint m_xoffset; GtkFixed m_fixed;
guint m_yoffset; GdkWindow* m_backing_window;
int m_scroll_x;
gboolean m_noscroll; int m_scroll_y;
int m_border_style;
GdkWindow *bin_window; bool m_is_scrollable;
}; };
WXDLLIMPEXP_CORE #endif // _WX_GTK_PIZZA_H_
GtkType gtk_pizza_get_type (void);
WXDLLIMPEXP_CORE
GtkWidget* gtk_pizza_new (void);
WXDLLIMPEXP_CORE
GtkWidget* gtk_pizza_new_no_scroll (void);
/* accessors */
WXDLLIMPEXP_CORE
gint gtk_pizza_get_xoffset (GtkPizza *pizza);
WXDLLIMPEXP_CORE
gint gtk_pizza_get_yoffset (GtkPizza *pizza);
WXDLLIMPEXP_CORE
void gtk_pizza_set_xoffset (GtkPizza *pizza, gint xoffset);
WXDLLIMPEXP_CORE
void gtk_pizza_set_yoffset (GtkPizza *pizza, gint yoffset);
WXDLLIMPEXP_CORE
gint gtk_pizza_get_rtl_offset (GtkPizza *pizza);
WXDLLIMPEXP_CORE
void gtk_pizza_scroll (GtkPizza *pizza,
gint dx,
gint dy);
WXDLLIMPEXP_CORE
void gtk_pizza_put (GtkPizza *pizza,
GtkWidget *widget,
gint x,
gint y,
gint width,
gint height);
WXDLLIMPEXP_CORE
void gtk_pizza_set_size (GtkPizza *pizza,
GtkWidget *widget,
gint x,
gint y,
gint width,
gint height);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __GTK_PIZZA_H__ */

View File

@@ -184,6 +184,8 @@ public:
// fire off capture lost events. // fire off capture lost events.
void GTKReleaseMouseAndNotify(); void GTKReleaseMouseAndNotify();
GdkWindow* GTKGetDrawingWindow() const;
protected: protected:
// Override GTKWidgetNeedsMnemonic and return true if your // Override GTKWidgetNeedsMnemonic and return true if your
// needs to set its mnemonic widget, such as for a // needs to set its mnemonic widget, such as for a

View File

@@ -110,6 +110,8 @@ public:
virtual bool IsDoubleBuffered() const { return false; } virtual bool IsDoubleBuffered() const { return false; }
GdkWindow* GTKGetDrawingWindow() const;
// implementation // implementation
// -------------- // --------------

View File

@@ -41,7 +41,6 @@
#ifdef __WXGTK__ #ifdef __WXGTK__
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include "wx/gtk/win_gtk.h"
#include "wx/renderer.h" #include "wx/renderer.h"
#endif #endif
@@ -467,12 +466,12 @@ void wxAuiDefaultDockArt::DrawSash(wxDC& dc, wxWindow *window, int orientation,
if (!window) return; if (!window) return;
if (!window->m_wxwindow) return; if (!window->m_wxwindow) return;
if (!GTK_PIZZA(window->m_wxwindow)->bin_window) return; if (!GTK_WIDGET_DRAWABLE(window->m_wxwindow)) return;
gtk_paint_handle gtk_paint_handle
( (
window->m_wxwindow->style, window->m_wxwindow->style,
GTK_PIZZA(window->m_wxwindow)->bin_window, window->GTKGetDrawingWindow(),
// flags & wxCONTROL_CURRENT ? GTK_STATE_PRELIGHT : GTK_STATE_NORMAL, // flags & wxCONTROL_CURRENT ? GTK_STATE_PRELIGHT : GTK_STATE_NORMAL,
GTK_STATE_NORMAL, GTK_STATE_NORMAL,
GTK_SHADOW_NONE, GTK_SHADOW_NONE,

View File

@@ -33,7 +33,7 @@
#endif #endif
#ifdef __WXGTK__ #ifdef __WXGTK__
#include "wx/gtk/win_gtk.h" #include <gtk/gtk.h>
#endif #endif
#include "wx/graphics.h" #include "wx/graphics.h"

View File

@@ -27,7 +27,6 @@
#ifdef __WXGTK20__ #ifdef __WXGTK20__
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include "wx/gtk/win_gtk.h"
#endif #endif
// we only have to do it here when we use wxStatusBarGeneric in addition to the // we only have to do it here when we use wxStatusBarGeneric in addition to the
@@ -204,7 +203,7 @@ void wxStatusBarGeneric::OnPaint(wxPaintEvent& WXUNUSED(event) )
if (GetLayoutDirection() == wxLayout_RightToLeft) if (GetLayoutDirection() == wxLayout_RightToLeft)
{ {
gtk_paint_resize_grip( m_widget->style, gtk_paint_resize_grip( m_widget->style,
GTK_PIZZA(m_wxwindow)->bin_window, GTKGetDrawingWindow(),
(GtkStateType) GTK_WIDGET_STATE (m_widget), (GtkStateType) GTK_WIDGET_STATE (m_widget),
NULL, NULL,
m_widget, m_widget,
@@ -215,7 +214,7 @@ void wxStatusBarGeneric::OnPaint(wxPaintEvent& WXUNUSED(event) )
else else
{ {
gtk_paint_resize_grip( m_widget->style, gtk_paint_resize_grip( m_widget->style,
GTK_PIZZA(m_wxwindow)->bin_window, GTKGetDrawingWindow(),
(GtkStateType) GTK_WIDGET_STATE (m_widget), (GtkStateType) GTK_WIDGET_STATE (m_widget),
NULL, NULL,
m_widget, m_widget,
@@ -423,7 +422,7 @@ void wxStatusBarGeneric::OnLeftDown(wxMouseEvent& event)
if (!GTK_IS_WINDOW (ancestor)) if (!GTK_IS_WINDOW (ancestor))
return; return;
GdkWindow *source = GTK_PIZZA(m_wxwindow)->bin_window; GdkWindow *source = GTKGetDrawingWindow();
int org_x = 0; int org_x = 0;
int org_y = 0; int org_y = 0;
@@ -470,7 +469,7 @@ void wxStatusBarGeneric::OnRightDown(wxMouseEvent& event)
if (!GTK_IS_WINDOW (ancestor)) if (!GTK_IS_WINDOW (ancestor))
return; return;
GdkWindow *source = GTK_PIZZA(m_wxwindow)->bin_window; GdkWindow *source = GTKGetDrawingWindow();
int org_x = 0; int org_x = 0;
int org_y = 0; int org_y = 0;

View File

@@ -26,7 +26,6 @@
#include <gpe/init.h> #include <gpe/init.h>
#endif #endif
#include "wx/gtk/win_gtk.h"
#include "wx/gtk/private.h" #include "wx/gtk/private.h"
#include "wx/apptrait.h" #include "wx/apptrait.h"

View File

@@ -28,7 +28,6 @@
#include "wx/fontutil.h" #include "wx/fontutil.h"
#include "wx/scrolwin.h" #include "wx/scrolwin.h"
#include "wx/gtk/win_gtk.h"
#include "wx/gtk/private.h" #include "wx/gtk/private.h"
#include <gdk/gdkx.h> #include <gdk/gdkx.h>
@@ -311,8 +310,7 @@ wxWindowDC::wxWindowDC( wxWindow *window )
m_layout = pango_layout_new( m_context ); m_layout = pango_layout_new( m_context );
m_fontdesc = pango_font_description_copy( widget->style->font_desc ); m_fontdesc = pango_font_description_copy( widget->style->font_desc );
GtkPizza *pizza = GTK_PIZZA( widget ); m_window = widget->window;
m_window = pizza->bin_window;
// Window not realized ? // Window not realized ?
if (!m_window) if (!m_window)

View File

@@ -26,8 +26,6 @@
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include <gdk/gdkx.h> #include <gdk/gdkx.h>
#include "wx/gtk/win_gtk.h"
#if WXWIN_COMPATIBILITY_2_8 #if WXWIN_COMPATIBILITY_2_8
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@@ -234,7 +232,7 @@ bool wxGLCanvas::Create(wxWindow *parent,
Window wxGLCanvas::GetXWindow() const Window wxGLCanvas::GetXWindow() const
{ {
GdkWindow *window = GTK_PIZZA(m_wxwindow)->bin_window; GdkWindow *window = m_wxwindow->window;
return window ? GDK_WINDOW_XWINDOW(window) : 0; return window ? GDK_WINDOW_XWINDOW(window) : 0;
} }

View File

@@ -109,12 +109,10 @@ gtk_dialog_realized_callback( GtkWidget * WXUNUSED(widget), wxPopupWindow *win )
static void wxInsertChildInPopupWin(wxWindowGTK* parent, wxWindowGTK* child) static void wxInsertChildInPopupWin(wxWindowGTK* parent, wxWindowGTK* child)
{ {
gtk_pizza_put( GTK_PIZZA(parent->m_wxwindow), gtk_widget_set_size_request(
child->m_widget, child->m_widget, child->m_width, child->m_height);
child->m_x, gtk_fixed_put(
child->m_y, GTK_FIXED(parent->m_wxwindow), child->m_widget, child->m_x, child->m_y);
child->m_width,
child->m_height );
if (parent->HasFlag(wxTAB_TRAVERSAL)) if (parent->HasFlag(wxTAB_TRAVERSAL))
{ {
@@ -165,7 +163,7 @@ bool wxPopupWindow::Create( wxWindow *parent, int style )
g_signal_connect (m_widget, "delete_event", g_signal_connect (m_widget, "delete_event",
G_CALLBACK (gtk_dialog_delete_callback), this); G_CALLBACK (gtk_dialog_delete_callback), this);
m_wxwindow = gtk_pizza_new(); m_wxwindow = wxPizza::New(m_windowStyle);
gtk_widget_show( m_wxwindow ); gtk_widget_show( m_wxwindow );
GTK_WIDGET_UNSET_FLAGS( m_wxwindow, GTK_CAN_FOCUS ); GTK_WIDGET_UNSET_FLAGS( m_wxwindow, GTK_CAN_FOCUS );

View File

@@ -33,7 +33,6 @@
#endif #endif
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include "wx/gtk/win_gtk.h"
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// wxRendererGTK: our wxRendererNative implementation // wxRendererGTK: our wxRendererNative implementation

View File

@@ -557,7 +557,7 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent,
gtk_container_add( GTK_CONTAINER(m_widget), m_mainWidget ); gtk_container_add( GTK_CONTAINER(m_widget), m_mainWidget );
// m_wxwindow is the client area // m_wxwindow is the client area
m_wxwindow = gtk_pizza_new_no_scroll(); m_wxwindow = wxPizza::New();
gtk_widget_show( m_wxwindow ); gtk_widget_show( m_wxwindow );
gtk_container_add( GTK_CONTAINER(m_mainWidget), m_wxwindow ); gtk_container_add( GTK_CONTAINER(m_mainWidget), m_wxwindow );
@@ -1105,8 +1105,7 @@ bool wxTopLevelWindowGTK::SetShape(const wxRegion& region)
GdkWindow *window = NULL; GdkWindow *window = NULL;
if (m_wxwindow) if (m_wxwindow)
{ {
window = GTK_PIZZA(m_wxwindow)->bin_window; do_shape_combine_region(m_wxwindow->window, region);
do_shape_combine_region(window, region);
} }
window = m_widget->window; window = m_widget->window;
return do_shape_combine_region(window, region); return do_shape_combine_region(window, region);

View File

@@ -112,19 +112,19 @@
can find in m_widget (defined in wxWindow) can find in m_widget (defined in wxWindow)
When the class has a client area for drawing into and for containing children When the class has a client area for drawing into and for containing children
it has to handle the client area widget (of the type GtkPizza, defined in it has to handle the client area widget (of the type wxPizza, defined in
win_gtk.c), but there could be any number of widgets, handled by a class win_gtk.cpp), but there could be any number of widgets, handled by a class.
The common rule for all windows is only, that the widget that interacts with The common rule for all windows is only, that the widget that interacts with
the rest of GTK must be referenced in m_widget and all other widgets must be the rest of GTK must be referenced in m_widget and all other widgets must be
children of this widget on the GTK level. The top-most widget, which also children of this widget on the GTK level. The top-most widget, which also
represents the client area, must be in the m_wxwindow field and must be of represents the client area, must be in the m_wxwindow field and must be of
the type GtkPizza. the type wxPizza.
As I said, the window classes that display a GTK native widget only have As I said, the window classes that display a GTK native widget only have
one widget, so in the case of e.g. the wxButton class m_widget holds a one widget, so in the case of e.g. the wxButton class m_widget holds a
pointer to a GtkButton widget. But windows with client areas (for drawing pointer to a GtkButton widget. But windows with client areas (for drawing
and children) have a m_widget field that is a pointer to a GtkScrolled- and children) have a m_widget field that is a pointer to a GtkScrolled-
Window and a m_wxwindow field that is pointer to a GtkPizza and this Window and a m_wxwindow field that is pointer to a wxPizza and this
one is (in the GTK sense) a child of the GtkScrolledWindow. one is (in the GTK sense) a child of the GtkScrolledWindow.
If the m_wxwindow field is set, then all input to this widget is inter- If the m_wxwindow field is set, then all input to this widget is inter-
@@ -138,10 +138,10 @@
clicking on a scrollbar belonging to scrolled window will inevitably move clicking on a scrollbar belonging to scrolled window will inevitably move
the window. In wxWidgets, the scrollbar will only emit an event, send this the window. In wxWidgets, the scrollbar will only emit an event, send this
to (normally) a wxScrolledWindow and that class will call ScrollWindow() to (normally) a wxScrolledWindow and that class will call ScrollWindow()
which actually moves the window and its sub-windows. Note that GtkPizza which actually moves the window and its sub-windows. Note that wxPizza
memorizes how much it has been scrolled but that wxWidgets forgets this memorizes how much it has been scrolled but that wxWidgets forgets this
so that the two coordinates systems have to be kept in synch. This is done so that the two coordinates systems have to be kept in synch. This is done
in various places using the pizza->xoffset and pizza->yoffset values. in various places using the pizza->m_scroll_x and pizza->m_scroll_y values.
III) III)
@@ -312,92 +312,6 @@ static void GetScrollbarWidth(GtkWidget* widget, int& w, int& h)
} }
} }
static void draw_frame( GtkWidget *widget, wxWindowGTK *win )
{
// wxUniversal widgets draw the borders and scrollbars themselves
#ifndef __WXUNIVERSAL__
if (!win->m_hasVMT)
return;
int dx = 0;
int dy = 0;
if (GTK_WIDGET_NO_WINDOW (widget))
{
dx += widget->allocation.x;
dy += widget->allocation.y;
}
int x = dx;
int y = dy;
int dw = 0;
int dh = 0;
if (win->m_hasScrolling)
{
GetScrollbarWidth(widget, dw, dh);
if (win->GetLayoutDirection() == wxLayout_RightToLeft)
{
// This is actually wrong for old GTK+ version
// which do not display the scrollbar on the
// left side in RTL
x += dw;
}
}
int w = widget->allocation.width-dw;
int h = widget->allocation.height-dh;
if (win->HasFlag(wxRAISED_BORDER))
{
gtk_paint_shadow (widget->style,
widget->window,
GTK_STATE_NORMAL,
GTK_SHADOW_OUT,
NULL, NULL, NULL, // FIXME: No clipping?
x, y, w, h );
return;
}
if (win->HasFlag(wxSUNKEN_BORDER))
{
gtk_paint_shadow (widget->style,
widget->window,
GTK_STATE_NORMAL,
GTK_SHADOW_IN,
NULL, NULL, NULL, // FIXME: No clipping?
x, y, w, h );
return;
}
if (win->HasFlag(wxSIMPLE_BORDER))
{
GdkGC *gc;
gc = gdk_gc_new( widget->window );
gdk_gc_set_foreground( gc, &widget->style->black );
gdk_draw_rectangle( widget->window, gc, FALSE, x, y, w-1, h-1 );
g_object_unref (gc);
return;
}
#endif // __WXUNIVERSAL__
}
//-----------------------------------------------------------------------------
// "expose_event" of m_widget
//-----------------------------------------------------------------------------
extern "C" {
static gboolean
gtk_window_own_expose_callback( GtkWidget *widget,
GdkEventExpose *gdk_event,
wxWindowGTK *win )
{
if (gdk_event->count == 0)
draw_frame(widget, win);
return false;
}
}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// "size_request" of m_widget // "size_request" of m_widget
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@@ -471,18 +385,9 @@ gtk_window_expose_callback( GtkWidget *widget,
{ {
DEBUG_MAIN_THREAD DEBUG_MAIN_THREAD
// This callback gets called in drawing-idle time under // if this event is for the border-only GdkWindow
// GTK 2.0, so we don't need to defer anything to idle if (gdk_event->window != widget->window)
// time anymore. return false;
GtkPizza *pizza = GTK_PIZZA( widget );
if (gdk_event->window != pizza->bin_window)
{
// block expose events on GTK_WIDGET(pizza)->window,
// all drawing is done on pizza->bin_window
return true;
}
#if 0 #if 0
if (win->GetName()) if (win->GetName())
@@ -518,6 +423,53 @@ gtk_window_expose_callback( GtkWidget *widget,
} }
} }
//-----------------------------------------------------------------------------
// "expose_event" from m_widget, for drawing border
//-----------------------------------------------------------------------------
#ifndef __WXUNIVERSAL__
extern "C" {
static gboolean
expose_event_border(GtkWidget* widget, GdkEventExpose* event, wxWindow* win)
{
// if this event is not for the GdkWindow the border is drawn on
if (win->m_wxwindow == win->m_widget && event->window == widget->window)
return false;
int x = 0;
int y = 0;
// GtkScrolledWindow is GTK_NO_WINDOW
if (GTK_WIDGET_NO_WINDOW(widget))
{
x = widget->allocation.x;
y = widget->allocation.y;
}
int w = win->m_wxwindow->allocation.width;
int h = win->m_wxwindow->allocation.height;
if (win->HasFlag(wxBORDER_SIMPLE))
{
GdkGC* gc;
gc = gdk_gc_new(event->window);
gdk_gc_set_foreground(gc, &widget->style->black);
gdk_draw_rectangle(event->window, gc, false, x, y, w - 1, h - 1);
g_object_unref(gc);
}
else
{
GtkShadowType shadow = GTK_SHADOW_IN;
if (win->HasFlag(wxBORDER_RAISED))
shadow = GTK_SHADOW_OUT;
gtk_paint_shadow(
widget->style, event->window, GTK_STATE_NORMAL,
shadow, &event->area, widget, NULL, x, y, w, h);
}
// no further painting is needed for border-only GdkWindow
return win->m_wxwindow == win->m_widget;
}
}
#endif // !__WXUNIVERSAL__
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// "key_press_event" from any window // "key_press_event" from any window
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@@ -1244,7 +1196,7 @@ template<typename T> void InitMouseEvent(wxWindowGTK *win,
if ((win->m_wxwindow) && (win->GetLayoutDirection() == wxLayout_RightToLeft)) if ((win->m_wxwindow) && (win->GetLayoutDirection() == wxLayout_RightToLeft))
{ {
// origin in the upper right corner // origin in the upper right corner
int window_width = gtk_pizza_get_rtl_offset( GTK_PIZZA(win->m_wxwindow) ); int window_width = win->m_wxwindow->allocation.width;
event.m_x = window_width - event.m_x; event.m_x = window_width - event.m_x;
} }
@@ -1294,9 +1246,9 @@ wxWindowGTK *FindWindowForMouseEvent(wxWindowGTK *win, wxCoord& x, wxCoord& y)
if (win->m_wxwindow) if (win->m_wxwindow)
{ {
GtkPizza *pizza = GTK_PIZZA(win->m_wxwindow); wxPizza* pizza = WX_PIZZA(win->m_wxwindow);
xx += gtk_pizza_get_xoffset( pizza ); xx += pizza->m_scroll_x;
yy += gtk_pizza_get_yoffset( pizza ); yy += pizza->m_scroll_y;
} }
wxWindowList::compatibility_iterator node = win->GetChildren().GetFirst(); wxWindowList::compatibility_iterator node = win->GetChildren().GetFirst();
@@ -1863,8 +1815,7 @@ wx_window_focus_callback(GtkWidget *widget,
GtkDirectionType WXUNUSED(direction), GtkDirectionType WXUNUSED(direction),
wxWindowGTK *win) wxWindowGTK *win)
{ {
// the default handler for focus signal in GtkPizza (or, rather, in // the default handler for focus signal in GtkScrolledWindow sets
// GtkScrolledWindow from which GtkPizza inherits this behaviour) sets
// focus to the window itself even if it doesn't accept focus, i.e. has no // focus to the window itself even if it doesn't accept focus, i.e. has no
// GTK_CAN_FOCUS in its style -- work around this by forcibly preventing // GTK_CAN_FOCUS in its style -- work around this by forcibly preventing
// the signal from reaching gtk_scrolled_window_focus() if we don't have // the signal from reaching gtk_scrolled_window_focus() if we don't have
@@ -2031,15 +1982,14 @@ gtk_scrollbar_button_release_event(GtkRange* range, GdkEventButton*, wxWindow* w
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
static void static void
gtk_window_realized_callback( GtkWidget *m_widget, wxWindow *win ) gtk_window_realized_callback(GtkWidget* widget, wxWindow* win)
{ {
DEBUG_MAIN_THREAD DEBUG_MAIN_THREAD
if (win->m_imData) if (win->m_imData)
{ {
GtkPizza *pizza = GTK_PIZZA( m_widget );
gtk_im_context_set_client_window( win->m_imData->context, gtk_im_context_set_client_window( win->m_imData->context,
pizza->bin_window ); widget->window);
} }
// We cannot set colours and fonts before the widget // We cannot set colours and fonts before the widget
@@ -2068,9 +2018,10 @@ size_allocate(GtkWidget*, GtkAllocation* alloc, wxWindow* win)
int h = alloc->height; int h = alloc->height;
if (win->m_wxwindow) if (win->m_wxwindow)
{ {
const int border = GTK_CONTAINER(win->m_wxwindow)->border_width; int border_x, border_y;
w -= 2 * border; WX_PIZZA(win->m_wxwindow)->get_border_widths(border_x, border_y);
h -= 2 * border; w -= 2 * border_x;
h -= 2 * border_y;
if (w < 0) w = 0; if (w < 0) w = 0;
if (h < 0) h = 0; if (h < 0) h = 0;
} }
@@ -2197,16 +2148,14 @@ static void wxInsertChildInWindow( wxWindowGTK* parent, wxWindowGTK* child )
{ {
/* the window might have been scrolled already, do we /* the window might have been scrolled already, do we
have to adapt the position */ have to adapt the position */
GtkPizza *pizza = GTK_PIZZA(parent->m_wxwindow); wxPizza* pizza = WX_PIZZA(parent->m_wxwindow);
child->m_x += gtk_pizza_get_xoffset( pizza ); child->m_x += pizza->m_scroll_x;
child->m_y += gtk_pizza_get_yoffset( pizza ); child->m_y += pizza->m_scroll_y;
gtk_pizza_put( GTK_PIZZA(parent->m_wxwindow), gtk_widget_set_size_request(
child->m_widget, child->m_widget, child->m_width, child->m_height);
child->m_x, gtk_fixed_put(
child->m_y, GTK_FIXED(parent->m_wxwindow), child->m_widget, child->m_x, child->m_y);
child->m_width,
child->m_height );
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@@ -2337,31 +2286,13 @@ bool wxWindowGTK::Create( wxWindow *parent,
return false; return false;
} }
m_wxwindow = wxPizza::New(m_windowStyle);
if (!HasFlag(wxHSCROLL) && !HasFlag(wxVSCROLL)) if (!HasFlag(wxHSCROLL) && !HasFlag(wxVSCROLL))
{
m_wxwindow = gtk_pizza_new_no_scroll();
#ifndef __WXUNIVERSAL__
if (HasFlag(wxSIMPLE_BORDER))
gtk_container_set_border_width((GtkContainer*)m_wxwindow, 1);
else if (HasFlag(wxRAISED_BORDER) || HasFlag(wxSUNKEN_BORDER))
gtk_container_set_border_width((GtkContainer*)m_wxwindow, 2);
#endif // __WXUNIVERSAL__
m_widget = m_wxwindow; m_widget = m_wxwindow;
}
else else
{ {
m_wxwindow = gtk_pizza_new();
#ifndef __WXUNIVERSAL__
if (HasFlag(wxSIMPLE_BORDER))
gtk_container_set_border_width((GtkContainer*)m_wxwindow, 1);
else if (HasFlag(wxRAISED_BORDER) || HasFlag(wxSUNKEN_BORDER))
gtk_container_set_border_width((GtkContainer*)m_wxwindow, 2);
#endif // __WXUNIVERSAL__
m_widget = gtk_scrolled_window_new( (GtkAdjustment *) NULL, (GtkAdjustment *) NULL ); m_widget = gtk_scrolled_window_new( (GtkAdjustment *) NULL, (GtkAdjustment *) NULL );
gtk_container_set_resize_mode(GTK_CONTAINER(m_widget), GTK_RESIZE_QUEUE);
GtkScrolledWindow *scrolledWindow = GTK_SCROLLED_WINDOW(m_widget); GtkScrolledWindow *scrolledWindow = GTK_SCROLLED_WINDOW(m_widget);
@@ -2516,7 +2447,7 @@ void wxWindowGTK::PostCreation()
G_CALLBACK (gtk_window_expose_callback), this); G_CALLBACK (gtk_window_expose_callback), this);
if (GetLayoutDirection() == wxLayout_LeftToRight) if (GetLayoutDirection() == wxLayout_LeftToRight)
gtk_widget_set_redraw_on_allocate( GTK_WIDGET(m_wxwindow), HasFlag( wxFULL_REPAINT_ON_RESIZE ) ); gtk_widget_set_redraw_on_allocate(m_wxwindow, HasFlag(wxFULL_REPAINT_ON_RESIZE));
} }
// Create input method handler // Create input method handler
@@ -2528,9 +2459,14 @@ void wxWindowGTK::PostCreation()
g_signal_connect (m_imData->context, "commit", g_signal_connect (m_imData->context, "commit",
G_CALLBACK (gtk_wxwindow_commit_cb), this); G_CALLBACK (gtk_wxwindow_commit_cb), this);
// these are called when the "sunken" or "raised" borders are drawn // border drawing
g_signal_connect (m_widget, "expose_event", #ifndef __WXUNIVERSAL__
G_CALLBACK (gtk_window_own_expose_callback), this); if (HasFlag(wxBORDER_SIMPLE | wxBORDER_RAISED | wxBORDER_SUNKEN))
{
g_signal_connect(m_widget, "expose_event",
G_CALLBACK(expose_event_border), this);
}
#endif
} }
// focus handling // focus handling
@@ -2684,9 +2620,9 @@ bool wxWindowGTK::Destroy()
void wxWindowGTK::DoMoveWindow(int x, int y, int width, int height) void wxWindowGTK::DoMoveWindow(int x, int y, int width, int height)
{ {
gtk_widget_set_size_request(m_widget, width, height);
// inform the parent to perform the move // inform the parent to perform the move
gtk_pizza_set_size( GTK_PIZZA(m_parent->m_wxwindow), m_widget, x, y, width, height ); WX_PIZZA(m_parent->m_wxwindow)->move(m_widget, x, y);
} }
void wxWindowGTK::ConstrainSize() void wxWindowGTK::ConstrainSize()
@@ -2740,9 +2676,9 @@ void wxWindowGTK::DoSetSize( int x, int y, int width, int height, int sizeFlags
if (m_parent->m_wxwindow) if (m_parent->m_wxwindow)
{ {
GtkPizza *pizza = GTK_PIZZA(m_parent->m_wxwindow); wxPizza* pizza = WX_PIZZA(m_parent->m_wxwindow);
m_x = x + gtk_pizza_get_xoffset(pizza); m_x = x + pizza->m_scroll_x;
m_y = y + gtk_pizza_get_yoffset(pizza); m_y = y + pizza->m_scroll_y;
int left_border = 0; int left_border = 0;
int right_border = 0; int right_border = 0;
@@ -2838,7 +2774,7 @@ void wxWindowGTK::OnInternalIdle()
if (m_wxwindow && (m_wxwindow != m_widget)) if (m_wxwindow && (m_wxwindow != m_widget))
{ {
GdkWindow *window = GTK_PIZZA(m_wxwindow)->bin_window; GdkWindow *window = m_wxwindow->window;
if (window) if (window)
gdk_window_set_cursor( window, cursor.GetCursor() ); gdk_window_set_cursor( window, cursor.GetCursor() );
@@ -2894,9 +2830,10 @@ void wxWindowGTK::DoGetClientSize( int *width, int *height ) const
if (m_hasScrolling) if (m_hasScrolling)
GetScrollbarWidth(m_widget, dw, dh); GetScrollbarWidth(m_widget, dw, dh);
const int border = GTK_CONTAINER(m_wxwindow)->border_width; int border_x, border_y;
dw += 2 * border; WX_PIZZA(m_wxwindow)->get_border_widths(border_x, border_y);
dh += 2 * border; dw += 2 * border_x;
dh += 2 * border_y;
w -= dw; w -= dw;
h -= dh; h -= dh;
@@ -2918,16 +2855,16 @@ void wxWindowGTK::DoGetPosition( int *x, int *y ) const
int dy = 0; int dy = 0;
if (!IsTopLevel() && m_parent && m_parent->m_wxwindow) if (!IsTopLevel() && m_parent && m_parent->m_wxwindow)
{ {
GtkPizza *pizza = GTK_PIZZA(m_parent->m_wxwindow); wxPizza* pizza = WX_PIZZA(m_parent->m_wxwindow);
dx = gtk_pizza_get_xoffset( pizza ); dx = pizza->m_scroll_x;
dy = gtk_pizza_get_yoffset( pizza ); dy = pizza->m_scroll_y;
} }
if (m_x == -1 && m_y == -1) if (m_x == -1 && m_y == -1)
{ {
GdkWindow *source = (GdkWindow *) NULL; GdkWindow *source = (GdkWindow *) NULL;
if (m_wxwindow) if (m_wxwindow)
source = GTK_PIZZA(m_wxwindow)->bin_window; source = m_wxwindow->window;
else else
source = m_widget->window; source = m_widget->window;
@@ -2957,7 +2894,7 @@ void wxWindowGTK::DoClientToScreen( int *x, int *y ) const
GdkWindow *source = (GdkWindow *) NULL; GdkWindow *source = (GdkWindow *) NULL;
if (m_wxwindow) if (m_wxwindow)
source = GTK_PIZZA(m_wxwindow)->bin_window; source = m_wxwindow->window;
else else
source = m_widget->window; source = m_widget->window;
@@ -2994,7 +2931,7 @@ void wxWindowGTK::DoScreenToClient( int *x, int *y ) const
GdkWindow *source = (GdkWindow *) NULL; GdkWindow *source = (GdkWindow *) NULL;
if (m_wxwindow) if (m_wxwindow)
source = GTK_PIZZA(m_wxwindow)->bin_window; source = m_wxwindow->window;
else else
source = m_widget->window; source = m_widget->window;
@@ -3394,7 +3331,7 @@ wxWindowGTK::AdjustForLayoutDirection(wxCoord x,
wxCoord WXUNUSED(width), wxCoord WXUNUSED(width),
wxCoord WXUNUSED(widthTotal)) const wxCoord WXUNUSED(widthTotal)) const
{ {
// We now mirrors the coordinates of RTL windows in GtkPizza // We now mirror the coordinates of RTL windows in wxPizza
return x; return x;
} }
@@ -3577,7 +3514,7 @@ void wxWindowGTK::WarpPointer( int x, int y )
GdkWindow *window = (GdkWindow*) NULL; GdkWindow *window = (GdkWindow*) NULL;
if (m_wxwindow) if (m_wxwindow)
window = GTK_PIZZA(m_wxwindow)->bin_window; window = m_wxwindow->window;
else else
window = GetConnectWidget()->window; window = GetConnectWidget()->window;
@@ -3638,7 +3575,7 @@ void wxWindowGTK::Refresh(bool WXUNUSED(eraseBackground),
if (m_wxwindow) if (m_wxwindow)
{ {
if (!GTK_PIZZA(m_wxwindow)->bin_window) return; if (m_wxwindow->window == NULL) return;
GdkRectangle gdk_rect, GdkRectangle gdk_rect,
*p; *p;
@@ -3658,7 +3595,7 @@ void wxWindowGTK::Refresh(bool WXUNUSED(eraseBackground),
p = NULL; p = NULL;
} }
gdk_window_invalidate_rect( GTK_PIZZA(m_wxwindow)->bin_window, p, TRUE ); gdk_window_invalidate_rect(m_wxwindow->window, p, true);
} }
} }
@@ -3675,8 +3612,8 @@ void wxWindowGTK::Update()
void wxWindowGTK::GtkUpdate() void wxWindowGTK::GtkUpdate()
{ {
if (m_wxwindow && GTK_PIZZA(m_wxwindow)->bin_window) if (m_wxwindow && m_wxwindow->window)
gdk_window_process_updates( GTK_PIZZA(m_wxwindow)->bin_window, FALSE ); gdk_window_process_updates(m_wxwindow->window, false);
if (m_widget && m_widget->window && (m_wxwindow != m_widget)) if (m_widget && m_widget->window && (m_wxwindow != m_widget))
gdk_window_process_updates( m_widget->window, FALSE ); gdk_window_process_updates( m_widget->window, FALSE );
@@ -3724,8 +3661,7 @@ void wxWindowGTK::GtkSendPaintEvents()
m_updateRegion.Clear(); m_updateRegion.Clear();
gint width; gint width;
gdk_window_get_geometry( GTK_PIZZA(m_wxwindow)->bin_window, gdk_drawable_get_size(m_wxwindow->window, &width, NULL);
NULL, NULL, &width, NULL, NULL );
wxRegionIterator upd( m_nativeUpdateRegion ); wxRegionIterator upd( m_nativeUpdateRegion );
while (upd) while (upd)
@@ -3743,9 +3679,6 @@ void wxWindowGTK::GtkSendPaintEvents()
} }
} }
// widget to draw on
GtkPizza *pizza = GTK_PIZZA (m_wxwindow);
if (GetThemeEnabled() && (GetBackgroundStyle() == wxBG_STYLE_SYSTEM)) if (GetThemeEnabled() && (GetBackgroundStyle() == wxBG_STYLE_SYSTEM))
{ {
// find ancestor from which to steal background // find ancestor from which to steal background
@@ -3765,7 +3698,7 @@ void wxWindowGTK::GtkSendPaintEvents()
rect.height = upd.GetHeight(); rect.height = upd.GetHeight();
gtk_paint_flat_box( parent->m_widget->style, gtk_paint_flat_box( parent->m_widget->style,
pizza->bin_window, m_wxwindow->window,
(GtkStateType)GTK_WIDGET_STATE(m_wxwindow), (GtkStateType)GTK_WIDGET_STATE(m_wxwindow),
GTK_SHADOW_NONE, GTK_SHADOW_NONE,
&rect, &rect,
@@ -3992,7 +3925,7 @@ bool wxWindowGTK::SetBackgroundStyle(wxBackgroundStyle style)
GdkWindow *window; GdkWindow *window;
if ( m_wxwindow ) if ( m_wxwindow )
{ {
window = GTK_PIZZA(m_wxwindow)->bin_window; window = m_wxwindow->window;
} }
else else
{ {
@@ -4065,7 +3998,7 @@ bool wxWindowGTK::GTKIsOwnWindow(GdkWindow *window) const
GdkWindow *wxWindowGTK::GTKGetWindow(wxArrayGdkWindows& WXUNUSED(windows)) const GdkWindow *wxWindowGTK::GTKGetWindow(wxArrayGdkWindows& WXUNUSED(windows)) const
{ {
return m_wxwindow ? GTK_PIZZA(m_wxwindow)->bin_window : m_widget->window; return m_wxwindow ? m_wxwindow->window : m_widget->window;
} }
bool wxWindowGTK::SetFont( const wxFont &font ) bool wxWindowGTK::SetFont( const wxFont &font )
@@ -4088,7 +4021,7 @@ void wxWindowGTK::DoCaptureMouse()
GdkWindow *window = (GdkWindow*) NULL; GdkWindow *window = (GdkWindow*) NULL;
if (m_wxwindow) if (m_wxwindow)
window = GTK_PIZZA(m_wxwindow)->bin_window; window = m_wxwindow->window;
else else
window = GetConnectWidget()->window; window = GetConnectWidget()->window;
@@ -4121,7 +4054,7 @@ void wxWindowGTK::DoReleaseMouse()
GdkWindow *window = (GdkWindow*) NULL; GdkWindow *window = (GdkWindow*) NULL;
if (m_wxwindow) if (m_wxwindow)
window = GTK_PIZZA(m_wxwindow)->bin_window; window = m_wxwindow->window;
else else
window = GetConnectWidget()->window; window = GetConnectWidget()->window;
@@ -4297,10 +4230,7 @@ void wxWindowGTK::ScrollWindow( int dx, int dy, const wxRect* WXUNUSED(rect) )
m_clipPaintRegion = true; m_clipPaintRegion = true;
if (GetLayoutDirection() == wxLayout_RightToLeft) WX_PIZZA(m_wxwindow)->scroll(dx, dy);
gtk_pizza_scroll( GTK_PIZZA(m_wxwindow), dx, -dy );
else
gtk_pizza_scroll( GTK_PIZZA(m_wxwindow), -dx, -dy );
m_clipPaintRegion = false; m_clipPaintRegion = false;
@@ -4408,3 +4338,11 @@ void wxRemoveGrab(wxWindow* window)
{ {
gtk_grab_remove( (GtkWidget*) window->GetHandle() ); gtk_grab_remove( (GtkWidget*) window->GetHandle() );
} }
GdkWindow* wxWindowGTK::GTKGetDrawingWindow() const
{
GdkWindow* window = NULL;
if (m_wxwindow)
window = m_wxwindow->window;
return window;
}

View File

@@ -4224,3 +4224,11 @@ void wxWinModule::OnExit()
if (g_eraseGC) if (g_eraseGC)
gdk_gc_unref( g_eraseGC ); gdk_gc_unref( g_eraseGC );
} }
GdkWindow* wxWindowGTK::GTKGetDrawingWindow() const
{
GdkWindow* window = NULL;
if (m_wxwindow)
window = GTK_PIZZA(m_wxwindow)->bin_window;
return window;
}

View File

@@ -37,7 +37,7 @@
#include "wx/thread.h" // wxMutex/wxMutexLocker #include "wx/thread.h" // wxMutex/wxMutexLocker
#ifdef __WXGTK__ #ifdef __WXGTK__
# include "wx/gtk/win_gtk.h" #include <gtk/gtk.h>
# include <gdk/gdkx.h> // for GDK_WINDOW_XWINDOW # include <gdk/gdkx.h> // for GDK_WINDOW_XWINDOW
#endif #endif
@@ -282,7 +282,7 @@ static gboolean gtk_window_expose_callback(GtkWidget *widget,
if(event->count > 0) if(event->count > 0)
return FALSE; return FALSE;
GdkWindow *window = GTK_PIZZA(be->GetControl()->m_wxwindow)->bin_window; GdkWindow *window = be->GetControl()->GTKGetDrawingWindow();
// I've seen this reccommended somewhere... // I've seen this reccommended somewhere...
// TODO: Is this needed? Maybe it is just cruft... // TODO: Is this needed? Maybe it is just cruft...
@@ -320,7 +320,7 @@ static gboolean gtk_window_expose_callback(GtkWidget *widget,
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
#ifdef __WXGTK__ #ifdef __WXGTK__
extern "C" { extern "C" {
static gint gtk_window_realize_callback(GtkWidget* theWidget, static gint gtk_window_realize_callback(GtkWidget*,
wxGStreamerMediaBackend* be) wxGStreamerMediaBackend* be)
{ {
DEBUG_MAIN_THREAD // TODO: Is this neccessary? DEBUG_MAIN_THREAD // TODO: Is this neccessary?
@@ -333,7 +333,7 @@ static gint gtk_window_realize_callback(GtkWidget* theWidget,
wxYield(); // FIXME: RN: X Server gets an error/crash if I don't do wxYield(); // FIXME: RN: X Server gets an error/crash if I don't do
// this or a messagebox beforehand?!?!?? // this or a messagebox beforehand?!?!??
GdkWindow *window = GTK_PIZZA(theWidget)->bin_window; GdkWindow *window = be->GetControl()->GTKGetDrawingWindow();
wxASSERT(window); wxASSERT(window);
gst_x_overlay_set_xwindow_id( GST_X_OVERLAY(be->m_xoverlay), gst_x_overlay_set_xwindow_id( GST_X_OVERLAY(be->m_xoverlay),
@@ -737,7 +737,7 @@ void wxGStreamerMediaBackend::SetupXOverlay()
else else
{ {
wxYield(); // see realize callback... wxYield(); // see realize callback...
GdkWindow *window = GTK_PIZZA(m_ctrl->m_wxwindow)->bin_window; GdkWindow *window = m_ctrl->m_wxwindow->GTKGetDrawingWindow();
wxASSERT(window); wxASSERT(window);
#endif #endif