]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/window.cpp
Corrected small mistake (set static variable)
[wxWidgets.git] / src / gtk / window.cpp
index e1172d0fdce89848642b98db22aaa8a172a94c98..c6b827a1e4ee66d34130638ef4f0eda6d4954c95 100644 (file)
    clicking on a scrollbar belonging to scrolled window will inevitably move
    the window. In wxWindows, the scrollbar will only emit an event, send this
    to (normally) a wxScrolledWindow and that class will call ScrollWindow()
    clicking on a scrollbar belonging to scrolled window will inevitably move
    the window. In wxWindows, the scrollbar will only emit an event, send this
    to (normally) a wxScrolledWindow and that class will call ScrollWindow()
-   which actually move the window and its subchildren. Note that GtkMyFixed
+   which actually moves the window and its subchildren. Note that GtkMyFixed
    memorizes how much it has been scrolled but that wxWindows forgets this
    so that the two coordinates systems have to be kept in synch. This is done
    in various places using the myfixed->xoffset and myfixed->yoffset values.
    memorizes how much it has been scrolled but that wxWindows forgets this
    so that the two coordinates systems have to be kept in synch. This is done
    in various places using the myfixed->xoffset and myfixed->yoffset values.
    and then iterates down the respective size events to all window. This has
    the disadvantage, that windows might get size events before the GTK widget
    actually has the reported size. This doesn't normally pose any problem, but
    and then iterates down the respective size events to all window. This has
    the disadvantage, that windows might get size events before the GTK widget
    actually has the reported size. This doesn't normally pose any problem, but
-   the OpenGl drawing routines rely in correct behaviour. Therefore, I have
+   the OpenGl drawing routines rely on correct behaviour. Therefore, I have
    added the m_nativeSizeEvents flag, which is true only for the OpenGL canvas,
    i.e. the wxGLCanvas will emit a size event, when (and not before) the X11
    window that is used for OpenGl output really has that size (as reported by
    added the m_nativeSizeEvents flag, which is true only for the OpenGL canvas,
    i.e. the wxGLCanvas will emit a size event, when (and not before) the X11
    window that is used for OpenGl output really has that size (as reported by
@@ -823,13 +823,12 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_e
     GdkModifierType state;
     if (gdk_event->window) gdk_window_get_pointer(gdk_event->window, &x, &y, &state);
 
     GdkModifierType state;
     if (gdk_event->window) gdk_window_get_pointer(gdk_event->window, &x, &y, &state);
 
+    bool ret = FALSE;
+    
     long key_code = map_to_unmodified_wx_keysym( gdk_event->keyval );
     long key_code = map_to_unmodified_wx_keysym( gdk_event->keyval );
-
     /* sending unknown key events doesn't really make sense */
     if (key_code == 0) return FALSE;
 
     /* sending unknown key events doesn't really make sense */
     if (key_code == 0) return FALSE;
 
-    bool ret = FALSE;
-
     wxKeyEvent event( wxEVT_KEY_DOWN );
     event.SetTimestamp( gdk_event->time );
     event.m_shiftDown = (gdk_event->state & GDK_SHIFT_MASK);
     wxKeyEvent event( wxEVT_KEY_DOWN );
     event.SetTimestamp( gdk_event->time );
     event.m_shiftDown = (gdk_event->state & GDK_SHIFT_MASK);
@@ -843,8 +842,6 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_e
     event.SetEventObject( win );
     ret = win->GetEventHandler()->ProcessEvent( event );
 
     event.SetEventObject( win );
     ret = win->GetEventHandler()->ProcessEvent( event );
 
-    key_code = map_to_wx_keysym( gdk_event->keyval );
-
 #if wxUSE_ACCEL
     if (!ret)
     {
 #if wxUSE_ACCEL
     if (!ret)
     {
@@ -862,10 +859,14 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_e
         }
     }
 #endif // wxUSE_ACCEL
         }
     }
 #endif // wxUSE_ACCEL
