X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/61682944f5d1fb2911de971b76a99cd57ec3c50a..9436c5c22d757657e9e5d204a61774927cb020e0:/disobedience/menu.c?ds=sidebyside diff --git a/disobedience/menu.c b/disobedience/menu.c index 0540a56..b80537e 100644 --- a/disobedience/menu.c +++ b/disobedience/menu.c @@ -117,20 +117,21 @@ static void settings(gpointer attribute((unused)) callback_data, * need not. */ 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)); - /* TODO Users should only be sensitive if have RIGHT_ADMIN */ + 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)); + } } /** @brief Fetch version in order to display the about... popup */ @@ -215,13 +216,36 @@ static void about_popup_got_version(void attribute((unused)) *v, gtk_widget_destroy(w); } +/** @brief Set 'Manage Users' menu item sensitivity */ +void users_set_sensitive(int sensitive) { + GtkWidget *w = gtk_item_factory_get_widget(mainmenufactory, + "/Server/Manage users"); + 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 Create the menu bar widget */ GtkWidget *menubar(GtkWidget *w) { GtkWidget *m; static const GtkItemFactoryEntry entries[] = { { - (char *)"/File", /* path */ + (char *)"/Server", /* path */ 0, /* accelerator */ 0, /* callback */ 0, /* callback_action */ @@ -229,7 +253,7 @@ GtkWidget *menubar(GtkWidget *w) { 0 /* extra_data */ }, { - (char *)"/File/Login", /* path */ + (char *)"/Server/Login", /* path */ (char *)"L", /* accelerator */ login, /* callback */ 0, /* callback_action */ @@ -237,7 +261,7 @@ GtkWidget *menubar(GtkWidget *w) { 0 /* extra_data */ }, { - (char *)"/File/Users", /* path */ + (char *)"/Server/Manage users", /* path */ 0, /* accelerator */ users, /* callback */ 0, /* callback_action */ @@ -246,7 +270,7 @@ GtkWidget *menubar(GtkWidget *w) { }, #if 0 { - (char *)"/File/Settings", /* path */ + (char *)"/Server/Settings", /* path */ 0, /* accelerator */ settings, /* callback */ 0, /* callback_action */ @@ -255,7 +279,7 @@ GtkWidget *menubar(GtkWidget *w) { }, #endif { - (char *)"/File/Quit Disobedience", /* path */ + (char *)"/Server/Quit Disobedience", /* path */ (char *)"Q", /* accelerator */ quit_program, /* callback */ 0, /* callback_action */ @@ -383,6 +407,8 @@ GtkWidget *menubar(GtkWidget *w) { assert(selectall_widget != 0); assert(selectnone_widget != 0); assert(properties_widget != 0); + register_reset(menu_reset); + menu_reset(); m = gtk_item_factory_get_widget(mainmenufactory, ""); set_tool_colors(m);