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
This commit is contained in:
Vadim Zeitlin
2002-05-31 14:13:17 +00:00
parent 3ae4c570c4
commit d1f2ac459a
8 changed files with 170 additions and 400 deletions

View File

@@ -42,7 +42,9 @@ public:
// implementation // implementation
void ApplyWidgetStyle(); virtual void ApplyWidgetStyle();
virtual bool IsTransparentForMouse() const { return TRUE; }
private: private:
DECLARE_DYNAMIC_CLASS(wxStaticBox) DECLARE_DYNAMIC_CLASS(wxStaticBox)

View File

@@ -177,6 +177,9 @@ public:
wxCoord& WXUNUSED(x), wxCoord& WXUNUSED(x),
wxCoord& WXUNUSED(y)) { } 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 // position and size of the window
int m_x, m_y; int m_x, m_y;
int m_width, m_height; int m_width, m_height;
@@ -211,7 +214,6 @@ public:
bool m_hasVMT:1; bool m_hasVMT:1;
bool m_sizeSet:1; bool m_sizeSet:1;
bool m_resizing: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_isRadioButton:1; // faster than IS_KIND_OF
bool m_isListBox:1; // faster than IS_KIND_OF bool m_isListBox:1; // faster than IS_KIND_OF
bool m_isFrame:1; // faster than IS_KIND_OF bool m_isFrame:1; // faster than IS_KIND_OF

View File

@@ -42,7 +42,9 @@ public:
// implementation // implementation
void ApplyWidgetStyle(); virtual void ApplyWidgetStyle();
virtual bool IsTransparentForMouse() const { return TRUE; }
private: private:
DECLARE_DYNAMIC_CLASS(wxStaticBox) DECLARE_DYNAMIC_CLASS(wxStaticBox)

View File

@@ -177,6 +177,9 @@ public:
wxCoord& WXUNUSED(x), wxCoord& WXUNUSED(x),
wxCoord& WXUNUSED(y)) { } 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 // position and size of the window
int m_x, m_y; int m_x, m_y;
int m_width, m_height; int m_width, m_height;
@@ -211,7 +214,6 @@ public:
bool m_hasVMT:1; bool m_hasVMT:1;
bool m_sizeSet:1; bool m_sizeSet:1;
bool m_resizing: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_isRadioButton:1; // faster than IS_KIND_OF
bool m_isListBox:1; // faster than IS_KIND_OF bool m_isListBox:1; // faster than IS_KIND_OF
bool m_isFrame:1; // faster than IS_KIND_OF bool m_isFrame:1; // faster than IS_KIND_OF

View File

@@ -58,12 +58,7 @@ bool wxStaticBox::Create( wxWindow *parent,
return FALSE; return FALSE;
} }
m_isStaticBox = TRUE; m_widget = gtk_frame_new(m_label.empty() ? (char *)NULL : m_label.mbc_str());
if (label.empty())
m_widget = gtk_frame_new( (char*) NULL );
else
m_widget = gtk_frame_new( m_label.mbc_str() );
m_parent->DoAddChild( this ); m_parent->DoAddChild( this );

View File

@@ -1233,6 +1233,10 @@ static gint gtk_window_key_release_callback( GtkWidget *widget,
// the mouse events // the mouse events
// ============================================================================ // ============================================================================
// ----------------------------------------------------------------------------
// mouse event processing helpers
// ----------------------------------------------------------------------------
// init wxMouseEvent with the info from gdk_event // init wxMouseEvent with the info from gdk_event
#define InitMouseEvent(win, event, 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; \ event.m_y = (wxCoord)gdk_event->y - pt.y; \
} }
// ----------------------------------------------------------------------------
// mouse event processing helper
// ----------------------------------------------------------------------------
static void AdjustEventButtonState(wxMouseEvent& event) static void AdjustEventButtonState(wxMouseEvent& event)
{ {
// GDK reports the old state of the button for a button press event, but // 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" // "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 DEBUG_MAIN_THREAD
@@ -1365,69 +1430,11 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton
// a chance to correct this // a chance to correct this
win->FixUpMouseEvent(widget, event.m_x, event.m_y); win->FixUpMouseEvent(widget, event.m_x, event.m_y);
// Some control don't have their own X window and thus cannot get // find the correct window to send the event too: it may be a different one
// any events. // 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) if ( !g_captureWindow )
{ win = FindWindowForMouseEvent(win, event.m_x, event.m_y);
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;
}
}
}
}
event.SetEventObject( win ); event.SetEventObject( win );
@@ -1491,69 +1498,8 @@ static gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButto
// same wxListBox hack as above // same wxListBox hack as above
win->FixUpMouseEvent(widget, event.m_x, event.m_y); win->FixUpMouseEvent(widget, event.m_x, event.m_y);
// Some control don't have their own X window and thus cannot get if ( !g_captureWindow )
// any events. win = FindWindowForMouseEvent(win, event.m_x, event.m_y);
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;
}
}
}
}
event.SetEventObject( win ); event.SetEventObject( win );
@@ -1624,66 +1570,7 @@ static gint gtk_window_motion_notify_callback( GtkWidget *widget,
} }
else // no capture else // no capture
{ {
// Some control don't have their own X window and thus cannot get win = FindWindowForMouseEvent(win, event.m_x, event.m_y);
// 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;
}
}
}
} }
event.SetEventObject( win ); event.SetEventObject( win );
@@ -2376,7 +2263,6 @@ void wxWindowGTK::Init()
m_insertCallback = (wxInsertChildFunction) NULL; m_insertCallback = (wxInsertChildFunction) NULL;
m_isStaticBox = FALSE;
m_isRadioButton = FALSE; m_isRadioButton = FALSE;
m_isFrame = FALSE; m_isFrame = FALSE;
m_acceptsFocus = FALSE; m_acceptsFocus = FALSE;

