event_() functions.
/* Public entry points ----------------------------------------------------- */
-/** @brief Called to entirely reset the choose screen */
-static void choose_reset(void) {
+/** @brief Called when we have just logged in
+ *
+ * Entirely resets the choose tab.
+ */
+static void choose_logged_in(const char attribute((unused)) *event,
+ void attribute((unused)) *eventdata,
+ void attribute((unused)) *callbackdata) {
if(root)
undisplay_tree(root);
root = newnode(0/*parent*/, "<root>", "All files", "",
NW(layout);
chooselayout = gtk_layout_new(0, 0);
gtk_widget_set_style(chooselayout, layout_style);
- choose_reset();
- register_reset(choose_reset);
+ choose_logged_in(0, 0, 0);
+ event_register("logged-in", choose_logged_in, 0);
/* Create the popup menus */
NW(menu);
track_menu = gtk_menu_new();
/** @brief True if RTP play is enabled */
int rtp_is_running;
-/** @brief Linked list of functions to call when we reset login parameters */
-static struct reset_callback_node {
- struct reset_callback_node *next;
- reset_callback *callback;
-} *resets;
-
/* Window creation --------------------------------------------------------- */
/* Note that all the client operations kicked off from here will only complete
exit(0);
}
-/* reset state */
-void reset(void) {
- struct reset_callback_node *r;
-
+void logged_in(void) {
/* reset the clients */
disorder_eclient_close(client);
disorder_eclient_close(logclient);
rtp_supported = 0;
- for(r = resets; r; r = r->next)
- r->callback();
+ event_raise("logged-in", 0);
/* Might be a new server so re-check */
check_rtp_address();
}
-/** @brief Register a reset callback */
-void register_reset(reset_callback *callback) {
- struct reset_callback_node *const r = xmalloc(sizeof *r);
-
- r->next = resets;
- r->callback = callback;
- resets = r;
-}
-
int main(int argc, char **argv) {
int n;
gboolean gtkok;
maybe_send_nop,
0/*data*/,
0/*notify*/);
- register_reset(properties_reset);
/* Start monitoring the log */
disorder_eclient_log(logclient, &log_callbacks, 0);
/* See if RTP play supported */
void properties(int ntracks, const char **tracks);
/* Pop up a properties window for a list of tracks */
-void properties_reset(void);
-
GtkWidget *scroll_widget(GtkWidget *child);
/* Wrap a widget up for scrolling */
size_t nbuttons,
GtkWidget *box);
-/** @brief Type signature for a reset callback */
-typedef void reset_callback(void);
-
-void register_reset(reset_callback *callback);
-/* Register a reset callback */
-
-void reset(void);
+void logged_in(void);
void all_update(void);
/* Update everything */
if(!disorder_connect(c)) {
/* Success; save the config and start using it */
login_save_config();
- reset();
+ logged_in();
/* Pop down login window */
gtk_widget_destroy(login_window);
} else {
users_set_sensitive(!!(r & RIGHT_ADMIN));
}
-/** @brief Called when we need to reset state */
-static void menu_reset(void) {
+/** @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);
assert(selectall_widget != 0);
assert(selectnone_widget != 0);
assert(properties_widget != 0);
- register_reset(menu_reset);
- menu_reset();
+ event_register("logged-in", menu_logged_in, 0);
+ menu_logged_in(0, 0, 0);
m = gtk_item_factory_get_widget(mainmenufactory,
"<GdisorderMain>");
set_tool_colors(m);
static void properties_apply(GtkButton *button, gpointer userdata);
static void properties_cancel(GtkButton *button, gpointer userdata);
+static void properties_logged_in(const char *event,
+ void *eventdata,
+ void *callbackdata);
+
/** @brief Data for a single preference */
struct prefdata {
const char *track;
static GtkWidget *properties_window;
static GtkWidget *properties_table;
static struct progress_window *pw;
+static event_handle properties_event;
static void propagate_clicked(GtkButton attribute((unused)) *button,
gpointer userdata) {
popup_msg(GTK_MESSAGE_ERROR, "Too many tracks selected");
return;
}
+ properties_event = event_register("logged-in", properties_logged_in, 0);
/* Create a new properties window */
properties_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_set_style(properties_window, tool_style);
static void properties_cancel(GtkButton attribute((unused)) *button,
gpointer attribute((unused)) userdata) {
gtk_widget_destroy(properties_window);
+ event_cancel(properties_event);
+ properties_event = 0;
}
-/** @brief Called on client reset
+/** @brief Called when we've just logged in
*
* Destroys the current properties window.
*/
-void properties_reset(void) {
+static void properties_logged_in(const char attribute((unused)) *event,
+ void attribute((unused)) *eventdata,
+ void attribute((unused)) *callbackdata) {
if(properties_window)
gtk_widget_destroy(properties_window);
}