X-Git-Url: https://git.distorted.org.uk/~mdw/disorder/blobdiff_plain/7c30fc7526b3f761d1b4d1c9d3a51842569529e2..d62c03cd64926d4d120f36e3ca3d2b7518c6e075:/disobedience/menu.c diff --git a/disobedience/menu.c b/disobedience/menu.c index b52190e..73f0909 100644 --- a/disobedience/menu.c +++ b/disobedience/menu.c @@ -58,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(NULL, t->extra); } /** @brief Called when the select none option is activated @@ -72,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(NULL, t->extra); } /** @brief Called when the track properties option is activated @@ -86,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(NULL, t->extra); } /** @brief Called when the login option is activated */ @@ -112,27 +115,31 @@ static void settings(gpointer attribute((unused)) callback_data, } #endif -/** @brief Update menu state +/** @brief Called when edit menu is shown * * Determines option sensitivity according to the current tab and adjusts the * widgets accordingly. Knows about @ref DISORDER_CONNECTED so the callbacks * need not. */ -void menu_update(int page) { +static void edit_menu_show(GtkWidget attribute((unused)) *widget, + gpointer attribute((unused)) user_data) { if(tabs) { GtkWidget *tab = gtk_notebook_get_nth_page (GTK_NOTEBOOK(tabs), - page < 0 ? gtk_notebook_current_page(GTK_NOTEBOOK(tabs)) : page); + gtk_notebook_current_page(GTK_NOTEBOOK(tabs))); 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) + (t->properties_sensitive + && t->properties_sensitive(t->extra) && (disorder_eclient_state(client) & DISORDER_CONNECTED))); gtk_widget_set_sensitive(selectall_widget, - t->selectall_sensitive(tab)); + t->selectall_sensitive + && t->selectall_sensitive(t->extra)); gtk_widget_set_sensitive(selectnone_widget, - t->selectnone_sensitive(tab)); + t->selectnone_sensitive + && t->selectnone_sensitive(t->extra)); } } @@ -228,29 +235,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 *error, - const char *value) { - rights_type r; - - if(error) { - popup_protocol_error(0, error); - r = 0; - } else { - if(parse_rights(value, &r, 0)) - r = 0; - } - users_set_sensitive(!!(r & RIGHT_ADMIN)); -} - -/** @brief Called after a fresh login */ -static void menu_logged_in(const char attribute((unused)) *event, - void attribute((unused)) *eventdata, - void attribute((unused)) *callbackdata) { - 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 */ @@ -421,8 +410,14 @@ GtkWidget *menubar(GtkWidget *w) { assert(selectall_widget != 0); assert(selectnone_widget != 0); assert(properties_widget != 0); - event_register("logged-in", menu_logged_in, 0); - menu_logged_in(0, 0, 0); + + + GtkWidget *edit_widget = gtk_item_factory_get_widget(mainmenufactory, + "/Edit"); + g_signal_connect(edit_widget, "show", G_CALLBACK(edit_menu_show), 0); + + event_register("rights-changed", menu_rights_changed, 0); + users_set_sensitive(0); m = gtk_item_factory_get_widget(mainmenufactory, ""); set_tool_colors(m);