X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3723b7b1d8cbeebccef4f8ad7fe3884dfca9eca6..f1d93f0beeec9d88f8a225aa35a9ccc163dcdb15:/src/gtk1/window.cpp diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index 15d638df75..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 ); @@ -3754,61 +3783,44 @@ void wxWindow::ScrollWindow( int dx, int dy, const wxRect* WXUNUSED(rect) ) */ } -// Helper for wxFindWindowAtPointer -wxWindow* wxFindWindowForGdkWindow(wxWindow* win, GdkWindow* gdkWindow) -{ - GdkWindow* thisGdkWindow1 = 0; - GdkWindow* thisGdkWindow2 = 0; - - if (win->m_wxwindow) - thisGdkWindow1 = GTK_PIZZA(win->m_wxwindow)->bin_window; - - thisGdkWindow2 = win->m_widget->window; - - if (gdkWindow == thisGdkWindow1 || gdkWindow == thisGdkWindow2) - return win; - - wxNode* node = win->GetChildren().First(); - while (node) - { - wxWindow* child = (wxWindow*) node->Data(); - wxWindow* found = wxFindWindowForGdkWindow(child, gdkWindow); - if (found) - return found; - - node = node->Next(); - } - return NULL; -} - // Find the wxWindow at the current mouse position, also returning the mouse // position. wxWindow* wxFindWindowAtPointer(wxPoint& pt) { - int x, y; - GdkWindow* windowAtPtr = gdk_window_at_pointer(& x, & y); - pt.x = x; - pt.y = y; - if (windowAtPtr) - { - wxNode* node = wxTopLevelWindows.First(); - while (node) - { - wxWindow* win = (wxWindow*) node->Data(); - wxWindow* wxWinAtPtr = wxFindWindowForGdkWindow(win, windowAtPtr); - if (wxWinAtPtr) - return wxWinAtPtr; - node = node->Next(); - } - } - return NULL; + pt = wxGetMousePosition(); + wxWindow* found = wxFindWindowAtPoint(pt); + return found; } // Get the current mouse position. wxPoint wxGetMousePosition() { + /* This crashes when used within wxHelpContext, + so we have to use the X-specific implementation below. + gint x, y; + GdkModifierType *mask; + (void) gdk_window_get_pointer(NULL, &x, &y, mask); + + return wxPoint(x, y); + */ + int x, y; GdkWindow* windowAtPtr = gdk_window_at_pointer(& x, & y); - return wxPoint(x, y); + if (!windowAtPtr) + return wxPoint(-999, -999); + + Display *display = GDK_WINDOW_XDISPLAY(windowAtPtr); + Window rootWindow = RootWindowOfScreen (DefaultScreenOfDisplay(display)); + Window rootReturn, childReturn; + int rootX, rootY, winX, winY; + unsigned int maskReturn; + + XQueryPointer (display, + rootWindow, + &rootReturn, + &childReturn, + &rootX, &rootY, &winX, &winY, &maskReturn); + return wxPoint(rootX, rootY); + }