aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am6
-rw-r--r--src/command.c8
-rw-r--r--src/command.h1
-rw-r--r--src/screen.c21
-rw-r--r--src/screen.h1
-rw-r--r--src/screen_clock.c259
-rw-r--r--src/screen_help.c3
7 files changed, 294 insertions, 5 deletions
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 <kaw@linux.se>
*
* 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;
}
@@ -886,12 +901,16 @@ screen_cmd(mpd_client_t *c, command_t cmd)
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 <time.h>
+#include <stdlib.h>
+#include <string.h>
+#include <glib.h>
+#include <ncurses.h>
+
+#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