View File

@@ -58,12 +58,7 @@ bool wxStaticBox::Create( wxWindow *parent,
return FALSE; return FALSE;
} }
m_isStaticBox = TRUE; m_widget = gtk_frame_new(m_label.empty() ? (char *)NULL : m_label.mbc_str());
if (label.empty())
m_widget = gtk_frame_new( (char*) NULL );
else
m_widget = gtk_frame_new( m_label.mbc_str() );
m_parent->DoAddChild( this ); m_parent->DoAddChild( this );

View File

@@ -1233,6 +1233,10 @@ static gint gtk_window_key_release_callback( GtkWidget *widget,
// the mouse events // the mouse events
// ============================================================================ // ============================================================================
// ----------------------------------------------------------------------------
// mouse event processing helpers
// ----------------------------------------------------------------------------
// init wxMouseEvent with the info from gdk_event // init wxMouseEvent with the info from gdk_event
#define InitMouseEvent(win, event, 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; \ event.m_y = (wxCoord)gdk_event->y - pt.y; \
} }
// ----------------------------------------------------------------------------
// mouse event processing helper
// ----------------------------------------------------------------------------
static void AdjustEventButtonState(wxMouseEvent& event) static void AdjustEventButtonState(wxMouseEvent& event)
{ {
// GDK reports the old state of the button for a button press event, but // 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" // "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 DEBUG_MAIN_THREAD
@@ -1365,69 +1430,11 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton
// a chance to correct this // a chance to correct this
win->FixUpMouseEvent(widget, event.m_x, event.m_y); win->FixUpMouseEvent(widget, event.m_x, event.m_y);
// Some control don't have their own X window and thus cannot get // find the correct window to send the event too: it may be a different one
// any events. // 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) if ( !g_captureWindow )
{ win = FindWindowForMouseEvent(win, event.m_x, event.m_y);
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;
}
}
}
}
event.SetEventObject( win ); event.SetEventObject( win );
@@ -1491,69 +1498,8 @@ static gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButto
// same wxListBox hack as above // same wxListBox hack as above
win->FixUpMouseEvent(widget, event.m_x, event.m_y); win->FixUpMouseEvent(widget, event.m_x, event.m_y);
// Some control don't have their own X window and thus cannot get if ( !g_captureWindow )
// any events. win = FindWindowForMouseEvent(win, event.m_x, event.m_y);
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;
}
}
}
}
event.SetEventObject( win ); event.SetEventObject( win );
@@ -1624,66 +1570,7 @@ static gint gtk_window_motion_notify_callback( GtkWidget *widget,
} }
else // no capture else // no capture
{ {
// Some control don't have their own X window and thus cannot get win = FindWindowForMouseEvent(win, event.m_x, event.m_y);
// 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;
}
}
}
} }
event.SetEventObject( win ); event.SetEventObject( win );
@@ -2376,7 +2263,6 @@ void wxWindowGTK::Init()
m_insertCallback = (wxInsertChildFunction) NULL; m_insertCallback = (wxInsertChildFunction) NULL;
m_isStaticBox = FALSE;
m_isRadioButton = FALSE; m_isRadioButton = FALSE;
m_isFrame = FALSE; m_isFrame = FALSE;
m_acceptsFocus = FALSE; m_acceptsFocus = FALSE;