dockapps/ascd/ascd/handlers.c

446 lines
12 KiB
C

/* ===========================================================================
* AScd: handlers.c
* mouse events <-> integrated commands
* ===========================================================================
* 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"
#include "faktory_prot.h"
void theme_select_init()
{
char txt[256];
DIR *dir_fd;
struct dirent *dir_pt;
int i;
theme_select = 1;
theme_select_nbr = 0;
sprintf(txt, "%s/Themes", THDIR);
if ((dir_fd = opendir(txt)) != NULL) {
while((dir_pt = readdir(dir_fd)) != NULL) if (dir_pt->d_name[0] != '.') theme_select_nbr++;
closedir(dir_fd);
}
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 (strcmp(dir_pt->d_name, theme) == 0) theme_select = i;
}
}
closedir(dir_fd);
}
}
void fak_event_handle(int event, XEvent Event)
{
/* global commands handling: panel switches, quit, GUI additional modules */
switch (event) {
case FAK_QUIT:
exit(0);
break;
case FAK_PANEL_SWITCH:
panel++;
if (panel > panels) panel = 1;
fak_redraw();
fak_maskset();
break;
case FAK_PANEL1:
panel = 1;
fak_redraw();
fak_maskset();
break;
case FAK_PANEL2:
panel = 2;
fak_redraw();
fak_maskset();
break;
case FAK_PANEL3:
panel = 3;
fak_redraw();
fak_maskset();
break;
case FAK_PANEL4:
panel = 4;
fak_redraw();
fak_maskset();
break;
case FAK_PANEL5:
panel = 5;
fak_redraw();
fak_maskset();
break;
case FAK_WINGS: /* must be compiled with WINGs support */
#ifdef WMK
big_window(scr);
#endif
break;
case FAK_COUNTER_MODE:
time_mode++ ;
if (time_mode > 3) time_mode = 0;
break;
case FAK_TOG_SHOWDB:
if (show_db) show_db = FALSE;
else show_db = TRUE;
redraw = TRUE;
break;
case FAK_TOG_SHOWARTIST:
if (show_artist) show_artist = FALSE;
else show_artist = TRUE;
redraw = TRUE;
break;
case FAK_TOG_UPPER:
if (force_upper) force_upper = FALSE;
else force_upper = TRUE;
redraw = TRUE;
break;
case FAK_TOG_AUTOPLAY:
if (autoplay) autoplay = FALSE;
else autoplay = TRUE;
redraw = TRUE;
break;
case FAK_TOG_AUTOREPEAT:
if (autorepeat) autorepeat = FALSE;
else autorepeat = TRUE;
redraw = TRUE;
break;
case FAK_TOG_ISKIPS:
if (ignore_avoid) ignore_avoid = FALSE;
else ignore_avoid = TRUE;
redraw = TRUE;
break;
case FAK_TSELECT:
if (theme_select == 0) {
selectors_timeout = time(NULL);
theme_select_init();
} else {
theme_select = 0;
strcpy(theme, selected_theme);
fak_load_theme(theme, TRUE);
fak_maskset();
}
break;
case FAK_TNEXT:
selectors_timeout = time(NULL);
if (theme_select == 0) theme_select_init();
theme_select ++;
if (theme_select > theme_select_nbr) theme_select = 1;
break;
case FAK_TPREVIOUS:
selectors_timeout = time(NULL);
if (theme_select == 0) theme_select_init();
theme_select --;
if (theme_select == 0) theme_select = theme_select_nbr;
break;
case FAK_FTSELECT:
show_db_pos = 0;
if (fast_track == 0) {
fast_track = cur_track;
selectors_timeout = time(NULL);
} else {
if (fast_track != cur_track) {
direct_track = fast_track;
fast_track = 0;
cd_control(DIRECTTRACK);
}
}
break;
case FAK_FTNEXT:
selectors_timeout = time(NULL);
show_db_pos = 0;
if (fast_track == 0) {
if (cur_track < cur_ntracks) fast_track = cur_track + 1;
else fast_track = 1;
} else {
if (fast_track == cur_ntracks) fast_track = 1;
else fast_track++;
}
break;
case FAK_FTPREVIOUS:
selectors_timeout = time(NULL);
show_db_pos = 0;
if (fast_track == 0) {
if (cur_track > 1) fast_track = cur_track - 1;
else fast_track = cur_ntracks;
} else {
if (fast_track == 1) fast_track = cur_ntracks;
else fast_track--;
}
break;
case FAK_SAVE:
newtext("Saving");
save_rc_file();
break;
case FAK_LOAD:
newtext("Loading");
load_rc_file();
break;
case FAK_QREF:
quick_reference(thdata[but_current].arg);
break;
default:
break;
}
redraw = TRUE;
fak_singlemask(but_current);
}
void cd_event_handle(int event, XEvent Event)
{
/* All the AScd CD player commands, access to cd_control() */
switch (event) {
case FAK_CD_PLAY:
case FAK_CD_PAUSE:
if (cur_cdmode == WM_CDM_PAUSED) {
newtext("Playing");
wanna_play = TRUE;
cd_control(PAUSE);
} else if (cur_cdmode == WM_CDM_PLAYING) {
if (fast_track != 0) {
direct_track = fast_track;
fast_track = 0;
cd_control(DIRECTTRACK);
} else {
newtext("Paused");
cd_control(PAUSE);
}
} else if (cur_cdmode == WM_CDM_EJECTED) {
/* the future?. Not yet working on my FreeBSD box... */
cd_control(CLOSETRAY);
} else {
newtext("Play");
wanna_play = TRUE;
cd_control(PLAY);
if (cd->volume > 0) {
volume=cd->volume;
cd_volume(volume, 10, max_volume);
}
}
redraw = TRUE;
fak_redraw();
break;
case FAK_CD_STOP:
fast_track = 0;
if (cur_cdmode != WM_CDM_STOPPED) {
newtext("Stop");
cd_control(STOPONLY);
wm_cd_status();
cur_track = 0;
redraw = TRUE;
fak_redraw();
}
break;
case FAK_CD_STOPEJECT:
fast_track = 0;
if (cur_cdmode != WM_CDM_STOPPED) {
newtext("Stop");
cd_control(STOPONLY);
wm_cd_status();
cur_track = 0;
redraw = TRUE;
fak_redraw();
fak_maskset();
} else {
newtext("Eject");
cd_control(EJECT);
redraw = TRUE;
fak_redraw();
}
break;
case FAK_CD_EJECT:
fast_track = 0;
newtext("Eject");
cd_control(EJECT);
redraw = TRUE;
fak_redraw();
break;
case FAK_CD_EJECTQUIT:
fast_track = 0;
if ((cur_cdmode != WM_CDM_EJECTED) && (cur_cdmode != WM_CDM_STOPPED)) {
newtext("Eject");
cd_control(EJECT);
redraw = TRUE;
fak_redraw();
} else {
exit(0);
}
break;
case FAK_CD_NEXT:
cd_control(UPTRACK);
break;
case FAK_CD_PREVIOUS:
cd_control(DNTRACK);
break;
case FAK_CD_FIRST:
cd_control(FIRST);
break;
case FAK_CD_LAST:
cd_control(LAST);
break;
case FAK_CD_REW:
cd_control(REV);
break;
case FAK_CD_FWD:
cd_control(CUE);
break;
case FAK_CD_DIRECT:
/* Direct Access:
we have to compute the offset to pass it to cd_control. We also have to
check if we want to move inside the current track or in the whole CD */
if (cur_track < 1) cur_track = 1;
if ((time_mode == 2) || (time_mode == 3)) {
if ((thdata[but_current].type == FAK_CD_BAR) || (thdata[but_current].type == FAK_CD_PIX)) {
direct_access = (int)((float)(Event.xbutton.x - thdata[but_current].x) / (float)thdata[but_current].xpm.attributes.width * (float)cur_cdlen);
} else if (thdata[but_current].type == FAK_ICD_BAR) {
direct_access = (int)((float)(Event.xbutton.y - thdata[but_current].y) / (float)thdata[but_current].xpm.attributes.height * (float)cur_cdlen);
direct_access = cur_cdlen - direct_access;
} else {
direct_access = (int)((float)(Event.xbutton.y - thdata[but_current].y) / (float)thdata[but_current].xpm.attributes.height * (float)cur_cdlen);
}
cd_control(GLOBALACCESS);
} else {
if ((thdata[but_current].type == FAK_CD_BAR) || (thdata[but_current].type == FAK_CD_PIX)) {
direct_access = (int)((float)(Event.xbutton.x - thdata[but_current].x) / (float)thdata[but_current].xpm.attributes.width * (float)cur_tracklen);
} else if (thdata[but_current].type == FAK_ICD_BAR) {
direct_access = (int)((float)(Event.xbutton.y - thdata[but_current].y) / (float)thdata[but_current].xpm.attributes.height * (float)cur_tracklen);
direct_access = cur_tracklen - direct_access;
} else {
direct_access = (int)((float)(Event.xbutton.y - thdata[but_current].y) / (float)thdata[but_current].xpm.attributes.height * (float)cur_tracklen);
}
cd_control(DIRECTACCESS);
}
wm_cd_status();
redraw = TRUE;
fak_redraw();
fak_maskset();
break;
case FAK_CD_VOLUME:
if ((cur_cdmode != WM_CDM_EJECTED) && (cur_cdmode != WM_CDM_STOPPED)) {
if ((thdata[but_current].xpm.attributes.width > 0) && (max_volume > 0)) {
if (thdata[but_current].type == FAK_VVOL_BAR) {
volume = (int)((float)(Event.xbutton.y - thdata[but_current].y) / (float)thdata[but_current].xpm.attributes.height * (float)max_volume);
} else if (thdata[but_current].type == FAK_IVOL_BAR) {
volume = (int)((float)(Event.xbutton.y - thdata[but_current].y) / (float)thdata[but_current].xpm.attributes.height * (float)max_volume);
volume = max_volume - volume;
} else {
volume = (int)((float)(Event.xbutton.x - thdata[but_current].x) / (float)thdata[but_current].xpm.attributes.width * (float)max_volume);
}
cd_volume(volume, 10, max_volume);
wm_cd_status();
redraw = TRUE;
fak_redraw();
}
}
break;
case FAK_CD_LOOP:
if (loop_mode) {
loop_mode = 0;
newtext("Loop Off");
} else {
cd_control(LOOP);
if (!anomalie) newtext("Loop On");
else newtext("ERROR!");
}
redraw = TRUE;
break;
case FAK_CD_LSTART:
loop_1 = cur_pos_rel;
newtext("L. Start");
loop_start_track = cur_track;
break;
case FAK_CD_LEND:
loop_2 = cur_pos_rel;
loop_end_track = cur_track;
newtext("L. End");
break;
case FAK_CD_GOLSTART:
direct_access = loop_1;
cd_control(DIRECTACCESS);
break;
case FAK_CD_GOLEND:
direct_access = loop_2;
cd_control(DIRECTACCESS);
break;
case FAK_CD_LTRACK:
loop_1 = 0;
loop_2 = cur_tracklen;
loop_start_track = cur_track;
loop_end_track = cur_track;
break;
case FAK_CD_LCLEAR:
loop_1 = 0;
loop_2 = 0;
loop_start_track = 1;
loop_end_track = 1;
newtext("L. Clear");
break;
case FAK_CD_INTRO:
cd_control(INTROSCAN);
wm_cd_status();
newtext("Intro");
fak_maskset();
break;
case FAK_CD_MUTE:
if (muted) {
muted = 0;
newtext("Mute Off");
cd_volume(volume, 10, max_volume);
} else {
newtext("Mute On");
muted = 1;
cd_volume(muted_volume, 10, max_volume);
}
break;
case FAK_CD_FADE:
fade_out = TRUE;
newtext("Fade...");
/*fak_redraw();*/
break;
default:
break;
}
redraw = TRUE;
fak_singlemask(but_current);
}