From 4a208f73cdc30fbd0f6f3b700469d0fa1ab2e646 Mon Sep 17 00:00:00 2001 From: Andrej Shadura Date: Mon, 7 Jan 2019 13:03:16 +0100 Subject: Import Upstream version 0.7.0 --- src/config.h | 15 +++ src/osdctl/Makefile | 17 +++ src/osdctl/osdctl.c | 146 ++++++++++++++++++++++++++ src/osdctl/osdctl.h | 3 + src/osdsh/Makefile | 48 +++++++++ src/osdsh/apmwatch.c | 140 +++++++++++++++++++++++++ src/osdsh/clockdisplay.c | 100 ++++++++++++++++++ src/osdsh/connectionwatch.c | 171 ++++++++++++++++++++++++++++++ src/osdsh/controlsh.c | 248 ++++++++++++++++++++++++++++++++++++++++++++ src/osdsh/mixerwatch.c | 161 ++++++++++++++++++++++++++++ src/osdsh/osdsh.c | 175 +++++++++++++++++++++++++++++++ src/osdsh/osdsh.h | 44 ++++++++ src/osdsh/utils.c | 97 +++++++++++++++++ 13 files changed, 1365 insertions(+) create mode 100644 src/config.h create mode 100644 src/osdctl/Makefile create mode 100644 src/osdctl/osdctl.c create mode 100644 src/osdctl/osdctl.h create mode 100644 src/osdsh/Makefile create mode 100644 src/osdsh/apmwatch.c create mode 100644 src/osdsh/clockdisplay.c create mode 100644 src/osdsh/connectionwatch.c create mode 100644 src/osdsh/controlsh.c create mode 100644 src/osdsh/mixerwatch.c create mode 100644 src/osdsh/osdsh.c create mode 100644 src/osdsh/osdsh.h create mode 100644 src/osdsh/utils.c (limited to 'src') diff --git a/src/config.h b/src/config.h new file mode 100644 index 0000000..0a4dfa5 --- /dev/null +++ b/src/config.h @@ -0,0 +1,15 @@ +#define VERSION "0.7.0" +#define FONT "-*-lucidatypewriter-bold-*-*-*-*-240-*-*-*-*-*-*" +#define TIMEOUT 5 +#define COLOR "green" +#define OSD_ALIGNMENT XOSD_left +#define OSD_POSITION XOSD_top +#define MIXER "/dev/mixer" +#define SHADOW_OFFSET 0 +#define DEFAULT_OFFSET 0 +#define CLOCK_FORMAT "%a %b %e %G - %H : %M : %S" +#define OSD_FIFO_PATH "/tmp/osdsh" +#define PPP_DEVICE "ppp0" +#define PPP_PID_PATH "/var/run" +#define PLUGINSDIR "/usr/local/lib/osdsh" +#define MAX_PLUGINS 20 diff --git a/src/osdctl/Makefile b/src/osdctl/Makefile new file mode 100644 index 0000000..fa11d8e --- /dev/null +++ b/src/osdctl/Makefile @@ -0,0 +1,17 @@ +CC = gcc +PREFIX = /usr +BINDIR = $(PREFIX)/bin +DOCDIR = $(PREFIX)/doc/osdsh +LIBDIR = -L/usr/X11R6/lib -L/usr/lib +LIBS = $(LIBDIR) +CFLAGS = -O3 + + +all: osdctl + +osdctl: + gcc $(LIBDIR) $(LIBS) $(CFLAGS) -o $@ $@.c + +clean: + rm osdctl + diff --git a/src/osdctl/osdctl.c b/src/osdctl/osdctl.c new file mode 100644 index 0000000..6792e19 --- /dev/null +++ b/src/osdctl/osdctl.c @@ -0,0 +1,146 @@ +#include "osdctl.h" +#include "../config.h" + +/* ============================ usage () =================================== */ +void usage(const int exitcode, const char *error, const char *more) +{ + fprintf(stderr, "osdctl %s\n", VERSION); + fprintf(stderr, "osdctl ...\n\n"); + fprintf(stderr, " -h display help\n"); + fprintf(stderr, " -s \"string\" display a string\n"); + fprintf(stderr, " -b (name,val) display a bar up to val, named \"name\"\n"); + fprintf(stderr, " -l (name,val) display a slider at val, named \"name\"\n"); + fprintf(stderr, " -t int display the clock for int seconds\n"); + fprintf(stderr, " -c <0|1> (de)activate the osd clock\n"); + fprintf(stderr, " -m <0|1> (de)activate the mixer display\n"); + fprintf(stderr, " -p <0|1> (de)activate the ppp watch feature\n"); + fprintf(stderr, " -a <0|1|2> (de)activate the apm watch feature\n"); + fprintf(stderr, " 1=don't show percent bar; 2=do show it\n"); + fprintf(stderr, " -d interface set the ppp interface, default: ppp0\n"); + fprintf(stderr, " -A int show battery status for int seconds\n"); + fprintf(stderr, " -e \"comm args\" tell osdsh to do \"comm\" with \"args\"\n"); + fprintf(stderr, " -S \"scriptfile\" execute commands form scriptfile\n"); + fprintf(stderr, " -x tell osdsh to quit\n\n"); + if (error) + fprintf(stderr, "%s: %s\n\n", error, more); + exit(exitcode); +} + +/* ============================= function prototypes ======================= */ +void send_command(char command[BUFSIZ]); +void script_file(char file[PATH_MAX]); +int main(int argc, char *argv[]); + +/*================================= send_command() ========================= */ +void send_command(char command[BUFSIZ]) +{ + FILE *fp; + char fifo_file[PATH_MAX]; + + if (strcmp(command, "")==0) + return; + + sprintf(fifo_file, "%s.%d", OSD_FIFO_PATH, getuid()); + + if((fp = fopen(fifo_file, "w")) == NULL) { + perror("Couldn't open fifo"); + exit(1); + } + + fputs(command, fp); + + fclose(fp); + +} +/*============================= script_file() =========================*/ +void script_file(char file[PATH_MAX]) +{ + char readbuffer[BUFSIZ]; + FILE *fp; + + if((fp = fopen(file, "r")) == NULL) { + perror("Couldn't find script file"); + exit(1); + } + while (fgets(readbuffer, BUFSIZ, fp)) { + send_command(readbuffer); + } + fclose(fp); +} +/* ============================ main () ============================== */ +int main(int argc, char *argv[]) +{ + char c; + char command[BUFSIZ]; + int opt_index = 0; + struct option opts[] = { + {"help", 0, 0, 'h'}, + {"string", 1, 0, 's'}, + {"bars", 1, 0, 'b'}, + {"slider", 1, 0, 'l'}, + {"flashtime", 1, 0, 't'}, + {"clock", 1, 0, 'c'}, + {"mixer", 1, 0, 'm'}, + {"execute", 1, 0, 'e'}, + {"exit", 0, 0, 'x'}, + {"script", 1, 0, 'S'}, + {"apm-watch", 1, 0, 'a'}, + {"apm-show", 1, 0, 'A'}, + {"ppp-watch", 1, 0, 'p'}, + {"ppp-dev", 1, 0, 'd'}, + }; + if (argc == 1) + usage(0, NULL, NULL); + while ((c = getopt_long(argc, argv, "hxs:b:l:t:c:m:e:S:p:d:a:A:", opts, &opt_index)) >= 0) { + switch (c) { + case 'h': + usage(0, NULL, NULL); + exit(0); + case 's': + sprintf(command, "strn(%s)", optarg); + break; + case 'b': + sprintf(command, "bars(%s)", optarg); + break; + case 'l': + sprintf(command, "slid(%s)", optarg); + break; + case 't': + sprintf(command, "time(%s)", optarg); + break; + case 'c': + sprintf(command, "clck(%s)", optarg); + break; + case 'm': + sprintf(command, "mixr(%s)", optarg); + break; + case 'e': + sprintf(command, "%s", optarg); + break; + case 'x': + sprintf(command, "exit()"); + break; + case 'S': + sprintf(command, ""); + script_file(optarg); + break; + case 'p': + sprintf(command, "pppw(%s)", optarg); + break; + case 'd': + sprintf(command, "pdev(%s)", optarg); + break; + case 'a': + sprintf(command, "apmw(%s)", optarg); + break; + case 'A': + sprintf(command, "apms(%s)", optarg); + break; + default: + usage(1, NULL, NULL); + exit(1); + } + send_command(command); + } + return(0); +} diff --git a/src/osdctl/osdctl.h b/src/osdctl/osdctl.h new file mode 100644 index 0000000..4fcdb48 --- /dev/null +++ b/src/osdctl/osdctl.h @@ -0,0 +1,3 @@ +#include +#include +#include diff --git a/src/osdsh/Makefile b/src/osdsh/Makefile new file mode 100644 index 0000000..d0f28ca --- /dev/null +++ b/src/osdsh/Makefile @@ -0,0 +1,48 @@ +CC = gcc +PREFIX = /usr +BINDIR = $(PREFIX)/bin +DOCDIR = $(PREFIX)/doc/osdsh +LIBDIR = -L/usr/X11R6/lib -L/usr/lib +LIBS = $(LIBDIR) -lxosd -lpthread +CFLAGS = -O3 + +#APMOBJS = apmwatch.o +#APMLIBS = -lapm +#APM=1 + +OBJS = controlsh.o utils.o + +all: osdsh libs + +libs: libosdshclock.so libosdshmixer.so libosdshapm.so libosdshnet.so + +%.o: %.c + + gcc -c $< + +osdsh: $(OBJS) + gcc -c $(CFLAGS) $@.c + gcc $(CFLAGS) -o $@ osdsh.o $(OBJS) $(LIBS) –ldl + +clean: libclean + rm osdsh + rm *.o + +libclean: + rm libosdsh*.so + +libosdshclock.so: + gcc -fPIC -c clockdisplay.c + gcc -shared -o $@ clockdisplay.o utils.o + +libosdshmixer.so: + gcc -fPIC -c mixerwatch.c + gcc -shared -o $@ mixerwatch.o utils.o + +libosdshapm.so: + gcc -fPIC -c apmwatch.c + gcc -shared -o $@ apmwatch.o utils.o -lapm + +libosdshnet.so: + gcc -fPIC -c connectionwatch.c + gcc -shared -o $@ connectionwatch.o utils.o diff --git a/src/osdsh/apmwatch.c b/src/osdsh/apmwatch.c new file mode 100644 index 0000000..5c5f424 --- /dev/null +++ b/src/osdsh/apmwatch.c @@ -0,0 +1,140 @@ +#include "osdsh.h" +#include "../config.h" +#include +#define IAM 2 +#define MYNAME "APM / Battery" + +settings_t apmset; +void *apm_watch(void *arg); + +/* ========================================================================== + ====================== REQUIERED STUFF FOR PLUGINS ======================= + ========================================================================== + +***** ID of the plugin, contact me before you asign this to your plugin!! ***** +*/ + +int whoami(void) { + return IAM; +} + +/* Return a pointer to the name of the plugin */ +char *mynameis() { + char *a = MYNAME; + return a; +} + +/* This function sets the default (initual) values for our osd */ +void initialize_myosd() { + set_defaults(&apmset); +} + +/* This function takes a command and arguments, if the command is ours, execute + it and return 1, if not, return 0*/ + +int isitmine( char command[BUFSIZ], char arg_first[BUFSIZ], + char arg_secound[BUFSIZ]) +{ + int i=1; + + if(strcmp(command, "stop")==0) { + apmset.displaying = 0; + } + else if(strcmp(command, "start")==0) { + if(!apmset.displaying) { + apmset.displaying = 1; + pthread_create(&apmset.mythread, NULL, apm_watch, NULL); + } + } + else if (strcmp(command, "apmw")==0) { + if (atoi(arg_first)) { + isitmine("start", NULL, NULL); + } + else { + apmset.displaying = 0; + } + } + else if (strcmp(command, "apms")==0) { + isitmine("start", NULL, NULL); + sleep(atoi(arg_first)); + apmset.displaying = 0; + } + else if (strcmp(command, "sapm")==0) { + control_options(&apmset, arg_first, arg_secound); + } + else { + i = 0; + } + return i; +} + +/*=============================apm_watch()=========================== */ +/* some ideas (shamelessly copied ) from apmd's "apm" utility*/ +void *apm_watch(void *arg) +{ + int secs; + apm_info i; + char battery[255]; + char remainingtime[255]; + char report1[255]; + + apmset.myosd = xosd_create(2); + initialize_osd(&apmset); + + while(apmset.displaying) { + if (apm_read(&i)) + { + /*fprintf(stderr, "Cannot read APM information\n");*/ + apmset.displaying = 0; + xosd_display(apmset.myosd, apmset.position==XOSD_bottom?1:0, XOSD_string, + "Cannot read APM information"); + break; + } + secs = i.using_minutes ? i.battery_time * 60 : i.battery_time; + if (i.battery_flags != 0xff /* Have a 1.1 BIOS and a system battery. ?????? */ + && i.battery_flags & 0x80) { + sprintf(battery, "no system battery"); + } + else { + switch (i.battery_status) { + case 0: + sprintf(battery, "high"); + xosd_set_colour(apmset.myosd, apmset.color); + break; + case 1: + sprintf(battery, "low"); + xosd_set_colour(apmset.myosd, "yellow"); + break; + case 2: + sprintf(battery, "critical!!"); + xosd_set_colour(apmset.myosd, "red"); + break; + case 3: + sprintf(battery, "charging..."); + break; + } + + } + if (strcmp(battery, "no system battery")==0) { + xosd_display(apmset.myosd, apmset.position==XOSD_bottom?1:0, XOSD_string, + "AC on line"); + xosd_display(apmset.myosd, apmset.position==XOSD_bottom?0:1, XOSD_string, battery); + } + else { + sprintf(remainingtime, "%dhr, %dmin, %dsec", + secs/3600, + (secs%3600)/60, + ((secs%3600)%60)%60); + sprintf(report1, "AC: %s Remaining battery: %d%%(%s) %s", + i.ac_line_status?"on line":"off line",i.battery_percentage, + remainingtime, battery); + + xosd_display(apmset.myosd, 0, XOSD_string, report1); + if (apmset.displaying > 1) + xosd_display(apmset.myosd, 1, XOSD_percentage, i.battery_percentage ); + else + xosd_display(apmset.myosd, 1, XOSD_string, ""); + } + } + pthread_exit(0); +} diff --git a/src/osdsh/clockdisplay.c b/src/osdsh/clockdisplay.c new file mode 100644 index 0000000..ca057b3 --- /dev/null +++ b/src/osdsh/clockdisplay.c @@ -0,0 +1,100 @@ +#include "../config.h" +#include "osdsh.h" +#define IAM 1 +#define MYNAME "Clock" + +char clockformat[255] = CLOCK_FORMAT; + +void *osdsh_clock(void *arg); +settings_t clocksetts; + +/*================================clock_display() ========================== */ +/* got the ideas from osd_clock */ + + +/* ========================================================================== + ====================== REQUIERED STUFF FOR PLUGINS ======================= + ========================================================================== + +***** ID of the plugin, contact me before you asign this to your plugin!! ***** +*/ +int whoami(void) { + return IAM; +} + +/* Return a pointer to the name of the plugin */ +char *mynameis() { + char *a = MYNAME; + return a; +} + +/* This function sets the default (initual) values for our osd */ +void initialize_myosd() { + set_defaults(&clocksetts); +} + +/* This function takes a command and arguments, if the command is ours, execute + it and return 1, if not, return 0*/ + +int isitmine( char command[BUFSIZ], char arg_first[BUFSIZ], + char arg_secound[BUFSIZ]) +{ + int i=1; + + if(strcmp(command, "stop")==0) { + clocksetts.displaying = 0; + } + else if(strcmp(command, "start")==0) { + if(!clocksetts.displaying) { + clocksetts.displaying = 1; + pthread_create(&clocksetts.mythread, NULL, osdsh_clock, NULL); + } + } + else if (strcmp(command, "clkf")==0) { + strcpy(clockformat ,arg_first); + } + else if (strcmp(command, "clck")==0) { + if (atoi(arg_first)) { + isitmine("start", NULL, NULL); + } + else { + clocksetts.displaying = 0; + } + } + else if (strcmp(command, "time")==0) { + if (atoi(arg_first)) + isitmine("start", NULL, NULL); + sleep(atoi(arg_first)); + clocksetts.displaying = 0; + } + else if (strcmp(command, "sclk")==0) { + control_options(&clocksetts, arg_first, arg_secound); + } + else { + i = 0; + } + return i; +} + +/*The functtion to call when we start our plugin... this sould be called by a +pthread(...) call so it won't block the whole program*/ + +void *osdsh_clock(void *arg) +{ + time_t currenttime; + char timestring[255]; + + clocksetts.myosd = xosd_create(1); + initialize_osd(&clocksetts); + clocksetts.displaying = 1; + + while (clocksetts.displaying) { + currenttime = time(0); + + strftime(timestring, 255, clockformat, localtime(¤ttime)); + + xosd_display(clocksetts.myosd, 0, XOSD_string, timestring); + } + xosd_destroy(clocksetts.myosd); + pthread_exit(0); +} diff --git a/src/osdsh/connectionwatch.c b/src/osdsh/connectionwatch.c new file mode 100644 index 0000000..804eaa1 --- /dev/null +++ b/src/osdsh/connectionwatch.c @@ -0,0 +1,171 @@ +#include "osdsh.h" +#include "../config.h" +#define IAM 3 +#define MYNAME "Net" + +settings_t pppset; +void *connection_watch(void *arg); + +char pppdevice[PATH_MAX+1]; +char connecting1[BUFSIZ+1]; +char connecting2[BUFSIZ+1]; +char connected1[BUFSIZ+1]; +char connected2[BUFSIZ+1]; +char disconnected[BUFSIZ+1]; +char timeconnected[255]; + +/* ========================================================================== + ====================== REQUIERED STUFF FOR PLUGINS ======================= + ========================================================================== + +***** ID of the plugin, contact me before you asign this to your plugin!! ***** +*/ + +int whoami(void) { + return IAM; +} + +/* Return a pointer to the name of the plugin */ +char *mynameis() { + char *a = MYNAME; + return a; +} + +/* This function sets the default (initual) values for our osd */ +void initialize_myosd() { + set_defaults(&pppset); +} + +/* This function takes a command and arguments, if the command is ours, execute + it and return 1, if not, return 0*/ + +int isitmine( char command[BUFSIZ], char arg_first[BUFSIZ], + char arg_secound[BUFSIZ]) +{ + int i=1; + + if(strcmp(command, "stop")==0) { + pppset.displaying = 0; + } + else if(strcmp(command, "start")==0) { + if(!pppset.displaying) { + pppset.displaying = 1; + pthread_create(&pppset.mythread, NULL, connection_watch, NULL); + } + } + else if (strcmp(command, "pppw")==0) { + if (atoi(arg_first)) { + isitmine("start", NULL, NULL); + } + else { + pppset.displaying = 0; + } + } + else if (strcmp(command, "sppp")==0) { + control_options(&pppset, arg_first, arg_secound); + } + else if (strcmp(command, "pdev")==0) { + sprintf(pppdevice, "%s", arg_first); + } + else if (strcmp(command, "connecting")==0) { + sprintf(connecting1, "%s", arg_first); + sprintf(connecting2, "%s", arg_secound); + } + else if (strcmp(command, "connected")==0) { + sprintf(connected1, "%s", arg_first); + sprintf(connected2, "%s", arg_secound); + } + else if (strcmp(command, "disconnected")==0) { + sprintf(disconnected, "%s", arg_first); + } + else if (strcmp(command, "showconntime")==0) { + xosd_display(pppset.myosd, 0, XOSD_string, "Connected for"); + xosd_display(pppset.myosd, 1, XOSD_string, timeconnected); + } + else { + i = 0; + } + return i; +} + + +/*=============================connection_watch()=========================== */ +/* some ideas from ppptime */ +void *connection_watch(void *arg) +{ + FILE *fp; + int ppp0run; + + long start; + long end; + int total; + struct stat st; + + char ppp0pidfile[PATH_MAX]; + + pppset.myosd = xosd_create(2); + initialize_osd(&pppset); + + if(strcmp(pppdevice, "")==0) + sprintf(pppdevice, "%s", PPP_DEVICE); + + sprintf(ppp0pidfile, "%s/%s.pid", PPP_PID_PATH, pppdevice); + + if (strcmp(connecting1, "")==0) + sprintf(connecting1, "Connecting"); + if (strcmp(connecting2, "")==0) + sprintf(connecting2, "please wait..."); + + if (strcmp(connected1, "")==0) + sprintf(connected1, "Connected"); + if (strcmp(connected2, "")==0) + sprintf(connected2, "GO!"); + + if (strcmp(disconnected, "")==0) + sprintf(disconnected, "Connection terminated"); + + while (pppset.displaying) { + + xosd_display(pppset.myosd, 0, XOSD_string, connecting1); + xosd_display(pppset.myosd, 1, XOSD_string, connecting2); + + sprintf(ppp0pidfile, "%s/%s.pid", PPP_PID_PATH, pppdevice); + + if((fp=fopen(ppp0pidfile, "r"))==NULL) { + ppp0run = 0; + } + else { + ppp0run = 1; + fclose(fp); + } + + if(ppp0run) { + xosd_display(pppset.myosd,0, XOSD_string, connected1); + xosd_display(pppset.myosd,1, XOSD_string, connected2); + + stat(ppp0pidfile, &st); + start = st.st_mtime; + + while((fp=fopen(ppp0pidfile, "r"))!=NULL) { + fclose(fp); + end = time(0); + total = end - start; + sprintf(timeconnected, "Connected for %d hr %d min %d sec", + ((total/60)/60)%100, (total/60)%60, total%60); + usleep(3); + } + end = time(0); + total = end - start; + sprintf(timeconnected, "Disconnected after %d hr %d min %d sec", + ((total/60)/60)%100, (total/60)%60, total%60); + + xosd_display(pppset.myosd,0, XOSD_string, disconnected); + xosd_display(pppset.myosd,1, XOSD_string, timeconnected); + + pppset.displaying = 0; + } + } + sleep(1); + xosd_destroy(pppset.myosd); + pthread_exit(0); +} diff --git a/src/osdsh/controlsh.c b/src/osdsh/controlsh.c new file mode 100644 index 0000000..de637db --- /dev/null +++ b/src/osdsh/controlsh.c @@ -0,0 +1,248 @@ +#include "osdsh.h" +#include "../config.h" + + int n=0; + plugininfo_t plugins[MAX_PLUGINS]; + settings_t settings; + +/* ================================== load a plugin ============================= */ +int load_plugin( char pluginfile[255]) +{ + int (*info)(); + void *module; + int a; + + char file[PATH_MAX+256]; + char *msg = NULL; + + +/* getcwd(file, PATH_MAX); + strcat(file, "/"); +*/ + strcat(file, pluginfile); + + module = dlopen(pluginfile, RTLD_NOW); + + if(!module) { + msg = dlerror(); + if(msg != NULL) { + fprintf(stderr, "%s\n", msg); + a = -1; + } + } + else { + info = dlsym(module, "whoami"); + a = info(); + + info = dlsym(module, "initialize_myosd"); + info(); + + plugins[a].isitmine = dlsym(module, "isitmine"); + + info = dlsym(module, "mynameis"); + + plugins[a].module = module; + plugins[a].whoami = a; + plugins[a].file = file; + plugins[a].myname = (char *) info(); + plugins[a].active = 1; + } + return a; +} + /* =========================== close a plugin ===============================*/ + +/* +int close_plugin( int a) +{ + char report[255]; + + if(dlclose(plugins[a].module)) { + sprintf(report, "Error while unloading %s", plugins[a].myname); + plugins[a].displaying = 1; + return -1; + } + else { + sprintf(report, "Successfully unloaded %s", plugins[a].myname); + plugins[a].displaying = 0; + return 0; + } + xosd_display(settings.myosd, 0, XOSD_string, report); + xosd_display(settings.myosd, 1, XOSD_string, ""); +} +*/ + + +/*============================ display_stuff()=============================== */ +void display_stuff(char command[BUFSIZ], char arguments[BUFSIZ]) +{ + char c; + char arg_first[BUFSIZ]; + char arg_secound[BUFSIZ]; + int a,i; + + sprintf(arg_first, ""); + sprintf(arg_secound, ""); + + /* separate the arguments in sub_arguments .... or not?*/ + i=0; + a=0; + while ((c=arguments[i])!=','&&c!='\n'&&c!='\0') { + if (c=='\\') { + i++; + arg_first[a] = arguments[i]; + } + else { + arg_first[a] = c; + } + a++; + i++; + } + arg_first[a] = '\0'; + i++; + a = 0; + + while((c=arguments[i])!='\n'&&c!='\0'&&c!=')') { + if (c=='\\') { + i++; + arg_secound[a] = arguments[i]; + } + else { + arg_secound[a] = c; + } + a++; + i++; + } + arg_secound[a] = '\0'; + + /* done with the arguments */ + + if (strcmp(command, "load")==0) { + +/* + for(i=0;i=0) { + if(a>n&&a, with some ideas, and slightly +(one or two chars) modified by me*/ + +/* ============================ initialize_vols () ========================= */ +void initialize_vols( int devmask) +{ + int i; + int volume; + for (i=0;i> 8) & 0xff)) { + xosd_display(mixerset.myosd, mixerset.position, XOSD_bottom, "Muted"); + xosd_display(mixerset.myosd, !mixerset.position, XOSD_bottom, ""); + } + /* not muted, so lets check if the vol changed, if so, display + them, if not, just ignore it*/ + else if (vol[channel] != old_vol[channel]) { + xosd_display(mixerset.myosd, 0, XOSD_string, channel_name); + xosd_display(mixerset.myosd, 1, XOSD_percentage, + (((vol[channel]>>8)&0xff)+vol[channel]&0xff)/2); + } +} + +/*================================= mixer_watch() ============================*/ +void *mixer_watch(void *arg) +{ + int devmask; + int i; + /* we open the osd for the mixer*/ + /* Mixer usually goes on the bottom of the screen... so*/ + + mixerset.position = XOSD_bottom; + + mixerset.myosd = xosd_create(2); + initialize_osd(&mixerset); + + /*open the mixer device for reading*/ + + if ((dev = open(mixerdevice, O_RDWR)) < 0) { + perror("Error opening"); + perror(mixerdevice); + pthread_exit(0); + } + if (ioctl(dev, SOUND_MIXER_READ_DEVMASK, &devmask) == -1) { + perror("Error reading"); + perror(mixerdevice); + pthread_exit(0); + } + /*initialize the volume.....*/ + initialize_vols(devmask); + + while(mixerset.displaying) { + for (i=0;i position of the osd, 0 for bottom,\n"); + fprintf(stderr, " 1 for top. Default 1 (top).\n"); + fprintf(stderr, " -a <0|1|2> align of the osd. left,center or right.\n"); + fprintf(stderr, " -n number set the nice number so osdsh won't eat your cpu\n"); + fprintf(stderr, "\n"); + if (error) + fprintf(stderr, "%s: %s\n\n", error, more); + exit(exitcode); +} + + + +/* ============================ parse_args () ============================== */ +void parse_args(int argc, char *argv[], settings_t * settings) +{ + char c; + int opt_index = 0; + struct option opts[] = { + {"help", 0, 0, 'h'}, + {"position", 1, 0, 'p'}, + {"soffset", 1, 0, 'o'}, + {"mixer", 1, 0, 'm'}, + {"font", 1, 0, 'f'}, + {"color", 1, 0, 'c'}, + {"delay", 1, 0, 'd'}, + {"align", 1, 0, 'a'}, + {"nice", 1, 0, 'n'} + }; + while ((c = getopt_long(argc, argv, "hm:f:c:p:d:o:n:", opts, &opt_index)) >= 0) { + switch (c) { + case 'h': + usage(0, NULL, NULL); + exit(0); + case 'f': + strncpy(settings->font, optarg, BUFSIZ); + settings->font[BUFSIZ] = '\0'; + break; + case 'c': + strncpy(settings->color, optarg, BUFSIZ); + settings->color[BUFSIZ] = '\0'; + break; + case 'p': + settings->position = atoi(optarg); + break; + case 'a': + settings->align = atoi(optarg); + break; + case 'd': + settings->delay = atoi(optarg); + break; +/* + case 'm': + strncpy(messages.mixerdevice, optarg, BUFSIZ); + messages.mixerdevice[PATH_MAX+1] = '\0'; + break; +*/ + case 'o': + settings->soffset = atoi(optarg); + break; + case 'n': + nice(atoi(optarg)); + break; + default: + usage(1, NULL, NULL); + exit(1); + } + } +} + +void load_basic_plugins(void) { + int a; + char file[PATH_MAX+255]; + + sprintf(file, "%s/libosdshmixer.so", PLUGINSDIR); + a = load_plugin(file); + if (a<0) { + xosd_display(settings.myosd, 0, XOSD_string, "No Mixer Support"); + xosd_display(settings.myosd, 1, XOSD_string, ""); + } + + sprintf(file, "%s/libosdshclock.so", PLUGINSDIR); + a = load_plugin(file); + if (a<0) { + xosd_display(settings.myosd, 0, XOSD_string, "No Clock Support"); + xosd_display(settings.myosd, 1, XOSD_string, ""); + } + + sprintf(file, "%s/libosdshnet.so", PLUGINSDIR); + a = load_plugin(file); + if (a<0) { + xosd_display(settings.myosd, 0, XOSD_string, "No Net Support"); + xosd_display(settings.myosd, 1, XOSD_string, ""); + } + + sprintf(file, "%s/libosdshapm.so", PLUGINSDIR); + a = load_plugin(file); + if (a<0) { + xosd_display(settings.myosd, 0, XOSD_string, "No APM/Battery support"); + xosd_display(settings.myosd, 1, XOSD_string, ""); + } +} + +/* ============================ main () ==================================== */ + +int main(int argc, char *argv[], char *env[]) +{ + pid_t childpid; + + char pid_file[PATH_MAX+1]; + FILE *fp; + + set_defaults(&settings); + initialize_osd(&settings); + + parse_args(argc, argv, &settings); +/* +#ifndef NOAPM + apmset = settings; +#endif + pppset = mixerset = settings; +*/ + + if((childpid=fork())<0) { + perror("fork"); + exit(1); + } + if (childpid==0) { + control_sh(NULL); + } + else { + sprintf(pid_file, "%s.%d.pid", OSD_FIFO_PATH, getuid()) ; + fp=fopen(pid_file, "w"); + fprintf(fp, "%d", childpid); + fclose(fp); + exit(0); + } + return(0); +} diff --git a/src/osdsh/osdsh.h b/src/osdsh/osdsh.h new file mode 100644 index 0000000..d653252 --- /dev/null +++ b/src/osdsh/osdsh.h @@ -0,0 +1,44 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +/*============================== settings_t ==================================*/ + +typedef struct settings_t { + xosd *myosd; + char font[BUFSIZ + 1]; + char color[BUFSIZ + 1]; + int soffset; + int xoffset; + int yoffset; + xosd_align align; + xosd_pos position; + int displaying; + int delay; + pthread_t mythread; +} settings_t; + +typedef struct plugininfo_t { + int whoami; + int active; + void *module; + char *file; + char *myname; + int (*isitmine)(); +} plugininfo_t; + diff --git a/src/osdsh/utils.c b/src/osdsh/utils.c new file mode 100644 index 0000000..024b6bf --- /dev/null +++ b/src/osdsh/utils.c @@ -0,0 +1,97 @@ +#include "osdsh.h" +#include "../config.h" + +/*This function is used to control the options of the individual osd's*/ + +void control_options(settings_t *setts, char option[2], char argument[BUFSIZ]) +{ + /*this function reads the option to change on each display, changes it + and saves the changes on the corresponding settings structure*/ + + switch (option[0]) { + case 'f': + strncpy(setts->font, argument, BUFSIZ); + if (setts->displaying&&xosd_set_font(setts->myosd, argument)) + fprintf(stderr, "Couldn't change font\n"); + break; + case 'C': + strncpy(setts->color, argument, BUFSIZ); + if (setts->displaying&&xosd_set_colour(setts->myosd, argument)) + fprintf(stderr, "Couldn't change color\n"); + break; + case 'd': + setts->delay = atoi(argument); + if (setts->displaying&&xosd_set_timeout(setts->myosd, atoi(argument))) + fprintf(stderr, "Couldn't change timeout\n"); + break; + case 'b': + setts->position = XOSD_bottom; + if (setts->displaying&&xosd_set_pos(setts->myosd, XOSD_bottom)) + fprintf(stderr, "Couldn't change position\n"); + break; + case 't': + setts->position = XOSD_top; + if (setts->displaying&&xosd_set_pos(setts->myosd, XOSD_top)) + fprintf(stderr, "Couldn't change position\n"); + break; + case 'l': + setts->align = XOSD_left; + if (setts->displaying&&xosd_set_align(setts->myosd, XOSD_left)) + fprintf(stderr, "Couldn't change align\n"); + break; + case 'r': + setts->align = XOSD_right; + if (setts->displaying&&xosd_set_align(setts->myosd, XOSD_right)) + fprintf(stderr, "Couldn't change align\n"); + break; + case 'c': + setts->align = XOSD_center; + if (setts->displaying&&xosd_set_align(setts->myosd, XOSD_center)) + fprintf(stderr, "Couldn't change align\n"); + case 'o': + setts->soffset = atoi(argument); + if (setts->displaying&&xosd_set_shadow_offset(setts->myosd, setts->soffset)) + fprintf(stderr, "Couldn't change Shadow Offset\n"); + break; + case 'y': + setts->yoffset = atoi(argument); + if (setts->displaying&&xosd_set_vertical_offset(setts->myosd, setts->yoffset)) + fprintf(stderr, "Couldn't change vertical offset\n"); + break; + case 'x': + setts->xoffset = atoi(argument); + if (setts->displaying&&xosd_set_horizontal_offset(setts->myosd, setts->xoffset)) + fprintf(stderr, "Couldn't change horizontal offset\n"); + default: + break; + } +} + +/*============================= initialize_osd() =========================== */ +void initialize_osd( settings_t *setts) +{ + xosd_set_font(setts->myosd, setts->font); + xosd_set_colour(setts->myosd, setts->color); + xosd_set_pos(setts->myosd, setts->position); + xosd_set_align(setts->myosd, setts->align); + xosd_set_horizontal_offset(setts->myosd, setts->xoffset); + xosd_set_vertical_offset(setts->myosd, setts->yoffset); + xosd_set_shadow_offset(setts->myosd, setts->soffset); + xosd_set_timeout(setts->myosd, setts->delay); +} +/* ============================ set_defaults () ============================ */ +void set_defaults(settings_t *setts) +{ + strncpy(setts->font, FONT, BUFSIZ); + setts->font[BUFSIZ] = '\0'; + strncpy(setts->color, COLOR, BUFSIZ); + setts->color[BUFSIZ] = '\0'; + setts->soffset = SHADOW_OFFSET; + setts->yoffset = DEFAULT_OFFSET; + setts->xoffset = DEFAULT_OFFSET; + setts->align= OSD_ALIGNMENT; + setts->position = OSD_POSITION; + setts->delay = TIMEOUT; + setts->displaying = 0; +} + -- cgit v1.2.3