X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/49e57291d78de2b583d6f2197ae6f9d9ff05e456..ee7552f86d9438d415cbe61fd897e5c768f4f1a4:/disobedience/menu.c diff --git a/disobedience/menu.c b/disobedience/menu.c index 3b39a44..8dcae3c 100644 --- a/disobedience/menu.c +++ b/disobedience/menu.c @@ -30,7 +30,9 @@ static GtkWidget *properties_widget; /** @brief Main menu widgets */ GtkItemFactory *mainmenufactory; -static void about_popup_got_version(void *v, const char *value); +static void about_popup_got_version(void *v, + const char *error, + const char *value); /** @brief Called when the quit option is activated * @@ -56,7 +58,8 @@ static void select_all(gpointer attribute((unused)) callback_data, (GTK_NOTEBOOK(tabs), gtk_notebook_current_page(GTK_NOTEBOOK(tabs))); const struct tabtype *t = g_object_get_data(G_OBJECT(tab), "type"); - t->selectall_activate(tab); + if(t->selectall_activate) + t->selectall_activate(t->extra); } /** @brief Called when the select none option is activated @@ -70,7 +73,8 @@ static void select_none(gpointer attribute((unused)) callback_data, (GTK_NOTEBOOK(tabs), gtk_notebook_current_page(GTK_NOTEBOOK(tabs))); const struct tabtype *t = g_object_get_data(G_OBJECT(tab), "type"); - t->selectnone_activate(tab); + if(t->selectnone_activate) + t->selectnone_activate(t->extra); } /** @brief Called when the track properties option is activated @@ -84,7 +88,8 @@ static void properties_item(gpointer attribute((unused)) callback_data, (GTK_NOTEBOOK(tabs), gtk_notebook_current_page(GTK_NOTEBOOK(tabs))); const struct tabtype *t = g_object_get_data(G_OBJECT(tab), "type"); - t->properties_activate(tab); + if(t->properties_activate) + t->properties_activate(t->extra); } /** @brief Called when the login option is activated */ @@ -115,21 +120,28 @@ static void settings(gpointer attribute((unused)) callback_data, * Determines option sensitivity according to the current tab and adjusts the * widgets accordingly. Knows about @ref DISORDER_CONNECTED so the callbacks * need not. + * + * TODO: base this on menu popup instead? */ void menu_update(int page) { - GtkWidget *tab = gtk_notebook_get_nth_page - (GTK_NOTEBOOK(tabs), - page < 0 ? gtk_notebook_current_page(GTK_NOTEBOOK(tabs)) : page); - const struct tabtype *t = g_object_get_data(G_OBJECT(tab), "type"); + if(tabs) { + GtkWidget *tab = gtk_notebook_get_nth_page + (GTK_NOTEBOOK(tabs), + page < 0 ? gtk_notebook_current_page(GTK_NOTEBOOK(tabs)) : page); + const struct tabtype *t = g_object_get_data(G_OBJECT(tab), "type"); - assert(t != 0); - gtk_widget_set_sensitive(properties_widget, - (t->properties_sensitive(tab) - && (disorder_eclient_state(client) & DISORDER_CONNECTED))); - gtk_widget_set_sensitive(selectall_widget, - t->selectall_sensitive(tab)); - gtk_widget_set_sensitive(selectnone_widget, - t->selectnone_sensitive(tab)); + assert(t != 0); + gtk_widget_set_sensitive(properties_widget, + (t->properties_sensitive + && t->properties_sensitive(t->extra) + && (disorder_eclient_state(client) & DISORDER_CONNECTED))); + gtk_widget_set_sensitive(selectall_widget, + t->selectall_sensitive + && t->selectall_sensitive(t->extra)); + gtk_widget_set_sensitive(selectnone_widget, + t->selectnone_sensitive + && t->selectnone_sensitive(t->extra)); + } } /** @brief Fetch version in order to display the about... popup */ @@ -154,12 +166,15 @@ static void manual_popup(gpointer attribute((unused)) callback_data, /** @brief Called when version arrives, displays about... popup */ static void about_popup_got_version(void attribute((unused)) *v, + const char attribute((unused)) *error, const char *value) { GtkWidget *w; char *server_version_string; char *short_version_string; GtkWidget *hbox, *vbox, *title; + if(!value) + value = "[error]"; byte_xasprintf(&server_version_string, "Server version %s", value); byte_xasprintf(&short_version_string, "Disobedience %s", disorder_short_version_string); @@ -221,20 +236,11 @@ void users_set_sensitive(int sensitive) { gtk_widget_set_sensitive(w, sensitive); } -/** @brief Called with current user's rights string */ -static void menu_got_rights(void attribute((unused)) *v, const char *value) { - rights_type r; - - if(parse_rights(value, &r, 0)) - r = 0; - users_set_sensitive(!!(r & RIGHT_ADMIN)); -} - -/** @brief Called when we need to reset state */ -static void menu_reset(void) { - users_set_sensitive(0); /* until we know better */ - disorder_eclient_userinfo(client, menu_got_rights, config->username, "rights", - 0); +/** @brief Called when our rights change */ +static void menu_rights_changed(const char attribute((unused)) *event, + void attribute((unused)) *eventdata, + void attribute((unused)) *callbackdata) { + users_set_sensitive(!!(last_rights & RIGHT_ADMIN)); } /** @brief Create the menu bar widget */ @@ -405,8 +411,8 @@ GtkWidget *menubar(GtkWidget *w) { assert(selectall_widget != 0); assert(selectnone_widget != 0); assert(properties_widget != 0); - register_reset(menu_reset); - menu_reset(); + event_register("rights-changed", menu_rights_changed, 0); + users_set_sensitive(0); m = gtk_item_factory_get_widget(mainmenufactory, ""); set_tool_colors(m);