/*
* serverscreens.c
* This file is part of LCDd, the lcdproc server.
*
* This file is released under the GNU General Public License. Refer to the
* COPYING file distributed with this package.
*
* Copyright (c) 1999, William Ferrell, Scott Scriven
* 2002, Joris Robijn
*
*
* Implements the serverscreens
*
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "shared/report.h"
#include "shared/configfile.h"
#include "drivers/lcd.h"
#include "drivers.h"
#include "clients.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;
int rotate_server_screen = UNSET_INT;
int
server_screen_init(void)
{
Widget *w;
int line;
debug(RPT_DEBUG, "server_screen_init");
/* Create the screen */
server_screen = screen_create("_server_screen", NULL);
if (!server_screen) {
report(RPT_ERR, "server_screen_init: Error allocating screen");
return -1;
}
server_screen->name = "Server screen";
server_screen->duration = RENDER_FREQ; /* 1 second, instead of 4...*/
if ((rotate_server_screen == UNSET_INT) || (rotate_server_screen == 1)) {
server_screen->priority = PRI_INFO;
} else {
server_screen->priority = PRI_BACKGROUND;
}
/* Create all the widgets...*/
for (line = 1; line <= 4; line++) {
char id[8];
sprintf(id, "line%d", line);
w = widget_create(id, WID_STRING, server_screen);
if (!w) {
report(RPT_ERR, "server_screen_init: Can't create a widget");
return -1;
}
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';
}
}
/* And enqueue the screen*/
screenlist_add(server_screen);
debug(RPT_DEBUG, "server_screen_init done");
return 0;
}
int
server_screen_shutdown(void)
{
if (!server_screen)
return -1;
screenlist_remove(server_screen);
screen_destroy(server_screen);
return 0;
}
int
update_server_screen(void)
{
Client *c;
Widget *w;
int num_clients;
int num_screens;
/* Now get info on the number of connected clients...*/
num_clients = clients_client_count();
/* ... and screens */
num_screens = 0;
for (c = clients_getfirst(); c != NULL; c = clients_getnext()) {
num_screens += client_screen_count(c);
}
/* 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,
"Clients: %i", num_clients);
w = screen_find_widget(server_screen, "line3");
snprintf(w->text, MAX_SERVERSCREEN_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);
}
return 0;
}
int
goodbye_screen(void)
{
if (!display_props)
return 0;
drivers_clear();
if (config_has_key("Server", "GoodBye")) { /* custom GoodBye */
int i;
/* loop over all display lines to read config & display message */
for (i = 0; i < display_props->height; i++) {
const char *line = config_get_string("Server", "GoodBye", i, "");
drivers_string(1, 1+i, line);
}
}
else { /* default GoodBye */
if ((display_props->height >= 2) && (display_props->width >= 16)) {
int xoffs = (display_props->width - 16) / 2;
int yoffs = (display_props->height - 2) / 2;
char *top = "Thanks for using";
#ifdef LINUX
char *low = "LCDproc & Linux!";
#else
char *low = " LCDproc! ";
#endif
drivers_string(1+xoffs, 1+yoffs, top);
drivers_string(1+xoffs, 2+yoffs, low);
}
}
drivers_cursor(1, 1, CURSOR_OFF);
drivers_flush();
return 0;
}
syntax highlighted by Code2HTML, v. 0.9.1