]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk1/window.cpp
OS/2 updates for statusbar processing and easier VA debugging
[wxWidgets.git] / src / gtk1 / window.cpp
index 15d638df75ea3c8e4a9c578d08c2d4efe6bd3a51..a85d6ab17b857ad6d222173471a3f122b5be095b 100644 (file)
@@ -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);
+
 }