diff --git a/ChangeLog b/ChangeLog
index fae7c6c..1ea247c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -6,9 +6,10 @@ Key:
* Something changed / fixed
v.0.5dev (ongoing development)
- * lcdexec: notification when called program finishes
- * xosd driver: offset from top-left corner
-
+ + lcdexec: notification when called program finishes
+ + xosd driver: offset from top-left corner
+ + LCDd: Hello= config option for startup message
+
v.0.5.2 (unreleased)
* fix switching on/off the Load screen in lcdproc client using the menu
* refactor adv_bignum: support height > 4, loadable chars with offset
diff --git a/LCDd.conf b/LCDd.conf
index 0eea2ff..17c3f19 100644
--- a/LCDd.conf
+++ b/LCDd.conf
@@ -78,6 +78,10 @@ User=nobody
# NOTE: Always place a slash as last character !
DriverPath=server/drivers/
+# Hello message: each entry represents a display line; default: builtin
+#Hello=" Welcome to"
+#Hello=" LCDproc!"
+
# GoodBye message: each entry represents a display line; default: builtin
#GoodBye="Thanks for using"
#GoodBye=" LCDproc!"
diff --git a/docs/lcdproc-user/configuration.docbook b/docs/lcdproc-user/configuration.docbook
index 9608db5..f0d78cb 100644
--- a/docs/lcdproc-user/configuration.docbook
+++ b/docs/lcdproc-user/configuration.docbook
@@ -237,6 +237,38 @@ settings for the LCDproc server LCDd.
+
+
+ Hello=
+ HELLOMSG
+
+
+
+ Define the startup message printed on the screen when LCDd starts.
+ This message will stay on the screen until a client connects.
+ If not given, it defaults to the builtin server screen that tells
+ how many clients are connected and how many screens these clients
+ are using in total.
+ If it is given, each Hello= directive represents
+ a line on the display.
+
+
+ The HELLOMSGs will be printed on
+ the display one after each other starting on the beginning of each line.
+ So, the definition of
+
+ Hello=" Welcome to"
+ Hello=" LCDproc!"
+
+ prints a nice 2-line welcome message to the display.
+
+
+ To simply disable the default builtin message, and leave the screen blank
+ a single Hello="" suffices.
+
+
+
+
GoodBye=
@@ -270,7 +302,6 @@ settings for the LCDproc server LCDd.
-
diff --git a/server/serverscreens.c b/server/serverscreens.c
index ad722c9..6fdb226 100644
--- a/server/serverscreens.c
+++ b/server/serverscreens.c
@@ -7,6 +7,7 @@
*
* Copyright (c) 1999, William Ferrell, Scott Scriven
* 2002, Joris Robijn
+ * 2007, Peter Marschall
*
*
* Implements the serverscreens
@@ -24,21 +25,17 @@
#include "shared/report.h"
#include "shared/configfile.h"
-#include "drivers/lcd.h"
#include "drivers.h"
#include "clients.h"
+#include "render.h"
#include "screen.h"
#include "screenlist.h"
#include "widget.h"
#include "main.h"
#include "serverscreens.h"
-#define UNSET_INT -1
-#define MAX_SERVERSCREEN_WIDTH 40
-
-
-Screen *server_screen;
+Screen *server_screen = NULL;
int rotate_server_screen = UNSET_INT;
@@ -46,7 +43,8 @@ int
server_screen_init(void)
{
Widget *w;
- int line;
+ int i;
+ int has_hello_msg = config_has_key("Server", "Hello");
debug(RPT_DEBUG, "server_screen_init");
@@ -58,6 +56,7 @@ server_screen_init(void)
}
server_screen->name = "Server screen";
server_screen->duration = RENDER_FREQ; /* 1 second, instead of 4...*/
+ server_screen->heartbeat = (has_hello_msg) ? HEARTBEAT_OFF : HEARTBEAT_OPEN;
if ((rotate_server_screen == UNSET_INT) || (rotate_server_screen == 1)) {
server_screen->priority = PRI_INFO;
@@ -66,9 +65,9 @@ server_screen_init(void)
}
/* Create all the widgets...*/
- for (line = 1; line <= 4; line++) {
+ for (i = 0; i < display_props->height; i++) {
char id[8];
- sprintf(id, "line%d", line);
+ sprintf(id, "line%d", i+1);
w = widget_create(id, WID_STRING, server_screen);
if (!w) {
@@ -77,14 +76,24 @@ server_screen_init(void)
}
screen_add_widget(server_screen, w);
w->x = 1;
- w->y = line;
- w->text = malloc(MAX_SERVERSCREEN_WIDTH+1);
- if (line == 1) {
- w->type = WID_TITLE;
- strncpy(w->text, "LCDproc Server", MAX_SERVERSCREEN_WIDTH);
- } else {
- w->text[0] = '\0';
+ w->y = i+1;
+ w->text = calloc(LCD_MAX_WIDTH+1, 1);
+
+ /* depending on Hello in LCDd.conf set the widgets */
+ if (has_hello_msg) {
+ const char *line = config_get_string("Server", "Hello", i, "");
+
+ strncpy(w->text, line, LCD_MAX_WIDTH);
+ w->text[LCD_MAX_WIDTH] = '\0';
}
+ else {
+ if (i == 0) {
+ w->type = WID_TITLE;
+ strncpy(w->text, "LCDproc Server", LCD_MAX_WIDTH);
+ } else {
+ w->text[0] = '\0';
+ }
+ }
}
/* And enqueue the screen*/
@@ -113,10 +122,27 @@ update_server_screen(void)
Widget *w;
int num_clients;
int num_screens;
+ static int use_default = 0;
/* Now get info on the number of connected clients...*/
num_clients = clients_client_count();
+ /* turn off the Hello message after the first client onnected */
+ if (!use_default && config_has_key("Server", "Hello")) {
+ if (num_clients != 0) {
+ if (!use_default) {
+ server_screen->heartbeat = HEARTBEAT_OPEN;
+
+ w = screen_find_widget(server_screen, "line1");
+ w->type = WID_TITLE;
+ strncpy(w->text, "LCDproc Server", LCD_MAX_WIDTH);
+ }
+ use_default = 1;
+ }
+ if (!use_default)
+ return 0;
+ }
+
/* ... and screens */
num_screens = 0;
for (c = clients_getfirst(); c != NULL; c = clients_getnext()) {
@@ -126,18 +152,25 @@ update_server_screen(void)
/* Format strings for the appropriate size display... */
if (display_props->height >= 3) {
w = screen_find_widget(server_screen, "line2");
- snprintf(w->text, MAX_SERVERSCREEN_WIDTH,
+ if (w != NULL) {
+ snprintf(w->text, LCD_MAX_WIDTH,
"Clients: %i", num_clients);
+ }
+
w = screen_find_widget(server_screen, "line3");
- snprintf(w->text, MAX_SERVERSCREEN_WIDTH,
+ if (w != NULL) {
+ snprintf(w->text, LCD_MAX_WIDTH,
"Screens: %i", num_screens);
+ }
} else {
w = screen_find_widget(server_screen, "line2");
- snprintf(w->text, MAX_SERVERSCREEN_WIDTH,
- ((display_props->width >= 16)
- ? "Cli: %i Scr: %i"
- : "C: %i S: %i"),
- num_clients, num_screens);
+ if (w != NULL) {
+ snprintf(w->text, LCD_MAX_WIDTH,
+ ((display_props->width >= 16)
+ ? "Cli: %i Scr: %i"
+ : "C: %i S: %i"),
+ num_clients, num_screens);
+ }
}
return 0;
}