From 3fc6e5fa23909c701654001a895f2ba95751e0af Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Tue, 20 Aug 2002 15:48:14 +0000 Subject: [PATCH] Added scrolling of widgets to GTK 2.0. Removied obsolete ifdef from toolbar code. Updated readme. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@16628 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/gtk/readme.txt | 11 +++- src/gtk/tbargtk.cpp | 2 - src/gtk/win_gtk.c | 130 +++++++++++++++++++++++-------------------- src/gtk/window.cpp | 30 ++++------ src/gtk1/tbargtk.cpp | 2 - src/gtk1/win_gtk.c | 130 +++++++++++++++++++++++-------------------- src/gtk1/window.cpp | 30 ++++------ 7 files changed, 174 insertions(+), 161 deletions(-) diff --git a/docs/gtk/readme.txt b/docs/gtk/readme.txt index 58a83d81e2..b398d599ea 100644 --- a/docs/gtk/readme.txt +++ b/docs/gtk/readme.txt @@ -7,7 +7,7 @@ wxWindows GUI library. wxWindows no longer supports GTK 1.0 (as did some early snapshots) so that you will need GTK 1.2 when using it. GTK 1.2.6 or above is recommended although some programs -will work with GTK 1.2.3 onwards. There is now beta support +will work with GTK 1.2.3 onwards. There is now support for GTK 2.0. More info about the wxWindows project (and the Windows @@ -27,6 +27,15 @@ make install ldconfig exit +In order to use wxGTK with GTK 2.0 and its unicode +support, you need to configure + +./configure --with-gtk --enable-gtk2 --enable-unicode +etc. + +Sofar, support for GTK 2.0 has only been tested on +Linux with glibc 2.2. + When you run into problems, please read the INSTALL.txt and follow those instructions. If you still don't have any success, please send a bug report to one of our mailing list, INCLUDING diff --git a/src/gtk/tbargtk.cpp b/src/gtk/tbargtk.cpp index 0494319d44..53e68f741a 100644 --- a/src/gtk/tbargtk.cpp +++ b/src/gtk/tbargtk.cpp @@ -396,9 +396,7 @@ bool wxToolBar::DoInsertTool(size_t pos, wxToolBarToolBase *toolBase) mask = bitmap.GetMask()->GetBitmap(); tool_pixmap = gtk_pixmap_new( pixmap, mask ); -#if (GTK_MINOR_VERSION > 0) gtk_pixmap_set_build_insensitive( GTK_PIXMAP(tool_pixmap), TRUE ); -#endif gtk_misc_set_alignment( GTK_MISC(tool_pixmap), 0.5, 0.5 ); diff --git a/src/gtk/win_gtk.c b/src/gtk/win_gtk.c index d2d3ecdec5..27e2d156bb 100644 --- a/src/gtk/win_gtk.c +++ b/src/gtk/win_gtk.c @@ -68,19 +68,17 @@ static void gtk_pizza_forall (GtkContainer *container, gboolean include_internals, GtkCallback callback, gpointer callback_data); + static void gtk_pizza_allocate_child (GtkPizza *pizza, GtkPizzaChild *child); +static void gtk_pizza_adjust_allocations_recurse (GtkWidget *widget, + gpointer cb_data); +#ifndef __WXGTK20__ static void gtk_pizza_position_child (GtkPizza *pizza, GtkPizzaChild *child); -#ifndef __WXGTK20__ static void gtk_pizza_position_children (GtkPizza *pizza); -static void gtk_pizza_adjust_allocations_recurse (GtkWidget *widget, - gpointer cb_data); -static void gtk_pizza_adjust_allocations (GtkPizza *pizza, - gint dx, - gint dy); static GdkFilterReturn gtk_pizza_filter (GdkXEvent *gdk_xevent, GdkEvent *event, gpointer data); @@ -351,7 +349,7 @@ gtk_pizza_move (GtkPizza *pizza, child->x = x; child->y = y; - + if (GTK_WIDGET_VISIBLE (widget) && GTK_WIDGET_VISIBLE (pizza)) gtk_widget_queue_resize (widget); break; @@ -709,7 +707,9 @@ gtk_pizza_size_allocate (GtkWidget *widget, child = children->data; children = children->next; +#ifndef __WXGTK20__ gtk_pizza_position_child (pizza, child); +#endif gtk_pizza_allocate_child (pizza, child); } } @@ -759,9 +759,11 @@ gtk_pizza_expose (GtkWidget *widget, GdkEventExpose *event) { GtkPizza *pizza; +#ifndef __WXGTK20__ GtkPizzaChild *child; GdkEventExpose child_event; GList *children; +#endif g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_PIZZA (widget), FALSE); @@ -902,57 +904,6 @@ gtk_pizza_allocate_child (GtkPizza *pizza, gtk_widget_size_allocate (child->widget, &allocation); } -static void -gtk_pizza_position_child (GtkPizza *pizza, - GtkPizzaChild *child) -{ - gint x; - gint y; - - x = child->x - pizza->xoffset; - y = child->y - pizza->yoffset; - -#ifndef __WXGTK20__ - if (IS_ONSCREEN (x,y)) - { - if (GTK_WIDGET_MAPPED (pizza) && - GTK_WIDGET_VISIBLE (child->widget)) - { - if (!GTK_WIDGET_MAPPED (child->widget)) - gtk_widget_map (child->widget); - } - - if (GTK_WIDGET_IS_OFFSCREEN (child->widget)) - GTK_PRIVATE_UNSET_FLAG (child->widget, GTK_IS_OFFSCREEN); - } - else - { - if (!GTK_WIDGET_IS_OFFSCREEN (child->widget)) - GTK_PRIVATE_SET_FLAG (child->widget, GTK_IS_OFFSCREEN); - - if (GTK_WIDGET_MAPPED (child->widget)) - gtk_widget_unmap (child->widget); - } -#endif -} - -#ifndef __WXGTK20__ - -static void -gtk_pizza_position_children (GtkPizza *pizza) -{ - GList *tmp_list; - - tmp_list = pizza->children; - while (tmp_list) - { - GtkPizzaChild *child = tmp_list->data; - tmp_list = tmp_list->next; - - gtk_pizza_position_child (pizza, child); - } -} - static void gtk_pizza_adjust_allocations_recurse (GtkWidget *widget, gpointer cb_data) @@ -1000,8 +951,55 @@ gtk_pizza_adjust_allocations (GtkPizza *pizza, } } -/* This function is used to find events to process while scrolling */ +#ifndef __WXGTK20__ +static void +gtk_pizza_position_child (GtkPizza *pizza, + GtkPizzaChild *child) +{ + gint x; + gint y; + x = child->x - pizza->xoffset; + y = child->y - pizza->yoffset; + + if (IS_ONSCREEN (x,y)) + { + if (GTK_WIDGET_MAPPED (pizza) && + GTK_WIDGET_VISIBLE (child->widget)) + { + if (!GTK_WIDGET_MAPPED (child->widget)) + gtk_widget_map (child->widget); + } + + if (GTK_WIDGET_IS_OFFSCREEN (child->widget)) + GTK_PRIVATE_UNSET_FLAG (child->widget, GTK_IS_OFFSCREEN); + } + else + { + if (!GTK_WIDGET_IS_OFFSCREEN (child->widget)) + GTK_PRIVATE_SET_FLAG (child->widget, GTK_IS_OFFSCREEN); + + if (GTK_WIDGET_MAPPED (child->widget)) + gtk_widget_unmap (child->widget); + } +} + +static void +gtk_pizza_position_children (GtkPizza *pizza) +{ + GList *tmp_list; + + tmp_list = pizza->children; + while (tmp_list) + { + GtkPizzaChild *child = tmp_list->data; + tmp_list = tmp_list->next; + + gtk_pizza_position_child (pizza, child); + } +} + +/* This function is used to find events to process while scrolling */ static Bool gtk_pizza_expose_predicate (Display *display, XEvent *xevent, @@ -1014,6 +1012,7 @@ gtk_pizza_expose_predicate (Display *display, else return False; } +#endif /* __WXGTK20__ */ /* This is the main routine to do the scrolling. Scrolling is * done by "Guffaw" scrolling, as in the Mozilla XFE, with @@ -1030,6 +1029,15 @@ gtk_pizza_expose_predicate (Display *display, void gtk_pizza_scroll (GtkPizza *pizza, gint dx, gint dy) { +#ifdef __WXGTK20__ + pizza->xoffset += dx; + pizza->yoffset += dy; + + gtk_pizza_adjust_allocations (pizza, -dx, -dy); + + if (pizza->bin_window) + gdk_window_scroll( pizza->bin_window, -dx, -dy ); +#else GtkWidget *widget; XEvent xevent; XID win; @@ -1161,8 +1169,11 @@ gtk_pizza_scroll (GtkPizza *pizza, gint dx, gint dy) } } } +#endif /* __WXGTK20__ */ } + +#ifndef __WXGTK20__ /* The main event filter. Actually, we probably don't really need * to install this as a filter at all, since we are calling it * directly above in the expose-handling hack. But in case scrollbars @@ -1250,7 +1261,6 @@ gtk_pizza_main_filter (GdkXEvent *gdk_xevent, return GDK_FILTER_CONTINUE; } - #endif /* __WXGTK20__ */ diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index e66e9b1b9c..76c5596cc0 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -497,6 +497,14 @@ static int gtk_window_expose_callback( GtkWidget *widget, if (g_isIdle) wxapp_install_idle_handler(); +#ifdef __WXGTK20__ + // This callback gets called in drawing-idle time under + // GTK 2.0, so we don't need to defer anything to idle + // time anymore. + + GtkPizza *pizza = GTK_PIZZA( widget ); + if (gdk_event->window != pizza->bin_window) return FALSE; + #if 0 if (win->GetName()) { @@ -510,16 +518,11 @@ static int gtk_window_expose_callback( GtkWidget *widget, } #endif -#ifdef __WXGTK20__ - // This callback gets called in drawing-idle time under - // GTK 2.0, so we don't need to defer anything to idle - // time anymore. - win->GetUpdateRegion() = wxRegion( gdk_event->region ); win->GtkSendPaintEvents(); - // Draw window less widgets + // Let parent window draw window less widgets (* GTK_WIDGET_CLASS (pizza_parent_class)->expose_event) (widget, gdk_event); #else // This gets called immediately after an expose event @@ -539,8 +542,7 @@ static int gtk_window_expose_callback( GtkWidget *widget, // win->GtkUpdate(); #endif - - return TRUE; + return FALSE; } //----------------------------------------------------------------------------- @@ -4261,21 +4263,13 @@ void wxWindowGTK::ScrollWindow( int dx, int dy, const wxRect* WXUNUSED(rect) ) GetClientSize( &cw, &ch ); m_clearRegion.Intersect( 0, 0, cw, ch ); } +#endif + m_clipPaintRegion = TRUE; gtk_pizza_scroll( GTK_PIZZA(m_wxwindow), -dx, -dy ); m_clipPaintRegion = FALSE; -#else - wxCHECK_RET( GTK_PIZZA(m_wxwindow)->bin_window != NULL, wxT("window needs client area for scrolling") ); - - gdk_window_scroll( GTK_PIZZA(m_wxwindow)->bin_window, dx, dy ); - - GTK_PIZZA(m_wxwindow)->xoffset += dx; - GTK_PIZZA(m_wxwindow)->yoffset += dy; - -#endif - } diff --git a/src/gtk1/tbargtk.cpp b/src/gtk1/tbargtk.cpp index 0494319d44..53e68f741a 100644 --- a/src/gtk1/tbargtk.cpp +++ b/src/gtk1/tbargtk.cpp @@ -396,9 +396,7 @@ bool wxToolBar::DoInsertTool(size_t pos, wxToolBarToolBase *toolBase) mask = bitmap.GetMask()->GetBitmap(); tool_pixmap = gtk_pixmap_new( pixmap, mask ); -#if (GTK_MINOR_VERSION > 0) gtk_pixmap_set_build_insensitive( GTK_PIXMAP(tool_pixmap), TRUE ); -#endif gtk_misc_set_alignment( GTK_MISC(tool_pixmap), 0.5, 0.5 ); diff --git a/src/gtk1/win_gtk.c b/src/gtk1/win_gtk.c index d2d3ecdec5..27e2d156bb 100644 --- a/src/gtk1/win_gtk.c +++ b/src/gtk1/win_gtk.c @@ -68,19 +68,17 @@ static void gtk_pizza_forall (GtkContainer *container, gboolean include_internals, GtkCallback callback, gpointer callback_data); + static void gtk_pizza_allocate_child (GtkPizza *pizza, GtkPizzaChild *child); +static void gtk_pizza_adjust_allocations_recurse (GtkWidget *widget, + gpointer cb_data); +#ifndef __WXGTK20__ static void gtk_pizza_position_child (GtkPizza *pizza, GtkPizzaChild *child); -#ifndef __WXGTK20__ static void gtk_pizza_position_children (GtkPizza *pizza); -static void gtk_pizza_adjust_allocations_recurse (GtkWidget *widget, - gpointer cb_data); -static void gtk_pizza_adjust_allocations (GtkPizza *pizza, - gint dx, - gint dy); static GdkFilterReturn gtk_pizza_filter (GdkXEvent *gdk_xevent, GdkEvent *event, gpointer data); @@ -351,7 +349,7 @@ gtk_pizza_move (GtkPizza *pizza, child->x = x; child->y = y; - + if (GTK_WIDGET_VISIBLE (widget) && GTK_WIDGET_VISIBLE (pizza)) gtk_widget_queue_resize (widget); break; @@ -709,7 +707,9 @@ gtk_pizza_size_allocate (GtkWidget *widget, child = children->data; children = children->next; +#ifndef __WXGTK20__ gtk_pizza_position_child (pizza, child); +#endif gtk_pizza_allocate_child (pizza, child); } } @@ -759,9 +759,11 @@ gtk_pizza_expose (GtkWidget *widget, GdkEventExpose *event) { GtkPizza *pizza; +#ifndef __WXGTK20__ GtkPizzaChild *child; GdkEventExpose child_event; GList *children; +#endif g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_PIZZA (widget), FALSE); @@ -902,57 +904,6 @@ gtk_pizza_allocate_child (GtkPizza *pizza, gtk_widget_size_allocate (child->widget, &allocation); } -static void -gtk_pizza_position_child (GtkPizza *pizza, - GtkPizzaChild *child) -{ - gint x; - gint y; - - x = child->x - pizza->xoffset; - y = child->y - pizza->yoffset; - -#ifndef __WXGTK20__ - if (IS_ONSCREEN (x,y)) - { - if (GTK_WIDGET_MAPPED (pizza) && - GTK_WIDGET_VISIBLE (child->widget)) - { - if (!GTK_WIDGET_MAPPED (child->widget)) - gtk_widget_map (child->widget); - } - - if (GTK_WIDGET_IS_OFFSCREEN (child->widget)) - GTK_PRIVATE_UNSET_FLAG (child->widget, GTK_IS_OFFSCREEN); - } - else - { - if (!GTK_WIDGET_IS_OFFSCREEN (child->widget)) - GTK_PRIVATE_SET_FLAG (child->widget, GTK_IS_OFFSCREEN); - - if (GTK_WIDGET_MAPPED (child->widget)) - gtk_widget_unmap (child->widget); - } -#endif -} - -#ifndef __WXGTK20__ - -static void -gtk_pizza_position_children (GtkPizza *pizza) -{ - GList *tmp_list; - - tmp_list = pizza->children; - while (tmp_list) - { - GtkPizzaChild *child = tmp_list->data; - tmp_list = tmp_list->next; - - gtk_pizza_position_child (pizza, child); - } -} - static void gtk_pizza_adjust_allocations_recurse (GtkWidget *widget, gpointer cb_data) @@ -1000,8 +951,55 @@ gtk_pizza_adjust_allocations (GtkPizza *pizza, } } -/* This function is used to find events to process while scrolling */ +#ifndef __WXGTK20__ +static void +gtk_pizza_position_child (GtkPizza *pizza, + GtkPizzaChild *child) +{ + gint x; + gint y; + x = child->x - pizza->xoffset; + y = child->y - pizza->yoffset; + + if (IS_ONSCREEN (x,y)) + { + if (GTK_WIDGET_MAPPED (pizza) && + GTK_WIDGET_VISIBLE (child->widget)) + { + if (!GTK_WIDGET_MAPPED (child->widget)) + gtk_widget_map (child->widget); + } + + if (GTK_WIDGET_IS_OFFSCREEN (child->widget)) + GTK_PRIVATE_UNSET_FLAG (child->widget, GTK_IS_OFFSCREEN); + } + else + { + if (!GTK_WIDGET_IS_OFFSCREEN (child->widget)) + GTK_PRIVATE_SET_FLAG (child->widget, GTK_IS_OFFSCREEN); + + if (GTK_WIDGET_MAPPED (child->widget)) + gtk_widget_unmap (child->widget); + } +} + +static void +gtk_pizza_position_children (GtkPizza *pizza) +{ + GList *tmp_list; + + tmp_list = pizza->children; + while (tmp_list) + { + GtkPizzaChild *child = tmp_list->data; + tmp_list = tmp_list->next; + + gtk_pizza_position_child (pizza, child); + } +} + +/* This function is used to find events to process while scrolling */ static Bool gtk_pizza_expose_predicate (Display *display, XEvent *xevent, @@ -1014,6 +1012,7 @@ gtk_pizza_expose_predicate (Display *display, else return False; } +#endif /* __WXGTK20__ */ /* This is the main routine to do the scrolling. Scrolling is * done by "Guffaw" scrolling, as in the Mozilla XFE, with @@ -1030,6 +1029,15 @@ gtk_pizza_expose_predicate (Display *display, void gtk_pizza_scroll (GtkPizza *pizza, gint dx, gint dy) { +#ifdef __WXGTK20__ + pizza->xoffset += dx; + pizza->yoffset += dy; + + gtk_pizza_adjust_allocations (pizza, -dx, -dy); + + if (pizza->bin_window) + gdk_window_scroll( pizza->bin_window, -dx, -dy ); +#else GtkWidget *widget; XEvent xevent; XID win; @@ -1161,8 +1169,11 @@ gtk_pizza_scroll (GtkPizza *pizza, gint dx, gint dy) } } } +#endif /* __WXGTK20__ */ } + +#ifndef __WXGTK20__ /* The main event filter. Actually, we probably don't really need * to install this as a filter at all, since we are calling it * directly above in the expose-handling hack. But in case scrollbars @@ -1250,7 +1261,6 @@ gtk_pizza_main_filter (GdkXEvent *gdk_xevent, return GDK_FILTER_CONTINUE; } - #endif /* __WXGTK20__ */ diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index e66e9b1b9c..76c5596cc0 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -497,6 +497,14 @@ static int gtk_window_expose_callback( GtkWidget *widget, if (g_isIdle) wxapp_install_idle_handler(); +#ifdef __WXGTK20__ + // This callback gets called in drawing-idle time under + // GTK 2.0, so we don't need to defer anything to idle + // time anymore. + + GtkPizza *pizza = GTK_PIZZA( widget ); + if (gdk_event->window != pizza->bin_window) return FALSE; + #if 0 if (win->GetName()) { @@ -510,16 +518,11 @@ static int gtk_window_expose_callback( GtkWidget *widget, } #endif -#ifdef __WXGTK20__ - // This callback gets called in drawing-idle time under - // GTK 2.0, so we don't need to defer anything to idle - // time anymore. - win->GetUpdateRegion() = wxRegion( gdk_event->region ); win->GtkSendPaintEvents(); - // Draw window less widgets + // Let parent window draw window less widgets (* GTK_WIDGET_CLASS (pizza_parent_class)->expose_event) (widget, gdk_event); #else // This gets called immediately after an expose event @@ -539,8 +542,7 @@ static int gtk_window_expose_callback( GtkWidget *widget, // win->GtkUpdate(); #endif - - return TRUE; + return FALSE; } //----------------------------------------------------------------------------- @@ -4261,21 +4263,13 @@ void wxWindowGTK::ScrollWindow( int dx, int dy, const wxRect* WXUNUSED(rect) ) GetClientSize( &cw, &ch ); m_clearRegion.Intersect( 0, 0, cw, ch ); } +#endif + m_clipPaintRegion = TRUE; gtk_pizza_scroll( GTK_PIZZA(m_wxwindow), -dx, -dy ); m_clipPaintRegion = FALSE; -#else - wxCHECK_RET( GTK_PIZZA(m_wxwindow)->bin_window != NULL, wxT("window needs client area for scrolling") ); - - gdk_window_scroll( GTK_PIZZA(m_wxwindow)->bin_window, dx, dy ); - - GTK_PIZZA(m_wxwindow)->xoffset += dx; - GTK_PIZZA(m_wxwindow)->yoffset += dy; - -#endif - } -- 2.47.2