445 lines
12 KiB
C
445 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);
|
|
}
|