]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/window.cpp
Committing in .
[wxWidgets.git] / src / gtk / window.cpp
index 82eec9cf6275bf6f2f7acaa6d938ad589e0a855b..e9ba04cdfeb1b9972f1413ab5992556a669f5102 100644 (file)
     #include "wx/dialog.h"
     #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
 
-#if wxUSE_TEXTCTRL
-    #include "wx/textctrl.h"
-#endif
-
-#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
@@ -537,6 +531,18 @@ gtk_window_expose_callback( GtkWidget *widget,
 // "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")
 
@@ -1088,9 +1094,13 @@ gtk_window_key_press_callback( GtkWidget *widget,
 
             // 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
@@ -1229,8 +1239,14 @@ gtk_wxwindow_commit_cb (GtkIMContext *context,
 
         // 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;
@@ -2137,6 +2153,26 @@ gtk_scrollbar_button_press_event(GtkRange*, GdkEventButton*, wxWindow* win)
 }
 }
 
+//-----------------------------------------------------------------------------
+// "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
 //-----------------------------------------------------------------------------
@@ -2153,12 +2189,10 @@ gtk_scrollbar_button_release_event(GtkRange* range, GdkEventButton*, wxWindow* w
     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;
@@ -2575,6 +2609,13 @@ bool wxWindowGTK::Create( wxWindow *parent,
                      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
 
@@ -3856,7 +3897,7 @@ GtkRcStyle *wxWindowGTK::CreateWidgetStyle(bool forceStyle)
 
     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;
@@ -3870,7 +3911,7 @@ GtkRcStyle *wxWindowGTK::CreateWidgetStyle(bool forceStyle)
 
     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;