/* Initialize the main screen. Start with top menu system. Initialize all screens. We clear the whole screen. We start the PLAYING screen. */ void mainscreen_init(void) { init_font(); set_font(MEDIUMFONT); win_scroll_init(); win_cursor_init(); // popup window win_init(&popup_win, POPUP_STARTPAGE * 8, 8, POPUP_PAGES * 8, 112, 1, popup_txt); popup_win.font = SMALLFONT; popup_win.flags |= WINFLG_CENTER | WINFLG_LFTADJ; popup_win.buffer_size = POPUP_TXT_SIZE; popup_active = 0; deferred_screen = NO_SCREEN; playing_screen_init( &(screen_list[PLAYING_SCREEN]) ); playlist_screen_init( &(screen_list[PLAYLIST_SCREEN]) ); tracklist_screen_init( &(screen_list[TRACKLIST_SCREEN]) ); search_screen_init( &(screen_list[SEARCH_SCREEN]) ); set_keypress_handler(mainscreen_keypress); screen_enter(PLAYING_SCREEN); };
auth_t* auth_create (const char *serve_name) { auth_t *au = xmalloc (sizeof (auth_t)); au->pconv.conv = auth_conv; au->pconv.appdata_ptr = au; au->pamh = NULL; au->ist = NULL; au->epfd = epoll_create1 (0); if (au->epfd == -1) { fprintf (stderr, "epoll create failed: %s\n", strerror (errno)); exit (-1); } screen_enter (au->epfd); au->v = view_create(); au->name = xstrdup (serve_name); return au; }
/* This is called when the current task does not know which screen is shown, so that switch_screen() can not be used. We simply exit the current screen and enter the new one. if a popup is active, do not switch screens, set deferred_screen instead */ void show_screen(enum SCREEN newscreen){ screen_exit(cur_screen); if (popup_active) deferred_screen = newscreen; else screen_enter(newscreen); };
void popup_end(){ if (timed_popup) { task_del(close_popup_task); timer_del(&popup_tmr); }; popup_active = 0; set_keypress_handler(mainscreen_keypress); if (deferred_screen != NO_SCREEN) screen_enter(deferred_screen); else { popup_restore(); screen_visible(cur_screen, 1); screen_redraw(cur_screen); }; };
int main(void) { int epfd, ret; struct epoll_event tmp; input_state_t *ist; data_handler_t *dht; view_t *v; line_text_t *lt; int timeout = -1; keysym_t sym; epfd = epoll_create1(0); if (epfd == -1) { perror ("epoll create failed"); exit(-1); } screen_enter (epfd); ist = input_state_create (epfd); v = view_create (); lt = view_user_input_ref (v); view_update (v, VIEW_USER); while ((ret = epoll_wait (epfd, &tmp, 1, timeout)) > -1) { if (ret) { dht = tmp.data.ptr; dht->handler (dht->fd, dht->data); } sym = get_input_state_info (ist, &timeout); switch (sym) { case XKB_KEY_NoSymbol: break; case XKB_KEY_Return: goto input_end; case XKB_KEY_BackSpace: line_text_handle_event (lt, DELETE_LEFT_CH); break; case XKB_KEY_Delete: line_text_handle_event (lt, DELETE_RIGHT_CH); break; case XKB_KEY_Left: line_text_handle_event (lt, CURSOR_MOVE_LEFT); break; case XKB_KEY_Right: line_text_handle_event (lt, CURSOR_MOVE_RIGHT); break; default: line_text_handle_event (lt, APPEND_CH, keysym_to_utf32(sym)); break; } if (sym != XKB_KEY_NoSymbol) view_update (v, VIEW_USER); } input_end: line_text_unref (lt); view_destory (v); input_state_destroy (ist); screen_leave (epfd); return 0; }