dockapps/ascd/ascd/misc.c

432 lines
14 KiB
C

/* ===========================================================================
* AScd: the AfterStep and WindowMaker CD player
* misc.c: various stuff
* ===========================================================================
* Copyright (c) 1999 Denis Bourez and Rob Malda. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by Denis Bourez & Rob Malda
* 4. Neither the name of the author nor the names of any co-contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY DENIS BOUREZ AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL DENIS BOUREZ, ROB MALDA OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
* ===========================================================================
*/
#include "ext.h"
extern tes_xgets();
extern fak_parse_line();
extern cd_control_version();
/* The rc file functions, taken from xfascd*/
void load_rc_file(int mx)
{
FILE *in;
struct passwd *pw;
char st[256];
if (NULL == (pw = getpwuid(getuid()))) {
return;
} else {
sprintf(st, "%s/.ascdrc", pw->pw_dir);
if ((in = fopen(st, "r"))) {
while ( fgets(st, 255, in) ) {
if (strlen(st) > 0) st[strlen(st) - 1] = 0;
if (!mx) {
#ifndef NO_D_DEVICE
if (strncmp(st, "CD_DEVICE=", 10) == 0) strcpy(cd_device, st + 10);
else if (strncmp(st, "THEME=", 6) == 0) strcpy(theme, st + 6);
else if (strncmp(st, "VISU=", 5) == 0) strcpy(xv, st + 5);
else if (strncmp(st, "AUTOREPEAT=", 11) == 0) autorepeat = atoi(st + 11);
#else
if (strncmp(st, "AUTOREPEAT=", 11) == 0) autorepeat = atoi(st + 11);
#endif
else if (strncmp(st, "AUTOPLAY=", 9) == 0) autoplay = atoi(st + 9);
else if (strncmp(st, "AUTOPROBE=", 10) == 0) autoprobe = atoi(st + 10);
else if (strncmp(st, "CUE_TIME=", 9) == 0) cue_time = atoi(st + 9);
else if (strncmp(st, "TI=", 3) == 0) text_timeout = atoi(st + 3);
else if (strncmp(st, "MAX_VOL=", 8) == 0) max_volume = atoi(st + 8);
else if (strncmp(st, "MIN_VOL=", 8) == 0) min_volume = atoi(st + 8);
else if (strncmp(st, "MUT_VOL=", 8) == 0) muted_volume = atoi(st + 8);
else if (strncmp(st, "VOLUME=", 7) == 0) volume = atoi(st + 7);
else if (strncmp(st, "FADE_STEP=", 10) == 0) fade_step = atoi(st + 10);
else if (strncmp(st, "TIMEMODE=", 9) == 0) time_mode = atoi(st + 9);
else if (strcmp(st, "WITHDRAWN") == 0) withdrawn = TRUE;
else if (strcmp(st, "SHOWDB") == 0) show_db = TRUE;
else if (strcmp(st, "SHOWARTIST") == 0) show_artist = TRUE;
else if (strcmp(st, "UPPERCASE") == 0) force_upper = TRUE;
else if (strncmp(st, "IGNORE_AVOID=", 13) == 0) ignore_avoid = atoi(st + 13);
}
}
fclose(in);
return;
} else {
return;
}
}
}
void save_rc_file()
{
FILE *out;
struct passwd *pw;
char st[128];
if (NULL == (pw = getpwuid(getuid()))) {
/* hum... big problem... */
return;
} else {
sprintf(st, "%s/.ascdrc", pw->pw_dir);
if ((out = fopen(st, "w"))) {
fprintf(out, "#### generated by AScd version %s ####\n", VERSION);
#ifndef NO_D_DEVICE
fprintf(out, "CD_DEVICE=%s\n", cd_device);
#endif
fprintf(out, "THEME=%s\n", theme);
fprintf(out, "VISU=%s\n", xv);
fprintf(out, "AUTOREPEAT=%d\n", autorepeat);
fprintf(out, "AUTOPLAY=%d\n", autoplay);
fprintf(out, "AUTOPROBE=%d\n", autoprobe);
fprintf(out, "CUE_TIME=%d\n", cue_time);
fprintf(out, "TI=%d\n", text_timeout);
fprintf(out, "VOLUME=%d\n", volume);
fprintf(out, "MAX_VOL=%d\n", max_volume);
fprintf(out, "MIN_VOL=%d\n", min_volume);
fprintf(out, "MUT_VOL=%d\n", muted_volume);
fprintf(out, "FADE_STEP=%d\n", fade_step);
fprintf(out, "TIMEMODE=%d\n", time_mode);
fprintf(out, "IGNORE_AVOID=%d\n", ignore_avoid);
if (withdrawn) {
fprintf(out, "WITHDRAWN\n");
}
if (show_db) {
fprintf(out, "SHOWDB\n");
}
if (show_artist) {
fprintf(out, "SHOWARTIST\n");
}
if (force_upper) {
fprintf(out, "UPPERCASE\n");
}
fclose(out);
return;
} else {
return;
}
}
}
void command_line_help()
{
fprintf(stderr, "ascd %s ", VERSION);
#ifdef WMK
fprintf(stderr, "[WINGs] ");
#endif
#ifdef MIXER
fprintf(stderr, "[mixer] ");
#endif
fprintf(stderr, "\n(c) 1999 Rob Malda and Denis Bourez\n");
fprintf(stderr, "Usage: ascd [-options ...] where the options are:\n\n");
fprintf(stderr, "-version Display the version numbers and exit\n");
fprintf(stderr, "-help Display this help screen and exit\n");
fprintf(stderr, "-themes Display available themes and exit\n\n");
fprintf(stderr, "+/-withdrawn Turn on/off withdrawn mode for WindowMaker\n");
fprintf(stderr, "-geometry geom Standard X Location\n");
fprintf(stderr, "-ti time Texts display timeout in seconds (default = 1)\n");
fprintf(stderr, "-cue time Cue Time in seconds (default = 10)\n");
fprintf(stderr, "+/-a Turn on/off Autoplay mode\n");
fprintf(stderr, "+/-p Turn on/off Autoprobe mode\n");
fprintf(stderr, "+/-t Turn on/off Autorepeat mode\n");
fprintf(stderr, "+/-B Turn on/off Blind mode (no counters updates)\n");
fprintf(stderr, "+/-ia Apply/Ignore 'avoid' tags in WorkMan database\n"),
fprintf(stderr, "+/-up All messages in uppercase?\n");
fprintf(stderr, "-theme value Select the visual theme (in %s)\n", THDIR);
fprintf(stderr, "-xf Launch XfAscd with middle click on counter\n");
fprintf(stderr, "-minvolume value Minimum volume\n");
fprintf(stderr, "-maxvolume value Maximum volume\n");
fprintf(stderr, "-volume value CD Drive volume, from 0 to maxvolume\n");
fprintf(stderr, "-mvolume value CD Drive volume in mute mode, from 0 to maxvolume\n");
fprintf(stderr, "-fadestep value Fade in/out timing offset\n");
fprintf(stderr, "-device device_driver CDROM drive device\n");
#ifdef MIXER
fprintf(stderr, "-mixer device_driver Mixer device\n");
#endif
fprintf(stderr, "-showtitle Turn on Song Title Scrolling\n");
fprintf(stderr, "-showartist Show artist name when scrolling song title\n");
fprintf(stderr, "-debug Enable debug (verbose) messages on stderr\n");
fprintf(stderr, "-save Save settings and exit. Should be *last* command.\n\n");
exit(0);
}
void command_line_err()
{
fprintf(stderr, "ascd: bad command line syntax.\n");
fprintf(stderr, "Type 'ascd -help' for a list of command line options.\n");
exit(-1);
}
void themes_help()
{
char txt[256];
char key[256];
char r[256];
char d[256];
char arguments[256];
DIR *dir_fd;
struct dirent *dir_pt;
FILE *in;
fprintf(stderr, "List of AScd installed themes:\n\n");
fprintf(stderr, "Theme Release Description\n");
fprintf(stderr, "---------------- ------------ -------------------------------------\n");
sprintf(txt, "%s/Themes", THDIR);
if ((dir_fd = opendir(txt)) != NULL) {
while((dir_pt = readdir(dir_fd)) != NULL) {
if (dir_pt->d_name[0] != '.') {
fprintf(stderr, "%-16s ", dir_pt->d_name);
sprintf(txt, "%s/Themes/%s/Theme", THDIR, dir_pt->d_name);
if (access(txt, R_OK) == 0) {
if (!(in = fopen(txt, "r"))) {
fprintf(stderr, "cannot open Theme definition file");
} else {
strcpy(d, "");
strcpy(r, "");
while (tes_xgets(txt, 256, in)) {
fak_parse_line(txt, key, arguments);
if (strcmp(key, "release") == 0) strcpy(r, arguments);
if (strcmp(key, "name") == 0) strcpy(d, arguments);
}
fprintf(stderr, "%-12s %s", r, d);
fclose(in);
}
} else {
fprintf(stderr, "cannot find Theme definition file");
}
fprintf(stderr, "\n");
}
}
closedir(dir_fd);
} else {
fprintf(stderr, "Can't read directory %s!\n", txt);
}
fprintf(stderr, "\n");
exit(0);
}
#define MAX_LINE_NAME 16
void command_line_parse(int argc, char *argv[]) {
int i;
char *Argument;
int sw;
for (i = 1 ; i < argc ; i++) {
Argument = argv[i];
if ((Argument[0] == '-') || (Argument[0] == '+')) {
if (Argument[0] == '-') {
sw = FALSE;
} else if (Argument[0] == '+') {
sw = TRUE;
}
if ((strcmp(Argument + 1, "w") == 0) || (strcmp(Argument + 1, "withdrawn") == 0)) {
if (sw) withdrawn = TRUE;
else withdrawn = FALSE;
}
else if ((strcmp(Argument + 1, "g") == 0) || (strcmp(Argument + 1, "geometry") == 0)) {
if(++i >= argc) command_line_err();
Geometry = argv[i];
}
else if ((strcmp(Argument + 1, "d") == 0) || (strcmp(Argument + 1, "device") == 0)) {
if(++i >= argc) command_line_err();
cd_device = malloc(strlen(argv[i]) + 1);
strcpy(cd_device, argv[i]);
}
#ifdef MIXER
else if (strcmp(Argument + 1, "mixer") == 0) {
if(++i >= argc) command_line_err();
strcpy(mixer_device, argv[i]);
}
#endif
else if (strcmp(Argument + 1, "theme") == 0) {
if(++i >= argc) command_line_err();
strcpy(theme, argv[i]);
}
else if ((strcmp(Argument + 1, "c") == 0) || (strcmp(Argument + 1, "cue") == 0)) {
if(++i >= argc) command_line_err();
cue_time = atoi(argv[i]);
}
else if ((strcmp(Argument + 1, "i") == 0) || (strcmp(Argument + 1, "ti") == 0)) {
if(++i >= argc) command_line_err();
text_timeout = atoi(argv[i]);
}
else if ((strcmp(Argument + 1, "a") == 0) || (strcmp(Argument + 1, "autoplay") == 0)) {
if (sw) autoplay = TRUE;
else autoplay = FALSE;
}
else if ((strcmp(Argument + 1, "p") == 0) || (strcmp(Argument + 1, "autoprobe") == 0)) {
if (sw) autoprobe = TRUE;
else autoprobe = FALSE;
}
else if (strcmp(Argument + 1, "B") == 0) {
if (sw) blind_mode = TRUE;
else blind_mode = FALSE;
}
else if (strcmp(Argument + 1, "ia") == 0) {
if (sw) ignore_avoid = TRUE;
else ignore_avoid = FALSE;
}
else if (strcmp(Argument + 1, "up") == 0) {
if (sw) force_upper = TRUE;
else force_upper = FALSE;
}
else if ((strcmp(Argument + 1, "t") == 0) || (strcmp(Argument + 1, "autorepeat") == 0)) {
if (sw) autorepeat = TRUE;
else autorepeat = FALSE;
}
else if (strcmp(Argument + 1, "showtitle") == 0) {
show_db = TRUE;
}
else if (strcmp(Argument + 1, "showartist") == 0) {
show_artist = TRUE;
}
else if (strcmp(Argument + 1, "debug") == 0) {
debug++;
}
else if (strcmp(Argument + 1, "mvolume") == 0) {
if(++i >= argc) command_line_err();
muted_volume = atoi(argv[i]);
}
else if (strcmp(Argument + 1, "volume") == 0) {
if(++i >= argc) command_line_err();
volume = atoi(argv[i]);
}
else if (strcmp(Argument + 1, "xf") == 0) {
xflaunch = TRUE;
}
else if (strcmp(Argument + 1, "maxvolume") == 0) {
if(++i >= argc) command_line_err();
max_volume = atoi(argv[i]);
}
else if (strcmp(Argument + 1, "minvolume") == 0) {
if(++i >= argc) command_line_err();
min_volume = atoi(argv[i]);
}
else if (strcmp(Argument + 1, "fadestep") == 0) {
if(++i >= argc) command_line_err();
fade_step = atoi(argv[i]);
}
else if (strcmp(Argument + 1, "save") == 0) {
save_rc_file();
fprintf(stderr, "Settings file saved.\n");
exit(0);
}
else if ((strcmp(Argument + 1, "version") == 0) || (strcmp(Argument + 1, "v") == 0)) {
fprintf(stderr, "%s %s (CDcontrol %s, %s) ", PACKAGE, VERSION, (char *)cd_control_version(), wm_libver_string());
#ifdef WMK
fprintf(stderr, "[WINGs] ");
#endif
#ifdef MIXER
fprintf(stderr, "[mixer] ");
#endif
fprintf(stderr, "\n");
exit(0);
}
else if (strcmp(Argument + 1, "themes") == 0) {
themes_help();
}
else if ((strcmp(Argument + 1, "h") == 0) || (strcmp(Argument + 1, "help") == 0)) {
command_line_help();
} else {
command_line_err();
}
} else {
command_line_err();
}
}
}
void quick_reference(int nbr)
{
char txt[127];
char fic[40];
if (nbr == 0) strcpy(fic, "quick*");
else sprintf(fic, "quick%d.gif", nbr);
sprintf(txt, "%s/Themes/%s/quick", THDIR, theme);
if (access(txt, R_OK) == 0) {
sprintf(txt, "%s %s/Themes/%s/quick/%s &", xv, THDIR, theme, fic);
system(txt);
}
}
/* ------------------------------------------------------------------------
dumb functions: do nothing, but they need to be present if we don't
wanna change anything in the WorkMan code...
------------------------------------------------------------------------ */
void disable_save() { }
int get_playnew() { return autoplay; }
void set_abtimer(int a, int b) { }
void about_set_drivetype(char *vendor, char *model, char *rev) { }