1778 lines
57 KiB
C
1778 lines
57 KiB
C
/* ===========================================================================
|
|
* AScd: faktory.c
|
|
* The theme handling functions
|
|
* ===========================================================================
|
|
* 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"
|
|
|
|
#define MAX_LINE_NAME 16
|
|
|
|
void tes_sncpy(char *out, char *in, int n)
|
|
{
|
|
register int i;
|
|
for (i=0; i<=n-1; i++) out[i] = in[i];
|
|
out[i] = '\0';
|
|
}
|
|
|
|
char *tes_xgets(char *chaine, int nb, FILE *fichier)
|
|
{
|
|
char *r;
|
|
r = fgets(chaine, nb, fichier);
|
|
if (feof(fichier) == 0) chaine[strlen(chaine) - 1] = 0;
|
|
return r;
|
|
}
|
|
|
|
int fak_parse_line(char *ligne, char *key, char *arguments)
|
|
{
|
|
unsigned int pos = 0;
|
|
|
|
if ((strlen(ligne) > 0) && (ligne[0] != '#')) {
|
|
while ((ligne[pos] != ' ') && (ligne[pos] != 9)) pos++;
|
|
tes_sncpy(key, ligne, pos);
|
|
while (((ligne[pos] == ' ') || (ligne[pos] == 9)) && (pos < strlen(ligne))) pos++;
|
|
if (pos < strlen(ligne)) strcpy(arguments, ligne + pos);
|
|
else strcpy(arguments, "");
|
|
if (debug > 2) fprintf(stderr,"++ input: [%s]\n key: [%s]\n args: [%s]\n", ligne, key, arguments);
|
|
return TRUE;
|
|
} else {
|
|
strcpy(key, "");
|
|
strcpy(arguments, "");
|
|
if (debug > 2) fprintf(stderr,"++ input: [%s]\n key: [%s]\n args: [%s]\n", ligne, key, arguments);
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
int fak_use_alt(int i)
|
|
{
|
|
int use_alt = 0;
|
|
switch (thdata[i].left) {
|
|
case FAK_CD_PLAY:
|
|
if (cur_cdmode == WM_CDM_PLAYING) use_alt = 1;
|
|
break;
|
|
case FAK_CD_PAUSE:
|
|
if (cur_cdmode == WM_CDM_PAUSED) use_alt = 1;
|
|
break;
|
|
case FAK_CD_STOP:
|
|
if (cur_cdmode == WM_CDM_STOPPED) use_alt = 1;
|
|
break;
|
|
case FAK_CD_EJECT:
|
|
if (cur_cdmode == WM_CDM_EJECTED) use_alt = 1;
|
|
break;
|
|
case FAK_CD_STOPEJECT:
|
|
if (cur_cdmode == WM_CDM_STOPPED) use_alt = 1;
|
|
break;
|
|
case FAK_CD_EJECTQUIT:
|
|
if ((cur_cdmode == WM_CDM_EJECTED) || (cur_cdmode == WM_CDM_STOPPED)) use_alt = 1;
|
|
break;
|
|
case FAK_CD_LOOP:
|
|
if (loop_mode) use_alt = 1;
|
|
break;
|
|
case FAK_CD_MUTE:
|
|
if (muted) use_alt = 1;
|
|
break;
|
|
case FAK_CD_VOLUME:
|
|
if (muted) use_alt = 1;
|
|
break;
|
|
case FAK_CD_INTRO:
|
|
if (intro_mode) use_alt = 1;
|
|
break;
|
|
case FAK_TOG_AUTOREPEAT:
|
|
if (autorepeat) use_alt = 1;
|
|
break;
|
|
case FAK_TOG_AUTOPLAY:
|
|
if (autoplay) use_alt = 1;
|
|
break;
|
|
case FAK_TOG_UPPER:
|
|
if (force_upper) use_alt = 1;
|
|
break;
|
|
case FAK_TOG_SHOWDB:
|
|
if (show_db) use_alt = 1;
|
|
break;
|
|
case FAK_TOG_SHOWARTIST:
|
|
if (show_artist) use_alt = 1;
|
|
break;
|
|
case FAK_TOG_ISKIPS:
|
|
if (ignore_avoid) use_alt = 1;
|
|
break;
|
|
case FAK_TSELECT:
|
|
case FAK_TNEXT:
|
|
case FAK_TPREVIOUS:
|
|
if (theme_select) use_alt = 1;
|
|
break;
|
|
default:
|
|
use_alt = 0;
|
|
break;
|
|
}
|
|
return use_alt;
|
|
}
|
|
|
|
void fak_validate_pixmap(char *string, char *name)
|
|
{
|
|
sprintf(string, "%s/Themes/%s/%s", THDIR, theme, name);
|
|
if (access(string, R_OK) != 0) {
|
|
sprintf(string, "%s/Default/%s", THDIR, name);
|
|
if (access(string, R_OK) != 0) {
|
|
fprintf(stderr, "\nascd: fatal error while loading theme '%s'\n", theme);
|
|
fprintf(stderr, " Pixmap file '%s' was not found.\n\n", name);
|
|
exit(1);
|
|
}
|
|
}
|
|
}
|
|
|
|
void fak_init_theme(int upgrade)
|
|
{
|
|
/* re-init all the buttons structure and globals */
|
|
|
|
int i;
|
|
|
|
if (debug) fprintf(stderr, "** Init theme variables.\n Buttons...\n");
|
|
for (i = 1; i <= but_max ; i++) {
|
|
|
|
thdata[i].type = 0;
|
|
thdata[i].panel = 0;
|
|
thdata[i].left = 0;
|
|
thdata[i].mid = 0;
|
|
thdata[i].right = 0;
|
|
thdata[i].x = 0;
|
|
thdata[i].y = 0;
|
|
thdata[i].w = 0;
|
|
thdata[i].h = 0;
|
|
thdata[i].arg = 0;
|
|
thdata[i].icon = FALSE;
|
|
thdata[i].ox = 0;
|
|
thdata[i].oy = 0;
|
|
|
|
if (strcmp(thdata[i].xpm_file, "") != 0) {
|
|
strcpy(thdata[i].xpm_file, "");
|
|
/*if (upgrade) XpmFree(&thdata[i].xpm);*/
|
|
}
|
|
if (strcmp(thdata[i].altxpm_file, "") != 0) {
|
|
strcpy(thdata[i].altxpm_file, "");
|
|
/*if (upgrade) XpmFree(&thdata[i].altxpm);*/
|
|
}
|
|
}
|
|
|
|
if (debug) fprintf(stderr, " Strings & globals...\n");
|
|
|
|
strcpy(th_name, "");
|
|
strcpy(th_author, "");
|
|
strcpy(th_release, "");
|
|
strcpy(th_email, "");
|
|
strcpy(th_url, "");
|
|
strcpy(th_comment, "");
|
|
strcpy(th_alpha1, "");
|
|
strcpy(th_alpha2, "");
|
|
strcpy(th_background, "");
|
|
strcpy(th_icon_window, "");
|
|
|
|
th_no_minus = FALSE;
|
|
|
|
but_max = 0;
|
|
but_counter = 0;
|
|
but_msg = 0;
|
|
but_tracknbr = 0;
|
|
but_db = 0;
|
|
but_current = 0;
|
|
|
|
icon_counter = 0;
|
|
icon_msg = 0;
|
|
icon_tracknbr = 0;
|
|
|
|
panels = 0;
|
|
panel = 1;
|
|
|
|
panel_stop = 0;
|
|
panel_play = 0;
|
|
|
|
/*
|
|
if (upgrade) {
|
|
XpmFree(&alphaXPM);
|
|
XpmFree(&ralphaXPM);
|
|
XpmFree(&backXPM);
|
|
}
|
|
*/
|
|
if (debug) fprintf(stderr, "-> done.\n");
|
|
|
|
}
|
|
|
|
int fak_load_theme(char *th, int upgrade)
|
|
{
|
|
char txt[256];
|
|
char key[256];
|
|
char arguments[256];
|
|
int button = FALSE;
|
|
unsigned int i;
|
|
XWindowAttributes Attributes;
|
|
int Ret;
|
|
FILE *in;
|
|
#ifdef MIXER
|
|
unsigned int j;
|
|
struct {
|
|
char name[MAX_LINE_NAME];
|
|
int dev;
|
|
} mixernames[SOUND_MIXER_NRDEVICES] = {
|
|
{ "volume", SOUND_MIXER_VOLUME },
|
|
{ "bass", SOUND_MIXER_BASS },
|
|
{ "treble", SOUND_MIXER_TREBLE },
|
|
{ "midi", SOUND_MIXER_SYNTH },
|
|
{ "pcm", SOUND_MIXER_PCM },
|
|
{ "speaker", SOUND_MIXER_SPEAKER },
|
|
{ "line", SOUND_MIXER_LINE },
|
|
{ "mic", SOUND_MIXER_MIC },
|
|
{ "cd", SOUND_MIXER_CD },
|
|
{ "imix", SOUND_MIXER_IMIX },
|
|
{ "altpcm", SOUND_MIXER_ALTPCM },
|
|
{ "reclev", SOUND_MIXER_RECLEV },
|
|
{ "igain", SOUND_MIXER_IGAIN },
|
|
{ "ogain", SOUND_MIXER_OGAIN },
|
|
{ "line1", SOUND_MIXER_LINE1 },
|
|
{ "line2", SOUND_MIXER_LINE2 },
|
|
{ "line3", SOUND_MIXER_LINE3 }
|
|
};
|
|
#endif
|
|
|
|
/* check if theme directory if ok: */
|
|
|
|
sprintf(txt, "%s/Themes/%s", THDIR, th);
|
|
|
|
if (debug) fprintf(stderr, "** Theme to load: %s\n", txt);
|
|
|
|
if (access(txt, X_OK | R_OK) != 0) {
|
|
sprintf(txt, "%s/Themes/default", THDIR);
|
|
if (access(txt, X_OK | R_OK) != 0) {
|
|
fprintf(stderr, "ascd: fatal error\n\n");
|
|
fprintf(stderr, "The '%s' and 'default' themes folders are not \navailable in %s.\n\n", th, THDIR);
|
|
fprintf(stderr, "Please check the permissions and/or redo ascd installation.\n\n");
|
|
exit(1);
|
|
} else {
|
|
strcpy(th, "default");
|
|
}
|
|
}
|
|
|
|
sprintf(txt, "%s/Themes/%s/Theme", THDIR, th);
|
|
|
|
/* parse and load the file */
|
|
|
|
if (in = fopen(txt, "r")) {
|
|
|
|
/* we first clear everything... */
|
|
|
|
fak_init_theme(upgrade);
|
|
|
|
/* that's ok, let's go! */
|
|
|
|
if (debug) fprintf(stderr, "-> Parsing Theme file...\n");
|
|
while (tes_xgets(txt, 255, in)) {
|
|
if (fak_parse_line(txt, key, arguments)) {
|
|
if (key[0] == '{') {
|
|
button = TRUE;
|
|
if (but_max < FAK_BMAX - 1) {
|
|
but_max ++;
|
|
strcpy(thdata[but_max].xpm_file, "");
|
|
strcpy(thdata[but_max].altxpm_file, "");
|
|
thdata[but_max].type = 0;
|
|
} else {
|
|
/* no more free buttons. We'll ignore the rest */
|
|
button = FALSE;
|
|
}
|
|
} else if (key[0] == '}') {
|
|
button = FALSE;
|
|
|
|
/* update the pointers to msg, counter and tracknbr: */
|
|
|
|
switch(thdata[but_max].type) {
|
|
case FAK_COUNTER:
|
|
if (thdata[but_max].icon) icon_counter = but_max;
|
|
else but_counter = but_max;
|
|
break;
|
|
case FAK_MSG:
|
|
if (thdata[but_max].icon) icon_msg = but_max;
|
|
else but_msg = but_max;
|
|
break;
|
|
case FAK_DB:
|
|
but_db = but_max;
|
|
break;
|
|
case FAK_TRACKNBR:
|
|
if (thdata[but_max].icon) icon_tracknbr = but_max;
|
|
else but_tracknbr = but_max;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if (debug > 1) {
|
|
fprintf(stderr, " Button %02d type: %02d commands: %02d %02d %02d arg: %02d\n", but_max, thdata[but_max].type, thdata[but_max].left, thdata[but_max].mid, thdata[but_max].right, thdata[but_max].arg);
|
|
fprintf(stderr, " Geometry: %02dx%02d on panel %02d\n", thdata[but_max].x, thdata[but_max].y, thdata[but_max].panel);
|
|
fprintf(stderr, " Pixmaps: [%s] and [%s]\n", thdata[but_max].xpm_file, thdata[but_max].altxpm_file);
|
|
}
|
|
}
|
|
|
|
if (!button) {
|
|
if (strcmp(key, "name") == 0) strcpy(th_name, arguments);
|
|
else if (strcmp(key, "release") == 0) strcpy(th_release, arguments);
|
|
else if (strcmp(key, "author") == 0) strcpy(th_author, arguments);
|
|
else if (strcmp(key, "email") == 0) strcpy(th_email, arguments);
|
|
else if (strcmp(key, "url") == 0) strcpy(th_url, arguments);
|
|
else if (strcmp(key, "comment") == 0) strcpy(th_comment, arguments);
|
|
else if (strcmp(key, "alpha1") == 0) strcpy(th_alpha1, arguments);
|
|
else if (strcmp(key, "alpha2") == 0) strcpy(th_alpha2, arguments);
|
|
else if (strcmp(key, "background") == 0) strcpy(th_background, arguments);
|
|
else if (strcmp(key, "icon_background") == 0) strcpy(th_icon_window, arguments);
|
|
else if (strcmp(key, "panels") == 0) panels = atoi(arguments);
|
|
else if (strcmp(key, "panel_stop") == 0) panel_stop = atoi(arguments);
|
|
else if (strcmp(key, "panel_play") == 0) panel_play = atoi(arguments);
|
|
else if (strcmp(key, "no_minus") == 0) th_no_minus = TRUE;
|
|
} else {
|
|
|
|
/* button definition: */
|
|
|
|
if (strcmp(key, "icon") == 0) thdata[but_max].icon = TRUE;
|
|
|
|
if (strcmp(key, "type") == 0) {
|
|
if (strcmp(arguments, "pixmap") == 0) thdata[but_max].type = FAK_PIXMAP;
|
|
else if (strcmp(arguments, "counter") == 0) thdata[but_max].type = FAK_COUNTER;
|
|
else if (strcmp(arguments, "tracknumber") == 0) thdata[but_max].type = FAK_TRACKNBR;
|
|
else if (strcmp(arguments, "message") == 0) thdata[but_max].type = FAK_MSG;
|
|
else if (strcmp(arguments, "database") == 0) thdata[but_max].type = FAK_DB;
|
|
else if (strcmp(arguments, "progress_bar") == 0) thdata[but_max].type = FAK_CD_BAR;
|
|
else if (strcmp(arguments, "vprogress_bar") == 0) thdata[but_max].type = FAK_VCD_BAR;
|
|
else if (strcmp(arguments, "iprogress_bar") == 0) thdata[but_max].type = FAK_ICD_BAR;
|
|
else if (strcmp(arguments, "pixmap_bar") == 0) thdata[but_max].type = FAK_CD_PIX;
|
|
else if (strcmp(arguments, "vpixmap_bar") == 0) thdata[but_max].type = FAK_VCD_PIX;
|
|
else if (strcmp(arguments, "volume_bar") == 0) thdata[but_max].type = FAK_VOL_BAR;
|
|
else if (strcmp(arguments, "volume") == 0) thdata[but_max].type = FAK_VOL_BAR;
|
|
else if (strcmp(arguments, "pixmap_volume") == 0) thdata[but_max].type = FAK_VOL_PIX;
|
|
else if (strcmp(arguments, "vpixmap_volume") == 0) thdata[but_max].type = FAK_VVOL_PIX;
|
|
else if (strcmp(arguments, "vvolume") == 0) thdata[but_max].type = FAK_VVOL_BAR;
|
|
else if (strcmp(arguments, "vvolume_bar") == 0) thdata[but_max].type = FAK_VVOL_BAR;
|
|
else if (strcmp(arguments, "ivolume") == 0) thdata[but_max].type = FAK_IVOL_BAR;
|
|
else if (strcmp(arguments, "ivolume_bar") == 0) thdata[but_max].type = FAK_IVOL_BAR;
|
|
else if (strcmp(arguments, "mixer_bar") == 0) thdata[but_max].type = FAK_MIXER_BAR;
|
|
else if (strcmp(arguments, "mixer") == 0) thdata[but_max].type = FAK_MIXER_BAR;
|
|
else if (strcmp(arguments, "vmixer_bar") == 0) thdata[but_max].type = FAK_VMIXER_BAR;
|
|
else if (strcmp(arguments, "vmixer") == 0) thdata[but_max].type = FAK_VMIXER_BAR;
|
|
else if (strcmp(arguments, "imixer_bar") == 0) thdata[but_max].type = FAK_IMIXER_BAR;
|
|
else if (strcmp(arguments, "imixer") == 0) thdata[but_max].type = FAK_IMIXER_BAR;
|
|
}
|
|
|
|
i = 0;
|
|
if ((strcmp(key, "left") == 0) ||
|
|
(strcmp(key, "middle") ==0) ||
|
|
(strcmp(key, "mid") ==0) ||
|
|
(strcmp(key, "right") == 0)) {
|
|
|
|
/* --------------- available commands: ---------------- */
|
|
|
|
/* basic orders */
|
|
|
|
if (strcmp(arguments, "panel_switch") == 0) i = FAK_PANEL_SWITCH;
|
|
else if (strcmp(arguments, "panel 1") == 0) i = FAK_PANEL1;
|
|
else if (strcmp(arguments, "panel 2") == 0) i = FAK_PANEL2;
|
|
else if (strcmp(arguments, "panel 3") == 0) i = FAK_PANEL3;
|
|
else if (strcmp(arguments, "panel 4") == 0) i = FAK_PANEL4;
|
|
else if (strcmp(arguments, "panel 5") == 0) i = FAK_PANEL5;
|
|
else if (strcmp(arguments, "counter_mode") == 0) i = FAK_COUNTER_MODE;
|
|
else if (strcmp(arguments, "quit") == 0) i = FAK_QUIT;
|
|
else if (strcmp(arguments, "wings_window") == 0) i = FAK_WINGS;
|
|
else if (strcmp(arguments, "theme_select") == 0) i = FAK_TSELECT;
|
|
else if (strcmp(arguments, "theme_next") == 0) i = FAK_TNEXT;
|
|
else if (strcmp(arguments, "theme_previous") == 0) i = FAK_TPREVIOUS;
|
|
else if (strcmp(arguments, "ftrack_select") == 0) i = FAK_FTSELECT;
|
|
else if (strcmp(arguments, "ftrack_next") == 0) i = FAK_FTNEXT;
|
|
else if (strcmp(arguments, "ftrack_previous") == 0) i = FAK_FTPREVIOUS;
|
|
else if (strcmp(arguments, "autoplay") == 0) i = FAK_TOG_AUTOPLAY;
|
|
else if (strcmp(arguments, "autorepeat") == 0) i = FAK_TOG_AUTOREPEAT;
|
|
else if (strcmp(arguments, "show_db") == 0) i = FAK_TOG_SHOWDB;
|
|
else if (strcmp(arguments, "show_artist") == 0) i = FAK_TOG_SHOWARTIST;
|
|
else if (strcmp(arguments, "uppercase") == 0) i = FAK_TOG_UPPER;
|
|
else if (strcmp(arguments, "ignore_skips") == 0) i = FAK_TOG_ISKIPS;
|
|
else if (strcmp(arguments, "save") == 0) i = FAK_SAVE;
|
|
else if (strcmp(arguments, "load") == 0) i = FAK_LOAD;
|
|
else if (strcmp(arguments, "quick_ref") == 0) i = FAK_QREF;
|
|
|
|
/* CD player */
|
|
|
|
else if (strcmp(arguments, "play") == 0) i = FAK_CD_PLAY;
|
|
else if (strcmp(arguments, "pause") == 0) i = FAK_CD_PAUSE;
|
|
else if (strcmp(arguments, "stop") == 0) i = FAK_CD_STOP;
|
|
else if (strcmp(arguments, "eject") == 0) i = FAK_CD_EJECT;
|
|
else if (strcmp(arguments, "stop_eject") == 0) i = FAK_CD_STOPEJECT;
|
|
else if (strcmp(arguments, "eject_quit") == 0) i = FAK_CD_EJECTQUIT;
|
|
else if (strcmp(arguments, "rew") == 0) i = FAK_CD_REW;
|
|
else if (strcmp(arguments, "first_track") == 0) i = FAK_CD_FIRST;
|
|
else if (strcmp(arguments, "previous_track") == 0) i = FAK_CD_PREVIOUS;
|
|
else if (strcmp(arguments, "fwd") == 0) i = FAK_CD_FWD;
|
|
else if (strcmp(arguments, "last_track") == 0) i = FAK_CD_LAST;
|
|
else if (strcmp(arguments, "next_track") == 0) i = FAK_CD_NEXT;
|
|
else if (strcmp(arguments, "direct_access") == 0) i = FAK_CD_DIRECT;
|
|
else if (strcmp(arguments, "loop") == 0) i = FAK_CD_LOOP;
|
|
else if (strcmp(arguments, "loop_start") == 0) i = FAK_CD_LSTART;
|
|
else if (strcmp(arguments, "loop_end") == 0) i = FAK_CD_LEND;
|
|
else if (strcmp(arguments, "loop_go_start") == 0) i = FAK_CD_GOLSTART;
|
|
else if (strcmp(arguments, "loop_go_end") == 0) i = FAK_CD_GOLEND;
|
|
else if (strcmp(arguments, "loop_track") == 0) i = FAK_CD_LTRACK;
|
|
else if (strcmp(arguments, "loop_to_track") == 0) i = FAK_CD_LTOTRACK;
|
|
else if (strcmp(arguments, "loop_from_track") == 0) i = FAK_CD_LFROMTRACK;
|
|
else if (strcmp(arguments, "loop_clear") == 0) i = FAK_CD_LCLEAR;
|
|
else if (strcmp(arguments, "intro_scan") == 0) i = FAK_CD_INTRO;
|
|
else if (strcmp(arguments, "fade") == 0) i = FAK_CD_FADE;
|
|
else if (strcmp(arguments, "random_jump") == 0) i = FAK_CD_RANDOM;
|
|
else if (strcmp(arguments, "random_mode") == 0) i = FAK_CD_RMODE;
|
|
else if (strcmp(arguments, "mute") == 0) i = FAK_CD_MUTE;
|
|
else if (strcmp(arguments, "volume") == 0) i = FAK_CD_VOLUME;
|
|
|
|
/* mixer */
|
|
|
|
else if (strcmp(arguments, "set") == 0) i = FAK_MIXER_SET;
|
|
else if (strcmp(arguments, "zero") == 0) i = FAK_MIXER_0;
|
|
else if (strcmp(arguments, "0") == 0) i = FAK_MIXER_0;
|
|
else if (strcmp(arguments, "50%") == 0) i = FAK_MIXER_50;
|
|
else if (strcmp(arguments, "50") == 0) i = FAK_MIXER_50;
|
|
else if (strcmp(arguments, "75%") == 0) i = FAK_MIXER_75;
|
|
else if (strcmp(arguments, "75") == 0) i = FAK_MIXER_75;
|
|
else if (strcmp(arguments, "100%") == 0) i = FAK_MIXER_100;
|
|
else if (strcmp(arguments, "100") == 0) i = FAK_MIXER_100;
|
|
|
|
/* ------------- which mouse button? --------------- */
|
|
|
|
if (strcmp(key, "left") == 0) thdata[but_max].left = i;
|
|
else if (strcmp(key, "middle") == 0) thdata[but_max].mid = i;
|
|
else if (strcmp(key, "mid") == 0) thdata[but_max].mid = i;
|
|
else if (strcmp(key, "right") == 0) thdata[but_max].right = i;
|
|
}
|
|
|
|
else if (strcmp(key, "panel") == 0) thdata[but_max].panel = atoi(arguments);
|
|
else if (strcmp(key, "x") == 0) thdata[but_max].x = atoi(arguments);
|
|
else if (strcmp(key, "y") == 0) thdata[but_max].y = atoi(arguments);
|
|
else if (strcmp(key, "w") == 0) thdata[but_max].w = atoi(arguments);
|
|
else if (strcmp(key, "h") == 0) thdata[but_max].h = atoi(arguments);
|
|
else if (strcmp(key, "arg") == 0) {
|
|
thdata[but_max].arg = atoi(arguments);
|
|
#ifdef MIXER
|
|
for(j = 0; j < SOUND_MIXER_NRDEVICES; j++) {
|
|
if(strcasecmp(mixernames[j].name, arguments) == 0) {
|
|
thdata[but_max].arg = mixernames[j].dev;
|
|
break;
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
else if (strcmp(key, "pixmap") == 0) strcpy(thdata[but_max].xpm_file, arguments);
|
|
else if (strcmp(key, "alt") == 0) strcpy(thdata[but_max].altxpm_file, arguments);
|
|
}
|
|
}
|
|
}
|
|
fclose(in);
|
|
|
|
if (debug) {
|
|
fprintf(stderr, "-> Theme summary for '%s':\n", th_name);
|
|
fprintf(stderr, " Release: %s\n", th_release);
|
|
fprintf(stderr, " Author: %s (%s)\n", th_author, th_email);
|
|
fprintf(stderr, " URL: %s\n", th_url);
|
|
fprintf(stderr, " Comment: %s\n", th_comment);
|
|
fprintf(stderr, " Stats: %d panels, %d buttons\n", panels, but_max);
|
|
fprintf(stderr, " Display: counter: %d / msg: %d (%d cars) / db: %d / track: %d\n", but_counter, but_msg, thdata[but_msg].w, but_db, but_tracknbr);
|
|
if (th_no_icon_window) fprintf(stderr, " Using separate icon definition, background = %s\n", th_icon_window);
|
|
fprintf(stderr, "-> Loading basic pixmap files... ");
|
|
}
|
|
|
|
XGetWindowAttributes(Disp, Root, &Attributes);
|
|
|
|
/* the background pixmap: */
|
|
|
|
if (debug) fprintf(stderr, "background ");
|
|
|
|
fak_validate_pixmap(txt, th_background);
|
|
Ret = XpmReadFileToPixmap(Disp, Root, txt, &backXPM.pixmap,
|
|
&backXPM.mask, &backXPM.attributes);
|
|
if ((Ret != XpmSuccess) && (debug)) fprintf(stderr, "*!* ");
|
|
|
|
/* the fonts: */
|
|
|
|
if (debug) fprintf(stderr, "alpha 1 ");
|
|
|
|
fak_validate_pixmap(txt, th_alpha1);
|
|
Ret = XpmReadFileToPixmap(Disp, Root, txt, &alphaXPM.pixmap,
|
|
&alphaXPM.mask, &alphaXPM.attributes);
|
|
if ((Ret != XpmSuccess) && (debug)) fprintf(stderr, "*!* ");
|
|
|
|
if (debug) fprintf(stderr, "2 ");
|
|
|
|
fak_validate_pixmap(txt, th_alpha2);
|
|
Ret = XpmReadFileToPixmap(Disp, Root, txt, &ralphaXPM.pixmap,
|
|
&ralphaXPM.mask, &ralphaXPM.attributes);
|
|
if ((Ret != XpmSuccess) && (debug)) fprintf(stderr, "*!* ");
|
|
|
|
if (debug) fprintf(stderr, "\n-> Loading buttons pixmaps... ");
|
|
for (i = 1; i <= but_max; i++) {
|
|
if (strlen(thdata[i].xpm_file) > 0) {
|
|
if (debug > 1) fprintf(stderr, "%d ", i);
|
|
fak_validate_pixmap(txt, thdata[i].xpm_file);
|
|
thdata[i].xpm.attributes.valuemask |= (XpmReturnPixels | XpmReturnExtensions);
|
|
Ret = XpmReadFileToPixmap(Disp, Root, txt, &thdata[i].xpm.pixmap, &thdata[i].xpm.mask, &thdata[i].xpm.attributes);
|
|
if ((Ret != XpmSuccess) && (debug > 1)) fprintf(stderr, "*!* ");
|
|
}
|
|
if (strlen(thdata[i].altxpm_file) > 0) {
|
|
if (debug > 1) fprintf(stderr, "a ");
|
|
fak_validate_pixmap(txt, thdata[i].altxpm_file);
|
|
thdata[i].xpm.attributes.valuemask |= (XpmReturnPixels | XpmReturnExtensions);
|
|
Ret = XpmReadFileToPixmap(Disp, Root, txt, &thdata[i].altxpm.pixmap, &thdata[i].altxpm.mask, &thdata[i].altxpm.attributes);
|
|
if ((Ret != XpmSuccess) && (debug > 1)) fprintf(stderr, "*!* ");
|
|
}
|
|
}
|
|
|
|
/* the icon */
|
|
|
|
if (strlen(th_icon_window) > 0) {
|
|
if (debug) fprintf(stderr, "\n-> Loading icon... ");
|
|
fak_validate_pixmap(txt, th_icon_window);
|
|
Ret = XpmReadFileToPixmap(Disp, Root, txt, &iconXPM.pixmap,
|
|
&iconXPM.mask, &iconXPM.attributes);
|
|
if ((Ret != XpmSuccess) && (debug)) fprintf(stderr, "*!* ");
|
|
}
|
|
|
|
if (debug) fprintf(stderr, "\n-> Theme loaded.\n");
|
|
return TRUE;
|
|
} else {
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
void fak_icon_text(char *string, unsigned int where, unsigned int col, unsigned int red)
|
|
{
|
|
unsigned int x = 0;
|
|
unsigned int offset = 0;
|
|
unsigned hoffset = 0;
|
|
unsigned voffset = 0;
|
|
unsigned char txt[128];
|
|
unsigned int j;
|
|
unsigned int char_max;
|
|
int out = FALSE;
|
|
|
|
if (!th_no_icon_window) return;
|
|
|
|
switch(where) {
|
|
case COUNTER_PANEL:
|
|
if (icon_counter == 0) out = TRUE;
|
|
else {
|
|
voffset = thdata[icon_counter].y;
|
|
hoffset = thdata[icon_counter].x;
|
|
}
|
|
break;
|
|
case MSG_PANEL:
|
|
if (icon_msg == 0) out = TRUE;
|
|
else {
|
|
voffset = thdata[icon_msg].y;
|
|
hoffset = thdata[icon_msg].x;
|
|
}
|
|
break;
|
|
default:
|
|
if (icon_tracknbr == 0) out = TRUE;
|
|
else {
|
|
voffset = thdata[icon_tracknbr].y;
|
|
hoffset = thdata[icon_tracknbr].x;
|
|
}
|
|
break;
|
|
}
|
|
|
|
if (out) return;
|
|
|
|
strcpy(txt, string);
|
|
|
|
/* Deal with the string length: */
|
|
|
|
if ((strlen(txt) > thdata[icon_msg].w) && (where == MSG_PANEL)) {
|
|
txt[thdata[icon_msg].w] = 0;
|
|
|
|
}
|
|
|
|
if ((strcmp(txt, "") == 0) && (where == MSG_PANEL)) {
|
|
for (x = 1; x <= thdata[icon_msg].w; x++) {
|
|
strcat(txt, " ");
|
|
}
|
|
}
|
|
|
|
|
|
if (red) {
|
|
char_max = alphaXPM.attributes.width / 6;
|
|
} else {
|
|
char_max = ralphaXPM.attributes.width / 6;
|
|
}
|
|
|
|
for(x = 0; x < strlen(txt); x++) {
|
|
|
|
/* lookup in the accents table to remove them */
|
|
if (! force_upper) {
|
|
|
|
if (char_max <= 116) { /* don't convert if 8bit font */
|
|
for (j = 0 ; j <= strlen(ACCTABLE) - 2 ; j = j + 2) {
|
|
if ( txt[x] == (unsigned char)ACCTABLE[j] ) {
|
|
txt[x] = ACCTABLE[j + 1];
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
} else {
|
|
/* force upper case */
|
|
for (j = 0 ; j <= strlen(UPACCTABLE) - 2 ; j = j + 2) {
|
|
if ( txt[x] == (unsigned char)UPACCTABLE[j] ) {
|
|
txt[x] = UPACCTABLE[j + 1];
|
|
break;
|
|
}
|
|
}
|
|
txt[x] = toupper(txt[x]);
|
|
}
|
|
|
|
if ((txt[x] >= 32) && (txt[x] <= char_max + 32)) offset = txt[x] - 32;
|
|
else offset = 31;
|
|
|
|
if (red) {
|
|
XCopyArea(Disp, ralphaXPM.pixmap, Iconwin, WinGC,
|
|
6 * offset, 0, 6, 9,
|
|
hoffset + (col * 6) + (x * 6),
|
|
voffset);
|
|
} else {
|
|
XCopyArea(Disp, alphaXPM.pixmap, Iconwin, WinGC,
|
|
6 * offset, 0, 6, 9,
|
|
hoffset + (col * 6) + (x * 6),
|
|
voffset);
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
void fak_text(char *string, unsigned int where, unsigned int col, unsigned int red) {
|
|
|
|
/* different behaviour than the old draw_text() found in AScd <= 0.12.... The
|
|
where parameter replaces the odl "row" one and should be:
|
|
|
|
0 = write to the counter zone
|
|
1 = write to the message zone
|
|
2 = write to the track number zone
|
|
*/
|
|
|
|
unsigned int x = 0;
|
|
unsigned int offset = 0;
|
|
unsigned hoffset = 0;
|
|
unsigned voffset = 0;
|
|
unsigned char txt[128];
|
|
unsigned int j;
|
|
unsigned int char_max;
|
|
int out = FALSE;
|
|
int do_icon = TRUE;
|
|
|
|
if (where == DB_PANEL) {
|
|
do_icon = FALSE;
|
|
if (but_db == 0) where = MSG_PANEL;
|
|
}
|
|
|
|
if (do_icon) fak_icon_text(string, where, col, red);
|
|
|
|
switch(where) {
|
|
case COUNTER_PANEL:
|
|
if (but_counter == 0) out = TRUE;
|
|
else {
|
|
voffset = thdata[but_counter].y;
|
|
hoffset = thdata[but_counter].x;
|
|
}
|
|
break;
|
|
case MSG_PANEL:
|
|
if (but_msg == 0) out = TRUE;
|
|
else {
|
|
voffset = thdata[but_msg].y;
|
|
hoffset = thdata[but_msg].x;
|
|
}
|
|
break;
|
|
case DB_PANEL:
|
|
voffset = thdata[but_db].y;
|
|
hoffset = thdata[but_db].x;
|
|
break;
|
|
default:
|
|
if (but_tracknbr == 0) out = TRUE;
|
|
else {
|
|
voffset = thdata[but_tracknbr].y;
|
|
hoffset = thdata[but_tracknbr].x;
|
|
}
|
|
break;
|
|
}
|
|
|
|
if (out) return;
|
|
|
|
strcpy(txt, string);
|
|
|
|
/* Deal with the string length: */
|
|
|
|
if ((strlen(txt) > thdata[but_msg].w) && (where == MSG_PANEL)) {
|
|
txt[thdata[but_msg].w] = 0;
|
|
|
|
}
|
|
|
|
if ((strlen(txt) > thdata[but_db].w) && (where == DB_PANEL)) {
|
|
txt[thdata[but_msg].w] = 0;
|
|
|
|
}
|
|
|
|
if ((strcmp(txt, "") == 0) && (where == MSG_PANEL)) {
|
|
for (x = 1; x <= thdata[but_msg].w; x++) {
|
|
strcat(txt, " ");
|
|
}
|
|
}
|
|
|
|
if ((strcmp(txt, "") == 0) && (where == DB_PANEL)) {
|
|
for (x = 1; x <= thdata[but_db].w; x++) {
|
|
strcat(txt, " ");
|
|
}
|
|
}
|
|
|
|
if (red) {
|
|
char_max = alphaXPM.attributes.width / 6;
|
|
} else {
|
|
char_max = ralphaXPM.attributes.width / 6;
|
|
}
|
|
|
|
for(x = 0; x < strlen(txt); x++) {
|
|
|
|
/* lookup in the accents table to remove them */
|
|
if (! force_upper) {
|
|
|
|
if (char_max <= 116) { /* don't convert if 8bit font */
|
|
for (j = 0 ; j <= strlen(ACCTABLE) - 2 ; j = j + 2) {
|
|
if ( txt[x] == (unsigned char)ACCTABLE[j] ) {
|
|
txt[x] = ACCTABLE[j + 1];
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
} else {
|
|
/* force upper case */
|
|
for (j = 0 ; j <= strlen(UPACCTABLE) - 2 ; j = j + 2) {
|
|
if ( txt[x] == (unsigned char)UPACCTABLE[j] ) {
|
|
txt[x] = UPACCTABLE[j + 1];
|
|
break;
|
|
}
|
|
}
|
|
txt[x] = toupper(txt[x]);
|
|
}
|
|
|
|
if ((txt[x] >= 32) && (txt[x] <= char_max + 32)) offset = txt[x] - 32;
|
|
else offset = 31;
|
|
|
|
if (red) {
|
|
XCopyArea(Disp, ralphaXPM.pixmap, Win, WinGC,
|
|
6 * offset, 0, 6, 9,
|
|
hoffset + (col * 6) + (x * 6),
|
|
voffset);
|
|
|
|
if (!th_no_icon_window) {
|
|
XCopyArea(Disp, ralphaXPM.pixmap, Iconwin, WinGC,
|
|
6 * offset, 0, 6, 9,
|
|
hoffset + (col * 6) + (x * 6),
|
|
voffset);
|
|
}
|
|
} else {
|
|
XCopyArea(Disp, alphaXPM.pixmap, Win, WinGC,
|
|
6 * offset, 0, 6, 9,
|
|
hoffset + (col * 6) + (x * 6),
|
|
voffset);
|
|
|
|
if (!th_no_icon_window) {
|
|
XCopyArea(Disp, alphaXPM.pixmap, Iconwin, WinGC,
|
|
6 * offset, 0, 6, 9,
|
|
hoffset + (col * 6) + (x * 6),
|
|
voffset);
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
int fak_flush_expose(Window w)
|
|
{
|
|
XEvent dummy;
|
|
int i=0;
|
|
|
|
while (XCheckTypedWindowEvent (Disp, w, Expose, &dummy))i++;
|
|
return i;
|
|
}
|
|
|
|
void fak_minus(void) {
|
|
if (th_no_minus) return;
|
|
|
|
if (time_mode == 1) {
|
|
if (!th_no_icon_window) {
|
|
if (but_counter == 0) return;
|
|
XCopyArea(Disp, alphaXPM.pixmap, Win, WinGC,
|
|
6 * (45 - 32), 0, 6, 7,
|
|
thdata[but_counter].x, thdata[but_counter].y);
|
|
XCopyArea(Disp, alphaXPM.pixmap, Iconwin, WinGC,
|
|
6 * (45 - 32), 0, 6, 7,
|
|
thdata[but_counter].x, thdata[but_counter].y);
|
|
} else {
|
|
if (but_counter > 0) {
|
|
XCopyArea(Disp, alphaXPM.pixmap, Win, WinGC,
|
|
6 * (45 - 32), 0, 6, 7,
|
|
thdata[but_counter].x, thdata[but_counter].y);
|
|
}
|
|
if (icon_counter > 0) {
|
|
XCopyArea(Disp, alphaXPM.pixmap, Iconwin, WinGC,
|
|
6 * (45 - 32), 0, 6, 7,
|
|
thdata[icon_counter].x, thdata[icon_counter].y);
|
|
}
|
|
}
|
|
} else if (time_mode == 3) {
|
|
if (!th_no_icon_window) {
|
|
if (but_counter == 0) return;
|
|
XCopyArea(Disp, alphaXPM.pixmap, Win, WinGC,
|
|
588, 0, 4, 7,
|
|
thdata[but_counter].x, thdata[but_counter].y);
|
|
XCopyArea(Disp, alphaXPM.pixmap, Iconwin, WinGC,
|
|
588, 0, 4, 7,
|
|
thdata[but_counter].x, thdata[but_counter].y);
|
|
} else {
|
|
if (but_counter > 0) {
|
|
XCopyArea(Disp, alphaXPM.pixmap, Win, WinGC,
|
|
588, 0, 4, 7,
|
|
thdata[but_counter].x, thdata[but_counter].y);
|
|
}
|
|
if (icon_counter > 0) {
|
|
XCopyArea(Disp, alphaXPM.pixmap, Iconwin, WinGC,
|
|
588, 0, 4, 7,
|
|
thdata[icon_counter].x, thdata[icon_counter].y);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* if displaying CD times, we display a little 'cd' */
|
|
|
|
if (time_mode >= 2) {
|
|
if (!th_no_icon_window) {
|
|
if (but_counter == 0) return;
|
|
XCopyArea(Disp, ralphaXPM.pixmap, Win, WinGC,
|
|
582, 0, 4, 4,
|
|
thdata[but_counter].x, thdata[but_counter].y);
|
|
XCopyArea(Disp, ralphaXPM.pixmap, Iconwin, WinGC,
|
|
582, 0, 4, 4,
|
|
thdata[but_counter].x, thdata[but_counter].y);
|
|
} else {
|
|
if (but_counter > 0) {
|
|
XCopyArea(Disp, ralphaXPM.pixmap, Win, WinGC,
|
|
582, 0, 4, 4,
|
|
thdata[but_counter].x, thdata[but_counter].y);
|
|
}
|
|
if (icon_counter > 0) {
|
|
XCopyArea(Disp, ralphaXPM.pixmap, Iconwin, WinGC,
|
|
582, 0, 4, 4,
|
|
thdata[icon_counter].x, thdata[icon_counter].y);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
void fak_singlemask(int i)
|
|
{
|
|
/* we first remove pixmap and alt from the mask */
|
|
|
|
if (strlen(thdata[i].xpm_file) > 0) {
|
|
if (!th_no_icon_window) {
|
|
XShapeCombineMask(Disp, Win, ShapeBounding, thdata[i].x, thdata[i].y,
|
|
thdata[i].xpm.mask, ShapeSubtract);
|
|
XShapeCombineMask(Disp, Iconwin, ShapeBounding, thdata[i].x, thdata[i].y,
|
|
thdata[i].xpm.mask, ShapeSubtract);
|
|
} else {
|
|
if (thdata[i].icon) {
|
|
XShapeCombineMask(Disp, Iconwin, ShapeBounding, thdata[i].x, thdata[i].y,
|
|
thdata[i].xpm.mask, ShapeSubtract);
|
|
} else {
|
|
XShapeCombineMask(Disp, Win, ShapeBounding, thdata[i].x, thdata[i].y,
|
|
thdata[i].xpm.mask, ShapeSubtract);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (strlen(thdata[i].altxpm_file) > 0) {
|
|
if (!th_no_icon_window) {
|
|
XShapeCombineMask(Disp, Win, ShapeBounding, thdata[i].x, thdata[i].y,
|
|
thdata[i].altxpm.mask, ShapeSubtract);
|
|
XShapeCombineMask(Disp, Iconwin, ShapeBounding, thdata[i].x, thdata[i].y,
|
|
thdata[i].altxpm.mask, ShapeSubtract);
|
|
} else {
|
|
if (thdata[i].icon) {
|
|
XShapeCombineMask(Disp, Iconwin, ShapeBounding, thdata[i].x, thdata[i].y,
|
|
thdata[i].altxpm.mask, ShapeSubtract);
|
|
} else {
|
|
XShapeCombineMask(Disp, Win, ShapeBounding, thdata[i].x, thdata[i].y,
|
|
thdata[i].altxpm.mask, ShapeSubtract);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* then we set of the two : */
|
|
|
|
if ((fak_use_alt(i)) && (strlen(thdata[i].altxpm_file) > 0)) {
|
|
if (!th_no_icon_window) {
|
|
XShapeCombineMask(Disp, Win, ShapeBounding, thdata[i].x, thdata[i].y,
|
|
thdata[i].altxpm.mask, ShapeUnion);
|
|
XShapeCombineMask(Disp, Iconwin, ShapeBounding, thdata[i].x, thdata[i].y,
|
|
thdata[i].altxpm.mask, ShapeUnion);
|
|
} else {
|
|
if (thdata[i].icon) {
|
|
XShapeCombineMask(Disp, Iconwin, ShapeBounding, thdata[i].x, thdata[i].y,
|
|
thdata[i].altxpm.mask, ShapeUnion);
|
|
} else {
|
|
XShapeCombineMask(Disp, Win, ShapeBounding, thdata[i].x, thdata[i].y,
|
|
thdata[i].altxpm.mask, ShapeUnion);
|
|
}
|
|
}
|
|
} else {
|
|
if (!th_no_icon_window) {
|
|
XShapeCombineMask(Disp, Win, ShapeBounding, thdata[i].x, thdata[i].y,
|
|
thdata[i].xpm.mask, ShapeUnion);
|
|
XShapeCombineMask(Disp, Iconwin, ShapeBounding, thdata[i].x, thdata[i].y,
|
|
thdata[i].xpm.mask, ShapeUnion);
|
|
} else {
|
|
if (thdata[i].icon) {
|
|
XShapeCombineMask(Disp, Iconwin, ShapeBounding, thdata[i].x, thdata[i].y,
|
|
thdata[i].xpm.mask, ShapeUnion);
|
|
} else {
|
|
XShapeCombineMask(Disp, Win, ShapeBounding, thdata[i].x, thdata[i].y,
|
|
thdata[i].xpm.mask, ShapeUnion);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void fak_maskset()
|
|
{
|
|
int i;
|
|
|
|
if (debug) fprintf(stderr, "** Setting pixmaps mask\n");
|
|
if (debug) fprintf(stderr, "-> background\n");
|
|
|
|
XShapeCombineMask(Disp, Win, ShapeBounding, 0, 0,
|
|
backXPM.mask, ShapeSet);
|
|
|
|
if (!th_no_icon_window) {
|
|
XShapeCombineMask(Disp, Iconwin, ShapeBounding, 0, 0,
|
|
backXPM.mask, ShapeSet);
|
|
} else {
|
|
if (strlen(th_icon_window) > 0) {
|
|
XShapeCombineMask(Disp, Iconwin, ShapeBounding, 0, 0,
|
|
iconXPM.mask, ShapeSet);
|
|
}
|
|
}
|
|
if (debug) fprintf(stderr, "-> buttons ");
|
|
for (i=1; i <= but_max; i++) {
|
|
if ((thdata[i].panel == panel) || (thdata[i].panel == 0)) {
|
|
if (strlen(thdata[i].xpm_file) > 0) {
|
|
if (debug) fprintf(stderr, "%d ", i);
|
|
if ((fak_use_alt(i)) && (strlen(thdata[i].altxpm_file) > 0)) {
|
|
if (!th_no_icon_window) {
|
|
XShapeCombineMask(Disp, Win, ShapeBounding, thdata[i].x, thdata[i].y,
|
|
thdata[i].altxpm.mask, ShapeUnion);
|
|
XShapeCombineMask(Disp, Iconwin, ShapeBounding, thdata[i].x, thdata[i].y,
|
|
thdata[i].altxpm.mask, ShapeUnion);
|
|
} else {
|
|
if (thdata[i].icon) {
|
|
XShapeCombineMask(Disp, Iconwin, ShapeBounding, thdata[i].x, thdata[i].y,
|
|
thdata[i].altxpm.mask, ShapeUnion);
|
|
} else {
|
|
XShapeCombineMask(Disp, Win, ShapeBounding, thdata[i].x, thdata[i].y,
|
|
thdata[i].altxpm.mask, ShapeUnion);
|
|
}
|
|
}
|
|
} else {
|
|
if (!th_no_icon_window) {
|
|
XShapeCombineMask(Disp, Win, ShapeBounding, thdata[i].x, thdata[i].y,
|
|
thdata[i].xpm.mask, ShapeUnion);
|
|
XShapeCombineMask(Disp, Iconwin, ShapeBounding, thdata[i].x, thdata[i].y,
|
|
thdata[i].xpm.mask, ShapeUnion);
|
|
} else {
|
|
if (thdata[i].icon) {
|
|
XShapeCombineMask(Disp, Iconwin, ShapeBounding, thdata[i].x, thdata[i].y,
|
|
thdata[i].xpm.mask, ShapeUnion);
|
|
} else {
|
|
XShapeCombineMask(Disp, Win, ShapeBounding, thdata[i].x, thdata[i].y,
|
|
thdata[i].xpm.mask, ShapeUnion);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (debug) fprintf(stderr, "\n-> done.\n");
|
|
}
|
|
|
|
void fak_redraw()
|
|
{
|
|
char txt[256];
|
|
int i;
|
|
long int dodo = 300000;
|
|
char cdtime[6];
|
|
int disp_time;
|
|
int use_alt = FALSE;
|
|
int offset;
|
|
DIR *dir_fd;
|
|
struct dirent *dir_pt;
|
|
unsigned int fx;
|
|
unsigned int fy;
|
|
unsigned int fw;
|
|
unsigned int fh;
|
|
|
|
/* ============================================================== */
|
|
/* ============================================================== */
|
|
/* ============================================================== */
|
|
/* First part: check different modes before doing the real redraw */
|
|
/* ============================================================== */
|
|
/* ============================================================== */
|
|
/* ============================================================== */
|
|
|
|
if (debug) fprintf(stderr, "** Entering redraw routine\n");
|
|
|
|
if (!blind_mode) {
|
|
if ((cur_cdmode == WM_CDM_PLAYING) || (wanna_play)) wm_cd_status();
|
|
}
|
|
|
|
/* the panel auto-switch mode: */
|
|
|
|
if (((cur_cdmode == WM_CDM_STOPPED) || (cur_cdmode == WM_CDM_EJECTED)) && (panel_stop > 0)) panel = panel_stop;
|
|
if (((cur_cdmode == WM_CDM_PLAYING) || (cur_cdmode == WM_CDM_PAUSED)) && (panel_play > 0)) panel = panel_play;
|
|
|
|
/* ===================================================================
|
|
Auto-Repeat mode: at then end of the CD, play again the first track
|
|
=================================================================== */
|
|
|
|
if ((cur_track >= cur_ntracks) && (cur_cdmode != WM_CDM_PAUSED) && (cur_cdmode != WM_CDM_PLAYING)) {
|
|
/*if (wanna_play) {*/
|
|
if (autorepeat) {
|
|
newtext("A.Repeat");
|
|
do_autorepeat = TRUE;
|
|
cd_control(PLAY);
|
|
} else {
|
|
cd_control(STOPONLY); /* added in 0.13 */
|
|
if (debug) fprintf(stderr, "-> Stopping\n");
|
|
cur_cdmode = WM_CDM_STOPPED;
|
|
wm_cd_status();
|
|
cur_track = 0;
|
|
redraw = TRUE;
|
|
fak_maskset();
|
|
}
|
|
}
|
|
|
|
/* ======================================================= */
|
|
/* the next track handling. We have to skip 'avoid' tracks */
|
|
/* ======================================================= */
|
|
|
|
if ((cur_cdmode != WM_CDM_EJECTED) && (! ignore_avoid)) {
|
|
if (cur_ntracks > 1) { /* only if there are more than ONE track */
|
|
if (cur_track != old_track) {
|
|
if (debug) fprintf(stderr, "-> Track change (current = %d, old = %d)\n", cur_track, old_track);
|
|
redraw = TRUE;
|
|
i = cur_track - 1;
|
|
while ((i <= cur_ntracks) && (cd->trk[i].avoid == 1)) {
|
|
i ++;
|
|
}
|
|
|
|
/* go to the next valid track, only if it is now the
|
|
current track... */
|
|
|
|
if (i != cur_track - 1) {
|
|
direct_track = i + 1;
|
|
cd_control(DIRECTTRACK);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* ======================================================================
|
|
Do we *really* need to update the counter? If the cur time is the same
|
|
as last time, we simply exit the redraw function
|
|
====================================================================== */
|
|
|
|
if ((cur_track == old_track) && (lasttime == cur_pos_rel) && (!redraw) && (text_start == 0) && (strlen(led_text) == 0)) return;
|
|
|
|
lasttime = cur_pos_rel;
|
|
|
|
/* ===================================== */
|
|
/* ===================================== */
|
|
/* ===================================== */
|
|
/* ===================================== */
|
|
/* Dealing with the __real__ redraw now: */
|
|
/* ===================================== */
|
|
/* ===================================== */
|
|
/* ===================================== */
|
|
/* ===================================== */
|
|
|
|
if (debug) fprintf(stderr, "-> Redrawing\n");
|
|
|
|
fak_flush_expose(Win);
|
|
fak_flush_expose(Iconwin);
|
|
|
|
|
|
/* ================================ */
|
|
/* draw the text if we have a query */
|
|
/* ================================ */
|
|
|
|
/* but but but... If we see a "redraw" query,
|
|
we skip the text! It will be displayed next time
|
|
the function is called... 0.13 */
|
|
|
|
if (!redraw) {
|
|
if (strlen(led_text) > 0) {
|
|
if (text_start == 0) {
|
|
text_start = time(NULL);
|
|
fak_text("", MSG_PANEL, 0, FALSE);
|
|
fak_text(led_text, MSG_PANEL, 0, FALSE);
|
|
}
|
|
|
|
if (time(NULL) - text_start > text_timeout) {
|
|
text_start = 0;
|
|
redraw = TRUE;
|
|
strcpy(led_text, "");
|
|
fak_text("", MSG_PANEL, 0, FALSE);
|
|
} else {
|
|
if (!fade_out) return;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* ======================================= */
|
|
/* if WINGs support, update the track list */
|
|
/* ======================================= */
|
|
|
|
#ifdef WMK
|
|
if (cur_track != old_track) {
|
|
update_track();
|
|
old_track = cur_track;
|
|
}
|
|
#endif
|
|
|
|
/* ===============================================
|
|
We don't redraw everything if not required,
|
|
so whe ckech fo each element if redraw variable
|
|
is set
|
|
=============================================== */
|
|
|
|
/* the background: */
|
|
|
|
if (redraw) {
|
|
|
|
if (debug) fprintf(stderr, "-> ** GLOBAL REDRAW NEEDED **\n");
|
|
|
|
XCopyArea(Disp,backXPM.pixmap,Win,WinGC,0,0,backXPM.attributes.width, backXPM.attributes.height,0,0);
|
|
if (!th_no_icon_window) {
|
|
XCopyArea(Disp,backXPM.pixmap,Iconwin,WinGC,0,0,backXPM.attributes.width, backXPM.attributes.height,0,0);
|
|
} else {
|
|
if (strlen(th_icon_window) > 0) {
|
|
XCopyArea(Disp,iconXPM.pixmap,Iconwin,WinGC,0,0,iconXPM.attributes.width, iconXPM.attributes.height,0,0);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* the buttons: */
|
|
|
|
for (i = 1; i <= but_max; i++) {
|
|
|
|
use_alt = FALSE;
|
|
|
|
if ((thdata[i].panel == panel) || (thdata[i].panel == 0)) {
|
|
if (thdata[i].type == FAK_VCD_BAR) {
|
|
if ( (cur_cdmode != WM_CDM_STOPPED) && (cur_cdmode != WM_CDM_EJECTED) ) {
|
|
if ((time_mode == 2) || (time_mode == 3)) {
|
|
if (cur_cdlen > 0) {
|
|
XCopyArea(Disp, thdata[i].xpm.pixmap, Win, WinGC, 0, 0,
|
|
thdata[i].xpm.attributes.width,
|
|
0 + (int)((float)cur_pos_abs / (float)cur_cdlen * (float)thdata[i].xpm.attributes.height),
|
|
thdata[i].x,
|
|
thdata[i].y);
|
|
if (!th_no_icon_window) {
|
|
XCopyArea(Disp, thdata[i].xpm.pixmap, Iconwin, WinGC, 0, 0,
|
|
thdata[i].xpm.attributes.width,
|
|
0 + (int)((float)cur_pos_abs / (float)cur_cdlen * (float)thdata[i].xpm.attributes.height),
|
|
thdata[i].x,
|
|
thdata[i].y);
|
|
}
|
|
}
|
|
} else {
|
|
if (cur_tracklen > 0) {
|
|
XCopyArea(Disp, thdata[i].xpm.pixmap, Win, WinGC, 0, 0,
|
|
thdata[i].xpm.attributes.width,
|
|
0 + (int)((float)cur_pos_rel / (float)cur_tracklen * (float)thdata[i].xpm.attributes.height),
|
|
thdata[i].x,
|
|
thdata[i].y);
|
|
if (!th_no_icon_window) {
|
|
XCopyArea(Disp, thdata[i].xpm.pixmap, Iconwin, WinGC, 0, 0,
|
|
thdata[i].xpm.attributes.width,
|
|
0 + (int)((float)cur_pos_rel / (float)cur_tracklen * (float)thdata[i].xpm.attributes.height),
|
|
thdata[i].x,
|
|
thdata[i].y);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
} else if (thdata[i].type == FAK_ICD_BAR) {
|
|
if ( (cur_cdmode != WM_CDM_STOPPED) && (cur_cdmode != WM_CDM_EJECTED) ) {
|
|
if ((time_mode == 2) || (time_mode == 3)) {
|
|
if (cur_cdlen > 0) {
|
|
offset = (int)((float)cur_pos_abs / (float)cur_cdlen * (float)thdata[i].xpm.attributes.height);
|
|
offset = thdata[i].xpm.attributes.height - offset;
|
|
|
|
XCopyArea(Disp, thdata[i].xpm.pixmap, Win, WinGC, 0, 0,
|
|
thdata[i].xpm.attributes.width,
|
|
thdata[i].xpm.attributes.height - offset,
|
|
thdata[i].x,
|
|
thdata[i].y +offset);
|
|
|
|
if (!th_no_icon_window) {
|
|
XCopyArea(Disp, thdata[i].xpm.pixmap, Iconwin, WinGC, 0, 0,
|
|
thdata[i].xpm.attributes.width,
|
|
thdata[i].xpm.attributes.height - offset,
|
|
thdata[i].x,
|
|
thdata[i].y +offset);
|
|
}
|
|
}
|
|
} else {
|
|
if (cur_tracklen > 0) {
|
|
offset = (int)((float)cur_pos_rel / (float)cur_tracklen * (float)thdata[i].xpm.attributes.height);
|
|
offset = thdata[i].xpm.attributes.height - offset;
|
|
|
|
XCopyArea(Disp, thdata[i].xpm.pixmap, Win, WinGC, 0, 0,
|
|
thdata[i].xpm.attributes.width,
|
|
thdata[i].xpm.attributes.height - offset,
|
|
thdata[i].x,
|
|
thdata[i].y +offset);
|
|
|
|
if (!th_no_icon_window) {
|
|
XCopyArea(Disp, thdata[i].xpm.pixmap, Iconwin, WinGC, 0, 0,
|
|
thdata[i].xpm.attributes.width,
|
|
thdata[i].xpm.attributes.height - offset,
|
|
thdata[i].x,
|
|
thdata[i].y +offset);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
} else if (thdata[i].type == FAK_CD_BAR) {
|
|
if ( (cur_cdmode != WM_CDM_STOPPED) && (cur_cdmode != WM_CDM_EJECTED) ) {
|
|
if ((time_mode == 2) || (time_mode == 3)) {
|
|
if (cur_cdlen > 0) {
|
|
XCopyArea(Disp, thdata[i].xpm.pixmap, Win, WinGC, 0, 0,
|
|
0 + (int)((float)cur_pos_abs / (float)cur_cdlen * (float)thdata[i].xpm.attributes.width),
|
|
thdata[i].xpm.attributes.height, thdata[i].x, thdata[i].y);
|
|
if (!th_no_icon_window) {
|
|
XCopyArea(Disp, thdata[i].xpm.pixmap, Iconwin, WinGC, 0, 0,
|
|
0 + (int)((float)cur_pos_abs / (float)cur_cdlen * (float)thdata[i].xpm.attributes.width),
|
|
thdata[i].xpm.attributes.height, thdata[i].x, thdata[i].y);
|
|
}
|
|
}
|
|
} else {
|
|
if (cur_tracklen > 0) {
|
|
XCopyArea(Disp, thdata[i].xpm.pixmap, Win, WinGC, 0, 0,
|
|
0 + (int)((float)cur_pos_rel / (float)cur_tracklen * (float)thdata[i].xpm.attributes.width),
|
|
thdata[i].xpm.attributes.height, thdata[i].x, thdata[i].y);
|
|
if (!th_no_icon_window) {
|
|
XCopyArea(Disp, thdata[i].xpm.pixmap, Iconwin, WinGC, 0, 0,
|
|
0 + (int)((float)cur_pos_rel / (float)cur_tracklen * (float)thdata[i].xpm.attributes.width),
|
|
thdata[i].xpm.attributes.height, thdata[i].x, thdata[i].y);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
} else if (thdata[i].type == FAK_VCD_PIX) { /************** vertical pixmap slider *****************/
|
|
if ((cur_cdmode != WM_CDM_STOPPED) && (cur_cdmode != WM_CDM_EJECTED) && (cur_cdlen > 0)) {
|
|
|
|
/* erase the old position : */
|
|
|
|
if (thdata[i].ox > 0) {
|
|
XCopyArea(Disp, thdata[i].xpm.pixmap, Win, WinGC,
|
|
0, thdata[i].oy,
|
|
thdata[i].altxpm.attributes.width, thdata[i].altxpm.attributes.height,
|
|
thdata[i].x,
|
|
thdata[i].oy + thdata[i].y);
|
|
|
|
if (!th_no_icon_window) {
|
|
XCopyArea(Disp, thdata[i].xpm.pixmap, Iconwin, WinGC,
|
|
0, thdata[i].oy,
|
|
thdata[i].altxpm.attributes.width, thdata[i].altxpm.attributes.height,
|
|
thdata[i].x,
|
|
thdata[i].oy + thdata[i].y);
|
|
}
|
|
}
|
|
|
|
/* compute the new geometry: */
|
|
|
|
if ((time_mode == 2) || (time_mode == 3)) fx = (int)((float)cur_pos_abs / (float)cur_cdlen * (float)(thdata[i].xpm.attributes.width - thdata[i].altxpm.attributes.width));
|
|
else fx = (int)((float)cur_pos_rel / (float)cur_tracklen * (float)(thdata[i].xpm.attributes.width - thdata[i].altxpm.attributes.width));
|
|
|
|
/* ugly, need to CHANGE THIS!!!!! */
|
|
if (fx < 1) fx = 1;
|
|
|
|
/* and show it: */
|
|
|
|
XCopyArea(Disp, thdata[i].altxpm.pixmap, Win, WinGC,
|
|
0, 0,
|
|
thdata[i].altxpm.attributes.width, thdata[i].altxpm.attributes.height,
|
|
thdata[i].x,
|
|
thdata[i].y + fx);
|
|
|
|
if (!th_no_icon_window) {
|
|
XCopyArea(Disp, thdata[i].altxpm.pixmap, Iconwin, WinGC,
|
|
0, 0,
|
|
thdata[i].altxpm.attributes.width, thdata[i].altxpm.attributes.height,
|
|
thdata[i].x,
|
|
thdata[i].y + fx);
|
|
}
|
|
|
|
/* finaly, save it! */
|
|
thdata[i].oy = fx;
|
|
}
|
|
} else if (thdata[i].type == FAK_CD_PIX) { /**************** horizontal pixmap slider *****************/
|
|
if ((cur_cdmode != WM_CDM_STOPPED) && (cur_cdmode != WM_CDM_EJECTED) && (cur_cdlen > 0)) {
|
|
/* erase the old position : */
|
|
|
|
if (thdata[i].ox > 0) {
|
|
XCopyArea(Disp, thdata[i].xpm.pixmap, Win, WinGC,
|
|
thdata[i].ox, 0,
|
|
thdata[i].altxpm.attributes.width, thdata[i].altxpm.attributes.height,
|
|
thdata[i].ox + thdata[i].x,
|
|
thdata[i].y);
|
|
|
|
if (!th_no_icon_window) {
|
|
XCopyArea(Disp, thdata[i].xpm.pixmap, Iconwin, WinGC,
|
|
thdata[i].ox, 0,
|
|
thdata[i].altxpm.attributes.width, thdata[i].altxpm.attributes.height,
|
|
thdata[i].ox + thdata[i].x,
|
|
thdata[i].y);
|
|
}
|
|
}
|
|
|
|
/* compute the new geometry: */
|
|
|
|
if ((time_mode == 2) || (time_mode == 3)) fx = (int)((float)cur_pos_abs / (float)cur_cdlen * (float)(thdata[i].xpm.attributes.height - thdata[i].altxpm.attributes.height));
|
|
else fx = (int)((float)cur_pos_rel / (float)cur_tracklen * (float)(thdata[i].xpm.attributes.height - thdata[i].altxpm.attributes.height));
|
|
|
|
/* ugly, need to CHANGE THIS!!!!! */
|
|
if (fx < 1) fx = 1;
|
|
|
|
/* and show it: */
|
|
|
|
XCopyArea(Disp, thdata[i].altxpm.pixmap, Win, WinGC,
|
|
0, 0,
|
|
thdata[i].altxpm.attributes.width, thdata[i].altxpm.attributes.height,
|
|
thdata[i].x + fx,
|
|
thdata[i].y);
|
|
|
|
if (!th_no_icon_window) {
|
|
XCopyArea(Disp, thdata[i].altxpm.pixmap, Iconwin, WinGC,
|
|
0, 0,
|
|
thdata[i].altxpm.attributes.width, thdata[i].altxpm.attributes.height,
|
|
thdata[i].x + fx,
|
|
thdata[i].y);
|
|
}
|
|
|
|
/* finaly, save it! */
|
|
thdata[i].ox = fx;
|
|
}
|
|
} else if (thdata[i].type == FAK_VOL_BAR) {
|
|
if ( (cur_cdmode != WM_CDM_STOPPED) && (cur_cdmode != WM_CDM_EJECTED) ) {
|
|
XCopyArea(Disp, thdata[i].xpm.pixmap, Win, WinGC, 0, 0,
|
|
0 + (int)((float)volume / (float)max_volume * (float)thdata[i].xpm.attributes.width),
|
|
thdata[i].xpm.attributes.height, thdata[i].x, thdata[i].y);
|
|
if (!th_no_icon_window) {
|
|
XCopyArea(Disp, thdata[i].xpm.pixmap, Iconwin, WinGC, 0, 0,
|
|
0 + (int)((float)volume / (float)max_volume * (float)thdata[i].xpm.attributes.width),
|
|
thdata[i].xpm.attributes.height, thdata[i].x, thdata[i].y);
|
|
}
|
|
}
|
|
} else if (thdata[i].type == FAK_VOL_PIX) {
|
|
if ((cur_cdmode != WM_CDM_STOPPED) && (cur_cdmode != WM_CDM_EJECTED)) {
|
|
|
|
/* first erase the old position : */
|
|
|
|
if (thdata[i].ox > 0) {
|
|
XCopyArea(Disp, thdata[i].xpm.pixmap, Win, WinGC,
|
|
thdata[i].ox, 0,
|
|
thdata[i].altxpm.attributes.width, thdata[i].altxpm.attributes.height,
|
|
thdata[i].ox + thdata[i].x,
|
|
thdata[i].y);
|
|
|
|
if (!th_no_icon_window) {
|
|
XCopyArea(Disp, thdata[i].xpm.pixmap, Iconwin, WinGC,
|
|
thdata[i].ox, 0,
|
|
thdata[i].altxpm.attributes.width, thdata[i].altxpm.attributes.height,
|
|
thdata[i].ox + thdata[i].x,
|
|
thdata[i].y);
|
|
}
|
|
}
|
|
|
|
/* compute the new geometry: */
|
|
|
|
fx = (int)((float)volume / (float)max_volume * (float)(thdata[i].xpm.attributes.width - thdata[i].altxpm.attributes.width));
|
|
|
|
/* ugly, need to CHANGE THIS!!!!! */
|
|
if (fx < 1) fx = 1;
|
|
|
|
/* and show it: */
|
|
|
|
XCopyArea(Disp, thdata[i].altxpm.pixmap, Win, WinGC,
|
|
0, 0,
|
|
thdata[i].altxpm.attributes.width, thdata[i].altxpm.attributes.height,
|
|
thdata[i].x + fx,
|
|
thdata[i].y);
|
|
|
|
if (!th_no_icon_window) {
|
|
XCopyArea(Disp, thdata[i].altxpm.pixmap, Iconwin, WinGC,
|
|
0, 0,
|
|
thdata[i].altxpm.attributes.width, thdata[i].altxpm.attributes.height,
|
|
thdata[i].x + fx,
|
|
thdata[i].y);
|
|
}
|
|
|
|
/* finaly, save it! */
|
|
thdata[i].ox = fx;
|
|
}
|
|
} else if (thdata[i].type == FAK_VVOL_BAR) {
|
|
if ( (cur_cdmode != WM_CDM_STOPPED) && (cur_cdmode != WM_CDM_EJECTED) ) {
|
|
XCopyArea(Disp, thdata[i].xpm.pixmap, Win, WinGC, 0, 0,
|
|
thdata[i].xpm.attributes.width,
|
|
0 + (int)((float)volume / (float)max_volume * (float)thdata[i].xpm.attributes.height),
|
|
thdata[i].x,
|
|
thdata[i].y);
|
|
if (!th_no_icon_window) {
|
|
XCopyArea(Disp, thdata[i].xpm.pixmap, Iconwin, WinGC, 0, 0,
|
|
thdata[i].xpm.attributes.width,
|
|
0 + (int)((float)volume / (float)max_volume * (float)thdata[i].xpm.attributes.height),
|
|
thdata[i].x,
|
|
thdata[i].y);
|
|
}
|
|
}
|
|
} else if (thdata[i].type == FAK_IVOL_BAR) {
|
|
if ( (cur_cdmode != WM_CDM_STOPPED) && (cur_cdmode != WM_CDM_EJECTED) ) {
|
|
offset = (int)((float)volume / (float)max_volume * (float)thdata[i].xpm.attributes.height);
|
|
offset = thdata[i].xpm.attributes.height - offset;
|
|
XCopyArea(Disp, thdata[i].xpm.pixmap, Win, WinGC, 0, offset,
|
|
thdata[i].xpm.attributes.width,
|
|
thdata[i].xpm.attributes.height - offset,
|
|
thdata[i].x,
|
|
thdata[i].y +offset);
|
|
if (!th_no_icon_window) {
|
|
XCopyArea(Disp, thdata[i].xpm.pixmap, Iconwin, WinGC, 0, offset,
|
|
thdata[i].xpm.attributes.width,
|
|
thdata[i].xpm.attributes.height - offset,
|
|
thdata[i].x,
|
|
thdata[i].y +offset);
|
|
}
|
|
}
|
|
} else if (thdata[i].type == FAK_MIXER_BAR) {
|
|
#ifdef MIXER
|
|
XCopyArea(Disp, thdata[i].xpm.pixmap, Win, WinGC, 0, 0,
|
|
0 + (int)((float)getvol(thdata[i].arg) / 100.0 * (float)thdata[i].xpm.attributes.width),
|
|
thdata[i].xpm.attributes.height, thdata[i].x, thdata[i].y);
|
|
if (!th_no_icon_window) {
|
|
XCopyArea(Disp, thdata[i].xpm.pixmap, Iconwin, WinGC, 0, 0,
|
|
0 + (int)((float)getvol(thdata[i].arg) / 100.0 * (float)thdata[i].xpm.attributes.width),
|
|
thdata[i].xpm.attributes.height, thdata[i].x, thdata[i].y);
|
|
}
|
|
#endif
|
|
} else if (thdata[i].type == FAK_VMIXER_BAR) {
|
|
#ifdef MIXER
|
|
XCopyArea(Disp, thdata[i].xpm.pixmap, Win, WinGC, 0, 0,
|
|
thdata[i].xpm.attributes.width,
|
|
0 + (int)((float)getvol(thdata[i].arg) / 100.0 * (float)thdata[i].xpm.attributes.height),
|
|
thdata[i].x,
|
|
thdata[i].y);
|
|
if (!th_no_icon_window) {
|
|
XCopyArea(Disp, thdata[i].xpm.pixmap, Iconwin, WinGC, 0, 0,
|
|
thdata[i].xpm.attributes.width,
|
|
0 + (int)((float)getvol(thdata[i].arg) / 100.0 * (float)thdata[i].xpm.attributes.height),
|
|
thdata[i].x,
|
|
thdata[i].y);
|
|
}
|
|
#endif
|
|
} else if (thdata[i].type == FAK_IMIXER_BAR) {
|
|
#ifdef MIXER
|
|
offset = (int)((float)getvol(thdata[i].arg) / 100.0 * (float)thdata[i].xpm.attributes.height);
|
|
offset = thdata[i].xpm.attributes.height - offset;
|
|
XCopyArea(Disp, thdata[i].xpm.pixmap, Win, WinGC,
|
|
0,
|
|
offset,
|
|
thdata[i].xpm.attributes.width,
|
|
thdata[i].xpm.attributes.height - offset,
|
|
thdata[i].x,
|
|
thdata[i].y + offset);
|
|
if (!th_no_icon_window) {
|
|
XCopyArea(Disp, thdata[i].xpm.pixmap, Iconwin, WinGC, 0, offset,
|
|
thdata[i].xpm.attributes.width,
|
|
thdata[i].xpm.attributes.height - offset,
|
|
thdata[i].x,
|
|
thdata[i].y + offset);
|
|
}
|
|
#endif
|
|
} else {
|
|
if (redraw) {
|
|
if (strlen(thdata[i].xpm_file) > 0) {
|
|
if (strlen(thdata[i].altxpm_file) == 0) use_alt = FALSE;
|
|
else use_alt = fak_use_alt(i);
|
|
|
|
if (use_alt) {
|
|
if (!th_no_icon_window) {
|
|
XCopyArea(Disp, thdata[i].altxpm.pixmap, Win, WinGC, 0, 0, thdata[i].xpm.attributes.width, thdata[i].altxpm.attributes.height, thdata[i].x, thdata[i].y);
|
|
XCopyArea(Disp, thdata[i].altxpm.pixmap, Iconwin, WinGC, 0, 0, thdata[i].xpm.attributes.width, thdata[i].altxpm.attributes.height, thdata[i].x, thdata[i].y);
|
|
} else {
|
|
if (thdata[i].icon) {
|
|
XCopyArea(Disp, thdata[i].altxpm.pixmap, Iconwin, WinGC, 0, 0, thdata[i].xpm.attributes.width, thdata[i].altxpm.attributes.height, thdata[i].x, thdata[i].y);
|
|
} else {
|
|
XCopyArea(Disp, thdata[i].altxpm.pixmap, Win, WinGC, 0, 0, thdata[i].xpm.attributes.width, thdata[i].altxpm.attributes.height, thdata[i].x, thdata[i].y);
|
|
}
|
|
}
|
|
} else {
|
|
if (!th_no_icon_window) {
|
|
XCopyArea(Disp, thdata[i].xpm.pixmap, Win, WinGC, 0, 0, thdata[i].xpm.attributes.width, thdata[i].xpm.attributes.height, thdata[i].x, thdata[i].y);
|
|
XCopyArea(Disp, thdata[i].xpm.pixmap, Iconwin, WinGC, 0, 0, thdata[i].xpm.attributes.width, thdata[i].xpm.attributes.height, thdata[i].x, thdata[i].y);
|
|
} else {
|
|
if (thdata[i].icon) {
|
|
XCopyArea(Disp, thdata[i].xpm.pixmap, Iconwin, WinGC, 0, 0, thdata[i].xpm.attributes.width, thdata[i].xpm.attributes.height, thdata[i].x, thdata[i].y);
|
|
} else {
|
|
XCopyArea(Disp, thdata[i].xpm.pixmap, Win, WinGC, 0, 0, thdata[i].xpm.attributes.width, thdata[i].xpm.attributes.height, thdata[i].x, thdata[i].y);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
redraw = FALSE;
|
|
|
|
if (debug) fprintf(stderr, "-> Display [last section]\n");
|
|
|
|
/* The Track number */
|
|
|
|
/* if ((cur_cdmode == WM_CDM_PLAYING) || (cur_cdmode == WM_CDM_PAUSED)) { */
|
|
if (!th_no_minus) fak_text(" ", COUNTER_PANEL, 0, FALSE);
|
|
else fak_text(" ", COUNTER_PANEL, 0, FALSE);
|
|
|
|
/* no CD? no counters! */
|
|
|
|
if (cur_cdmode == WM_CDM_EJECTED) {
|
|
if (!th_no_minus) fak_text("AScd", COUNTER_PANEL, 1, FALSE);
|
|
else fak_text("AScd", COUNTER_PANEL, 0, FALSE);
|
|
fak_text("NO CD", MSG_PANEL, 1, TRUE);
|
|
if (debug) fprintf(stderr, "-> No CD. Leaving redraw routine\n");
|
|
return;
|
|
}
|
|
|
|
if (debug) fprintf(stderr, "-> Dealing with theme/fast_track selectors\n");
|
|
|
|
/* ================== */
|
|
/* The theme selector */
|
|
/* ================== */
|
|
|
|
if (theme_select > 0) {
|
|
/* 5 seconds timeout */
|
|
if (time(NULL) - selectors_timeout <= 5) {
|
|
fak_text("THEME", COUNTER_PANEL, 0, TRUE);
|
|
sprintf(cdtime, "%02d", theme_select);
|
|
fak_text(cdtime, TRACK_PANEL, 0, FALSE);
|
|
|
|
i = 0;
|
|
|
|
sprintf(txt, "%s/Themes", THDIR);
|
|
if ((dir_fd = opendir(txt)) != NULL) {
|
|
i = 0;
|
|
while((dir_pt = readdir(dir_fd)) != NULL) {
|
|
if (dir_pt->d_name[0] != '.') {
|
|
i++;
|
|
if (i == theme_select) {
|
|
strcpy(selected_theme, dir_pt->d_name);
|
|
fak_text(dir_pt->d_name, MSG_PANEL, 0, FALSE);
|
|
}
|
|
}
|
|
}
|
|
closedir(dir_fd);
|
|
}
|
|
return;
|
|
} else {
|
|
theme_select = 0;
|
|
redraw = TRUE;
|
|
}
|
|
}
|
|
|
|
/* =================== */
|
|
/* Fast Track selector */
|
|
/* =================== */
|
|
|
|
if (fast_track == 0) {
|
|
if (cur_track > 0) {
|
|
/* 15 seconds timeout */
|
|
if (time_mode != 15) {
|
|
sprintf(cdtime, "%02d", cur_track);
|
|
} else {
|
|
sprintf(cdtime, "%02d", cur_ntracks - cur_track);
|
|
}
|
|
} else {
|
|
sprintf(cdtime, "%02d", cur_ntracks);
|
|
}
|
|
if ((thdata[but_tracknbr].panel == panel) || (thdata[but_tracknbr].panel == 0))
|
|
fak_text(cdtime, TRACK_PANEL, 0, TRUE);
|
|
} else {
|
|
if (time(NULL) - selectors_timeout <= 3) {
|
|
sprintf(cdtime, "%02d", fast_track);
|
|
fak_text("TRACK", COUNTER_PANEL, 0, TRUE);
|
|
if ((thdata[but_tracknbr].panel == panel) || (thdata[but_tracknbr].panel == 0))
|
|
fak_text(cdtime, TRACK_PANEL, 0, FALSE);
|
|
return;
|
|
} else {
|
|
selectors_timeout = 0;
|
|
fast_track = 0;
|
|
redraw = TRUE;
|
|
}
|
|
}
|
|
|
|
if (debug) fprintf(stderr, "-> Counter\n");
|
|
|
|
/* the counter: */
|
|
|
|
switch(time_mode) {
|
|
case 0:
|
|
fak_minus();
|
|
disp_time = cur_pos_rel;
|
|
break;
|
|
case 1:
|
|
fak_minus();
|
|
disp_time = cur_tracklen - cur_pos_rel ;
|
|
break;
|
|
case 2:
|
|
fak_minus();
|
|
disp_time = cur_pos_abs;
|
|
break;
|
|
default:
|
|
fak_minus();
|
|
disp_time = cur_cdlen - cur_pos_abs;
|
|
break;
|
|
}
|
|
|
|
strcpy(cdtime, "00:00");
|
|
if ((cur_cdmode == WM_CDM_PLAYING) || (cur_cdmode == WM_CDM_PAUSED)) {
|
|
cdtime[0] = 0 ;
|
|
cdtime[1] = (disp_time / 60);
|
|
if (cdtime[1] >= 10) {
|
|
cdtime[0] = (cdtime[1] / 10);
|
|
cdtime[1] = (cdtime[1] % 10);
|
|
}
|
|
cdtime[3] = ((disp_time % 60) / 10);
|
|
cdtime[4] = (disp_time % 10);
|
|
} else {
|
|
cdtime[0] = 0;
|
|
cdtime[1] = (cur_cdlen / 60);
|
|
if (cdtime[1] >= 10) {
|
|
cdtime[0] = (cdtime[1] / 10);
|
|
cdtime[1] = (cdtime[1] % 10);
|
|
}
|
|
cdtime[3] = ((cur_cdlen % 60) / 10);
|
|
cdtime[4] = (cur_cdlen % 10);
|
|
}
|
|
|
|
cdtime[0] = cdtime[0] + 48;
|
|
cdtime[1] = cdtime[1] + 48;
|
|
cdtime[3] = cdtime[3] + 48;
|
|
cdtime[4] = cdtime[4] + 48;
|
|
|
|
if (th_no_minus) fak_text(cdtime, 0, 0, FALSE);
|
|
else fak_text(cdtime, 0, 1, FALSE);
|
|
|
|
/* ================= */
|
|
/* The auto fade out */
|
|
/* ================= */
|
|
|
|
if ((cur_cdmode == WM_CDM_PLAYING) && (fade_out)) {
|
|
if (!fade_ok) {
|
|
fade_ok = 1;
|
|
return;
|
|
} else {
|
|
unmuted_volume = volume ;
|
|
while (volume > min_volume) {
|
|
volume = volume - fade_step;
|
|
cd_volume(volume, 10, max_volume);
|
|
usleep(dodo);
|
|
}
|
|
fade_out = 0;
|
|
fade_ok = 0;
|
|
cd_control(PAUSE);
|
|
old_track = 0;
|
|
volume = unmuted_volume;
|
|
cd_volume(volume, 10, max_volume);
|
|
}
|
|
}
|
|
|
|
/* ================= */
|
|
/* The auto fade in: */
|
|
/* ================= */
|
|
|
|
if ((cur_cdmode == WM_CDM_PAUSED) && (fade_out)){
|
|
if (!fade_ok) {
|
|
fade_ok = 1;
|
|
return;
|
|
} else {
|
|
unmuted_volume = volume;
|
|
volume = min_volume;
|
|
cd_volume(volume, 10, max_volume);
|
|
wm_cd_status();
|
|
usleep(dodo * 5);
|
|
cd_control(PAUSE);
|
|
usleep(dodo * 5);
|
|
while (volume < max_volume) {
|
|
volume = volume + fade_step;
|
|
cd_volume(volume, 10, max_volume);
|
|
usleep(dodo);
|
|
}
|
|
fade_out = 0;
|
|
fade_ok = 0;
|
|
volume = unmuted_volume;
|
|
cd_volume(volume, 10, max_volume);
|
|
}
|
|
}
|
|
|
|
/* end of redraw routine */
|
|
|
|
old_track = cur_track;
|
|
if (debug) fprintf(stderr, "-> End of global redraw. Leaving redraw routine\n");
|
|
}
|