diff options
Diffstat (limited to 'src/indicator-notifications-settings.c')
-rw-r--r-- | src/indicator-notifications-settings.c | 201 |
1 files changed, 132 insertions, 69 deletions
diff --git a/src/indicator-notifications-settings.c b/src/indicator-notifications-settings.c index 439413e..510a0ec 100644 --- a/src/indicator-notifications-settings.c +++ b/src/indicator-notifications-settings.c @@ -21,8 +21,8 @@ typedef struct GSettings *settings; - GtkWidget *blacklist_treeview; - GtkWidget *blacklist_entry; + GtkWidget *filter_list_treeview; + GtkWidget *filter_list_entry; /* GtkTreeModel foreach variables */ gboolean result; @@ -43,29 +43,31 @@ static void indicator_notifications_settings_dispose(GObject *object); static void indicator_notifications_settings_activate(GApplication *app); /* Utility Functions */ -static void load_blacklist(IndicatorNotificationsSettings *self); -static void save_blacklist(IndicatorNotificationsSettings *self); +static void load_filter_list(IndicatorNotificationsSettings *self); +static void load_filter_list_hints(IndicatorNotificationsSettings *self); +static void save_filter_list(IndicatorNotificationsSettings *self); static gboolean foreach_check_duplicates(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer user_data); static gboolean foreach_build_array(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer user_data); /* Callbacks */ -static void blacklist_add_clicked_cb(GtkButton *button, gpointer user_data); -static void blacklist_remove_clicked_cb(GtkButton *button, gpointer user_data); +static void filter_list_add_clicked_cb(GtkButton *button, gpointer user_data); +static void filter_list_remove_clicked_cb(GtkButton *button, gpointer user_data); static void button_toggled_cb(GtkToggleButton *button, gpointer user_data); static void max_items_changed_cb(GtkSpinButton *button, gpointer user_data); +static gboolean filter_list_entry_focus_in_cb(GtkWidget *widget, GdkEvent *event, gpointer user_data); static void -load_blacklist(IndicatorNotificationsSettings *self) +load_filter_list(IndicatorNotificationsSettings *self) { - GtkListStore *list = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(self->blacklist_treeview))); + GtkListStore *list = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(self->filter_list_treeview))); GtkTreeIter iter; gchar **items; gtk_list_store_clear(list); - items = g_settings_get_strv(self->settings, NOTIFICATIONS_KEY_BLACKLIST); + items = g_settings_get_strv(self->settings, NOTIFICATIONS_KEY_FILTER_LIST); for (int i = 0; items[i] != NULL; i++) { gtk_list_store_append(list, &iter); @@ -76,19 +78,39 @@ load_blacklist(IndicatorNotificationsSettings *self) } static void -save_blacklist(IndicatorNotificationsSettings *self) +load_filter_list_hints(IndicatorNotificationsSettings *self) { - GtkListStore *list = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(self->blacklist_treeview))); + GtkEntryCompletion *completion = gtk_entry_get_completion(GTK_ENTRY(self->filter_list_entry)); + GtkListStore *list = GTK_LIST_STORE(gtk_entry_completion_get_model(completion)); + GtkTreeIter iter; gchar **items; - /* build an array of the blacklist items */ + gtk_list_store_clear(list); + + items = g_settings_get_strv(self->settings, NOTIFICATIONS_KEY_FILTER_LIST_HINTS); + + for (int i = 0; items[i] != NULL; i++) { + gtk_list_store_append(list, &iter); + gtk_list_store_set(list, &iter, 0, items[i], -1); + } + + g_strfreev(items); +} + +static void +save_filter_list(IndicatorNotificationsSettings *self) +{ + GtkListStore *list = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(self->filter_list_treeview))); + gchar **items; + + /* build an array of the filter list items */ self->array = g_ptr_array_new(); gtk_tree_model_foreach(GTK_TREE_MODEL(list), foreach_build_array, self); g_ptr_array_add(self->array, NULL); items = (gchar **) g_ptr_array_free(self->array, FALSE); self->array = NULL; - g_settings_set_strv(self->settings, NOTIFICATIONS_KEY_BLACKLIST, (const gchar **) items); + g_settings_set_strv(self->settings, NOTIFICATIONS_KEY_FILTER_LIST, (const gchar **) items); g_strfreev(items); } @@ -126,14 +148,14 @@ foreach_build_array(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, g } static void -blacklist_add_clicked_cb(GtkButton *button, gpointer user_data) +filter_list_add_clicked_cb(GtkButton *button, gpointer user_data) { IndicatorNotificationsSettings *self = (IndicatorNotificationsSettings *) user_data; - GtkListStore *list = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(self->blacklist_treeview))); + GtkListStore *list = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(self->filter_list_treeview))); GtkTreeIter iter; /* strip off the leading and trailing whitespace in case of user error */ - self->text = g_strdup(gtk_entry_get_text(GTK_ENTRY(self->blacklist_entry))); + self->text = g_strdup(gtk_entry_get_text(GTK_ENTRY(self->filter_list_entry))); g_strstrip(self->text); if (strlen(self->text) > 0) { @@ -144,12 +166,12 @@ blacklist_add_clicked_cb(GtkButton *button, gpointer user_data) if (self->result == FALSE) { gtk_list_store_append(list, &iter); gtk_list_store_set(list, &iter, COLUMN_APPNAME, self->text, -1); - save_blacklist(self); + save_filter_list(self); } } /* clear the entry */ - gtk_entry_set_text(GTK_ENTRY(self->blacklist_entry), ""); + gtk_entry_set_text(GTK_ENTRY(self->filter_list_entry), ""); /* cleanup text */ g_free(self->text); @@ -157,19 +179,19 @@ blacklist_add_clicked_cb(GtkButton *button, gpointer user_data) } static void -blacklist_remove_clicked_cb(GtkButton *button, gpointer user_data) +filter_list_remove_clicked_cb(GtkButton *button, gpointer user_data) { IndicatorNotificationsSettings *self = (IndicatorNotificationsSettings *) user_data; - GtkListStore *list = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(self->blacklist_treeview))); + GtkListStore *list = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(self->filter_list_treeview))); GtkTreeIter iter; GtkTreeSelection *selection; - selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(self->blacklist_treeview)); + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(self->filter_list_treeview)); if (gtk_tree_selection_get_selected(selection, NULL, &iter) == TRUE) { gtk_list_store_remove(list, &iter); - save_blacklist(self); + save_filter_list(self); } } @@ -191,24 +213,37 @@ max_items_changed_cb(GtkSpinButton *button, gpointer user_data) g_settings_set_int(settings, NOTIFICATIONS_KEY_MAX_ITEMS, value); } +static gboolean +filter_list_entry_focus_in_cb(GtkWidget *widget, GdkEvent *event, gpointer user_data) +{ + IndicatorNotificationsSettings *self = (IndicatorNotificationsSettings *) user_data; + load_filter_list_hints(self); + g_signal_emit_by_name(widget, "changed", NULL); + return FALSE; +} + static void indicator_notifications_settings_activate(GApplication *app) { GtkWidget *window; GtkWidget *frame; GtkWidget *vbox; - GtkWidget *button_1; - GtkWidget *button_2; + GtkWidget *button_cmc; + GtkWidget *button_hide_ind; + GtkWidget *button_dnd; + GtkWidget *button_swap_clr_s; GtkWidget *spin; GtkWidget *spin_label; - GtkWidget *blacklist_label; - GtkListStore *blacklist_list; - GtkWidget *blacklist_scroll; + GtkWidget *filter_list_label; + GtkListStore *filter_list_list; + GtkWidget *filter_list_scroll; GtkTreeViewColumn *column; GtkCellRenderer *renderer; GtkWidget *hbox; - GtkWidget *button_3; - GtkWidget *button_4; + GtkWidget *button_filter_list_rem; + GtkWidget *button_filter_list_add; + GtkEntryCompletion *entry_completion; + GtkListStore *entry_list; IndicatorNotificationsSettings *self = (IndicatorNotificationsSettings *) app; @@ -241,22 +276,40 @@ indicator_notifications_settings_activate(GApplication *app) gtk_widget_show(vbox); /* clear-on-middle-click */ - button_1 = gtk_check_button_new_with_label(_("Clear notifications on middle click")); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button_1), + button_cmc = gtk_check_button_new_with_label(_("Clear notifications on middle click")); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button_cmc), g_settings_get_boolean(self->settings, NOTIFICATIONS_KEY_CLEAR_MC)); - g_object_set_data(G_OBJECT(button_1), SCHEMA_KEY, NOTIFICATIONS_KEY_CLEAR_MC); - g_signal_connect(button_1, "toggled", G_CALLBACK(button_toggled_cb), self->settings); - gtk_box_pack_start(GTK_BOX(vbox), button_1, FALSE, FALSE, 4); - gtk_widget_show(button_1); + g_object_set_data(G_OBJECT(button_cmc), SCHEMA_KEY, NOTIFICATIONS_KEY_CLEAR_MC); + g_signal_connect(button_cmc, "toggled", G_CALLBACK(button_toggled_cb), self->settings); + gtk_box_pack_start(GTK_BOX(vbox), button_cmc, FALSE, FALSE, 4); + gtk_widget_show(button_cmc); /* hide-indicator */ - button_2 = gtk_check_button_new_with_label(_("Hide indicator")); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button_2), + button_hide_ind = gtk_check_button_new_with_label(_("Hide indicator")); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button_hide_ind), g_settings_get_boolean(self->settings, NOTIFICATIONS_KEY_HIDE_INDICATOR)); - g_object_set_data(G_OBJECT(button_2), SCHEMA_KEY, NOTIFICATIONS_KEY_HIDE_INDICATOR); - g_signal_connect(button_2, "toggled", G_CALLBACK(button_toggled_cb), self->settings); - gtk_box_pack_start(GTK_BOX(vbox), button_2, FALSE, FALSE, 4); - gtk_widget_show(button_2); + g_object_set_data(G_OBJECT(button_hide_ind), SCHEMA_KEY, NOTIFICATIONS_KEY_HIDE_INDICATOR); + g_signal_connect(button_hide_ind, "toggled", G_CALLBACK(button_toggled_cb), self->settings); + gtk_box_pack_start(GTK_BOX(vbox), button_hide_ind, FALSE, FALSE, 4); + gtk_widget_show(button_hide_ind); + + /* do-not-disturb */ + button_dnd = gtk_check_button_new_with_label(_("Do not disturb")); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button_dnd), + g_settings_get_boolean(self->settings, NOTIFICATIONS_KEY_DND)); + g_object_set_data(G_OBJECT(button_dnd), SCHEMA_KEY, NOTIFICATIONS_KEY_DND); + g_signal_connect(button_dnd, "toggled", G_CALLBACK(button_toggled_cb), self->settings); + gtk_box_pack_start(GTK_BOX(vbox), button_dnd, FALSE, FALSE, 4); + gtk_widget_show(button_dnd); + + /* swap-clear-settings */ + button_swap_clr_s = gtk_check_button_new_with_label(_("Swap \"Clear\" and \"Settings\" items")); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button_swap_clr_s), + g_settings_get_boolean(self->settings, NOTIFICATIONS_KEY_SWAP_CLEAR_SETTINGS)); + g_object_set_data(G_OBJECT(button_swap_clr_s), SCHEMA_KEY, NOTIFICATIONS_KEY_SWAP_CLEAR_SETTINGS); + g_signal_connect(button_swap_clr_s, "toggled", G_CALLBACK(button_toggled_cb), self->settings); + gtk_box_pack_start(GTK_BOX(vbox), button_swap_clr_s, FALSE, FALSE, 4); + gtk_widget_show(button_swap_clr_s); /* max-items */ /* FIXME: indicator does not change max items until restart... */ @@ -270,45 +323,55 @@ indicator_notifications_settings_activate(GApplication *app) gtk_box_pack_start(GTK_BOX(vbox), spin, FALSE, FALSE, 4); gtk_widget_show(spin); - /* blacklist */ - blacklist_label = gtk_label_new(_("Discard notifications by application name")); - gtk_box_pack_start(GTK_BOX(vbox), blacklist_label, FALSE, FALSE, 4); - gtk_widget_show(blacklist_label); + /* filter-list */ + filter_list_label = gtk_label_new(_("Discard notifications by application name")); + gtk_box_pack_start(GTK_BOX(vbox), filter_list_label, FALSE, FALSE, 4); + gtk_widget_show(filter_list_label); - blacklist_scroll = gtk_scrolled_window_new(NULL, NULL); - gtk_box_pack_start(GTK_BOX(vbox), blacklist_scroll, TRUE, TRUE, 4); - gtk_widget_show(blacklist_scroll); + filter_list_scroll = gtk_scrolled_window_new(NULL, NULL); + gtk_box_pack_start(GTK_BOX(vbox), filter_list_scroll, TRUE, TRUE, 4); + gtk_widget_show(filter_list_scroll); - blacklist_list = gtk_list_store_new(1, G_TYPE_STRING); + filter_list_list = gtk_list_store_new(1, G_TYPE_STRING); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes("appname", renderer, "text", COLUMN_APPNAME, NULL); - self->blacklist_treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(blacklist_list)); - g_object_unref(blacklist_list); - gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(self->blacklist_treeview), FALSE); - gtk_tree_view_append_column(GTK_TREE_VIEW(self->blacklist_treeview), column); - load_blacklist(self); - gtk_container_add(GTK_CONTAINER(blacklist_scroll), self->blacklist_treeview); - gtk_widget_show(self->blacklist_treeview); + self->filter_list_treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(filter_list_list)); + g_object_unref(filter_list_list); + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(self->filter_list_treeview), FALSE); + gtk_tree_view_append_column(GTK_TREE_VIEW(self->filter_list_treeview), column); + load_filter_list(self); + gtk_container_add(GTK_CONTAINER(filter_list_scroll), self->filter_list_treeview); + gtk_widget_show(self->filter_list_treeview); hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); gtk_widget_show(hbox); - button_3 = gtk_button_new_with_label(_("Remove")); - g_signal_connect(button_3, "clicked", G_CALLBACK(blacklist_remove_clicked_cb), self); - gtk_box_pack_start(GTK_BOX(hbox), button_3, FALSE, FALSE, 2); - gtk_widget_show(button_3); - - button_4 = gtk_button_new_with_label(_("Add")); - g_signal_connect(button_4, "clicked", G_CALLBACK(blacklist_add_clicked_cb), self); - gtk_box_pack_start(GTK_BOX(hbox), button_4, FALSE, FALSE, 2); - gtk_widget_show(button_4); - - self->blacklist_entry = gtk_entry_new(); - gtk_box_pack_start(GTK_BOX(hbox), self->blacklist_entry, TRUE, TRUE, 0); - gtk_widget_show(self->blacklist_entry); + button_filter_list_rem = gtk_button_new_with_label(_("Remove")); + g_signal_connect(button_filter_list_rem, "clicked", G_CALLBACK(filter_list_remove_clicked_cb), self); + gtk_box_pack_start(GTK_BOX(hbox), button_filter_list_rem, FALSE, FALSE, 2); + gtk_widget_show(button_filter_list_rem); + + button_filter_list_add = gtk_button_new_with_label(_("Add")); + g_signal_connect(button_filter_list_add, "clicked", G_CALLBACK(filter_list_add_clicked_cb), self); + gtk_box_pack_start(GTK_BOX(hbox), button_filter_list_add, FALSE, FALSE, 2); + gtk_widget_show(button_filter_list_add); + + self->filter_list_entry = gtk_entry_new(); + gtk_box_pack_start(GTK_BOX(hbox), self->filter_list_entry, TRUE, TRUE, 0); + gtk_widget_show(self->filter_list_entry); + + entry_completion = gtk_entry_completion_new(); + entry_list = gtk_list_store_new(1, G_TYPE_STRING); + gtk_entry_completion_set_model(entry_completion, GTK_TREE_MODEL(entry_list)); + gtk_entry_completion_set_text_column(entry_completion, 0); + gtk_entry_completion_set_minimum_key_length(entry_completion, 0); + gtk_entry_set_completion(GTK_ENTRY(self->filter_list_entry), entry_completion); + /* When we focus the entry, emit the changed signal so we get the hints immediately */ + /* also update the filter list hints from gsettings */ + g_signal_connect(self->filter_list_entry, "focus-in-event", G_CALLBACK(filter_list_entry_focus_in_cb), self); } static void |