Files
lcdproc/server/screen.c
T
ppokorny 00cc9fca23 + Changed protocol to 0.3 because we now accept both -foo and foo
as argument introducers.  in 0.4-pre10, these were changed
   from foo to -foo and this broke many clients.  This change
   should fix that and be backward/forward compatible.
 + Added a noop function to the protocol.  This is useful for writing
   shell script clients of LCDproc.
 + Changed the shared sock_send_string function to NOT send the
   ending NUL ('\0') byte with the string.  This was confusing
   in Perl clients which saw NUL's as the first character of
   each reply.  WARNING: The LCDPROC client depended on this
   behavior, your client may too.  Use the newline instead.
   See the code in clients/lcdproc/main.c (look for "switch(buf[i])")
   to see one way to handle this.  This should allow new clients
   to connect to old servers and vice-versa.
 + Messed with include structure in .c files.  It should no longer
   be necessary to specify ../.. to get to shared code headers.
   Also, since we are using automake, the global config.h can be
   found with just #include "config.h" as it's location is included
   in a -I to the compilers.  As a result "make distcheck" now works.
2001-05-25 03:14:27 +00:00

170 lines
2.8 KiB
C

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "shared/debug.h"
#include "drivers/lcd.h"
#include "clients.h"
#include "client_data.h"
#include "widget.h"
#include "screenlist.h"
#include "screen.h"
screen *
screen_create ()
{
screen *s;
s = malloc (sizeof (screen));
if (!s) {
fprintf (stderr, "screen_create: Error allocating new screen\n");
return NULL;
}
s->id = NULL;
s->name = NULL;
s->priority = 128; // Default priority
s->duration = 32; // Default duration (~ 8 seconds)
s->heartbeat = 1;
s->wid = lcd.wid;
s->hgt = lcd.hgt;
s->keys = NULL;
s->parent = NULL;
s->widgets = NULL;
s->widgets = LL_new ();
if (!s->widgets) {
fprintf (stderr, "screen_create: Error allocating widget list\n");
return NULL;
}
return s;
}
int
screen_destroy (screen * s)
{
widget *w;
if (!s)
return -1;
LL_Rewind (s->widgets);
do {
// Free a widget...
w = LL_Get (s->widgets);
widget_destroy (w);
} while (LL_Next (s->widgets) == 0);
LL_Destroy (s->widgets);
if (s->id)
free (s->id);
if (s->name)
free (s->name);
if (s->keys)
free (s->keys);
free (s);
return 0;
}
screen *
screen_find (client * c, char *id)
{
screen *s;
if (!c)
return NULL;
if (!id)
return NULL;
debug ("client_find_screen(%s)\n", id);
LL_Rewind (c->data->screenlist);
do {
s = LL_Get (c->data->screenlist);
if ((s) && (0 == strcmp (s->id, id))) {
debug ("client_find_screen: Found %s\n", id);
return s;
}
} while (LL_Next (c->data->screenlist) == 0);
return NULL;
}
int
screen_add (client * c, char *id)
{
screen *s;
if (!c)
return -1;
if (!id)
return -1;
// Make sure this screen doesn't already exist...
s = screen_find (c, id);
if (s) {
return 1;
}
s = screen_create ();
if (!s) {
fprintf (stderr, "screen_add: Error creating screen\n");
return -1;
}
s->parent = c;
s->id = strdup (id);
if (!s->id) {
fprintf (stderr, "screen_add: Error allocating name\n");
return -1;
}
// TODO: Check for errors here?
LL_Push (c->data->screenlist, (void *) s);
// Now, add it to the screenlist...
if (screenlist_add (s) < 0) {
fprintf (stderr, "screen_add: Error queueing new screen\n");
return -1;
}
return 0;
}
int
screen_remove (client * c, char *id)
{
screen *s;
if (!c)
return -1;
if (!id)
return -1;
// Make sure this screen *does* exist...
s = screen_find (c, id);
if (!s) {
fprintf (stderr, "screen_remove: Error finding screen %s\n", id);
return 1;
}
// TODO: Check for errors here?
LL_Remove (c->data->screenlist, (void *) s);
// Now, remove it from the screenlist...
if (screenlist_remove_all (s) < 0) {
// Not a serious error..
fprintf (stderr, "screen_remove: Error dequeueing screen\n");
return 0;
}
// TODO: Check for errors here too?
screen_destroy (s);
return 0;
}