X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=avahi-ui%2Favahi-ui.c;h=402ae9ddd596a9c63164381692c34aac93133e3f;hb=b6a614b20d4df2ef40c7213a6c448341f3e20ac5;hp=13208939903465a550ac4cbc2a932ef8381bd121;hpb=e5cc6bde6390048349a3edef991d9278a13cdaf6;p=catta diff --git a/avahi-ui/avahi-ui.c b/avahi-ui/avahi-ui.c index 1320893..402ae9d 100644 --- a/avahi-ui/avahi-ui.c +++ b/avahi-ui/avahi-ui.c @@ -23,6 +23,8 @@ #include #endif +#include +#include #include #include #include @@ -84,6 +86,8 @@ struct _AuiServiceDialogPrivate { GtkWidget *domain_tree_view; GtkWidget *domain_progress_bar; GtkWidget *domain_ok_button; + + gint forward_response_id; }; enum { @@ -121,6 +125,47 @@ static void aui_service_dialog_finalize(GObject *object); static void aui_service_dialog_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); static void aui_service_dialog_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); +static int get_default_response(GtkDialog *dlg) { + gint ret = GTK_RESPONSE_NONE; + + if (GTK_WINDOW(dlg)->default_widget) + /* Use the response of the default widget, if possible */ + ret = gtk_dialog_get_response_for_widget(dlg, GTK_WINDOW(dlg)->default_widget); + + if (ret == GTK_RESPONSE_NONE) { + /* Fall back to finding the first positive response */ + GList *children, *t; + gint bad = GTK_RESPONSE_NONE; + + t = children = gtk_container_get_children(GTK_CONTAINER(dlg->action_area)); + + while (t) { + GtkWidget *child = t->data; + + ret = gtk_dialog_get_response_for_widget(dlg, child); + + if (ret == GTK_RESPONSE_ACCEPT || + ret == GTK_RESPONSE_OK || + ret == GTK_RESPONSE_YES || + ret == GTK_RESPONSE_APPLY) + break; + + if (ret != GTK_RESPONSE_NONE && bad == GTK_RESPONSE_NONE) + bad = ret; + + t = t->next; + } + + g_list_free (children); + + /* Fall back to finding the first negative response */ + if (ret == GTK_RESPONSE_NONE) + ret = bad; + } + + return ret; +} + G_DEFINE_TYPE(AuiServiceDialog, aui_service_dialog, GTK_TYPE_DIALOG) static void aui_service_dialog_class_init(AuiServiceDialogClass *klass) { @@ -205,6 +250,7 @@ GtkWidget *aui_service_dialog_new_valist( va_list varargs) { const gchar *button_text; + gint dr; GtkWidget *w = GTK_WIDGET(g_object_new( AUI_TYPE_SERVICE_DIALOG, @@ -224,6 +270,14 @@ GtkWidget *aui_service_dialog_new_valist( button_text = va_arg(varargs, const gchar *); } + gtk_dialog_set_response_sensitive(GTK_DIALOG(w), GTK_RESPONSE_ACCEPT, FALSE); + gtk_dialog_set_response_sensitive(GTK_DIALOG(w), GTK_RESPONSE_OK, FALSE); + gtk_dialog_set_response_sensitive(GTK_DIALOG(w), GTK_RESPONSE_YES, FALSE); + gtk_dialog_set_response_sensitive(GTK_DIALOG(w), GTK_RESPONSE_APPLY, FALSE); + + if ((dr = get_default_response(GTK_DIALOG(w))) != GTK_RESPONSE_NONE) + gtk_dialog_set_default_response(GTK_DIALOG(w), dr); + return w; } @@ -318,7 +372,7 @@ static void resolve_callback( d->priv->address = *a; } - gtk_dialog_response(GTK_DIALOG(d), GTK_RESPONSE_ACCEPT); + gtk_dialog_response(GTK_DIALOG(d), d->priv->forward_response_id); break; @@ -608,6 +662,7 @@ static const gchar *get_domain_name(AuiServiceDialog *d) { const gchar *domain; g_return_val_if_fail(d, NULL); + g_return_val_if_fail(AUI_IS_SERVICE_DIALOG(d), NULL); if (d->priv->domain) return d->priv->domain; @@ -692,7 +747,7 @@ static gboolean start_callback(gpointer data) { gtk_widget_show(d->priv->service_progress_bar); if (d->priv->service_pulse_timeout <= 0) - d->priv->service_pulse_timeout = g_timeout_add(100, service_pulse_callback, d->priv); + d->priv->service_pulse_timeout = g_timeout_add(100, service_pulse_callback, d); for (i = 0; d->priv->browse_service_types[i]; i++) ; @@ -771,19 +826,27 @@ static void aui_service_dialog_finalize(GObject *object) { static void service_row_activated_callback(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data) { AuiServiceDialog *d = AUI_SERVICE_DIALOG(user_data); - gtk_dialog_response(GTK_DIALOG(d), GTK_RESPONSE_ACCEPT); + gtk_dialog_response(GTK_DIALOG(d), get_default_response(GTK_DIALOG(d))); } static void service_selection_changed_callback(GtkTreeSelection *selection, gpointer user_data) { AuiServiceDialog *d = AUI_SERVICE_DIALOG(user_data); + gboolean b; - gtk_dialog_set_response_sensitive(GTK_DIALOG(d), GTK_RESPONSE_ACCEPT, gtk_tree_selection_get_selected(selection, NULL, NULL)); + b = gtk_tree_selection_get_selected(selection, NULL, NULL); + gtk_dialog_set_response_sensitive(GTK_DIALOG(d), GTK_RESPONSE_ACCEPT, b); + gtk_dialog_set_response_sensitive(GTK_DIALOG(d), GTK_RESPONSE_OK, b); + gtk_dialog_set_response_sensitive(GTK_DIALOG(d), GTK_RESPONSE_YES, b); + gtk_dialog_set_response_sensitive(GTK_DIALOG(d), GTK_RESPONSE_APPLY, b); } static void response_callback(GtkDialog *dialog, gint response, gpointer user_data) { AuiServiceDialog *d = AUI_SERVICE_DIALOG(user_data); - if (response == GTK_RESPONSE_ACCEPT && + if ((response == GTK_RESPONSE_ACCEPT || + response == GTK_RESPONSE_OK || + response == GTK_RESPONSE_YES || + response == GTK_RESPONSE_APPLY) && ((d->priv->resolve_service && !d->priv->resolve_service_done) || (d->priv->resolve_host_name && !d->priv->resolve_host_name_done))) { @@ -793,6 +856,7 @@ static void response_callback(GtkDialog *dialog, gint response, gpointer user_da GdkCursor *cursor; g_signal_stop_emission(dialog, g_signal_lookup("response", gtk_dialog_get_type()), 0); + d->priv->forward_response_id = response; if (d->priv->resolver) return; @@ -872,7 +936,7 @@ static void domain_entry_changed_callback(GtkEditable *editable, gpointer user_d gtk_widget_set_sensitive(d->priv->domain_ok_button, is_valid_domain_suffix(gtk_entry_get_text(GTK_ENTRY(d->priv->domain_entry)))); } -static void domain_button_clicked(GtkButton *button, gpointer user_data) { +static void domain_button_clicked(GtkButton *button, gpointer user_data) { GtkWidget *vbox, *vbox2, *scrolled_window; GtkTreeSelection *selection; GtkCellRenderer *renderer; @@ -937,7 +1001,7 @@ static void domain_button_clicked(GtkButton *button, gpointer user_data) { g_signal_connect(selection, "changed", G_CALLBACK(domain_selection_changed_callback), d); renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes("Name", renderer, "text", DOMAIN_COLUMN_NAME, NULL); + column = gtk_tree_view_column_new_with_attributes("Service Name", renderer, "text", DOMAIN_COLUMN_NAME, NULL); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_append_column(GTK_TREE_VIEW(p->domain_tree_view), column); @@ -1021,6 +1085,8 @@ static void aui_service_dialog_init(AuiServiceDialog *d) { p->domain_progress_bar = NULL; p->domain_ok_button = NULL; + p->forward_response_id = GTK_RESPONSE_NONE; + p->service_list_store = p->domain_list_store = NULL; gtk_widget_push_composite_child(); @@ -1085,7 +1151,6 @@ static void aui_service_dialog_init(AuiServiceDialog *d) { gtk_widget_show(p->domain_button); gtk_dialog_set_default_response(GTK_DIALOG(d), GTK_RESPONSE_ACCEPT); - gtk_dialog_set_response_sensitive(GTK_DIALOG(d), GTK_RESPONSE_ACCEPT, FALSE); gtk_widget_grab_focus(p->service_tree_view);