+2006-12-05 [wwp] 2.6.1cvs5
+
+ * src/message_search.c
+ * src/summary_search.c
+ * src/gtk/combobox.c
+ * src/gtk/combobox.h
+ * src/gtk/gtkutils.c
+ * src/gtk/gtkutils.h
+ make up and down arrow keys in modern gtk_combo_box_entry widgets
+ behave like w/ old comboboxes (summary and message search only).
+
2006-12-05 [paul] 2.6.1cvs4
* src/wizard.c
( cvs diff -u -r 1.382.2.338 -r 1.382.2.339 src/compose.c; ) > 2.6.1cvs2.patchset
( cvs diff -u -r 1.30.2.14 -r 1.30.2.15 tools/README; cvs diff -u -r 1.1.2.1 -r 1.1.2.2 tools/textviewer.pl; ) > 2.6.1cvs3.patchset
( cvs diff -u -r 1.1.2.39 -r 1.1.2.40 src/wizard.c; ) > 2.6.1cvs4.patchset
+( cvs diff -u -r 1.3.12.20 -r 1.3.12.21 src/message_search.c; cvs diff -u -r 1.15.2.38 -r 1.15.2.39 src/summary_search.c; cvs diff -u -r 1.1.2.3 -r 1.1.2.4 src/gtk/combobox.c; cvs diff -u -r 1.1.2.3 -r 1.1.2.4 src/gtk/combobox.h; cvs diff -u -r 1.5.2.45 -r 1.5.2.46 src/gtk/gtkutils.c; cvs diff -u -r 1.4.2.27 -r 1.4.2.28 src/gtk/gtkutils.h; ) > 2.6.1cvs5.patchset
MICRO_VERSION=1
INTERFACE_AGE=0
BINARY_AGE=0
-EXTRA_VERSION=4
+EXTRA_VERSION=5
EXTRA_RELEASE=
EXTRA_GTK2_VERSION=
#include <glib.h>
#include <glib/gi18n.h>
+#include <gdk/gdkkeysyms.h>
#include <gtk/gtk.h>
#include <utils.h>
for (cur = list; cur != NULL; cur = g_list_next(cur))
gtk_combo_box_append_text(combobox, (const gchar*) cur->data);
}
+
+gboolean combobox_set_value_from_arrow_key(GtkComboBox *combobox,
+ guint keyval)
+/* used from key_press events upon gtk_combo_box_entry with one text column
+ (gtk_combo_box_new_text() and with GtkComboBoxEntry's for instance),
+ make sure that up and down arrow keys behave the same as old with old
+ gtk_combo widgets:
+ when pressing Up:
+ if the current text in entry widget is not found in combo list,
+ get last value from combo list
+ if the current text in entry widget exists in combo list,
+ get prev value from combo list
+ when pressing Down:
+ if the current text in entry widget is not found in combo list,
+ get first value from combo list
+ if the current text in entry widget exists in combo list,
+ get next value from combo list
+*/
+{
+ gboolean valid = FALSE;
+
+ g_return_val_if_fail(combobox != NULL, FALSE);
+
+ /* reproduce the behaviour of old gtk_combo_box */
+ GtkTreeModel *model = gtk_combo_box_get_model(combobox);
+ GtkTreeIter iter;
+
+ if (gtk_combo_box_get_active_iter(combobox, &iter)) {
+ /* if current text is in list, get prev or next one */
+
+ if (keyval == GDK_Up)
+ valid = gtkut_tree_model_text_iter_prev(model, &iter,
+ gtk_combo_box_get_active_text(combobox));
+ else
+ if (keyval == GDK_Down)
+ valid = gtk_tree_model_iter_next(model, &iter);
+
+ if (valid)
+ gtk_combo_box_set_active_iter(combobox, &iter);
+
+ } else {
+ /* current text is not in list, get first or next one */
+
+ if (keyval == GDK_Up)
+ valid = gtkut_tree_model_get_iter_last(model, &iter);
+ else
+ if (keyval == GDK_Down)
+ valid = gtk_tree_model_get_iter_first(model, &iter);
+
+ if (valid)
+ gtk_combo_box_set_active_iter(combobox, &iter);
+ }
+
+ /* return TRUE if value could be set */
+ return valid;
+}
void combobox_unset_popdown_strings(GtkComboBox *combobox);
void combobox_set_popdown_strings(GtkComboBox *combobox,
GList *list);
+gboolean combobox_set_value_from_arrow_key(GtkComboBox *combobox,
+ guint keyval);
#endif /* __COMBOBOX_H__ */
}
}
}
+
+gboolean gtkut_tree_model_text_iter_prev(GtkTreeModel *model,
+ GtkTreeIter *iter,
+ const gchar* text)
+/* do the same as gtk_tree_model_iter_next, but _prev instead.
+ to use with widgets with one text column (gtk_combo_box_new_text()
+ and with GtkComboBoxEntry's for instance),
+*/
+{
+ GtkTreeIter cur_iter;
+ gchar *cur_value;
+ gboolean valid;
+ gint count;
+
+ g_return_val_if_fail(model != NULL, FALSE);
+ g_return_val_if_fail(iter != NULL, FALSE);
+
+ if (text == NULL || *text == '\0')
+ return FALSE;
+
+ valid = gtk_tree_model_get_iter_first(model, &cur_iter);
+ count = 0;
+ while (valid) {
+ gtk_tree_model_get(model, &cur_iter, 0, &cur_value, -1);
+
+ if (strcmp(text, cur_value) == 0) {
+ if (count <= 0)
+ return FALSE;
+
+ return gtk_tree_model_iter_nth_child(model, iter, NULL, count - 1);
+ }
+
+ valid = gtk_tree_model_iter_next(model, &cur_iter);
+ count++;
+ }
+ return FALSE;
+}
+
+gboolean gtkut_tree_model_get_iter_last(GtkTreeModel *model,
+ GtkTreeIter *iter)
+/* do the same as gtk_tree_model_get_iter_first, but _last instead.
+*/
+{
+ gint count;
+
+ g_return_val_if_fail(model != NULL, FALSE);
+ g_return_val_if_fail(iter != NULL, FALSE);
+
+ count = gtk_tree_model_iter_n_children(model, NULL);
+
+ if (count <= 0)
+ return FALSE;
+
+ return gtk_tree_model_iter_nth_child(model, iter, NULL, count - 1);
+}
#include <gtk/gtkcombo.h>
#include <gtk/gtktextview.h>
#include <gtk/gtkitemfactory.h>
+#include <gtk/gtktreemodel.h>
#include <stdlib.h>
#if HAVE_WCHAR_H
# include <wchar.h>
gboolean gtkutils_scroll_page (GtkWidget *widget,
GtkAdjustment *vadj,
gboolean up);
+
+gboolean gtkut_tree_model_text_iter_prev(GtkTreeModel *model,
+ GtkTreeIter *iter,
+ const gchar* text);
+gboolean gtkut_tree_model_get_iter_last(GtkTreeModel *model,
+ GtkTreeIter *iter);
+
#endif /* __GTKUTILS_H__ */
static gboolean key_pressed(GtkWidget *widget, GdkEventKey *event,
gpointer data)
{
- if (event && event->keyval == GDK_Escape)
+ if (event && (event->keyval == GDK_Escape)) {
gtk_widget_hide(search_window.window);
+ }
+
+ if (event && (event->keyval == GDK_Down || event->keyval == GDK_Up)) {
+ if (search_window.body_entry_has_focus) {
+ combobox_set_value_from_arrow_key(
+ GTK_COMBO_BOX(search_window.body_entry),
+ event->keyval);
+ return TRUE;
+ }
+ }
+
return FALSE;
}
static gboolean key_pressed(GtkWidget *widget, GdkEventKey *event,
gpointer data)
{
- if (event && event->keyval == GDK_Escape) {
+ if (event && (event->keyval == GDK_Escape)) {
/* ESC key will:
- stop a running search
- close the search window if no search is running
search_window.is_searching = FALSE;
}
}
+
+ if (event && (event->keyval == GDK_Down || event->keyval == GDK_Up)) {
+ if (search_window.from_entry_has_focus) {
+ combobox_set_value_from_arrow_key(
+ GTK_COMBO_BOX(search_window.from_entry),
+ event->keyval);
+ return TRUE;
+ }
+ if (search_window.to_entry_has_focus) {
+ combobox_set_value_from_arrow_key(
+ GTK_COMBO_BOX(search_window.to_entry),
+ event->keyval);
+ return TRUE;
+ }
+ if (search_window.subject_entry_has_focus) {
+ combobox_set_value_from_arrow_key(
+ GTK_COMBO_BOX(search_window.subject_entry),
+ event->keyval);
+ return TRUE;
+ }
+ if (search_window.body_entry_has_focus) {
+ combobox_set_value_from_arrow_key(
+ GTK_COMBO_BOX(search_window.body_entry),
+ event->keyval);
+ return TRUE;
+ }
+ if (search_window.adv_condition_entry_has_focus) {
+ combobox_set_value_from_arrow_key(
+ GTK_COMBO_BOX(search_window.adv_condition_entry),
+ event->keyval);
+ return TRUE;
+ }
+ }
+
return FALSE;
}