+
     /* wxMSW doesn't send char events with Alt pressed */
     /* Only send wxEVT_CHAR event if not processed yet. Thus, ALT-x
     /* wxMSW doesn't send char events with Alt pressed */
     /* Only send wxEVT_CHAR event if not processed yet. Thus, ALT-x
-       will only be sent if it is not a menu accelerator. */
-    if ((key_code != 0) && ! ret )
+       will only be sent if it is not in an accelerator table. */
+    key_code = map_to_wx_keysym( gdk_event->keyval );
+    
+    if ( (!ret) &&
+         (key_code != 0))
     {
         wxKeyEvent event2( wxEVT_CHAR );
         event2.SetTimestamp( gdk_event->time );
     {
         wxKeyEvent event2( wxEVT_CHAR );
         event2.SetTimestamp( gdk_event->time );
@@ -878,7 +879,7 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_e
         event2.m_x = x;
         event2.m_y = y;
         event2.SetEventObject( win );
         event2.m_x = x;
         event2.m_y = y;
         event2.SetEventObject( win );
-        ret = (ret || win->GetEventHandler()->ProcessEvent( event2 ));
+        ret = win->GetEventHandler()->ProcessEvent( event2 );
     }
 
     /* win is a control: tab can be propagated up */
     }
 
     /* win is a control: tab can be propagated up */
@@ -906,6 +907,7 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_e
 
 #if (GTK_MINOR_VERSION > 0)
     /* pressing F10 will activate the menu bar of the top frame */
 
 #if (GTK_MINOR_VERSION > 0)
     /* pressing F10 will activate the menu bar of the top frame */
+/*
     if ( (!ret) &&
          (gdk_event->keyval == GDK_F10) )
     {
     if ( (!ret) &&
          (gdk_event->keyval == GDK_F10) )
     {
@@ -921,10 +923,9 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_e
                     wxNode *node = menubar->GetMenus().First();
                     if (node)
                     {
                     wxNode *node = menubar->GetMenus().First();
                     if (node)
                     {
-                        // doesn't work correctly
-            // wxMenu *firstMenu = (wxMenu*) node->Data();
-                        // gtk_menu_item_select( GTK_MENU_ITEM(firstMenu->m_owner) );
-                        // ret = TRUE;
+                        wxMenu *firstMenu = (wxMenu*) node->Data();
+                        gtk_menu_item_select( GTK_MENU_ITEM(firstMenu->m_owner) );
+                        ret = TRUE;
                         break;
                     }
                 }
                         break;
                     }
                 }
@@ -932,6 +933,7 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_e
             ancestor = ancestor->GetParent();
         }
     }
             ancestor = ancestor->GetParent();
         }
     }
+*/
 #endif
 
 /*
 #endif
 
 /*
@@ -1059,13 +1061,6 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton
         }
     }
 
         }
     }
 
-/*
-    wxPrintf( wxT("2) OnButtonPress from ") );
-    if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
-        wxPrintf( win->GetClassInfo()->GetClassName() );
-    wxPrintf( wxT(".\n") );
-*/
-
     wxEventType event_type = wxEVT_LEFT_DOWN;
 
     if (gdk_event->button == 1)
     wxEventType event_type = wxEVT_LEFT_DOWN;
 
     if (gdk_event->button == 1)
