X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/656b9f44671d3f17ad6ea964f95a7468f7e66cdc..029a401d74c00ce86f485fafeda73520d315fb0f:/src/gtk/textentry.cpp diff --git a/src/gtk/textentry.cpp b/src/gtk/textentry.cpp index 79e690c0f5..0c15570343 100644 --- a/src/gtk/textentry.cpp +++ b/src/gtk/textentry.cpp @@ -3,7 +3,6 @@ // Purpose: wxTextEntry implementation for wxGTK // Author: Vadim Zeitlin // Created: 2007-09-24 -// RCS-ID: $Id$ // Copyright: (c) 2007 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -56,27 +55,37 @@ wx_gtk_insert_text_callback(GtkEditable *editable, const int text_max_length = entry->text_max_length; #endif - // we should only be called if we have a max len limit at all - wxCHECK_RET(text_max_length, "shouldn't be called"); + bool handled = false; - // check that we don't overflow the max length limit + // check that we don't overflow the max length limit if we have it + if ( text_max_length ) + { + const int text_length = gtk_entry_get_text_length(entry); - const int text_length = gtk_entry_get_text_length(entry); + // We can't use new_text_length as it is in bytes while we want to count + // characters (in first approximation, anyhow...). + if ( text_length + g_utf8_strlen(new_text, -1) > text_max_length ) + { + // Prevent the new text from being inserted. + handled = true; - // We can't use new_text_length as it is in bytes while we want to count - // characters (in first approximation, anyhow...). - if ( text_length + g_utf8_strlen(new_text, -1) > text_max_length ) - { - // Prevent the new text from being inserted. - g_signal_stop_emission_by_name (editable, "insert_text"); + // Currently we don't insert anything at all, but it would be better to + // insert as many characters as would fit into the text control and + // only discard the rest. - // Currently we don't insert anything at all, but it would be better to - // insert as many characters as would fit into the text control and - // only discard the rest. + // Notify the user code about overflow. + text->SendMaxLenEvent(); + } + } - // Notify the user code about overflow. - text->SendMaxLenEvent(); + if ( !handled && text->GTKEntryOnInsertText(new_text) ) + { + // If we already handled the new text insertion, don't do it again. + handled = true; } + + if ( handled ) + g_signal_stop_emission_by_name (editable, "insert_text"); } //----------------------------------------------------------------------------- @@ -107,21 +116,21 @@ static void wx_gtk_copy_clipboard_callback( GtkWidget *widget, wxWindow *win ) { DoHandleClipboardCallback( - widget, win, wxEVT_COMMAND_TEXT_COPY, "copy-clipboard" ); + widget, win, wxEVT_TEXT_COPY, "copy-clipboard" ); } static void wx_gtk_cut_clipboard_callback( GtkWidget *widget, wxWindow *win ) { DoHandleClipboardCallback( - widget, win, wxEVT_COMMAND_TEXT_CUT, "cut-clipboard" ); + widget, win, wxEVT_TEXT_CUT, "cut-clipboard" ); } static void wx_gtk_paste_clipboard_callback( GtkWidget *widget, wxWindow *win ) { DoHandleClipboardCallback( - widget, win, wxEVT_COMMAND_TEXT_PASTE, "paste-clipboard" ); + widget, win, wxEVT_TEXT_PASTE, "paste-clipboard" ); } } // extern "C" @@ -387,50 +396,48 @@ void wxTextEntry::SetMaxLength(unsigned long len) return; gtk_entry_set_max_length(entry, len); - - // there is a bug in GTK+ 1.2.x: "changed" signal is emitted even if we had - // tried to enter more text than allowed by max text length and the text - // wasn't really changed - // - // to detect this and generate TEXT_MAXLEN event instead of TEXT_CHANGED - // one in this case we also catch "insert_text" signal - // - // when max len is set to 0 we disconnect our handler as it means that we - // shouldn't check anything any more - if ( len ) - { - g_signal_connect - ( - entry, - "insert_text", - G_CALLBACK(wx_gtk_insert_text_callback), - this - ); - } - else // no max length - { - g_signal_handlers_disconnect_by_func - ( - entry, - (gpointer)wx_gtk_insert_text_callback, - this - ); - } } void wxTextEntry::SendMaxLenEvent() { // remember that the next changed signal is to be ignored to avoid - // generating a dummy wxEVT_COMMAND_TEXT_UPDATED event + // generating a dummy wxEVT_TEXT event //IgnoreNextTextUpdate(); wxWindow * const win = GetEditableWindow(); - wxCommandEvent event(wxEVT_COMMAND_TEXT_MAXLEN, win->GetId()); + wxCommandEvent event(wxEVT_TEXT_MAXLEN, win->GetId()); event.SetEventObject(win); event.SetString(GetValue()); win->HandleWindowEvent(event); } +// ---------------------------------------------------------------------------- +// IM handling +// ---------------------------------------------------------------------------- + +int wxTextEntry::GTKIMFilterKeypress(GdkEventKey* event) const +{ +#if GTK_CHECK_VERSION(2, 22, 0) + if ( gtk_check_version(2, 12, 0) == 0 ) + return gtk_entry_im_context_filter_keypress(GetEntry(), event); +#else // GTK+ < 2.22 + wxUnusedVar(event); +#endif // GTK+ 2.22+ + + return FALSE; +} + +void wxTextEntry::GTKConnectInsertTextSignal(GtkEntry* entry) +{ + g_signal_connect(entry, "insert_text", + G_CALLBACK(wx_gtk_insert_text_callback), this); +} + +bool wxTextEntry::GTKEntryOnInsertText(const char* text) +{ + return GetEditableWindow()->GTKOnInsertText(text); +} + // ---------------------------------------------------------------------------- // margins support // ----------------------------------------------------------------------------