From d1f2ac459a122eec2fa2317765b5c30909fca750 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Fri, 31 May 2002 14:13:17 +0000 Subject: [PATCH] replaced wxWindowGTK::m_isStaticBox with a virtual function and replaced 3 occurences of the code finding the window for the mouse events with one git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@15716 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/gtk/statbox.h | 4 +- include/wx/gtk/window.h | 4 +- include/wx/gtk1/statbox.h | 4 +- include/wx/gtk1/window.h | 4 +- src/gtk/statbox.cpp | 7 +- src/gtk/window.cpp | 270 +++++++++++--------------------------- src/gtk1/statbox.cpp | 7 +- src/gtk1/window.cpp | 270 +++++++++++--------------------------- 8 files changed, 170 insertions(+), 400 deletions(-) diff --git a/include/wx/gtk/statbox.h b/include/wx/gtk/statbox.h index abda2db802..8b9c296f70 100644 --- a/include/wx/gtk/statbox.h +++ b/include/wx/gtk/statbox.h @@ -42,7 +42,9 @@ public: // implementation - void ApplyWidgetStyle(); + virtual void ApplyWidgetStyle(); + + virtual bool IsTransparentForMouse() const { return TRUE; } private: DECLARE_DYNAMIC_CLASS(wxStaticBox) diff --git a/include/wx/gtk/window.h b/include/wx/gtk/window.h index 723a4a8ab5..dbc427553f 100644 --- a/include/wx/gtk/window.h +++ b/include/wx/gtk/window.h @@ -177,6 +177,9 @@ public: wxCoord& WXUNUSED(x), wxCoord& WXUNUSED(y)) { } + // is this window transparent for the mouse events (as wxStaticBox is)? + virtual bool IsTransparentForMouse() const { return FALSE; } + // position and size of the window int m_x, m_y; int m_width, m_height; @@ -211,7 +214,6 @@ public: bool m_hasVMT:1; bool m_sizeSet:1; bool m_resizing:1; - bool m_isStaticBox:1; // faster than IS_KIND_OF bool m_isRadioButton:1; // faster than IS_KIND_OF bool m_isListBox:1; // faster than IS_KIND_OF bool m_isFrame:1; // faster than IS_KIND_OF diff --git a/include/wx/gtk1/statbox.h b/include/wx/gtk1/statbox.h index abda2db802..8b9c296f70 100644 --- a/include/wx/gtk1/statbox.h +++ b/include/wx/gtk1/statbox.h @@ -42,7 +42,9 @@ public: // implementation - void ApplyWidgetStyle(); + virtual void ApplyWidgetStyle(); + + virtual bool IsTransparentForMouse() const { return TRUE; } private: DECLARE_DYNAMIC_CLASS(wxStaticBox) diff --git a/include/wx/gtk1/window.h b/include/wx/gtk1/window.h index 723a4a8ab5..dbc427553f 100644 --- a/include/wx/gtk1/window.h +++ b/include/wx/gtk1/window.h @@ -177,6 +177,9 @@ public: wxCoord& WXUNUSED(x), wxCoord& WXUNUSED(y)) { } + // is this window transparent for the mouse events (as wxStaticBox is)? + virtual bool IsTransparentForMouse() const { return FALSE; } + // position and size of the window int m_x, m_y; int m_width, m_height; @@ -211,7 +214,6 @@ public: bool m_hasVMT:1; bool m_sizeSet:1; bool m_resizing:1; - bool m_isStaticBox:1; // faster than IS_KIND_OF bool m_isRadioButton:1; // faster than IS_KIND_OF bool m_isListBox:1; // faster than IS_KIND_OF bool m_isFrame:1; // faster than IS_KIND_OF diff --git a/src/gtk/statbox.cpp b/src/gtk/statbox.cpp index fdc5f6eb5e..07c354e4c4 100644 --- a/src/gtk/statbox.cpp +++ b/src/gtk/statbox.cpp @@ -58,12 +58,7 @@ bool wxStaticBox::Create( wxWindow *parent, return FALSE; } - m_isStaticBox = TRUE; - - if (label.empty()) - m_widget = gtk_frame_new( (char*) NULL ); - else - m_widget = gtk_frame_new( m_label.mbc_str() ); + m_widget = gtk_frame_new(m_label.empty() ? (char *)NULL : m_label.mbc_str()); m_parent->DoAddChild( this ); diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index 287bf987f6..a566c9ebdb 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -1233,6 +1233,10 @@ static gint gtk_window_key_release_callback( GtkWidget *widget, // the mouse events // ============================================================================ +// ---------------------------------------------------------------------------- +// mouse event processing helpers +// ---------------------------------------------------------------------------- + // init wxMouseEvent with the info from gdk_event #define InitMouseEvent(win, event, gdk_event) \ { \ @@ -1250,10 +1254,6 @@ static gint gtk_window_key_release_callback( GtkWidget *widget, event.m_y = (wxCoord)gdk_event->y - pt.y; \ } -// ---------------------------------------------------------------------------- -// mouse event processing helper -// ---------------------------------------------------------------------------- - static void AdjustEventButtonState(wxMouseEvent& event) { // GDK reports the old state of the button for a button press event, but @@ -1286,11 +1286,76 @@ static void AdjustEventButtonState(wxMouseEvent& event) } } +// find the window to send the mouse event too +static +wxWindowGTK *FindWindowForMouseEvent(wxWindowGTK *win, wxCoord& x, wxCoord& y) +{ + if (win->m_wxwindow) + { + GtkPizza *pizza = GTK_PIZZA(win->m_wxwindow); + x += pizza->xoffset; + y += pizza->yoffset; + } + + wxNode *node = win->GetChildren().First(); + while (node) + { + wxWindowGTK *child = (wxWindowGTK*)node->Data(); + + node = node->Next(); + if (!child->IsShown()) + continue; + + if (child->IsTransparentForMouse()) + { + // wxStaticBox is transparent in the box itself + int xx1 = child->m_x; + int yy1 = child->m_y; + int xx2 = child->m_x + child->m_width; + int yy2 = child->m_x + child->m_height; + + // left + if (((x >= xx1) && (x <= xx1+10) && (y >= yy1) && (y <= yy2)) || + // right + ((x >= xx2-10) && (x <= xx2) && (y >= yy1) && (y <= yy2)) || + // top + ((x >= xx1) && (x <= xx2) && (y >= yy1) && (y <= yy1+10)) || + // bottom + ((x >= xx1) && (x <= xx2) && (y >= yy2-1) && (y <= yy2))) + { + win = child; + x -= child->m_x; + y -= child->m_y; + break; + } + + } + else + { + if ((child->m_wxwindow == (GtkWidget*) NULL) && + (child->m_x <= x) && + (child->m_y <= y) && + (child->m_x+child->m_width >= x) && + (child->m_y+child->m_height >= y)) + { + win = child; + x -= child->m_x; + y -= child->m_y; + break; + } + } + } + + return win; +} + //----------------------------------------------------------------------------- // "button_press_event" //----------------------------------------------------------------------------- -static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton *gdk_event, wxWindowGTK *win ) +static gint gtk_window_button_press_callback( GtkWidget *widget, + GdkEventButton *gdk_event, + wxWindowGTK *win ) { DEBUG_MAIN_THREAD @@ -1365,69 +1430,11 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton // a chance to correct this win->FixUpMouseEvent(widget, event.m_x, event.m_y); - // Some control don't have their own X window and thus cannot get - // any events. - - if (!g_captureWindow) - { - wxCoord x = event.m_x; - wxCoord y = event.m_y; - if (win->m_wxwindow) - { - GtkPizza *pizza = GTK_PIZZA(win->m_wxwindow); - x += pizza->xoffset; - y += pizza->yoffset; - } - - wxNode *node = win->GetChildren().First(); - while (node) - { - wxWindowGTK *child = (wxWindowGTK*)node->Data(); - - node = node->Next(); - if (!child->IsShown()) - continue; - - if (child->m_isStaticBox) - { - // wxStaticBox is transparent in the box itself - int xx1 = child->m_x; - int yy1 = child->m_y; - int xx2 = child->m_x + child->m_width; - int yy2 = child->m_x + child->m_height; - - // left - if (((x >= xx1) && (x <= xx1+10) && (y >= yy1) && (y <= yy2)) || - // right - ((x >= xx2-10) && (x <= xx2) && (y >= yy1) && (y <= yy2)) || - // top - ((x >= xx1) && (x <= xx2) && (y >= yy1) && (y <= yy1+10)) || - // bottom - ((x >= xx1) && (x <= xx2) && (y >= yy2-1) && (y <= yy2))) - { - win = child; - event.m_x -= child->m_x; - event.m_y -= child->m_y; - break; - } - - } - else - { - if ((child->m_wxwindow == (GtkWidget*) NULL) && - (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; - event.m_y -= child->m_y; - break; - } - } - } - } + // find the correct window to send the event too: it may be a different one + // from the one which got it at GTK+ level because some control don't have + // their own X window and thus cannot get any events. + if ( !g_captureWindow ) + win = FindWindowForMouseEvent(win, event.m_x, event.m_y); event.SetEventObject( win ); @@ -1491,69 +1498,8 @@ static gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButto // same wxListBox hack as above win->FixUpMouseEvent(widget, event.m_x, event.m_y); - // Some control don't have their own X window and thus cannot get - // any events. - - if (!g_captureWindow) - { - wxCoord x = event.m_x; - wxCoord y = event.m_y; - if (win->m_wxwindow) - { - GtkPizza *pizza = GTK_PIZZA(win->m_wxwindow); - x += pizza->xoffset; - y += pizza->yoffset; - } - - wxNode *node = win->GetChildren().First(); - while (node) - { - wxWindowGTK *child = (wxWindowGTK*)node->Data(); - - node = node->Next(); - if (!child->IsShown()) - continue; - - if (child->m_isStaticBox) - { - // wxStaticBox is transparent in the box itself - int xx1 = child->m_x; - int yy1 = child->m_y; - int xx2 = child->m_x + child->m_width; - int yy2 = child->m_x + child->m_height; - - // left - if (((x >= xx1) && (x <= xx1+10) && (y >= yy1) && (y <= yy2)) || - // right - ((x >= xx2-10) && (x <= xx2) && (y >= yy1) && (y <= yy2)) || - // top - ((x >= xx1) && (x <= xx2) && (y >= yy1) && (y <= yy1+10)) || - // bottom - ((x >= xx1) && (x <= xx2) && (y >= yy2-1) && (y <= yy2))) - { - win = child; - event.m_x -= child->m_x; - event.m_y -= child->m_y; - break; - } - - } - else - { - if ((child->m_wxwindow == (GtkWidget*) NULL) && - (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; - event.m_y -= child->m_y; - break; - } - } - } - } + if ( !g_captureWindow ) + win = FindWindowForMouseEvent(win, event.m_x, event.m_y); event.SetEventObject( win ); @@ -1624,66 +1570,7 @@ static gint gtk_window_motion_notify_callback( GtkWidget *widget, } else // no capture { - // Some control don't have their own X window and thus cannot get - // any events. - - wxCoord x = event.m_x; - wxCoord y = event.m_y; - if (win->m_wxwindow) - { - GtkPizza *pizza = GTK_PIZZA(win->m_wxwindow); - x += pizza->xoffset; - y += pizza->yoffset; - } - - wxNode *node = win->GetChildren().First(); - while (node) - { - wxWindowGTK *child = (wxWindowGTK*)node->Data(); - - node = node->Next(); - if (!child->IsShown()) - continue; - - if (child->m_isStaticBox) - { - // wxStaticBox is transparent in the box itself - int xx1 = child->m_x; - int yy1 = child->m_y; - int xx2 = child->m_x + child->m_width; - int yy2 = child->m_x + child->m_height; - - // left - if (((x >= xx1) && (x <= xx1+10) && (y >= yy1) && (y <= yy2)) || - // right - ((x >= xx2-10) && (x <= xx2) && (y >= yy1) && (y <= yy2)) || - // top - ((x >= xx1) && (x <= xx2) && (y >= yy1) && (y <= yy1+10)) || - // bottom - ((x >= xx1) && (x <= xx2) && (y >= yy2-1) && (y <= yy2))) - { - win = child; - event.m_x -= child->m_x; - event.m_y -= child->m_y; - break; - } - - } - else - { - if ((child->m_wxwindow == (GtkWidget*) NULL) && - (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; - event.m_y -= child->m_y; - break; - } - } - } + win = FindWindowForMouseEvent(win, event.m_x, event.m_y); } event.SetEventObject( win ); @@ -2376,7 +2263,6 @@ void wxWindowGTK::Init() m_insertCallback = (wxInsertChildFunction) NULL; - m_isStaticBox = FALSE; m_isRadioButton = FALSE; m_isFrame = FALSE; m_acceptsFocus = FALSE; diff --git a/src/gtk1/statbox.cpp b/src/gtk1/statbox.cpp index fdc5f6eb5e..07c354e4c4 100644 --- a/src/gtk1/statbox.cpp +++ b/src/gtk1/statbox.cpp @@ -58,12 +58,7 @@ bool wxStaticBox::Create( wxWindow *parent, return FALSE; } - m_isStaticBox = TRUE; - - if (label.empty()) - m_widget = gtk_frame_new( (char*) NULL ); - else - m_widget = gtk_frame_new( m_label.mbc_str() ); + m_widget = gtk_frame_new(m_label.empty() ? (char *)NULL : m_label.mbc_str()); m_parent->DoAddChild( this ); diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index 287bf987f6..a566c9ebdb 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -1233,6 +1233,10 @@ static gint gtk_window_key_release_callback( GtkWidget *widget, // the mouse events // ============================================================================ +// ---------------------------------------------------------------------------- +// mouse event processing helpers +// ---------------------------------------------------------------------------- + // init wxMouseEvent with the info from gdk_event #define InitMouseEvent(win, event, gdk_event) \ { \ @@ -1250,10 +1254,6 @@ static gint gtk_window_key_release_callback( GtkWidget *widget, event.m_y = (wxCoord)gdk_event->y - pt.y; \ } -// ---------------------------------------------------------------------------- -// mouse event processing helper -// ---------------------------------------------------------------------------- - static void AdjustEventButtonState(wxMouseEvent& event) { // GDK reports the old state of the button for a button press event, but @@ -1286,11 +1286,76 @@ static void AdjustEventButtonState(wxMouseEvent& event) } } +// find the window to send the mouse event too +static +wxWindowGTK *FindWindowForMouseEvent(wxWindowGTK *win, wxCoord& x, wxCoord& y) +{ + if (win->m_wxwindow) + { + GtkPizza *pizza = GTK_PIZZA(win->m_wxwindow); + x += pizza->xoffset; + y += pizza->yoffset; + } + + wxNode *node = win->GetChildren().First(); + while (node) + { + wxWindowGTK *child = (wxWindowGTK*)node->Data(); + + node = node->Next(); + if (!child->IsShown()) + continue; + + if (child->IsTransparentForMouse()) + { + // wxStaticBox is transparent in the box itself + int xx1 = child->m_x; + int yy1 = child->m_y; + int xx2 = child->m_x + child->m_width; + int yy2 = child->m_x + child->m_height; + + // left + if (((x >= xx1) && (x <= xx1+10) && (y >= yy1) && (y <= yy2)) || + // right + ((x >= xx2-10) && (x <= xx2) && (y >= yy1) && (y <= yy2)) || + // top + ((x >= xx1) && (x <= xx2) && (y >= yy1) && (y <= yy1+10)) || + // bottom + ((x >= xx1) && (x <= xx2) && (y >= yy2-1) && (y <= yy2))) + { + win = child; + x -= child->m_x; + y -= child->m_y; + break; + } + + } + else + { + if ((child->m_wxwindow == (GtkWidget*) NULL) && + (child->m_x <= x) && + (child->m_y <= y) && + (child->m_x+child->m_width >= x) && + (child->m_y+child->m_height >= y)) + { + win = child; + x -= child->m_x; + y -= child->m_y; + break; + } + } + } + + return win; +} + //----------------------------------------------------------------------------- // "button_press_event" //----------------------------------------------------------------------------- -static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton *gdk_event, wxWindowGTK *win ) +static gint gtk_window_button_press_callback( GtkWidget *widget, + GdkEventButton *gdk_event, + wxWindowGTK *win ) { DEBUG_MAIN_THREAD @@ -1365,69 +1430,11 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton // a chance to correct this win->FixUpMouseEvent(widget, event.m_x, event.m_y); - // Some control don't have their own X window and thus cannot get - // any events. - - if (!g_captureWindow) - { - wxCoord x = event.m_x; - wxCoord y = event.m_y; - if (win->m_wxwindow) - { - GtkPizza *pizza = GTK_PIZZA(win->m_wxwindow); - x += pizza->xoffset; - y += pizza->yoffset; - } - - wxNode *node = win->GetChildren().First(); - while (node) - { - wxWindowGTK *child = (wxWindowGTK*)node->Data(); - - node = node->Next(); - if (!child->IsShown()) - continue; - - if (child->m_isStaticBox) - { - // wxStaticBox is transparent in the box itself - int xx1 = child->m_x; - int yy1 = child->m_y; - int xx2 = child->m_x + child->m_width; - int yy2 = child->m_x + child->m_height; - - // left - if (((x >= xx1) && (x <= xx1+10) && (y >= yy1) && (y <= yy2)) || - // right - ((x >= xx2-10) && (x <= xx2) && (y >= yy1) && (y <= yy2)) || - // top - ((x >= xx1) && (x <= xx2) && (y >= yy1) && (y <= yy1+10)) || - // bottom - ((x >= xx1) && (x <= xx2) && (y >= yy2-1) && (y <= yy2))) - { - win = child; - event.m_x -= child->m_x; - event.m_y -= child->m_y; - break; - } - - } - else - { - if ((child->m_wxwindow == (GtkWidget*) NULL) && - (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; - event.m_y -= child->m_y; - break; - } - } - } - } + // find the correct window to send the event too: it may be a different one + // from the one which got it at GTK+ level because some control don't have + // their own X window and thus cannot get any events. + if ( !g_captureWindow ) + win = FindWindowForMouseEvent(win, event.m_x, event.m_y); event.SetEventObject( win ); @@ -1491,69 +1498,8 @@ static gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButto // same wxListBox hack as above win->FixUpMouseEvent(widget, event.m_x, event.m_y); - // Some control don't have their own X window and thus cannot get - // any events. - - if (!g_captureWindow) - { - wxCoord x = event.m_x; - wxCoord y = event.m_y; - if (win->m_wxwindow) - { - GtkPizza *pizza = GTK_PIZZA(win->m_wxwindow); - x += pizza->xoffset; - y += pizza->yoffset; - } - - wxNode *node = win->GetChildren().First(); - while (node) - { - wxWindowGTK *child = (wxWindowGTK*)node->Data(); - - node = node->Next(); - if (!child->IsShown()) - continue; - - if (child->m_isStaticBox) - { - // wxStaticBox is transparent in the box itself - int xx1 = child->m_x; - int yy1 = child->m_y; - int xx2 = child->m_x + child->m_width; - int yy2 = child->m_x + child->m_height; - - // left - if (((x >= xx1) && (x <= xx1+10) && (y >= yy1) && (y <= yy2)) || - // right - ((x >= xx2-10) && (x <= xx2) && (y >= yy1) && (y <= yy2)) || - // top - ((x >= xx1) && (x <= xx2) && (y >= yy1) && (y <= yy1+10)) || - // bottom - ((x >= xx1) && (x <= xx2) && (y >= yy2-1) && (y <= yy2))) - { - win = child; - event.m_x -= child->m_x; - event.m_y -= child->m_y; - break; - } - - } - else - { - if ((child->m_wxwindow == (GtkWidget*) NULL) && - (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; - event.m_y -= child->m_y; - break; - } - } - } - } + if ( !g_captureWindow ) + win = FindWindowForMouseEvent(win, event.m_x, event.m_y); event.SetEventObject( win ); @@ -1624,66 +1570,7 @@ static gint gtk_window_motion_notify_callback( GtkWidget *widget, } else // no capture { - // Some control don't have their own X window and thus cannot get - // any events. - - wxCoord x = event.m_x; - wxCoord y = event.m_y; - if (win->m_wxwindow) - { - GtkPizza *pizza = GTK_PIZZA(win->m_wxwindow); - x += pizza->xoffset; - y += pizza->yoffset; - } - - wxNode *node = win->GetChildren().First(); - while (node) - { - wxWindowGTK *child = (wxWindowGTK*)node->Data(); - - node = node->Next(); - if (!child->IsShown()) - continue; - - if (child->m_isStaticBox) - { - // wxStaticBox is transparent in the box itself - int xx1 = child->m_x; - int yy1 = child->m_y; - int xx2 = child->m_x + child->m_width; - int yy2 = child->m_x + child->m_height; - - // left - if (((x >= xx1) && (x <= xx1+10) && (y >= yy1) && (y <= yy2)) || - // right - ((x >= xx2-10) && (x <= xx2) && (y >= yy1) && (y <= yy2)) || - // top - ((x >= xx1) && (x <= xx2) && (y >= yy1) && (y <= yy1+10)) || - // bottom - ((x >= xx1) && (x <= xx2) && (y >= yy2-1) && (y <= yy2))) - { - win = child; - event.m_x -= child->m_x; - event.m_y -= child->m_y; - break; - } - - } - else - { - if ((child->m_wxwindow == (GtkWidget*) NULL) && - (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; - event.m_y -= child->m_y; - break; - } - } - } + win = FindWindowForMouseEvent(win, event.m_x, event.m_y); } event.SetEventObject( win ); @@ -2376,7 +2263,6 @@ void wxWindowGTK::Init() m_insertCallback = (wxInsertChildFunction) NULL; - m_isStaticBox = FALSE; m_isRadioButton = FALSE; m_isFrame = FALSE; m_acceptsFocus = FALSE; -- 2.47.2