mainwindow);
}
+/* Need unique data to make unregistering signal handler possible for the auto
+ * completed entry */
+#define COMPLETION_UNIQUE_DATA (GINT_TO_POINTER(0xfeefaa))
+
void address_completion_register_entry(GtkEntry *entry)
{
g_return_if_fail(entry != NULL);
gtk_signal_connect_full(GTK_OBJECT(entry), "key_press_event",
GTK_SIGNAL_FUNC(address_completion_entry_key_pressed),
NULL,
- NULL,
+ COMPLETION_UNIQUE_DATA,
NULL,
0,
0); /* magic */
}
+void address_completion_unregister_entry(GtkEntry *entry)
+{
+ GtkObject *entry_obj;
+
+ g_return_if_fail(entry != NULL);
+ g_return_if_fail(GTK_IS_ENTRY(entry));
+
+ entry_obj = gtk_object_get_data(GTK_OBJECT(entry), ENTRY_DATA_TAB_HOOK);
+ g_return_if_fail(entry_obj);
+ g_return_if_fail(entry_obj == GTK_OBJECT(entry));
+
+ /* has the hooked property? */
+ gtk_object_set_data(GTK_OBJECT(entry), ENTRY_DATA_TAB_HOOK, NULL);
+
+ /* remove the hook */
+ gtk_signal_disconnect_by_func(GTK_OBJECT(entry),
+ GTK_SIGNAL_FUNC(address_completion_entry_key_pressed),
+ COMPLETION_UNIQUE_DATA);
+}
+
/* should be called when main window with address completion entries
- * terminates */
+ * terminates.
+ * NOTE: this function assumes that it is called upon destruction of
+ * the window */
void address_completion_end(GtkWidget *mainwindow)
{
/* if address_completion_end() is really called on closing the window,
#include "alertpanel.h"
#include "folder.h"
#include "filtering.h"
+#include "addr_compl.h"
static struct Filtering {
GtkWidget *window;
GtkWidget *exec_btn;
GtkWidget *cond_clist;
+
+ /* need this to make address completion entry work */
+ gint current_action;
} filtering;
#define VSPACING 12
static gint prefs_filtering_clist_set_row(gint row, FilteringProp * prop);
static void prefs_filtering_select_dest(void);
static void prefs_filtering_action_select(GtkList *list,
- GtkWidget *widget,
+ GtkWidget *widget,
gpointer user_data);
+static void prefs_filtering_action_selection_changed(GtkList *list,
+ gpointer user_data);
+
static void prefs_filtering_reset_dialog(void);
enum {
void * sel;
GList * child;
+ if (list->selection == NULL)
+ return -1;
+
sel = list->selection->data;
for(child = list->children ; child != NULL ;
child = g_list_next(child)) {
prefs_filtering_set_dialog();
gtk_widget_show(filtering.window);
+
+ start_address_completion();
+}
+
+/* prefs_filtering_close() - just to have one common exit point */
+static void prefs_filtering_close(void)
+{
+ end_address_completion();
+
+ gtk_widget_hide(filtering.window);
}
static void prefs_filtering_create(void)
GTK_SIGNAL_FUNC (prefs_filtering_action_select),
NULL);
+ gtk_signal_connect(GTK_OBJECT(action_list), "selection-changed",
+ GTK_SIGNAL_FUNC(prefs_filtering_action_selection_changed),
+ NULL);
+
/* accounts */
hbox1 = gtk_hbox_new (FALSE, VSPACING);
g_free(path);
}
+static void prefs_filtering_action_selection_changed(GtkList *list,
+ gpointer user_data)
+{
+ gint value;
+
+ value = get_sel_from_list(GTK_LIST(filtering.action_list));
+
+ if (filtering.current_action != value) {
+ if (filtering.current_action == ACTION_FORWARD
+ || filtering.current_action == ACTION_FORWARD_AS_ATTACHMENT) {
+ debug_print("unregistering address completion entry\n");
+ address_completion_unregister_entry(GTK_ENTRY(filtering.dest_entry));
+ }
+ if (value == ACTION_FORWARD || value == ACTION_FORWARD_AS_ATTACHMENT) {
+ debug_print("registering address completion entry\n");
+ address_completion_register_entry(GTK_ENTRY(filtering.dest_entry));
+ }
+ filtering.current_action = value;
+ }
+}
+
static void prefs_filtering_action_select(GtkList *list,
GtkWidget *widget,
gpointer user_data)
{
prefs_filtering_set_list();
prefs_filtering_write_config();
- gtk_widget_hide(filtering.window);
+ prefs_filtering_close();
}
static void prefs_filtering_cancel(void)
{
prefs_filtering_read_config();
- gtk_widget_hide(filtering.window);
+ prefs_filtering_close();
}