@@ -1114,16 +1109,27 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton
 
     if (!g_captureWindow)
     {
 
     if (!g_captureWindow)
     {
+        int x = event.m_x;
+        int y = event.m_y;
+        if (win->m_wxwindow)
+        {
+            GtkMyFixed *myfixed = GTK_MYFIXED(win->m_wxwindow);
+           x += myfixed->xoffset;
+           y += myfixed->yoffset;
+        }
+
         wxNode *node = win->GetChildren().First();
         while (node)
         {
             wxWindow *child = (wxWindow*)node->Data();
         wxNode *node = win->GetChildren().First();
         while (node)
         {
             wxWindow *child = (wxWindow*)node->Data();
+           
+            node = node->Next();
+           if (!child->IsShown())
+               continue;
 
             if (child->m_isStaticBox)
             {
                 // wxStaticBox is transparent in the box itself
 
             if (child->m_isStaticBox)
             {
                 // wxStaticBox is transparent in the box itself
-                int x = event.m_x;
-                int y = event.m_y;
                 int xx1 = child->m_x;
                 int yy1 = child->m_y;
                 int xx2 = child->m_x + child->m_width;
                 int xx1 = child->m_x;
                 int yy1 = child->m_y;
                 int xx2 = child->m_x + child->m_width;
@@ -1148,10 +1154,10 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton
             else
             {
                 if ((child->m_wxwindow == (GtkWidget*) NULL) &&
             else
             {
                 if ((child->m_wxwindow == (GtkWidget*) NULL) &&
-                    (child->m_x <= event.m_x) &&
-                    (child->m_y <= event.m_y) &&
-                    (child->m_x+child->m_width  >= event.m_x) &&
-                    (child->m_y+child->m_height >= event.m_y))
+                    (child->m_x <= x) &&
+                    (child->m_y <= y) &&
+                    (child->m_x+child->m_width  >= x) &&
+                    (child->m_y+child->m_height >= y))
                 {
                     win = child;
                     event.m_x -= child->m_x;
                 {
                     win = child;
                     event.m_x -= child->m_x;
@@ -1159,7 +1165,6 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton
                     break;
                 }
             }
                     break;
                 }
             }
-            node = node->Next();
         }
     }
 
         }
     }
 
@@ -1167,6 +1172,13 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton
 
     gs_timeLastClick = gdk_event->time;
 
 
     gs_timeLastClick = gdk_event->time;
 
+/*
+    wxPrintf( wxT("2) OnButtonPress from ") );
+    if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
+        wxPrintf( win->GetClassInfo()->GetClassName() );
+    wxPrintf( wxT(".\n") );
+*/
+
     if (win->GetEventHandler()->ProcessEvent( event ))
     {
         gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "button_press_event" );
     if (win->GetEventHandler()->ProcessEvent( event ))
     {
         gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "button_press_event" );
@@ -1224,16 +1236,27 @@ static gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButto
 
     if (!g_captureWindow)
     {
 
     if (!g_captureWindow)
     {
+        int x = event.m_x;
+        int y = event.m_y;
+        if (win->m_wxwindow)
+        {
+            GtkMyFixed *myfixed = GTK_MYFIXED(win->m_wxwindow);
+           x += myfixed->xoffset;
+           y += myfixed->yoffset;
+        }
+
         wxNode *node = win->GetChildren().First();
         while (node)
         {
             wxWindow *child = (wxWindow*)node->Data();
 
         wxNode *node = win->GetChildren().First();
         while (node)
         {
             wxWindow *child = (wxWindow*)node->Data();
 
+            node = node->Next();
+           if (!child->IsShown())
+               continue;
+
             if (child->m_isStaticBox)
             {
                 // wxStaticBox is transparent in the box itself
             if (child->m_isStaticBox)
             {
                 // wxStaticBox is transparent in the box itself
-                int x = event.m_x;
-                int y = event.m_y;
                 int xx1 = child->m_x;
                 int yy1 = child->m_y;
                 int xx2 = child->m_x + child->m_width;
                 int xx1 = child->m_x;
                 int yy1 = child->m_y;
                 int xx2 = child->m_x + child->m_width;
@@ -1258,10 +1281,10 @@ static gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButto
             else
             {
                 if ((child->m_wxwindow == (GtkWidget*) NULL) &&
             else
             {
                 if ((child->m_wxwindow == (GtkWidget*) NULL) &&
-                    (child->m_x <= event.m_x) &&
-                    (child->m_y <= event.m_y) &&
-                    (child->m_x+child->m_width  >= event.m_x) &&
-                    (child->m_y+child->m_height >= event.m_y))
+                    (child->m_x <= x) &&
+                    (child->m_y <= y) &&
+                    (child->m_x+child->m_width  >= x) &&
+                    (child->m_y+child->m_height >= y))
                 {
                     win = child;
                     event.m_x -= child->m_x;
                 {
                     win = child;
                     event.m_x -= child->m_x;
@@ -1269,7 +1292,6 @@ static gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButto
                     break;
                 }
             }
                     break;
                 }
             }
-            node = node->Next();
         }
     }
 
         }
     }
 
@@ -1334,16 +1356,27 @@ static gint gtk_window_motion_notify_callback( GtkWidget *widget, GdkEventMotion
 
     if (!g_captureWindow)
     {
 
     if (!g_captureWindow)
     {
+        int x = event.m_x;
+        int y = event.m_y;
+        if (win->m_wxwindow)
+        {
+            GtkMyFixed *myfixed = GTK_MYFIXED(win->m_wxwindow);
+           x += myfixed->xoffset;
+           y += myfixed->yoffset;
+        }
+
         wxNode *node = win->GetChildren().First();
         while (node)
         {
             wxWindow *child = (wxWindow*)node->Data();
 
         wxNode *node = win->GetChildren().First();
         while (node)
         {
             wxWindow *child = (wxWindow*)node->Data();
 
+            node = node->Next();
+           if (!child->IsShown())
+               continue;
+
             if (child->m_isStaticBox)
             {
                 // wxStaticBox is transparent in the box itself
             if (child->m_isStaticBox)
             {
                 // wxStaticBox is transparent in the box itself
-                int x = event.m_x;
-                int y = event.m_y;
                 int xx1 = child->m_x;
                 int yy1 = child->m_y;
                 int xx2 = child->m_x + child->m_width;
                 int xx1 = child->m_x;
                 int yy1 = child->m_y;
                 int xx2 = child->m_x + child->m_width;
@@ -1368,10 +1401,10 @@ static gint gtk_window_motion_notify_callback( GtkWidget *widget, GdkEventMotion
             else
             {
                 if ((child->m_wxwindow == (GtkWidget*) NULL) &&
             else
             {
                 if ((child->m_wxwindow == (GtkWidget*) NULL) &&
-                    (child->m_x <= event.m_x) &&
-                    (child->m_y <= event.m_y) &&
-                    (child->m_x+child->m_width  >= event.m_x) &&
-                    (child->m_y+child->m_height >= event.m_y))
+                    (child->m_x <= x) &&
+                    (child->m_y <= y) &&
+                    (child->m_x+child->m_width  >= x) &&
+                    (child->m_y+child->m_height >= y))
                 {
                     win = child;
                     event.m_x -= child->m_x;
                 {
                     win = child;
                     event.m_x -= child->m_x;
@@ -1379,7 +1412,6 @@ static gint gtk_window_motion_notify_callback( GtkWidget *widget, GdkEventMotion
                     break;
                 }
             }
                     break;
                 }
             }
-            node = node->Next();
         }
     }
 
         }
     }
 
@@ -2255,7 +2287,7 @@ void wxWindow::OnInternalIdle()
 
     if (cursor.Ok())
     {
 
     if (cursor.Ok())
     {
-        /* I now set the cursor the anew in every OnInternalIdle call
+        /* I now set the cursor anew in every OnInternalIdle call
           as setting the cursor in a parent window also effects the
           windows above so that checking for the current cursor is
           not possible. */
           as setting the cursor in a parent window also effects the
           windows above so that checking for the current cursor is
           not possible. */
@@ -2640,7 +2672,7 @@ bool wxWindow::Reparent( wxWindowBase *newParentBase )
 
     if (oldParent)
     {
 
     if (oldParent)
     {
-        gtk_container_remove( GTK_CONTAINER(oldParent->m_wxwindow), m_widget );
+        gtk_container_remove( GTK_CONTAINER(m_widget->parent), m_widget );
     }
 
     wxASSERT( GTK_IS_WIDGET(m_widget) );
     }
 
     wxASSERT( GTK_IS_WIDGET(m_widget) );