From 77c69999a63e6b999814cb39c35bb4d30646c145 Mon Sep 17 00:00:00 2001 From: Kalle Wallin Date: Sun, 6 Jun 2004 21:03:03 +0000 Subject: Added an optional clock screen :) git-svn-id: https://svn.musicpd.org/ncmpc/trunk@1360 09075e82-0dd4-0310-85a5-a0d7c8717e4f --- src/Makefile.am | 6 +- src/command.c | 8 +- src/command.h | 1 + src/screen.c | 21 ++++- src/screen.h | 1 + src/screen_clock.c | 259 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/screen_help.c | 3 + 7 files changed, 294 insertions(+), 5 deletions(-) create mode 100644 src/screen_clock.c (limited to 'src') diff --git a/src/Makefile.am b/src/Makefile.am index ff4fb7aa9..79822f029 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -11,12 +11,12 @@ AM_CPPFLAGS = $(GLIB_CFLAGS) -DLOCALE_DIR=\""$(datadir)/locale"\" -DSYSCONFDIR=\ ncmpc_headers = libmpdclient.h mpc.h options.h conf.h command.h screen.h \ screen_utils.h screen_play.h screen_file.h screen_search.h \ - screen_help.h list_window.h colors.h support.h wreadln.h \ - ncmpc.h + screen_clock.h screen_help.h list_window.h colors.h support.h \ + wreadln.h ncmpc.h ncmpc_SOURCES = libmpdclient.c main.c mpc.c options.c conf.c command.c \ screen.c screen_utils.c screen_play.c screen_file.c \ - screen_search.c screen_help.c screen_keydef.c \ + screen_search.c screen_help.c screen_keydef.c screen_clock.c \ list_window.c colors.c support.c wreadln.c $(ncmpc_headers) diff --git a/src/command.c b/src/command.c index 78199f252..294f2318b 100644 --- a/src/command.c +++ b/src/command.c @@ -1,5 +1,7 @@ /* - * (c) 2004 by Kalle Wallin (kaw@linux.se) + * $Id$ + * + * (c) 2004 by Kalle Wallin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -147,6 +149,10 @@ static command_definition_t cmds[] = N_("Browse screen") }, { {'u', 0, 0 }, CMD_SCREEN_UPDATE, "update", N_("Update screen") }, +#ifdef ENABLE_CLOCK_SCREEN + { {'4', F4, 0 }, CMD_SCREEN_CLOCK, "screen-clock", + N_("Clock screen") }, +#endif #ifdef ENABLE_KEYDEF_SCREEN { {'K', 0, 0 }, CMD_SCREEN_KEYDEF, "screen-keyedit", N_("Key configuration screen") }, diff --git a/src/command.h b/src/command.h index f880998dc..9c20acb7a 100644 --- a/src/command.h +++ b/src/command.h @@ -45,6 +45,7 @@ typedef enum CMD_SCREEN_FILE, CMD_SCREEN_SEARCH, CMD_SCREEN_KEYDEF, + CMD_SCREEN_CLOCK, CMD_SCREEN_HELP, CMD_QUIT } command_t; diff --git a/src/screen.c b/src/screen.c index 7522ad227..d77faf269 100644 --- a/src/screen.c +++ b/src/screen.c @@ -53,6 +53,10 @@ #ifdef ENABLE_KEYDEF_SCREEN extern screen_functions_t *get_screen_keydef(void); #endif +#ifdef ENABLE_CLOCK_SCREEN +extern screen_functions_t *get_screen_clock(void); +#endif + static screen_t *screen = NULL; static screen_functions_t *mode_fn = NULL; @@ -84,6 +88,12 @@ switch_screen_mode(screen_mode_t new_mode, mpd_client_t *c) mode_fn = get_screen_keydef(); break; #endif +#ifdef ENABLE_CLOCK_SCREEN + case SCREEN_CLOCK_WINDOW: + mode_fn = get_screen_clock(); + break; +#endif + default: break; } @@ -578,6 +588,10 @@ screen_init(void) screen->screen_list = g_list_append(screen->screen_list, (gpointer) get_screen_keydef()); #endif +#ifdef ENABLE_CLOCK_SCREEN + screen->screen_list = g_list_append(screen->screen_list, + (gpointer) get_screen_clock()); +#endif list = screen->screen_list; while( list ) @@ -596,6 +610,7 @@ screen_init(void) /* initialize wreadln */ wrln_resize_callback = screen_resize; + wrln_max_history_length = 16; return 0; } @@ -885,13 +900,17 @@ screen_cmd(mpd_client_t *c, command_t cmd) case CMD_SCREEN_KEYDEF: switch_screen_mode(SCREEN_KEYDEF_WINDOW, c); break; +#endif +#ifdef ENABLE_CLOCK_SCREEN + case CMD_SCREEN_CLOCK: + switch_screen_mode(SCREEN_CLOCK_WINDOW, c); + break; #endif case CMD_QUIT: exit(EXIT_SUCCESS); default: break; } - } diff --git a/src/screen.h b/src/screen.h index cb4abc83d..f674b1cff 100644 --- a/src/screen.h +++ b/src/screen.h @@ -18,6 +18,7 @@ typedef enum SCREEN_FILE_WINDOW, SCREEN_HELP_WINDOW, SCREEN_KEYDEF_WINDOW, + SCREEN_CLOCK_WINDOW, SCREEN_SEARCH_WINDOW } screen_mode_t; diff --git a/src/screen_clock.c b/src/screen_clock.c new file mode 100644 index 000000000..57dcac058 --- /dev/null +++ b/src/screen_clock.c @@ -0,0 +1,259 @@ +/* + * This file is based on the 'Grand digital clock' (gdc.c) shipped with + * ncurses. + */ + +#include +#include +#include +#include +#include + +#include "config.h" + +#ifdef ENABLE_CLOCK_SCREEN +#include "ncmpc.h" +#include "libmpdclient.h" +#include "options.h" +#include "mpc.h" +#include "command.h" +#include "screen.h" +#include "screen_utils.h" + +#define YDEPTH 5 +#define BUFSIZE 64 + +#define ENABLE_SECONDS 0 + +static window_t win = { NULL, 0, 0 }; +static gboolean enable_seconds = ENABLE_SECONDS; + +/* orginal variables from gdc.c */ +static short disp[11] = +{ + 075557, 011111, 071747, 071717, 055711, + 074717, 074757, 071111, 075757, 075717, 002020 +}; + +static long older[6], next[6], newer[6], mask; + +static int YBASE = 10; +static int XBASE = 10; +static int XLENGTH = 54; + +/* orginal functions */ +static void +set(int t, int n) +{ + int i, m; + + m = 7 << n; + for (i = 0; i < 5; i++) { + next[i] |= ((disp[t] >> ((4 - i) * 3)) & 07) << n; + mask |= (next[i] ^ older[i]) & m; + } + if (mask & m) + mask |= m; +} + +static void +drawbox(void) +{ + chtype bottom[XLENGTH + 1]; + int n; + + mvwaddch(win.w, YBASE - 1, XBASE - 1, ACS_ULCORNER); + whline(win.w, ACS_HLINE, XLENGTH); + mvwaddch(win.w, YBASE - 1, XBASE + XLENGTH, ACS_URCORNER); + + mvwaddch(win.w, YBASE + YDEPTH, XBASE - 1, ACS_LLCORNER); + mvwinchnstr(win.w, YBASE + YDEPTH, XBASE, bottom, XLENGTH); + for (n = 0; n < XLENGTH; n++) + bottom[n] = ACS_HLINE | (bottom[n] & (A_ATTRIBUTES | A_COLOR)); + mvwaddchnstr(win.w, YBASE + YDEPTH, XBASE, bottom, XLENGTH); + mvwaddch(win.w, YBASE + YDEPTH, XBASE + XLENGTH, ACS_LRCORNER); + + wmove(win.w, YBASE, XBASE - 1); + wvline(win.w, ACS_VLINE, YDEPTH); + + wmove(win.w, YBASE, XBASE + XLENGTH); + wvline(win.w, ACS_VLINE, YDEPTH); +} + + +static void +standt(int on) +{ + if(on) + wattron(win.w, A_REVERSE); + else + wattroff(win.w, A_REVERSE); +} + + + +/* ncmpc screen functions */ + +static void +clock_resize(int cols, int rows) +{ + int j; + + for (j = 0; j < 5; j++) + older[j] = newer[j] = next[j] = 0; + + win.cols = cols; + win.rows = rows; + + if( cols<60 ) + enable_seconds = FALSE; + else + enable_seconds = ENABLE_SECONDS; + + if( enable_seconds ) + XLENGTH = 54; + else + XLENGTH = 54-18; + + + XBASE = (cols-XLENGTH)/2; + YBASE = (rows-YDEPTH)/2-(YDEPTH/2); +} + +static void +clock_init(WINDOW *w, int cols, int rows) +{ + win.w = w; + clock_resize(cols, rows); +} + +static void +clock_exit(void) +{ +} + +static void +clock_open(screen_t *screen, mpd_client_t *c) +{ + int j; + + for (j = 0; j < 5; j++) + older[j] = newer[j] = next[j] = 0; + +} + +static void +clock_close(void) +{ +} + +static char * +clock_title(void) +{ + return _("Music Player Client - Clock"); +} + +static void +clock_update(screen_t *screen, mpd_client_t *c) +{ + time_t now; + struct tm *tm; + long t, a; + int i, j, s, k; + char buf[BUFSIZE]; + + time(&now); + tm = localtime(&now); + + mask = 0; + set(tm->tm_sec % 10, 0); + set(tm->tm_sec / 10, 4); + set(tm->tm_min % 10, 10); + set(tm->tm_min / 10, 14); + set(tm->tm_hour % 10, 20); + set(tm->tm_hour / 10, 24); + set(10, 7); + set(10, 17); + + for (k = 0; k < 6; k++) { + newer[k] = (newer[k] & ~mask) | (next[k] & mask); + next[k] = 0; + for (s = 1; s >= 0; s--) { + standt(s); + for (i = 0; i < 6; i++) { + if ((a = (newer[i] ^ older[i]) & (s ? newer : older)[i]) + != 0) { + for (j = 0, t = 1 << 26; t; t >>= 1, j++) { + if (a & t) { + if (!(a & (t << 1))) { + wmove(win.w, YBASE + i, XBASE + 2 * j); + } + if( enable_seconds || j<18 ) + waddstr(win.w, " "); + } + } + } + if (!s) { + older[i] = newer[i]; + } + } + if (!s) { + wrefresh(win.w); + } + } + } + +#ifdef HAVE_LOCALE_H + strftime(buf, BUFSIZE, "%x", tm); +# else + /* this depends on the detailed format of ctime(3) */ + strcpy(buf, ctime(&now)); + strcpy(buf + 10, buf + 19); +#endif + mvwaddstr(win.w, YBASE+YDEPTH+1, (win.cols-strlen(buf))/2, buf); + + wmove(win.w, 6, 0); + drawbox(); + wrefresh(win.w); +} + +static void +clock_paint(screen_t *screen, mpd_client_t *c) +{ + /* this seems to be a better way to clear the window than wclear() ?! */ + wmove(win.w, 0, 0); + wclrtobot(win.w); + clock_update(screen, c); +} + + + +static int +clock_cmd(screen_t *screen, mpd_client_t *c, command_t cmd) +{ + return 0; +} + + +screen_functions_t * +get_screen_clock(void) +{ + static screen_functions_t functions; + + memset(&functions, 0, sizeof(screen_functions_t)); + functions.init = clock_init; + functions.exit = clock_exit; + functions.open = clock_open; + functions.close = clock_close; + functions.resize = clock_resize; + functions.paint = clock_paint; + functions.update = clock_update; + functions.cmd = clock_cmd; + functions.get_lw = NULL; + functions.get_title = clock_title; + + return &functions; +} + + +#endif diff --git a/src/screen_help.c b/src/screen_help.c index ced66064a..0299d6ca4 100644 --- a/src/screen_help.c +++ b/src/screen_help.c @@ -53,6 +53,9 @@ static help_text_row_t help_text[] = { 0, CMD_SCREEN_HELP, NULL }, { 0, CMD_SCREEN_PLAY, NULL }, { 0, CMD_SCREEN_FILE, NULL }, +#ifdef ENABLE_CLOCK_SCREEN + { 0, CMD_SCREEN_CLOCK, NULL }, +#endif #ifdef ENABLE_KEYDEF_SCREEN { 0, CMD_SCREEN_KEYDEF, NULL }, #endif -- cgit v1.2.3