* Claudio Saavedra <csaavedra@igalia.com>
*/
-#include <config.h>
-#include <string.h>
-
-#include <gtk/gtk.h>
-#include <gdk/gdkkeysyms.h>
-
-#include <libempathy/empathy-utils.h>
-
+#include "config.h"
#include "empathy-live-search.h"
+#include "empathy-utils.h"
+
G_DEFINE_TYPE (EmpathyLiveSearch, empathy_live_search, GTK_TYPE_HBOX)
#define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyLiveSearch)
{
gunichar retval = 0;
GUnicodeType utype;
- gunichar *decomp;
- gsize dlen;
utype = g_unichar_type (ch);
case G_UNICODE_SPACE_SEPARATOR:
default:
ch = g_unichar_tolower (ch);
- decomp = g_unicode_canonical_decomposition (ch, &dlen);
- if (decomp != NULL)
- {
- retval = decomp[0];
- g_free (decomp);
- }
+ g_unichar_fully_decompose (ch, FALSE, &retval, 1);
}
return retval;
/* emit key navigation signal, so other widgets can respond to it properly */
if (event->keyval == GDK_KEY_Up || event->keyval == GDK_KEY_Down
- || event->keyval == GDK_KEY_Page_Up || event->keyval == GDK_KEY_Page_Down)
+ || event->keyval == GDK_KEY_Page_Up || event->keyval == GDK_KEY_Page_Down
+ || event->keyval == GDK_KEY_Menu)
{
return fire_key_navigation_sig (self, event);
}
* they are needed for navigation in the treeview and are not needed in
* the search entry */
if (event->keyval == GDK_KEY_Up || event->keyval == GDK_KEY_Down ||
- event->keyval == GDK_KEY_Page_Up || event->keyval == GDK_KEY_Page_Down)
+ event->keyval == GDK_KEY_Page_Up || event->keyval == GDK_KEY_Page_Down ||
+ event->keyval == GDK_KEY_Menu)
return FALSE;
if (event->keyval == GDK_KEY_Home || event->keyval == GDK_KEY_End ||
return FALSE;
}
+ /* Don't forward shift keys events as focusing the search entry would
+ * cancel an in-progress editing on a cell renderer (like when renaming a
+ * group). There is no point focusing it anyway as we don't display the
+ * search entry when only a shift key is pressed. */
+ if (event->keyval == GDK_KEY_Shift_L ||
+ event->keyval == GDK_KEY_Shift_R)
+ return FALSE;
+
/* realize the widget if it is not realized yet */
gtk_widget_realize (priv->search_entry);
if (!gtk_widget_has_focus (priv->search_entry))
gtk_widget_hide (widget);
gtk_entry_set_text (GTK_ENTRY (priv->search_entry), "");
- gtk_widget_grab_focus (priv->hook_widget);
+
+ if (priv->hook_widget != NULL)
+ gtk_widget_grab_focus (priv->hook_widget);
}
static void