X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/59a12e90345a6d88e74f594b500be4b48637f52c..513abb883f5b0d02a9458becb2802dc01479bd38:/src/gtk1/window.cpp diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index d56ab1057d..a85d6ab17b 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -679,31 +679,43 @@ static int gtk_window_expose_callback( GtkWidget *widget, GdkEventExpose *gdk_ev } */ - win->GetUpdateRegion().Union( gdk_event->area.x, - gdk_event->area.y, - gdk_event->area.width, - gdk_event->area.height ); + GtkPizza *pizza = GTK_PIZZA (widget); - if (gdk_event->count == 0) - { - wxEraseEvent eevent( win->GetId() ); - eevent.SetEventObject( win ); - win->GetEventHandler()->ProcessEvent(eevent); + if (win->GetThemeEnabled()) + { + wxWindow *parent = win->GetParent(); + while (parent && !parent->IsTopLevel()) + parent = parent->GetParent(); + if (!parent) + parent = win; - wxPaintEvent event( win->GetId() ); - event.SetEventObject( win ); - win->GetEventHandler()->ProcessEvent( event ); + gtk_paint_flat_box (parent->m_widget->style, pizza->bin_window, GTK_STATE_NORMAL, + GTK_SHADOW_NONE, &gdk_event->area, parent->m_widget, "base", 0, 0, -1, -1); + } + + win->GetUpdateRegion().Union( gdk_event->area.x, + gdk_event->area.y, + gdk_event->area.width, + gdk_event->area.height ); - win->GetUpdateRegion().Clear(); - } + if (gdk_event->count == 0) + { + wxEraseEvent eevent( win->GetId() ); + eevent.SetEventObject( win ); + win->GetEventHandler()->ProcessEvent(eevent); + + wxPaintEvent event( win->GetId() ); + event.SetEventObject( win ); + win->GetEventHandler()->ProcessEvent( event ); + + win->GetUpdateRegion().Clear(); + } /* The following code will result in all window-less widgets being redrawn if the wxWindows class is given a chance to paint *anything* because it will then be allowed to paint over the window-less widgets */ - GtkPizza *pizza = GTK_PIZZA (widget); - GList *children = pizza->children; while (children) { @@ -761,7 +773,11 @@ static void gtk_window_draw_callback( GtkWidget *widget, GdkRectangle *rect, wxW if (g_isIdle) wxapp_install_idle_handler(); - + + // this is supposed to take care of extra (and unneeded) frame repaints + if (win->GetChildren().GetCount() == 0) + return; + /* if (win->GetName() == wxT("panel")) { @@ -776,17 +792,30 @@ static void gtk_window_draw_callback( GtkWidget *widget, GdkRectangle *rect, wxW */ GtkPizza *pizza = GTK_PIZZA (widget); + + if (win->GetThemeEnabled()) + { + wxWindow *parent = win->GetParent(); + while (parent && !parent->IsTopLevel()) + parent = parent->GetParent(); + if (!parent) + parent = win; + + gtk_paint_flat_box (parent->m_widget->style, pizza->bin_window, GTK_STATE_NORMAL, + GTK_SHADOW_NONE, rect, parent->m_widget, "base", 0, 0, -1, -1); + } - if (!(GTK_WIDGET_APP_PAINTABLE (widget)) && - (pizza->clear_on_draw)) - { - gdk_window_clear_area( pizza->bin_window, + + if (!(GTK_WIDGET_APP_PAINTABLE (widget)) && + (pizza->clear_on_draw)) + { + gdk_window_clear_area( pizza->bin_window, rect->x, rect->y, rect->width, rect->height); - } + } - win->GetUpdateRegion().Union( rect->x, rect->y, rect->width, rect->height ); + win->GetUpdateRegion().Union( rect->x, rect->y, rect->width, rect->height ); - win->m_clipPaintRegion = TRUE; + win->m_clipPaintRegion = TRUE; wxEraseEvent eevent( win->GetId() ); eevent.SetEventObject( win ); @@ -3777,6 +3806,8 @@ wxPoint wxGetMousePosition() int x, y; GdkWindow* windowAtPtr = gdk_window_at_pointer(& x, & y); + if (!windowAtPtr) + return wxPoint(-999, -999); Display *display = GDK_WINDOW_XDISPLAY(windowAtPtr); Window rootWindow = RootWindowOfScreen (DefaultScreenOfDisplay(display));