Fixed problem with mouse events getting sent to wrong
children when these were scrolled. wxCheckBox and wxRadioButton now have cursors and will do other things more sanely. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4085 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -67,6 +67,8 @@ public:
|
||||
|
||||
// implementation
|
||||
void ApplyWidgetStyle();
|
||||
bool IsOwnGtkWindow( GdkWindow *window );
|
||||
void OnInternalIdle();
|
||||
|
||||
GtkWidget *m_widgetCheckbox;
|
||||
GtkWidget *m_widgetLabel;
|
||||
|
@@ -41,8 +41,6 @@ extern const char* wxRadioButtonNameStr;
|
||||
|
||||
class wxRadioButton: public wxControl
|
||||
{
|
||||
DECLARE_DYNAMIC_CLASS(wxRadioButton)
|
||||
|
||||
public:
|
||||
inline wxRadioButton() {}
|
||||
inline wxRadioButton( wxWindow *parent, wxWindowID id,
|
||||
@@ -69,6 +67,11 @@ public:
|
||||
|
||||
GSList *m_radioButtonGroup;
|
||||
void ApplyWidgetStyle();
|
||||
bool IsOwnGtkWindow( GdkWindow *window );
|
||||
void OnInternalIdle();
|
||||
|
||||
private:
|
||||
DECLARE_DYNAMIC_CLASS(wxRadioButton)
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@@ -67,6 +67,8 @@ public:
|
||||
|
||||
// implementation
|
||||
void ApplyWidgetStyle();
|
||||
bool IsOwnGtkWindow( GdkWindow *window );
|
||||
void OnInternalIdle();
|
||||
|
||||
GtkWidget *m_widgetCheckbox;
|
||||
GtkWidget *m_widgetLabel;
|
||||
|
@@ -41,8 +41,6 @@ extern const char* wxRadioButtonNameStr;
|
||||
|
||||
class wxRadioButton: public wxControl
|
||||
{
|
||||
DECLARE_DYNAMIC_CLASS(wxRadioButton)
|
||||
|
||||
public:
|
||||
inline wxRadioButton() {}
|
||||
inline wxRadioButton( wxWindow *parent, wxWindowID id,
|
||||
@@ -69,6 +67,11 @@ public:
|
||||
|
||||
GSList *m_radioButtonGroup;
|
||||
void ApplyWidgetStyle();
|
||||
bool IsOwnGtkWindow( GdkWindow *window );
|
||||
void OnInternalIdle();
|
||||
|
||||
private:
|
||||
DECLARE_DYNAMIC_CLASS(wxRadioButton)
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@@ -126,7 +126,7 @@ CheckListBoxFrame::CheckListBoxFrame(wxFrame *frame,
|
||||
SetMenuBar(menu_bar);
|
||||
|
||||
// make a panel with some controls
|
||||
wxPanel *panel = new wxScrolledWindow(this, -1, wxPoint(0, 0),
|
||||
wxPanel *panel = new wxPanel(this, -1, wxPoint(0, 0),
|
||||
wxSize(400, 200), wxTAB_TRAVERSAL);
|
||||
|
||||
// check list box
|
||||
|
@@ -21,7 +21,9 @@
|
||||
#endif
|
||||
|
||||
#ifndef WX_PRECOMP
|
||||
#include "wx/wx.h"
|
||||
#include "wx/window.h"
|
||||
#include "wx/dialog.h"
|
||||
#include "wx/frame.h"
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
|
@@ -31,6 +31,7 @@ extern bool g_isIdle;
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
extern bool g_blockEventsOnDrag;
|
||||
extern wxCursor g_globalCursor;
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// "clicked"
|
||||
@@ -186,4 +187,27 @@ void wxCheckBox::ApplyWidgetStyle()
|
||||
gtk_widget_set_style( m_widgetLabel, m_widgetStyle );
|
||||
}
|
||||
|
||||
bool wxCheckBox::IsOwnGtkWindow( GdkWindow *window )
|
||||
{
|
||||
return (window == GTK_TOGGLE_BUTTON(m_widget)->event_window);
|
||||
}
|
||||
|
||||
void wxCheckBox::OnInternalIdle()
|
||||
{
|
||||
wxCursor cursor = m_cursor;
|
||||
if (g_globalCursor.Ok()) cursor = g_globalCursor;
|
||||
|
||||
if (GTK_TOGGLE_BUTTON(m_widget)->event_window && cursor.Ok())
|
||||
{
|
||||
/* I now set the cursor the 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. */
|
||||
|
||||
gdk_window_set_cursor( GTK_TOGGLE_BUTTON(m_widget)->event_window, cursor.GetCursor() );
|
||||
}
|
||||
|
||||
UpdateWindowUI();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@@ -31,6 +31,7 @@ extern bool g_isIdle;
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
extern bool g_blockEventsOnDrag;
|
||||
extern wxCursor g_globalCursor;
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// "clicked"
|
||||
@@ -186,4 +187,27 @@ void wxRadioButton::ApplyWidgetStyle()
|
||||
gtk_widget_set_style( GTK_BUTTON(m_widget)->child, m_widgetStyle );
|
||||
}
|
||||
|
||||
bool wxRadioButton::IsOwnGtkWindow( GdkWindow *window )
|
||||
{
|
||||
return (window == GTK_TOGGLE_BUTTON(m_widget)->event_window);
|
||||
}
|
||||
|
||||
void wxRadioButton::OnInternalIdle()
|
||||
{
|
||||
wxCursor cursor = m_cursor;
|
||||
if (g_globalCursor.Ok()) cursor = g_globalCursor;
|
||||
|
||||
if (GTK_TOGGLE_BUTTON(m_widget)->event_window && cursor.Ok())
|
||||
{
|
||||
/* I now set the cursor the 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. */
|
||||
|
||||
gdk_window_set_cursor( GTK_TOGGLE_BUTTON(m_widget)->event_window, cursor.GetCursor() );
|
||||
}
|
||||
|
||||
UpdateWindowUI();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@@ -1061,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)
|
||||
@@ -1116,6 +1109,15 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton
|
||||
|
||||
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)
|
||||
{
|
||||
@@ -1124,8 +1126,6 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton
|
||||
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;
|
||||
@@ -1150,10 +1150,10 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton
|
||||
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;
|
||||
@@ -1169,6 +1169,13 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton
|
||||
|
||||
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" );
|
||||
@@ -1226,6 +1233,15 @@ static gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButto
|
||||
|
||||
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)
|
||||
{
|
||||
@@ -1234,8 +1250,6 @@ static gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButto
|
||||
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;
|
||||
@@ -1260,10 +1274,10 @@ static gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButto
|
||||
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;
|
||||
@@ -1336,6 +1350,15 @@ static gint gtk_window_motion_notify_callback( GtkWidget *widget, GdkEventMotion
|
||||
|
||||
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)
|
||||
{
|
||||
@@ -1344,8 +1367,6 @@ static gint gtk_window_motion_notify_callback( GtkWidget *widget, GdkEventMotion
|
||||
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;
|
||||
@@ -1370,10 +1391,10 @@ static gint gtk_window_motion_notify_callback( GtkWidget *widget, GdkEventMotion
|
||||
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;
|
||||
|
@@ -31,6 +31,7 @@ extern bool g_isIdle;
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
extern bool g_blockEventsOnDrag;
|
||||
extern wxCursor g_globalCursor;
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// "clicked"
|
||||
@@ -186,4 +187,27 @@ void wxCheckBox::ApplyWidgetStyle()
|
||||
gtk_widget_set_style( m_widgetLabel, m_widgetStyle );
|
||||
}
|
||||
|
||||
bool wxCheckBox::IsOwnGtkWindow( GdkWindow *window )
|
||||
{
|
||||
return (window == GTK_TOGGLE_BUTTON(m_widget)->event_window);
|
||||
}
|
||||
|
||||
void wxCheckBox::OnInternalIdle()
|
||||
{
|
||||
wxCursor cursor = m_cursor;
|
||||
if (g_globalCursor.Ok()) cursor = g_globalCursor;
|
||||
|
||||
if (GTK_TOGGLE_BUTTON(m_widget)->event_window && cursor.Ok())
|
||||
{
|
||||
/* I now set the cursor the 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. */
|
||||
|
||||
gdk_window_set_cursor( GTK_TOGGLE_BUTTON(m_widget)->event_window, cursor.GetCursor() );
|
||||
}
|
||||
|
||||
UpdateWindowUI();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@@ -31,6 +31,7 @@ extern bool g_isIdle;
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
extern bool g_blockEventsOnDrag;
|
||||
extern wxCursor g_globalCursor;
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// "clicked"
|
||||
@@ -186,4 +187,27 @@ void wxRadioButton::ApplyWidgetStyle()
|
||||
gtk_widget_set_style( GTK_BUTTON(m_widget)->child, m_widgetStyle );
|
||||
}
|
||||
|
||||
bool wxRadioButton::IsOwnGtkWindow( GdkWindow *window )
|
||||
{
|
||||
return (window == GTK_TOGGLE_BUTTON(m_widget)->event_window);
|
||||
}
|
||||
|
||||
void wxRadioButton::OnInternalIdle()
|
||||
{
|
||||
wxCursor cursor = m_cursor;
|
||||
if (g_globalCursor.Ok()) cursor = g_globalCursor;
|
||||
|
||||
if (GTK_TOGGLE_BUTTON(m_widget)->event_window && cursor.Ok())
|
||||
{
|
||||
/* I now set the cursor the 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. */
|
||||
|
||||
gdk_window_set_cursor( GTK_TOGGLE_BUTTON(m_widget)->event_window, cursor.GetCursor() );
|
||||
}
|
||||
|
||||
UpdateWindowUI();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@@ -1061,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)
|
||||
@@ -1116,6 +1109,15 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton
|
||||
|
||||
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)
|
||||
{
|
||||
@@ -1124,8 +1126,6 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton
|
||||
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;
|
||||
@@ -1150,10 +1150,10 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton
|
||||
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;
|
||||
@@ -1169,6 +1169,13 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton
|
||||
|
||||
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" );
|
||||
@@ -1226,6 +1233,15 @@ static gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButto
|
||||
|
||||
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)
|
||||
{
|
||||
@@ -1234,8 +1250,6 @@ static gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButto
|
||||
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;
|
||||
@@ -1260,10 +1274,10 @@ static gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButto
|
||||
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;
|
||||
@@ -1336,6 +1350,15 @@ static gint gtk_window_motion_notify_callback( GtkWidget *widget, GdkEventMotion
|
||||
|
||||
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)
|
||||
{
|
||||
@@ -1344,8 +1367,6 @@ static gint gtk_window_motion_notify_callback( GtkWidget *widget, GdkEventMotion
|
||||
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;
|
||||
@@ -1370,10 +1391,10 @@ static gint gtk_window_motion_notify_callback( GtkWidget *widget, GdkEventMotion
|
||||
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;
|
||||
|
Reference in New Issue
Block a user