#include #include #include "../shared/LL.h" #include "../shared/sockets.h" #include "../shared/debug.h" #include "screenlist.h" #include "screen.h" #include "clients.h" int screenlist_action=0; int timer=0; LL * screenlist; int screenlist_add_end(screen *screen); screen * screenlist_next_roll(); screen * screenlist_prev_roll(); screen * screenlist_next_priority(); int compare_priority(void *one, void *two); int compare_addresses(void *one, void *two); int screenlist_init() { debug("screenlist_init()\n"); screenlist = LL_new(); if(!screenlist) { fprintf(stderr, "screenlist_init: Error allocating list\n"); return -1; } screenlist_action = 0; timer = 0; return 0; } int screenlist_shutdown() { debug("screenlist_shutdown()\n"); LL_Destroy(screenlist); return 0; } int screenlist_remove(screen *s) { debug("screenlist_remove()\n"); if(!LL_Remove(screenlist, s)) return -1; else return 0; } int screenlist_remove_all(screen *s) { int i=0; debug("screenlist_remove_all()\n"); while(LL_Remove(screenlist, s)) i++; debug("screenlist_remove_all()... got %i\n", i); return i; } LL * screenlist_getlist() { debug("screenlist_getlist()\n"); return screenlist; } screen * screenlist_current() { char str[256]; screen *s; static screen *old_s = NULL; client *c; //debug("screenlist_current:\n"); //LL_dprint(screenlist); s = (screen *)LL_GetFirst(screenlist); // FIXME: Make sure the screen/client exists! if(s != old_s) { debug("screenlist_current: new screen\n"); timer = 0; // Tell the client we're done with the current screen if(old_s) { //debug("screenlist_current: ignoring old screen\n"); LL_Rewind(screenlist); if(old_s != LL_Find(screenlist, compare_addresses, old_s)) { debug("screenlist: Didn't find screen 0x%8x!\n", (int)old_s); } else { //debug("screenlist_current: ... sending ignore\n"); c = old_s->parent; if(c) // Tell the client we're not listening any more... { sprintf(str, "ignore %s\n", old_s->id); sock_send_string(c->sock, str); } else // The server has the display, so do nothing { } //debug("screenlist_current: ... sent ignore\n"); } } if(s) { //debug("screenlist_current: listening to new screen\n"); c = s->parent; if(c) // Tell the client we're paying attention... { sprintf(str, "listen %s\n", s->id); sock_send_string(c->sock, str); } else // The server has the display, so do nothing { } } } old_s = s; //debug("screenlist_current: return %8x\n", s); return s; } int screenlist_add(screen *s) { // TODO: Different queueing modes... return screenlist_add_end(s); } screen * screenlist_next() { screen *s; //debug("Screenlist_next()\n"); s = screenlist_current(); // If we're on hold, don't advance! if(screenlist_action == SCR_HOLD) return s; if(screenlist_action == RENDER_HOLD) return s; // Otherwise, reset it to regular operation screenlist_action = 0; //debug("Screenlist_next: calling handler...\n"); // Call the selected queuing function... // TODO: Different queueing modes... s = screenlist_next_priority(); //s = screenlist_next_roll(); //debug("Screenlist_next() done\n"); return s; } screen * screenlist_prev() { screen *s; s = screenlist_current(); // If we're on hold, don't advance! if(screenlist_action == SCR_HOLD) return s; if(screenlist_action == RENDER_HOLD) return s; // Otherwise, reset it no regular operation screenlist_action = 0; // Call the selected queuing function... // TODO: Different queueing modes... s = screenlist_prev_roll(); return s; } // Adds new screens to the end of the screenlist... int screenlist_add_end(screen *screen) { debug("screenlist_add_end()\n"); return LL_Push(screenlist, (void *)screen); } // Simple round-robin approach to screen cycling... screen * screenlist_next_roll() { //debug("screenlist_next_roll()\n"); if(LL_UnRoll(screenlist) != 0) return NULL; return screenlist_current(); } // Strict priority queue approach... screen * screenlist_next_priority() { //screen *s, *t; //debug("screenlist_next_priority\n"); if(LL_UnRoll(screenlist) != 0) return NULL; LL_Sort(screenlist, compare_priority); return screenlist_current(); } // Simple round-robin approach to screen cycling... screen * screenlist_prev_roll() { //debug("screenlist_prev_roll()\n"); if(LL_Roll(screenlist) != 0) return NULL; return screenlist_current(); } int compare_priority(void *one, void *two) { screen *a, *b; //debug("compare_priority: %8x %8x\n", one, two); if(!one) return 0; if(!two) return 0; a = (screen *)one; b = (screen *)two; //debug("compare_priority: done?\n"); return (a->priority - b->priority); } int compare_addresses(void *one, void *two) { //printf("compare_addresses: 0x%x == 0x%x ???\n", one, two); //if(one == two) printf("Yes!\n"); //else printf("No!\n"); return (one != two); }