#include "wx/settings.h"
#include "wx/msgdlg.h"
#include "wx/textctrl.h"
+ #include "wx/toolbar.h"
+ #include "wx/combobox.h"
+ #include "wx/layout.h"
+ #include "wx/statusbr.h"
+ #include "wx/math.h"
#endif
-#include "wx/layout.h"
#include "wx/module.h"
-#include "wx/combobox.h"
-
-#if wxUSE_TOOLBAR_NATIVE
- #include "wx/toolbar.h"
-#endif
#if wxUSE_DRAG_AND_DROP
#include "wx/dnd.h"
#include "wx/caret.h"
#endif // wxUSE_CARET
-#include "wx/statusbr.h"
#include "wx/fontutil.h"
#ifdef __WXDEBUG__
#include "wx/thread.h"
#endif
-#include "wx/math.h"
#include <ctype.h>
// FIXME: Due to a hack we use GtkCombo in here, which is deprecated since gtk2.3.0
// "key_press_event" from any window
//-----------------------------------------------------------------------------
+// These are used when transforming Ctrl-alpha to ascii values 1-26
+inline bool wxIsLowerChar(int code)
+{
+ return (code >= 'a' && code <= 'z' );
+}
+
+inline bool wxIsUpperChar(int code)
+{
+ return (code >= 'A' && code <= 'Z' );
+}
+
+
// set WXTRACE to this to see the key event codes on the console
#define TRACE_KEYS _T("keyevent")
// To conform to the docs we need to translate Ctrl-alpha
// characters to values in the range 1-26.
- if (event.ControlDown() && key_code >= 'a' && key_code <= 'z' )
+ if ( event.ControlDown() &&
+ ( wxIsLowerChar(key_code) || wxIsUpperChar(key_code) ))
{
- event.m_keyCode = key_code - 'a' + 1;
+ if ( wxIsLowerChar(key_code) )
+ event.m_keyCode = key_code - 'a' + 1;
+ if ( wxIsUpperChar(key_code) )
+ event.m_keyCode = key_code - 'A' + 1;
#if wxUSE_UNICODE
event.m_uniChar = event.m_keyCode;
#endif
// To conform to the docs we need to translate Ctrl-alpha
// characters to values in the range 1-26.
- if (event.ControlDown() && *pstr >= 'a' && *pstr <= 'z' )
+ if ( event.ControlDown() &&
+ ( wxIsLowerChar(*pstr) || wxIsUpperChar(*pstr) ))
{
+ if ( wxIsLowerChar(*pstr) )
+ event.m_keyCode = *pstr - 'a' + 1;
+ if ( wxIsUpperChar(*pstr) )
+ event.m_keyCode = *pstr - 'A' + 1;
+
event.m_keyCode = *pstr - 'a' + 1;
#if wxUSE_UNICODE
event.m_uniChar = event.m_keyCode;
}
}
+//-----------------------------------------------------------------------------
+// "event_after" from scrollbar
+//-----------------------------------------------------------------------------
+
+extern "C" {
+static void
+gtk_scrollbar_event_after(GtkRange* range, GdkEvent* event, wxWindow* win)
+{
+ if (event->type == GDK_BUTTON_RELEASE)
+ {
+ g_signal_handlers_block_by_func(range, (void*)gtk_scrollbar_event_after, win);
+
+ const int orient = range == win->m_scrollBar[0] ? wxHORIZONTAL : wxVERTICAL;
+ wxScrollWinEvent event(wxEVT_SCROLLWIN_THUMBRELEASE, win->GetScrollPos(orient), orient);
+ event.SetEventObject(win);
+ win->GetEventHandler()->ProcessEvent(event);
+ }
+}
+}
+
//-----------------------------------------------------------------------------
// "button_release_event" from scrollbar
//-----------------------------------------------------------------------------
if (win->m_isScrolling)
{
win->m_isScrolling = false;
- const int orient = range == win->m_scrollBar[0] ? wxHORIZONTAL : wxVERTICAL;
- wxScrollWinEvent event(wxEVT_SCROLLWIN_THUMBRELEASE, win->GetScrollPos(orient), orient);
- event.SetEventObject(win);
+ // Hook up handler to send thumb release event after this emission is finished.
// To allow setting scroll position from event handler, sending event must
// be deferred until after the GtkRange handler for this signal has run
- win->GetEventHandler()->AddPendingEvent(event);
+ g_signal_handlers_unblock_by_func(range, (void*)gtk_scrollbar_event_after, win);
}
return false;
G_CALLBACK(gtk_scrollbar_button_release_event), this);
g_signal_connect(m_scrollBar[1], "button_release_event",
G_CALLBACK(gtk_scrollbar_button_release_event), this);
+ gulong handler_id;
+ handler_id = g_signal_connect(
+ m_scrollBar[0], "event_after", G_CALLBACK(gtk_scrollbar_event_after), this);
+ g_signal_handler_block(m_scrollBar[0], handler_id);
+ handler_id = g_signal_connect(
+ m_scrollBar[1], "event_after", G_CALLBACK(gtk_scrollbar_event_after), this);
+ g_signal_handler_block(m_scrollBar[1], handler_id);
// these handlers get notified when scrollbar slider moves
if ( m_foregroundColour.Ok() )
{
- GdkColor *fg = m_foregroundColour.GetColor();
+ const GdkColor *fg = m_foregroundColour.GetColor();
style->fg[GTK_STATE_NORMAL] = *fg;
style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG;
if ( m_backgroundColour.Ok() )
{
- GdkColor *bg = m_backgroundColour.GetColor();
+ const GdkColor *bg = m_backgroundColour.GetColor();
style->bg[GTK_STATE_NORMAL] = *bg;
style->base[GTK_STATE_NORMAL] = *bg;