mirror of
https://github.com/openbsd/xenocara.git
synced 2025-12-14 05:08:53 +00:00
Remove Modules that are not linked to the build for license issues.
This commit is contained in:
@@ -1,27 +0,0 @@
|
|||||||
1999-01-25 Steven Michael ROBBINS <stever@bongo.cs.mcgill.ca>
|
|
||||||
|
|
||||||
* FvwmAnimate.c: Include config.h first. Remove include of
|
|
||||||
<strings.h> as not all systems have this.
|
|
||||||
|
|
||||||
1998-11-11 Dan Espen <dane@mk.bellcore.com>
|
|
||||||
|
|
||||||
* FvwmAnimate.c: Fix bug that stopped zoom3d from being picked.
|
|
||||||
In general, strcasecmp is now being used instead of strncasecmp.
|
|
||||||
|
|
||||||
Tue Nov 10 22:17:50 1998 DanEspen <dje@blue>
|
|
||||||
|
|
||||||
* FvwmAnimate.c: Handle missing arg on first entry in cmd table.
|
|
||||||
|
|
||||||
Sat Nov 7 09:43:59 1998 DanEspen <dje@blue>
|
|
||||||
|
|
||||||
* FvwmAnimate.c: Make color a fully documented and customizable feature.
|
|
||||||
|
|
||||||
1998-11-06 Paul D. Smith <psmith@gnu.org>
|
|
||||||
|
|
||||||
* Makefile.am (FvwmAnimate_DEPENDENCIES): Add a dependency on
|
|
||||||
libfvwm.a.
|
|
||||||
|
|
||||||
1998-11-04 Dan Espen <dane@mk.bellcore.com>
|
|
||||||
|
|
||||||
* FvwmAnimate.c: Fixed bug where AnimateResizeLine was
|
|
||||||
drawing 5 segments when it only wanted 4.
|
|
||||||
@@ -1,131 +0,0 @@
|
|||||||
.TH FvwmAnimate 1.1 "October 1998"
|
|
||||||
.UC
|
|
||||||
.SH NAME
|
|
||||||
\fBFvwmAnimate\fP \- the Fvwm2 Animate module
|
|
||||||
.SH SYNOPSIS
|
|
||||||
\fBFvwmAnimate\fP is spawned by fvwm2, so no command line invocation will work.
|
|
||||||
From within the .fvwm2rc file, \fBFvwmAnimate\fP is spawned as follows:
|
|
||||||
.nf
|
|
||||||
.sp
|
|
||||||
Module FvwmAnimate
|
|
||||||
.sp
|
|
||||||
.fi
|
|
||||||
or from within an fvwm2 pop-up menu:
|
|
||||||
.nf
|
|
||||||
.sp
|
|
||||||
DestroyMenu Module-Popup
|
|
||||||
AddToMenu Module-Popup "Modules" Title
|
|
||||||
AddToMenu Module-Popup "Fvwm Animate Icons" Module FvwmAnimate OptionalName
|
|
||||||
.sp
|
|
||||||
.fi
|
|
||||||
|
|
||||||
.SH DESCRIPTION
|
|
||||||
The \fBFvwmAnimate\fP module animates iconification and deiconification.
|
|
||||||
There are currenly 6 different animation effects.
|
|
||||||
|
|
||||||
.SH INVOCATION
|
|
||||||
No command line invocation is possible.
|
|
||||||
\fBFvwmAnimate\fP must be invoked by the
|
|
||||||
\fBfvwm2\fP window manager.
|
|
||||||
When invoked with the \fIOptionalName\fP argument, the \fIOptionalName\fP
|
|
||||||
is used to find configuration commands, configuraton files,
|
|
||||||
and name the internally generated menus and forms instead of "FvwmAnimate".
|
|
||||||
During startup, FvwmAnimate defines menus and forms for configuring and
|
|
||||||
controlling FvwmAnimate. The default menu name is "MenuFvwmAnimate"
|
|
||||||
and the form name is "FormFvwmAnimate".
|
|
||||||
If the optional name is used, the menu would be "Menu<OptionalName>"
|
|
||||||
and the form would be "Form<OptionalName>".
|
|
||||||
.sp
|
|
||||||
Assuming you already had a builtin menu called "Module-Popup",
|
|
||||||
you could use FvwmAnimate by configuring it like this:
|
|
||||||
.nf
|
|
||||||
.sp
|
|
||||||
AddToFunc "InitFunction" "I" Module FvwmAnimate
|
|
||||||
AddToFunc "RestartFunction" "I" Module FvwmAnimate
|
|
||||||
AddToMenu "Module-Popup" "Control Animation" Popup MenuFvwmAnimate
|
|
||||||
.sp
|
|
||||||
.fi
|
|
||||||
|
|
||||||
.SH CONFIGURATION OPTIONS
|
|
||||||
Since the popup menu "MenuFvwmAnimate" allows complete control of
|
|
||||||
the \fBFvwmAnimate\fP module, you don't really have to know what any
|
|
||||||
of the configuration commands are. This section describes them anyway.
|
|
||||||
|
|
||||||
\fBFvwmAnimate\fP reads the same \fI.fvwm2rc\fP file as \fBfvwm2\fP
|
|
||||||
reads when it starts up.
|
|
||||||
In addition, \fBFvwmAnimate\fP reads the file $HOME/.FvwmAnimate,
|
|
||||||
and accepts commands from fvwm2 and its modules as it runs.
|
|
||||||
|
|
||||||
If \fIOptionalName\fP is used to start FvwmAnimate, the optional name
|
|
||||||
is used in all commands, messages, menus and forms generated by FvwmAnimate
|
|
||||||
and
|
|
||||||
in the configuration file name. Unlike other fvwm2 modules, there is
|
|
||||||
little reason to use the optional name.
|
|
||||||
|
|
||||||
.IP "*FvwmAnimateColor \fBcolor\fP"
|
|
||||||
Tells \fBFvwmAnimate\fP what color to draw with.
|
|
||||||
The color is "XOR'ed" (exclusive ORed) onto the background.
|
|
||||||
Depending on the display type you are using, the effect this
|
|
||||||
causes will vary. Especially on 8-bit displays, it helps if the background
|
|
||||||
is a solid color. You have to experiment with this to see how it works.
|
|
||||||
|
|
||||||
The default color is not really a color and can be entered as "Black^White",
|
|
||||||
or more simply "None". This is the same as the default XOR mask used
|
|
||||||
by fvwm2 for move and resize frames.
|
|
||||||
|
|
||||||
Other colors can be specified using standard X color notation. Ie. color
|
|
||||||
names like "LightBlue", or RGB values like "#FFFFFF".
|
|
||||||
|
|
||||||
.IP "*FvwmAnimateDelay \fBmsecs\fP"
|
|
||||||
Tells \fBFvwmAnimate\fP how many milliseconds to sleep
|
|
||||||
between frames of animation.
|
|
||||||
|
|
||||||
.IP "*FvwmAnimateIterations \fBiterations\fP"
|
|
||||||
Tells \fBFvwmAnimate\fP how many steps to break the animation into.
|
|
||||||
|
|
||||||
.IP "*FvwmAnimateTwist \fBtwist\fP"
|
|
||||||
Tells \fBFvwmAnimate\fP how many revolutions to twist the iconification frame.
|
|
||||||
|
|
||||||
.IP "*FvwmAnimateWidth \fBwidth\fP"
|
|
||||||
Tells \fBFvwmAnimate\fP how wide a line to draw with.
|
|
||||||
The default width of 0 (zero) is a fast line of Width 1.
|
|
||||||
|
|
||||||
.IP "*FvwmAnimateEffect \fBmode\fP"
|
|
||||||
Tells \fBFvwmAnimate\fP which animation effect to use.
|
|
||||||
Currently the effects are :
|
|
||||||
\fIFrame\fP,
|
|
||||||
\fILines\fP,
|
|
||||||
\fIFlip\fP,
|
|
||||||
\fITurn\fP,
|
|
||||||
\fIZoom3D\fP,
|
|
||||||
\fITwist\fP
|
|
||||||
\fIRandom\fP,
|
|
||||||
and
|
|
||||||
\fINone\fP.
|
|
||||||
\fINone\fP is normally set in the configuration file, in-case FvwmAnimate
|
|
||||||
is started automatically, but an individual user doesn't want it running.
|
|
||||||
|
|
||||||
.IP "*FvwmAnimateStop"
|
|
||||||
Tells \fBFvwmAnimate\fP to stop.
|
|
||||||
|
|
||||||
.IP "*FvwmAnimateSave"
|
|
||||||
Tells \fBFvwmAnimate\fP to save the current configuration in a file
|
|
||||||
named ".FvwmAnimate" in the users home directory. This same file is
|
|
||||||
read automatically by FvwmAnimate during startup.
|
|
||||||
|
|
||||||
.SH ORIGIN
|
|
||||||
\fBFvwmAnimate\fP is based on the \fBAnimate\fP module from Afterstep 1.5pre6.
|
|
||||||
Porting to \fBfvwm2\fP and lots of other changes were done by
|
|
||||||
\fIDan Espen\fP <dane@mk.bellcore.com>.
|
|
||||||
Below are the original author and acknowledgments.
|
|
||||||
|
|
||||||
.SH AUTHOR
|
|
||||||
\fIAlfredo Kengi Kojima\fP <kojima@inf.ufrgs.br>
|
|
||||||
|
|
||||||
.SH ACKNOWLEDGMENTS
|
|
||||||
These people have contributed to \fBFvwmAnimate\fP:
|
|
||||||
|
|
||||||
.IP "\fIKaj Groner\fP <kajg@mindspring.com>"
|
|
||||||
Twisty iconification, configuration file parsing, man page.
|
|
||||||
|
|
||||||
.IP "\fIFrank Scheelen <scheelen@worldonline.nl>"
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,35 +0,0 @@
|
|||||||
#ifndef _ANIMATE_H_
|
|
||||||
#define _ANIMATE_H_
|
|
||||||
|
|
||||||
/* Animation granularity. How many iterations use for the animation. */
|
|
||||||
#define ANIM_ITERATIONS 12
|
|
||||||
|
|
||||||
/* delay for each iteration of the animation in ms */
|
|
||||||
#define ANIM_DELAY 1
|
|
||||||
|
|
||||||
/* delay for each iteration of the close animation in ms */
|
|
||||||
#define ANIM_DELAY2 20
|
|
||||||
|
|
||||||
/* distance to spin frame around, 1.0 is one revolution.
|
|
||||||
with large values you should up ANIM_ITERATIONS as well */
|
|
||||||
#define ANIM_TWIST 0.5
|
|
||||||
|
|
||||||
/* default line width */
|
|
||||||
#define ANIM_WIDTH 0
|
|
||||||
|
|
||||||
/* default time */
|
|
||||||
#define ANIM_TIME 0
|
|
||||||
|
|
||||||
struct ASAnimate {
|
|
||||||
char *color;
|
|
||||||
int iterations;
|
|
||||||
int delay;
|
|
||||||
float twist;
|
|
||||||
int width;
|
|
||||||
void (*resize)(int, int, int, int, int, int, int, int);
|
|
||||||
clock_t time;
|
|
||||||
};
|
|
||||||
|
|
||||||
extern struct ASAnimate Animate;
|
|
||||||
|
|
||||||
#endif /* _ANIMATE_H_ */
|
|
||||||
@@ -1,128 +0,0 @@
|
|||||||
.\" t
|
|
||||||
.\" @(#)FvwmAudio.1 3/28/94
|
|
||||||
.TH FvwmAudio 1.0 "Mar 28 1994"
|
|
||||||
.UC
|
|
||||||
.SH NAME
|
|
||||||
\fBFvwmAudio\fP \- the FVWM Audio module
|
|
||||||
.SH NOTICE
|
|
||||||
\fBFvwmAudio\fP has been superceded by \fBFvwnEvent\fP and is no longer
|
|
||||||
supported. Please start using \fBFvwmEvent\fP as soon as possible.
|
|
||||||
.sp
|
|
||||||
.SH SYNOPSIS
|
|
||||||
\fBFvwmAudio\fP is spawned by \fBfvwm\fP, so no command line invocation will
|
|
||||||
work. From within the \fI.fvwmrc\fP file, \fBFvwmAudio\fP is spawned as
|
|
||||||
follows:
|
|
||||||
.nf
|
|
||||||
.sp
|
|
||||||
Module FvwmAudio
|
|
||||||
.sp
|
|
||||||
.fi
|
|
||||||
or from within an fvwm pop-up menu:
|
|
||||||
.nf
|
|
||||||
.sp
|
|
||||||
AddToMenu Module-Popup "Modules" Title
|
|
||||||
+ "Audio" Module FvwmAudio
|
|
||||||
+ "Auto" Module FvwmAuto 200
|
|
||||||
+ "Buttons" Module FvwmButtons
|
|
||||||
+ "Ident" Module FvwmIdent
|
|
||||||
+ "Banner" Module FvwmBanner
|
|
||||||
+ "Pager" Module FvwmPager 0 3
|
|
||||||
.sp
|
|
||||||
.fi
|
|
||||||
.SH DESCRIPTION
|
|
||||||
The \fBFvwmAudio\fP module communicates with the Fvwm window manager
|
|
||||||
to bind audio sounds to window manager actions. Different audio
|
|
||||||
queues may be assigned to any window manager action. \fBFvwmAudio\fP
|
|
||||||
can be used with any independent audio player, and therefore requires
|
|
||||||
no special audio library APIs of its own. Simple in its design, it
|
|
||||||
merely binds the audio filenames to particular actions and forks off
|
|
||||||
the audio player program with the appropriate filename when that
|
|
||||||
action occurs.
|
|
||||||
|
|
||||||
\fBFvwmAudio\fP can also have builtin support for the rplay library.
|
|
||||||
|
|
||||||
.SH CONFIGURATION OPTIONS
|
|
||||||
\fBFvwmAudio\fP reads the same \fI.fvwm2rc\fP file as \fBfvwm(1)\fP
|
|
||||||
reads when it starts up, and looks for certain configuration options:
|
|
||||||
|
|
||||||
.IP "*FvwmAudioPlayCmd \fI/usr/bin/X11/demos/auplay\fP"
|
|
||||||
This determines the independent audio player program that will
|
|
||||||
actually play the sounds. If the play command is set to
|
|
||||||
\fIbuiltin-rplay\fP then the builtin rplay support will be used. For
|
|
||||||
example:
|
|
||||||
.sp
|
|
||||||
*FvwmAudioPlayCmd \fIbuiltin-rplay\fP
|
|
||||||
|
|
||||||
.IP "*FvwmAudioDir \fI/usr/lib/sounds\fP"
|
|
||||||
Specifies the directory to look for the audio files. This option is
|
|
||||||
ignored when rplay is used.
|
|
||||||
|
|
||||||
.IP "*FvwmAudioDelay \fI5\fP"
|
|
||||||
Specifies that sound events will only be played if they occur at least
|
|
||||||
5 seconds after the previous event. Sounds events that occur during
|
|
||||||
the delay period are ignored. This option is useful if you don't want
|
|
||||||
several sounds playing at the same time. The default delay is 0 which
|
|
||||||
disables the audio delay.
|
|
||||||
|
|
||||||
.IP "*FvwmAudioRplayHost \fIhostname\fP"
|
|
||||||
Specifies what host the sounds will play on. The \fIhostname\fP can
|
|
||||||
also be an environment variable such as $HOSTDISPLAY. This option is
|
|
||||||
only valid with builtin rplay support.
|
|
||||||
|
|
||||||
.IP "*FvwmAudioRplayPriority \fI0\fP"
|
|
||||||
Specifies what priority will be assigned to the sounds when they are
|
|
||||||
played. This option is only valid with builtin rplay support.
|
|
||||||
|
|
||||||
.IP "*FvwmAudioRplayVolume \fI127\fP"
|
|
||||||
Specifies what volume will be assigned to the sounds when they are
|
|
||||||
played. This option is only valid with builtin rplay support.
|
|
||||||
|
|
||||||
.IP "*FvwmAudio \fIwindow-manager_action audio_filename\fP"
|
|
||||||
Binds particular window manager actions to sound queues.
|
|
||||||
.nf
|
|
||||||
.sp
|
|
||||||
*FvwmAudio startup TaDa.au
|
|
||||||
*FvwmAudio shutdown Elvis_Left.au
|
|
||||||
*FvwmAudio unknown doh.au
|
|
||||||
*FvwmAudio add_window drip.au
|
|
||||||
*FvwmAudio raise_window swoosh.au
|
|
||||||
*FvwmAudio lower_window swoosh.au
|
|
||||||
*FvwmAudio focus_change boing.au
|
|
||||||
*FvwmAudio destroy_window explosion.au
|
|
||||||
*FvwmAudio iconify ploop.au
|
|
||||||
*FvwmAudio deiconify ploop.au
|
|
||||||
*FvwmAudio toggle_paging fwop.au
|
|
||||||
*FvwmAudio new_page beam_trek.au
|
|
||||||
*FvwmAudio new_desk beam_trek.au
|
|
||||||
*FvwmAudio configure_window huh.au
|
|
||||||
*FvwmAudio window_name beep.au
|
|
||||||
*FvwmAudio icon_name beep.au
|
|
||||||
*FvwmAudio res_class beep.au
|
|
||||||
*FvwmAudio res_name beep.au
|
|
||||||
*FvwmAudio end_windowlist twang.au
|
|
||||||
.sp
|
|
||||||
.fi
|
|
||||||
.SH INVOCATION
|
|
||||||
The invocation method was shown in the synopsis section. No command
|
|
||||||
line invocation is possible. \fBFvwmAudio\fP must be invoked by the
|
|
||||||
\fBfvwm\fP window manager.
|
|
||||||
.sp
|
|
||||||
.SH BUGS
|
|
||||||
It's REALLY noisy when fvwm starts and restarts.
|
|
||||||
.sp
|
|
||||||
.SH COPYRIGHTS
|
|
||||||
This module is heavily based on a similar Fvwm module called
|
|
||||||
\fBFvwmSound\fP by Mark Boyns. \fBFvwmAudio\fP simply takes Mark's
|
|
||||||
original program and extends it to make it generic enough to work with
|
|
||||||
any audio player. The concept for interfacing this module to the
|
|
||||||
Window Manager, is original work by Robert Nation.
|
|
||||||
|
|
||||||
Copyright 1994, Mark Boyns and Mark Scott. No guarantees or
|
|
||||||
warranties or anything are provided or implied in any way whatsoever.
|
|
||||||
Use this program at your own risk. Permission to use this program for
|
|
||||||
any purpose is given, as long as the copyright is kept intact.
|
|
||||||
.sp
|
|
||||||
.SH AUTHORS
|
|
||||||
Mark Boyns (\fIboyns@sdsu.edu\fP)
|
|
||||||
.sp
|
|
||||||
Mark Scott (\fImscott@mcd.mot.com\fP)
|
|
||||||
@@ -1,529 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 1994 Mark Boyns (boyns@sdsu.edu) and
|
|
||||||
* Mark Scott (mscott@mcd.mot.com)
|
|
||||||
*
|
|
||||||
* FvwmAudio version 1.1
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* ChangeLog
|
|
||||||
|
|
||||||
|
|
||||||
* merged bug fix from Christophe MARTIN <cmartin@ipnl.in2p3.fr>
|
|
||||||
- FvwmAudio doesn't read messages it is not interrested in,
|
|
||||||
thus desynchronize,
|
|
||||||
- keep time stamp even if no sound is played
|
|
||||||
- minimize malloc/free
|
|
||||||
|
|
||||||
mark boyns ok-ed this patch, I reviewed it and put out those ugly
|
|
||||||
#defines for RESYNC and READ_BODY by reordering the control structures
|
|
||||||
|
|
||||||
* made FvwmAudio insensitive to its name -> can be symlinked.
|
|
||||||
corrected some error message deficiencies, code for quoted 'sound'
|
|
||||||
parameters shamelessly stolen from FvwmButtons/parse.c (with minimal
|
|
||||||
adjustments)
|
|
||||||
FvwmAudio now supports rsynth's say command:
|
|
||||||
*FvwmAudioPlayCmd say
|
|
||||||
*FvwmAudio add_window "add window"
|
|
||||||
*FvwmAudio raise_window 'raise window'
|
|
||||||
-- 08/07/96 Albrecht Kadlec (albrecht@auto.tuwien.ac.at)
|
|
||||||
|
|
||||||
* Fixed FvwmAudio to reflect the changes made to the module protocol.
|
|
||||||
|
|
||||||
* Szijarto Szabolcs <saby@sch.bme.hu> provided FvwmSound code that used
|
|
||||||
$HOSTDISPLAY for the rplay host. The code has been added to FvwmAudio.
|
|
||||||
|
|
||||||
* Fixed bugs reported by beta testers, thanks!
|
|
||||||
|
|
||||||
* Builtin rplay support has been added to FvwmAudio. This support is
|
|
||||||
enabled when FvwmAudio is compiled with HAVE_RPLAY defined and when
|
|
||||||
FvwmAudioPlayCmd is set to builtin-rplay. I guess it's safe to say
|
|
||||||
that FvwmSound is now obsolete. -- Mark Boyns 5/7/94
|
|
||||||
|
|
||||||
* FvwmAudio is based heavily on an Fvwm module "FvwmSound" by Mark Boyns
|
|
||||||
and the real credit for this really goes to him for the concept.
|
|
||||||
I just stripped out the "rplay" library dependencies to allow generic
|
|
||||||
audio play command support.
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This module is based on FvwmModuleDebugger which has the following
|
|
||||||
* copyright:
|
|
||||||
*
|
|
||||||
* This module, and the entire ModuleDebugger program, and the concept for
|
|
||||||
* interfacing this module to the Window Manager, are all original work
|
|
||||||
* by Robert Nation
|
|
||||||
*
|
|
||||||
* Copyright 1994, Robert Nation. No guarantees or warantees or anything
|
|
||||||
* are provided or implied in any way whatsoever. Use this program at your
|
|
||||||
* own risk. Permission to use this program for any purpose is given,
|
|
||||||
* as long as the copyright is kept intact.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
#include "../../fvwm/module.h"
|
|
||||||
#include "fvwmlib.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* fvwm includes:
|
|
||||||
*/
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/wait.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#ifdef HAVE_RPLAY
|
|
||||||
#include <rplay.h>
|
|
||||||
#undef M_ERROR /* Solaris fix */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define BUILTIN_STARTUP MAX_MESSAGES
|
|
||||||
#define BUILTIN_SHUTDOWN MAX_MESSAGES+1
|
|
||||||
#define BUILTIN_UNKNOWN MAX_MESSAGES+2
|
|
||||||
#define MAX_BUILTIN 3
|
|
||||||
|
|
||||||
#define BUFSIZE 512
|
|
||||||
|
|
||||||
/* globals */
|
|
||||||
char *MyName;
|
|
||||||
int MyNameLen;
|
|
||||||
int fd_width;
|
|
||||||
int fd[2];
|
|
||||||
char audio_play_cmd_line[BUFSIZE], audio_play_dir[BUFSIZE];
|
|
||||||
time_t audio_delay = 0, /* seconds */
|
|
||||||
last_time = 0,
|
|
||||||
now;
|
|
||||||
|
|
||||||
#ifdef HAVE_RPLAY
|
|
||||||
int rplay_fd = -1;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* prototypes */
|
|
||||||
void Loop(int *);
|
|
||||||
void process_message(unsigned long,unsigned long *);
|
|
||||||
void DeadPipe(int);
|
|
||||||
void config(void);
|
|
||||||
void done(int);
|
|
||||||
int audio_play(short);
|
|
||||||
|
|
||||||
/* define the message table */
|
|
||||||
char *messages[MAX_MESSAGES+MAX_BUILTIN] =
|
|
||||||
{
|
|
||||||
"new_page",
|
|
||||||
"new_desk",
|
|
||||||
"add_window",
|
|
||||||
"raise_window",
|
|
||||||
"lower_window",
|
|
||||||
"configure_window",
|
|
||||||
"focus_change",
|
|
||||||
"destroy_window",
|
|
||||||
"iconify",
|
|
||||||
"deiconify",
|
|
||||||
"window_name",
|
|
||||||
"icon_name",
|
|
||||||
"res_class",
|
|
||||||
"res_name",
|
|
||||||
"end_windowlist",
|
|
||||||
"icon_location",
|
|
||||||
"map",
|
|
||||||
"error",
|
|
||||||
"config_info",
|
|
||||||
"end_config_info",
|
|
||||||
"icon_file",
|
|
||||||
"default_icon",
|
|
||||||
"string",
|
|
||||||
"mini_icon",
|
|
||||||
"windowshade",
|
|
||||||
"dewindowshade",
|
|
||||||
/* add builtins here */
|
|
||||||
"startup",
|
|
||||||
"shutdown",
|
|
||||||
"unknown"
|
|
||||||
};
|
|
||||||
|
|
||||||
/* define the sound table */
|
|
||||||
char *sound_table[MAX_MESSAGES+MAX_BUILTIN];
|
|
||||||
|
|
||||||
#ifdef HAVE_RPLAY
|
|
||||||
/* define the rplay table */
|
|
||||||
RPLAY *rplay_table[MAX_MESSAGES+MAX_BUILTIN];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
char *temp, *s;
|
|
||||||
|
|
||||||
/* Save our program name - for error messages */
|
|
||||||
temp = argv[0];
|
|
||||||
s=strrchr(argv[0], '/');
|
|
||||||
if (s != NULL)
|
|
||||||
temp = s + 1;
|
|
||||||
|
|
||||||
MyNameLen=strlen(temp)+1; /* acoount for '*' */
|
|
||||||
MyName = safemalloc(MyNameLen+1); /* account for \0 */
|
|
||||||
strcpy(MyName,"*");
|
|
||||||
strcat(MyName, temp);
|
|
||||||
|
|
||||||
if ((argc != 6)&&(argc != 7)) /* Now Myname is defined */
|
|
||||||
{
|
|
||||||
fprintf(stderr,"%s Version %s should only be executed by fvwm!\n",
|
|
||||||
MyName+1, VERSION);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Dead pipe == Fvwm died */
|
|
||||||
signal (SIGPIPE, DeadPipe);
|
|
||||||
|
|
||||||
fd[0] = atoi(argv[1]);
|
|
||||||
fd[1] = atoi(argv[2]);
|
|
||||||
|
|
||||||
audio_play_dir[0] = '\0';
|
|
||||||
audio_play_cmd_line[0] = '\0';
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Read the sound configuration.
|
|
||||||
*/
|
|
||||||
config();
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Play the startup sound.
|
|
||||||
*/
|
|
||||||
audio_play(BUILTIN_STARTUP);
|
|
||||||
SendText(fd,"Nop",0);
|
|
||||||
Loop(fd);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* Procedure:
|
|
||||||
* config - read the sound configuration file.
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
void config(void)
|
|
||||||
{
|
|
||||||
char *buf;
|
|
||||||
char *message;
|
|
||||||
char *sound;
|
|
||||||
char *p;
|
|
||||||
int i, found;
|
|
||||||
#ifdef HAVE_RPLAY
|
|
||||||
int volume = RPLAY_DEFAULT_VOLUME;
|
|
||||||
int priority = RPLAY_DEFAULT_PRIORITY;
|
|
||||||
char host[128];
|
|
||||||
|
|
||||||
strcpy(host, rplay_default_host());
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Intialize all the sounds.
|
|
||||||
*/
|
|
||||||
for (i = 0; i < MAX_MESSAGES+MAX_BUILTIN; i++) {
|
|
||||||
sound_table[i] = NULL;
|
|
||||||
#ifdef HAVE_RPLAY
|
|
||||||
rplay_table[i] = NULL;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
GetConfigLine(fd,&buf);
|
|
||||||
while (buf != NULL)
|
|
||||||
{
|
|
||||||
if (buf[0] == '*') /* this check is obsolete */
|
|
||||||
/* - included in the next if */
|
|
||||||
{
|
|
||||||
buf[strlen(buf)-1] = '\0'; /* strip off \n */
|
|
||||||
/*
|
|
||||||
* Search for MyName (normally *FvwmAudio)
|
|
||||||
*/
|
|
||||||
if (strncasecmp(buf, MyName, MyNameLen) == 0)
|
|
||||||
{
|
|
||||||
p = strtok(buf+MyNameLen, " \t");
|
|
||||||
|
|
||||||
if (strcasecmp(p, "PlayCmd") == 0) {
|
|
||||||
p = strtok(NULL, "\n"); /* allow parameters */
|
|
||||||
if (p && *p) {
|
|
||||||
strcpy(audio_play_cmd_line, p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (strcasecmp(p, "Dir") == 0) {
|
|
||||||
p = strtok(NULL, " \t");
|
|
||||||
if (p && *p) {
|
|
||||||
strcpy(audio_play_dir, p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (strcasecmp(p, "Delay") == 0) {
|
|
||||||
p = strtok(NULL, " \t");
|
|
||||||
if (p && *p) {
|
|
||||||
audio_delay = atoi(p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef HAVE_RPLAY
|
|
||||||
/*
|
|
||||||
* Check for rplay configuration options.
|
|
||||||
*/
|
|
||||||
else if (strcasecmp(p, "RplayHost") == 0)
|
|
||||||
{
|
|
||||||
p = strtok(NULL, " \t");
|
|
||||||
if (p && *p)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Check for environment variables like $HOSTDISPLAY.
|
|
||||||
*/
|
|
||||||
if (*p == '$')
|
|
||||||
{
|
|
||||||
char *c1, *c2;
|
|
||||||
c2 = host;
|
|
||||||
for (c1 = (char *)getenv(p+1); *c1 && (*c1 != ':'); c1++)
|
|
||||||
{
|
|
||||||
*c2++ = *c1;
|
|
||||||
}
|
|
||||||
*c2 = '\0';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
strcpy(host, p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (strcasecmp(p, "RplayVolume") == 0)
|
|
||||||
{
|
|
||||||
p = strtok(NULL, " \t");
|
|
||||||
if (p && *p) {
|
|
||||||
volume = atoi(p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (strcasecmp(p, "RplayPriority") == 0)
|
|
||||||
{
|
|
||||||
p = strtok(NULL, " \t");
|
|
||||||
if (p && *p) {
|
|
||||||
priority = atoi(p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
/*
|
|
||||||
* *FvwmAudio <message_type> <audio_file>
|
|
||||||
* for builtin rplay
|
|
||||||
*
|
|
||||||
* or
|
|
||||||
*
|
|
||||||
* *FvwmAudio <message_type> <"any quoted parameters">
|
|
||||||
* can be (mis)used to call FvwmAudioPlayCmd
|
|
||||||
* with arbitrary parameters e.g: rsynth/say "window raised"
|
|
||||||
*
|
|
||||||
* can even be used to call arbitrary commands,
|
|
||||||
* if the following wrapper is used as FvwmAudioPlayCmd
|
|
||||||
*
|
|
||||||
* #!/bin/tcsh
|
|
||||||
* ${argv[1-]}
|
|
||||||
*/
|
|
||||||
else {
|
|
||||||
message = p;
|
|
||||||
p=strtok(NULL, ""); /* get rest of line */
|
|
||||||
sound = PeekToken(p); /* extract next parameter */
|
|
||||||
|
|
||||||
if (!message || !*message || !sound || !*sound)
|
|
||||||
{
|
|
||||||
fprintf(stderr,"%s: incomplete event definition %s\n",
|
|
||||||
MyName+1, buf);
|
|
||||||
GetConfigLine(fd,&buf);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
found = 0;
|
|
||||||
|
|
||||||
for (i = 0; !found && i < MAX_MESSAGES+MAX_BUILTIN; i++)
|
|
||||||
{
|
|
||||||
if (strcasecmp(message, messages[i]) == 0) {
|
|
||||||
#ifdef HAVE_RPLAY
|
|
||||||
rplay_table[i] = rplay_create(RPLAY_PLAY);
|
|
||||||
rplay_set(rplay_table[i], RPLAY_APPEND,
|
|
||||||
RPLAY_SOUND, sound,
|
|
||||||
RPLAY_PRIORITY, priority,
|
|
||||||
RPLAY_VOLUME, volume,
|
|
||||||
NULL);
|
|
||||||
#endif
|
|
||||||
sound_table[i]=sound;
|
|
||||||
found++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!found) fprintf(stderr,"%s: unknown message type: %s\n",
|
|
||||||
MyName+1, message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
GetConfigLine(fd,&buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef HAVE_RPLAY
|
|
||||||
/*
|
|
||||||
* Builtin rplay support is enabled when FvwmAudioPlayCmd == builtin-rplay.
|
|
||||||
*/
|
|
||||||
if (strcasecmp(audio_play_cmd_line, "builtin-rplay") == 0)
|
|
||||||
{
|
|
||||||
rplay_fd = rplay_open(host);
|
|
||||||
if (rplay_fd < 0)
|
|
||||||
{
|
|
||||||
rplay_perror("rplay_open");
|
|
||||||
done(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* Procedure:
|
|
||||||
* Loop - wait for data to process
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
void Loop(int *fd)
|
|
||||||
{
|
|
||||||
unsigned long header[HEADER_SIZE], body[ MAX_BODY_SIZE ];
|
|
||||||
int body_length,count,count2=0, total;
|
|
||||||
long code;
|
|
||||||
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
if ((count = read(fd[1],header,
|
|
||||||
HEADER_SIZE*sizeof(unsigned long))) <= 0)
|
|
||||||
done(0);
|
|
||||||
|
|
||||||
/* Ignore messages that occur during the delay period. */
|
|
||||||
now = time(0);
|
|
||||||
|
|
||||||
body_length = header[2]-HEADER_SIZE;
|
|
||||||
|
|
||||||
if( header[ 0 ] != START_FLAG )
|
|
||||||
continue; /* should find something better for resyncing */
|
|
||||||
|
|
||||||
|
|
||||||
/* read the message so we are still synchronized */
|
|
||||||
|
|
||||||
total = 0;
|
|
||||||
while(total < body_length*sizeof(unsigned long))
|
|
||||||
{
|
|
||||||
if((count2=read(fd[1],&body[total],
|
|
||||||
body_length*sizeof(unsigned long)-total)) >0)
|
|
||||||
total += count2;
|
|
||||||
else
|
|
||||||
if(count2 < 0)
|
|
||||||
done(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (now < (last_time + audio_delay))
|
|
||||||
continue; /* quash message */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* code will equal the number of shifts in the
|
|
||||||
* base-2 header[1] number. Could use log here
|
|
||||||
* but this should be fast enough.
|
|
||||||
*/
|
|
||||||
code = -1;
|
|
||||||
while (header[1])
|
|
||||||
{
|
|
||||||
code++;
|
|
||||||
header[1] >>= 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Play the sound.
|
|
||||||
*/
|
|
||||||
if (code >= 0 && code < MAX_MESSAGES)
|
|
||||||
audio_play(code);
|
|
||||||
else
|
|
||||||
audio_play(BUILTIN_UNKNOWN);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* Procedure:
|
|
||||||
* SIGPIPE handler - SIGPIPE means fvwm is dying
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
void DeadPipe(int nonsense)
|
|
||||||
{
|
|
||||||
done(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* Procedure:
|
|
||||||
* done - common exit point for FvwmAudio.
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
void done(int n)
|
|
||||||
{
|
|
||||||
if (n == 0)
|
|
||||||
audio_play(BUILTIN_SHUTDOWN); /* only play if no error... */
|
|
||||||
exit(n);
|
|
||||||
}
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* Procedure:
|
|
||||||
*
|
|
||||||
* audio_play - actually plays sound from lookup table
|
|
||||||
*
|
|
||||||
**********************************************************************/
|
|
||||||
int audio_play(short sound)
|
|
||||||
{
|
|
||||||
static char buf[BUFSIZE];
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
#ifdef HAVE_RPLAY
|
|
||||||
if (rplay_fd != -1)
|
|
||||||
{
|
|
||||||
if (rplay_table[sound])
|
|
||||||
{
|
|
||||||
if (rplay(rplay_fd, rplay_table[sound]) >= 0)
|
|
||||||
last_time = now;
|
|
||||||
else
|
|
||||||
rplay_perror("rplay");
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (sound_table[sound])
|
|
||||||
{
|
|
||||||
memset(buf,0,BUFSIZE);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Don't use audio_play_dir if it's NULL or if the sound file
|
|
||||||
* is an absolute pathname.
|
|
||||||
*/
|
|
||||||
if (audio_play_dir[0] == '\0' || sound_table[sound][0] == '/')
|
|
||||||
sprintf(buf,"%s %s", audio_play_cmd_line, sound_table[sound]);
|
|
||||||
else
|
|
||||||
sprintf(buf,"%s %s/%s &", audio_play_cmd_line, audio_play_dir,
|
|
||||||
sound_table[sound]);
|
|
||||||
|
|
||||||
if( ! ( ret = system(buf)))
|
|
||||||
last_time = now;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
This is the first version of the FvwmAudio module. This program must
|
|
||||||
be compiled in the fvwm/modules/FvwmAudio directory.
|
|
||||||
|
|
||||||
This module can play different sounds depending on message types.
|
|
||||||
|
|
||||||
The following can be specified in your .fvwmrc:
|
|
||||||
|
|
||||||
Here's a sample:
|
|
||||||
*FvwmAudioPlayCmd /usr/bin/X11/demos/auplay
|
|
||||||
*FvwmAudioDir /usr/lib/sounds
|
|
||||||
*FvwmAudio startup Cheers.au
|
|
||||||
*FvwmAudio shutdown Goodbye.au
|
|
||||||
*FvwmAudio unknown doh.au
|
|
||||||
*FvwmAudio add_window drip.au
|
|
||||||
*FvwmAudio raise_window beep_pure_saw.au
|
|
||||||
*FvwmAudio lower_window beep_pure_saw.au
|
|
||||||
*FvwmAudio focus_change tap2.au
|
|
||||||
*FvwmAudio destroy_window beep_drop_of_water.au
|
|
||||||
*FvwmAudio iconify ploop.au
|
|
||||||
*FvwmAudio deiconify beep_kind_warning.au
|
|
||||||
|
|
||||||
Note that startup, shutdown, and unknown are builtin sound events that are
|
|
||||||
played when the module begins, ends, and when an unknown message is received.
|
|
||||||
|
|
||||||
Sounds can be played using any independent audio player that can accept
|
|
||||||
filenames a command line argument.
|
|
||||||
|
|
||||||
This version of FvwmAudio has builtin rplay support which does not need to
|
|
||||||
invoke an external audio player to play sounds. The rplay support is
|
|
||||||
enabled when FvwmAudio is compiled with HAVE_RPLAY defined (see the Imakefile)
|
|
||||||
and when FvwmAudioPlayCmd is set to builtin-rplay. rplay can be obtained
|
|
||||||
via anonymous ftp at ftp.sdsu.edu in the /pub/rplay directory and at
|
|
||||||
ftp.x.org in the /contrib/audio/rplay directory.
|
|
||||||
|
|
||||||
Send questions and comments to Mark Boyns <boyns@sdsu.edu> and
|
|
||||||
Mark Scott <mscott@mcd.mot.com>
|
|
||||||
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
Due to a patch from Albrecht Kadlec, there is now support for the rsynth
|
|
||||||
'say' command and arbitrary strings instead of sound file names:
|
|
||||||
|
|
||||||
*FvwmAudioCommand /rsynth/say
|
|
||||||
*FvwmAudio close "window closed"
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
1999-01-08 Paul D. Smith <psmith@gnu.org>
|
|
||||||
|
|
||||||
* FvwmEvent.c (main): Remove USE_POSIX/USE_BSD stuff and rely on
|
|
||||||
HAVE_SIGACTION to choose between new- and old-style signal
|
|
||||||
handling.
|
|
||||||
(TerminateHandler): Use the autoconf'd return type for signal
|
|
||||||
handlers.
|
|
||||||
|
|
||||||
1998-12-17 Dominik Vogt <dominik_vogt@hp.com>
|
|
||||||
|
|
||||||
* Parse.c (PeekArgument): malloc -> safemalloc
|
|
||||||
|
|
||||||
1998-11-24 Paul D. Smith <psmith@gnu.org>
|
|
||||||
|
|
||||||
* Parse.h (LFindToken): Remove this macro. It's not used, and it
|
|
||||||
uses a non-standard function lfind(). Best to not use it at all.
|
|
||||||
(search.h): Removed #include.
|
|
||||||
|
|
||||||
Tue Nov 10 22:20:21 1998 DanEspen <dje@blue>
|
|
||||||
|
|
||||||
* FvwmEvent.c (config): Fix logic on test for cmd needs a
|
|
||||||
parameter. Thes test for "table != e" was incorrect. Only try to
|
|
||||||
strip off trailing newline when there is a newline on the command.
|
|
||||||
It was stripping the last character when commands came in from
|
|
||||||
FvwmTalk.
|
|
||||||
|
|
||||||
@@ -1,251 +0,0 @@
|
|||||||
.\" t
|
|
||||||
.\" @(#)FvwmEvent.1 3/28/94
|
|
||||||
.TH FvwmEvent 1.0 "Apr 22 1998"
|
|
||||||
.UC
|
|
||||||
.SH NAME
|
|
||||||
\fBFvwmEvent\fP \- the FVWM Event module
|
|
||||||
.SH SYNOPSIS
|
|
||||||
\fBFvwmEvent\fP is a more versatile replacement for \fBFvwmAudio\fP.
|
|
||||||
It can in general be used to hook any \fBfvwm2\fP function or program to any
|
|
||||||
window manager event. e.g: Delete unwanted netscape-popups or
|
|
||||||
application error popups as they appear, play sounds, log events to a
|
|
||||||
file and the like. Be creative, You'll find a use for it.
|
|
||||||
|
|
||||||
\fBFvwmEvent\fP is spawned by \fBfvwm2(1)\fP, so no command line invocation will
|
|
||||||
work. From within the \fI.fvwm2rc\fP file, \fBFvwmEvent\fP is spawned as
|
|
||||||
follows:
|
|
||||||
.nf
|
|
||||||
.sp
|
|
||||||
Module FvwmEvent
|
|
||||||
.sp
|
|
||||||
.fi
|
|
||||||
or from within an \fBfvwm2\fP pop-up menu:
|
|
||||||
.nf
|
|
||||||
.sp
|
|
||||||
DestroyMenu Module-Popup
|
|
||||||
AddToMenu Module-Popup "Modules" Title
|
|
||||||
+ "Event" Module FvwmEvent
|
|
||||||
+ "Auto" Module FvwmAuto 200
|
|
||||||
+ "Buttons" Module FvwmButtons
|
|
||||||
+ "Ident" Module FvwmIdent
|
|
||||||
+ "Banner" Module FvwmBanner
|
|
||||||
+ "Pager" Module FvwmPager 0 3
|
|
||||||
.sp
|
|
||||||
.fi
|
|
||||||
.SH DESCRIPTION
|
|
||||||
The \fBFvwmEvent\fP module communicates with the \fBfvwm2\fP window manager
|
|
||||||
to bind \fIactions\fP to window manager \fIevents\fP. Different actions
|
|
||||||
may be assigned to distinct window manager events.
|
|
||||||
|
|
||||||
\fBFvwmEvent\fP can be used to bind sound files to events like
|
|
||||||
\fBFvwmAudio\fP (RiP) did. It can be used for logging event traces to
|
|
||||||
a log file, while debugging \fBfvwm2\fP.
|
|
||||||
|
|
||||||
\fBFvwmEvent\fP can also have builtin support for the rplay library.
|
|
||||||
(heritage of FvwmAudio)
|
|
||||||
|
|
||||||
.SH CONFIGURATION OPTIONS
|
|
||||||
\fBFvwmEvent\fP reads the same \fI.fvwm2rc\fP file as \fBfvwm2\fP
|
|
||||||
reads when it starts up, and looks for certain configuration options:
|
|
||||||
|
|
||||||
.IP "*FvwmEventCmd \fIcommand\fP"
|
|
||||||
This determines the \fBfvwm2\fP function that is to be called with the
|
|
||||||
event parameters.
|
|
||||||
You might want to do one of the following (details below):
|
|
||||||
.nf
|
|
||||||
.sp
|
|
||||||
*FvwmEventCmd \fIbuiltin-rplay\fP
|
|
||||||
play sounds
|
|
||||||
*FvwmEventCmd
|
|
||||||
execute distinct fvwm2 functions
|
|
||||||
*FvwmEventCmd exec
|
|
||||||
execute distinct external programs
|
|
||||||
.sp
|
|
||||||
.fi
|
|
||||||
This version of \fBFvwmEvent\fP has builtin \fBrplay\fP support which does not
|
|
||||||
need to invoke an external audio player to play sounds. The rplay
|
|
||||||
support is enabled when \fBFvwmEvent\fP is compiled with \fIHAVE_RPLAY\fP defined
|
|
||||||
(see the Imakefile) and when \fBFvwmEventCmd\fP is set to \fIbuiltin-rplay\fP.
|
|
||||||
|
|
||||||
For example:
|
|
||||||
.nf
|
|
||||||
.sp
|
|
||||||
*FvwmEventCmd \fIbuiltin-rplay\fP
|
|
||||||
*FvwmEvent add_window drip.au
|
|
||||||
|
|
||||||
rplay can be obtained via anonymous ftp at
|
|
||||||
<URL:ftp://ftp.sdsu.edu/pub/rplay>
|
|
||||||
or <URL:ftp://ftp.x.org/contrib/Event/rplay>
|
|
||||||
.sp
|
|
||||||
.fi
|
|
||||||
\fBFvwmEvent\fP also has support for any other external program.
|
|
||||||
e.g: the rsynth 'say' command:
|
|
||||||
.nf
|
|
||||||
.sp
|
|
||||||
*FvwmEventCmd /rsynth/say
|
|
||||||
*FvwmEvent destroy_window "window closed"
|
|
||||||
.sp
|
|
||||||
.fi
|
|
||||||
You can also use \fBfvwm2\fP's builtin \fIEcho\fP command as
|
|
||||||
\fIFvwmEventCmd\fP to obtain debug output for \fBfvwm2\fP events quietly.
|
|
||||||
I used this setup to debug FvwmAuto:
|
|
||||||
.nf
|
|
||||||
.sp
|
|
||||||
*FvwmEventCmd \fIEcho\fP
|
|
||||||
*FvwmEvent focus_change "focus change"
|
|
||||||
*FvwmEvent raise_window "raise window"
|
|
||||||
.sp
|
|
||||||
.fi
|
|
||||||
You can even call different shell commands for each event just by setting
|
|
||||||
.nf
|
|
||||||
.sp
|
|
||||||
*FvwmEventCmd exec
|
|
||||||
*FvwmEvent add_window killname "APPL ERROR"
|
|
||||||
.sp
|
|
||||||
.fi
|
|
||||||
.IP "*FvwmEvent \fIwindow-manager-event action-or-filename\fP"
|
|
||||||
Binds particular actions to window manager events.
|
|
||||||
.nf
|
|
||||||
.sp
|
|
||||||
e.g. for audio-events:
|
|
||||||
|
|
||||||
*FvwmEvent startup TaDa.au
|
|
||||||
*FvwmEvent shutdown Elvis_Left.au
|
|
||||||
*FvwmEvent unknown doh.au
|
|
||||||
|
|
||||||
*FvwmEvent new_page beam_trek.au
|
|
||||||
*FvwmEvent new_desk beam_trek.au
|
|
||||||
*FvwmEvent add_window drip.au
|
|
||||||
*FvwmEvent raise_window swoosh.au
|
|
||||||
*FvwmEvent lower_window swoosh.au
|
|
||||||
*FvwmEvent configure_window hammer.au
|
|
||||||
*FvwmEvent focus_change boing.au
|
|
||||||
*FvwmEvent destroy_window explosion.au
|
|
||||||
*FvwmEvent iconify ploop.au
|
|
||||||
*FvwmEvent deiconify ploop.au
|
|
||||||
*FvwmEvent window_name huh.au
|
|
||||||
*FvwmEvent icon_name beep.au
|
|
||||||
*FvwmEvent res_class beep.au
|
|
||||||
*FvwmEvent res_name beep.au
|
|
||||||
*FvwmEvent end_windowlist twang.au
|
|
||||||
|
|
||||||
*FvwmEvent icon_location beep.au
|
|
||||||
*FvwmEvent map beep.au
|
|
||||||
*FvwmEvent error beep.au
|
|
||||||
*FvwmEvent config_info beep.au
|
|
||||||
*FvwmEvent end_config_info beep.au
|
|
||||||
*FvwmEvent icon_file beep.au
|
|
||||||
*FvwmEvent default_icon beep.au
|
|
||||||
*FvwmEvent string plapper.au
|
|
||||||
|
|
||||||
*FvwmEvent mini_icon beep.au
|
|
||||||
*FvwmEvent windowshade beep.au
|
|
||||||
*FvwmEvent dewindowshade beep.au
|
|
||||||
.sp
|
|
||||||
.fi
|
|
||||||
Provided \fBfvwm2\fP supports it (not yet), there's an additional event to
|
|
||||||
replace all \fBfvwm2\fP beeps with a sound:
|
|
||||||
.nf
|
|
||||||
.sp
|
|
||||||
*FvwmEvent beep beep.au
|
|
||||||
.sp
|
|
||||||
.fi
|
|
||||||
The toggle_paging event will be supported, as soon, as it's
|
|
||||||
resurrected by \fBfvwm2\fP:
|
|
||||||
.nf
|
|
||||||
.sp
|
|
||||||
*FvwmEvent toggle_paging fwop.au
|
|
||||||
.sp
|
|
||||||
.fi
|
|
||||||
.IP "*FvwmEventDelay \fI5\fP"
|
|
||||||
Specifies that an event-action will only be executed if it occurs at
|
|
||||||
least 5 seconds after the previous event. Events that occur during
|
|
||||||
the delay period are ignored. This option is useful if you don't want
|
|
||||||
several sounds playing at the same time. The default delay is 0 which
|
|
||||||
disables the Event delay.
|
|
||||||
|
|
||||||
|
|
||||||
.SH RPLAY OPTIONS
|
|
||||||
The following options are only valid with builtin rplay support.
|
|
||||||
i.e: when \fBFvwmEvent\fP was compiled with \fIHAVE_RPLAY\fP defined
|
|
||||||
(see the Imakefile). They are used only if \fBFvwmEventCmd\fP is set
|
|
||||||
to \fIbuiltin-rplay\fP.
|
|
||||||
|
|
||||||
|
|
||||||
.IP "*FvwmEventRplayHost \fIhostname\fP"
|
|
||||||
Specifies what host the rplay sounds will play on. The \fIhostname\fP
|
|
||||||
can also be an environment variable such as $HOSTDISPLAY.
|
|
||||||
|
|
||||||
.IP "*FvwmEventRplayPriority \fI0\fP"
|
|
||||||
Specifies what priority will be assigned to the rplay sounds when they
|
|
||||||
are played.
|
|
||||||
|
|
||||||
.IP "*FvwmEventRplayVolume \fI127\fP"
|
|
||||||
Specifies what volume will be assigned to the sounds when they are
|
|
||||||
played.
|
|
||||||
|
|
||||||
.SH INVOCATION
|
|
||||||
The invocation method was shown in the synopsis section. No command
|
|
||||||
line invocation is possible. \fBFvwmEvent\fP must be invoked by the
|
|
||||||
\fBfvwm2\fP window manager.
|
|
||||||
.sp
|
|
||||||
|
|
||||||
.SH FvwmAudio Compatibility
|
|
||||||
|
|
||||||
FvwmAudioPlayCmd used to call an external program.
|
|
||||||
FvwmEventCmd calls an \fBfvwm2\fP function. External programs can be called
|
|
||||||
using the \fBfvwm2\fP exec function "exec program".
|
|
||||||
|
|
||||||
FvwmAudioDir has been removed due to the fact that the parameters
|
|
||||||
don't have to be files any more.
|
|
||||||
use:
|
|
||||||
.nf
|
|
||||||
.sp
|
|
||||||
DestroyFunc mysay
|
|
||||||
AddToFunc mysay "I" exec /rsynth/say /rsynth/audiofiles/$1
|
|
||||||
|
|
||||||
*FvwmEventCmd mysay
|
|
||||||
.sp
|
|
||||||
.fi
|
|
||||||
.SH BUGS
|
|
||||||
It's REALLY noisy when \fBfvwm2\fP starts and restarts using an audio player.
|
|
||||||
FvwmEventDelay helps a little bit.
|
|
||||||
|
|
||||||
The parameters inherent to several events are not accessible. This
|
|
||||||
might be implemented in the future so that the command executed by
|
|
||||||
fvwm2 looks like FvwmEventCmd FvwmEvent-parameters
|
|
||||||
event-specific-parameters.
|
|
||||||
|
|
||||||
Simple \fBFvwmAuto\fP could then be emulated by:
|
|
||||||
.nf
|
|
||||||
*FvwmEventCmd
|
|
||||||
*FvwmEvent raise-window Raise
|
|
||||||
.sp
|
|
||||||
.fi
|
|
||||||
.SH COPYRIGHTS
|
|
||||||
This module has evolved of \fBFvwmAudio\fP, which in term is heavily based
|
|
||||||
on a similar Fvwm module called \fBFvwmSound\fP by Mark
|
|
||||||
Boyns. \fBFvwmAudio\fP simply took Mark's original program and
|
|
||||||
extended it to make it generic enough to work with any Audio
|
|
||||||
player. Due to different requests to do specific things on specific events,
|
|
||||||
\fBFvwmEvent\fP took this one step further and now calls any
|
|
||||||
\fBfvwm2\fP function, or builtin-rplay. If \fBfvwm2\fP's Exec function
|
|
||||||
is used, any external program can be called with any parameter.
|
|
||||||
|
|
||||||
The concept for interfacing this module to the Window Manager, is
|
|
||||||
original work by Robert Nation.
|
|
||||||
|
|
||||||
Copyright 1998 Albrecht Kadlec.
|
|
||||||
Copyright 1994, Mark Boyns and Mark Scott. No guarantees or
|
|
||||||
warranties or anything are provided or implied in any way whatsoever.
|
|
||||||
Use this program at your own risk. Permission to use and modify this
|
|
||||||
program for any purpose is given, as long as the copyright is kept intact.
|
|
||||||
|
|
||||||
|
|
||||||
.sp
|
|
||||||
.SH AUTHORS
|
|
||||||
.nf
|
|
||||||
1994 FvwmSound Mark Boyns (\fIboyns@sdsu.edu\fP)
|
|
||||||
1994 FvwmAudio Mark Scott (\fImscott@mcd.mot.com\fP)
|
|
||||||
1996 FvwmAudio Albrecht Kadlec
|
|
||||||
1998 FvwmEvent Albrecht Kadlec (\fIalbrecht@auto.tuwien.ac.at\fP)
|
|
||||||
@@ -1,519 +0,0 @@
|
|||||||
/*#define DEBUG
|
|
||||||
*
|
|
||||||
* Copyright (C) 1994 Mark Boyns (boyns@sdsu.edu) and
|
|
||||||
* Mark Scott (mscott@mcd.mot.com)
|
|
||||||
* 1996-1998 Albrecht Kadlec (albrecht@auto.tuwien.ac.at)
|
|
||||||
*
|
|
||||||
* FvwmEvent version 1.0
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* ChangeLog
|
|
||||||
|
|
||||||
* renamed & cleaned up so that FvwmEvent (TaDa !!) is a general event
|
|
||||||
handler module.
|
|
||||||
-- 21.04.98 Albrecht Kadlec (albrecht@auto.tuwien.ac.at)
|
|
||||||
|
|
||||||
* changed parsing to use new library functions
|
|
||||||
|
|
||||||
* merged bug fix from Christophe MARTIN <cmartin@ipnl.in2p3.fr>
|
|
||||||
- FvwmAudio doesn't read messages it is not interrested in,
|
|
||||||
thus desynchronize,
|
|
||||||
- keep time stamp even if no sound is played
|
|
||||||
- minimize malloc/free
|
|
||||||
|
|
||||||
mark boyns ok-ed this patch, I reviewed it and put out those ugly
|
|
||||||
#defines for RESYNC and READ_BODY by reordering the control structures
|
|
||||||
-- Albrecht Kadlec (albrecht@auto.tuwien.ac.at)
|
|
||||||
|
|
||||||
* made FvwmAudio insensitive to its name -> can be symlinked.
|
|
||||||
corrected some error message deficiencies, code for quoted 'sound'
|
|
||||||
parameters shamelessly stolen from FvwmButtons/parse.c (with minimal
|
|
||||||
adjustments)
|
|
||||||
FvwmAudio now supports rsynth's say command:
|
|
||||||
*FvwmAudioPlayCmd say
|
|
||||||
*FvwmAudio add_window "add window"
|
|
||||||
*FvwmAudio raise_window 'raise window'
|
|
||||||
-- 08/07/96 Albrecht Kadlec (albrecht@auto.tuwien.ac.at)
|
|
||||||
|
|
||||||
* Fixed FvwmAudio to reflect the changes made to the module protocol.
|
|
||||||
|
|
||||||
* Szijarto Szabolcs <saby@sch.bme.hu> provided FvwmSound code that used
|
|
||||||
$HOSTDISPLAY for the rplay host. The code has been added to FvwmAudio.
|
|
||||||
|
|
||||||
* Fixed bugs reported by beta testers, thanks!
|
|
||||||
|
|
||||||
* Builtin rplay support has been added to FvwmAudio. This support is
|
|
||||||
enabled when FvwmAudio is compiled with HAVE_RPLAY defined and when
|
|
||||||
FvwmAudioPlayCmd is set to builtin-rplay. I guess it's safe to say
|
|
||||||
that FvwmSound is now obsolete. -- Mark Boyns 5/7/94
|
|
||||||
|
|
||||||
* FvwmAudio is based heavily on an Fvwm module "FvwmSound" by Mark Boyns
|
|
||||||
and the real credit for this really goes to him for the concept.
|
|
||||||
I just stripped out the "rplay" library dependencies to allow generic
|
|
||||||
audio play command support.
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This module is based on FvwmModuleDebugger which has the following
|
|
||||||
* copyright:
|
|
||||||
*
|
|
||||||
* This module, and the entire ModuleDebugger program, and the concept for
|
|
||||||
* interfacing this module to the Window Manager, are all original work
|
|
||||||
* by Robert Nation
|
|
||||||
*
|
|
||||||
* Copyright 1994, Robert Nation. No guarantees or warantees or anything
|
|
||||||
* are provided or implied in any way whatsoever. Use this program at your
|
|
||||||
* own risk. Permission to use this program for any purpose is given,
|
|
||||||
* as long as the copyright is kept intact.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
#include "../../fvwm/module.h"
|
|
||||||
#include "fvwmlib.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* fvwm includes:
|
|
||||||
*/
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/wait.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* rplay includes:
|
|
||||||
*/
|
|
||||||
#ifdef HAVE_RPLAY
|
|
||||||
#include <rplay.h>
|
|
||||||
#undef M_ERROR /* Solaris fix */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "ModParse.h"
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
#define INFO(x) fprintf(stderr,x)
|
|
||||||
#else
|
|
||||||
#define INFO(x)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define BUILTIN_STARTUP MAX_MESSAGES
|
|
||||||
#define BUILTIN_SHUTDOWN MAX_MESSAGES+1
|
|
||||||
#define BUILTIN_UNKNOWN MAX_MESSAGES+2
|
|
||||||
#define MAX_BUILTIN 3
|
|
||||||
|
|
||||||
#define BUFSIZE 512
|
|
||||||
|
|
||||||
/* globals */
|
|
||||||
char *MyName;
|
|
||||||
int MyNameLen;
|
|
||||||
int fd[2];
|
|
||||||
char cmd_line[BUFSIZE]="";
|
|
||||||
time_t audio_delay = 0, /* seconds */
|
|
||||||
last_time = 0,
|
|
||||||
now;
|
|
||||||
|
|
||||||
#ifdef HAVE_RPLAY
|
|
||||||
int rplay_fd = -1;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* prototypes */
|
|
||||||
int execute_event(short);
|
|
||||||
void config(void);
|
|
||||||
void DeadPipe(int) __attribute__((__noreturn__));
|
|
||||||
|
|
||||||
static RETSIGTYPE TerminateHandler(int);
|
|
||||||
|
|
||||||
/* define the event table */
|
|
||||||
char *events[MAX_MESSAGES+MAX_BUILTIN] =
|
|
||||||
{
|
|
||||||
"new_page",
|
|
||||||
"new_desk",
|
|
||||||
"add_window",
|
|
||||||
"raise_window",
|
|
||||||
"lower_window",
|
|
||||||
"configure_window",
|
|
||||||
"focus_change",
|
|
||||||
"destroy_window",
|
|
||||||
"iconify",
|
|
||||||
"deiconify",
|
|
||||||
"window_name",
|
|
||||||
"icon_name",
|
|
||||||
"res_class",
|
|
||||||
"res_name",
|
|
||||||
"end_windowlist",
|
|
||||||
"icon_location",
|
|
||||||
"map",
|
|
||||||
"error",
|
|
||||||
"config_info",
|
|
||||||
"end_config_info",
|
|
||||||
"icon_file",
|
|
||||||
"default_icon",
|
|
||||||
"string",
|
|
||||||
#ifdef M_BELL
|
|
||||||
"beep",
|
|
||||||
#endif
|
|
||||||
#ifdef M_TOGGLEPAGE
|
|
||||||
"togglepage",
|
|
||||||
#endif
|
|
||||||
"mini_icon",
|
|
||||||
"windowshade",
|
|
||||||
"dewindowshade",
|
|
||||||
"locksonsend",
|
|
||||||
"sendconfig",
|
|
||||||
/* add builtins here */
|
|
||||||
"startup",
|
|
||||||
"shutdown",
|
|
||||||
"unknown"
|
|
||||||
};
|
|
||||||
|
|
||||||
/* define the action table */
|
|
||||||
char *action_table[MAX_MESSAGES+MAX_BUILTIN];
|
|
||||||
|
|
||||||
#ifdef HAVE_RPLAY
|
|
||||||
/* define the rplay table */
|
|
||||||
RPLAY *rplay_table[MAX_MESSAGES+MAX_BUILTIN];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static volatile sig_atomic_t isTerminated = False;
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
char *s;
|
|
||||||
unsigned long header[HEADER_SIZE], body[MAX_BODY_SIZE];
|
|
||||||
int total, remaining, count, event;
|
|
||||||
|
|
||||||
INFO("--- started ----\n");
|
|
||||||
|
|
||||||
/* Save our program name - for error events */
|
|
||||||
|
|
||||||
if ((s=strrchr(argv[0], '/'))) /* strip path */
|
|
||||||
s++;
|
|
||||||
else /* no slash */
|
|
||||||
s = argv[0];
|
|
||||||
|
|
||||||
MyNameLen=strlen(s)+1; /* account for '*' */
|
|
||||||
MyName = safemalloc(MyNameLen+1); /* account for \0 */
|
|
||||||
*MyName='*';
|
|
||||||
strcpy(MyName+1, s); /* append name */
|
|
||||||
|
|
||||||
if ((argc != 6)&&(argc != 7)) /* Now MyName is defined */
|
|
||||||
{
|
|
||||||
fprintf(stderr,"%s Version "VERSION" should only be executed by fvwm!\n",
|
|
||||||
MyName+1);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
INFO("--- installing signal server\n");
|
|
||||||
|
|
||||||
#ifdef HAVE_SIGACTION
|
|
||||||
{
|
|
||||||
struct sigaction sigact;
|
|
||||||
|
|
||||||
sigemptyset(&sigact.sa_mask);
|
|
||||||
# ifdef SA_INTERRUPT
|
|
||||||
sigact.sa_flags = SA_INTERRUPT;
|
|
||||||
# else
|
|
||||||
sigact.sa_flags = 0;
|
|
||||||
# endif
|
|
||||||
sigact.sa_handler = TerminateHandler;
|
|
||||||
|
|
||||||
sigaction(SIGPIPE,&sigact,NULL); /* Dead pipe == Fvwm died */
|
|
||||||
sigaction(SIGTERM,&sigact,NULL); /* "polite" termination signal */
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
/* We don't have sigaction(), so fall back to less robust methods. */
|
|
||||||
signal(SIGPIPE, TerminateHandler);
|
|
||||||
signal(SIGTERM, TerminateHandler);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
fd[0] = atoi(argv[1]);
|
|
||||||
fd[1] = atoi(argv[2]);
|
|
||||||
|
|
||||||
INFO("--- configuring\n");
|
|
||||||
|
|
||||||
config(); /* configure events */
|
|
||||||
execute_event(BUILTIN_STARTUP); /* Startup event */
|
|
||||||
|
|
||||||
SendText(fd,"Nop",0); /* what for ? */
|
|
||||||
|
|
||||||
|
|
||||||
/* main loop */
|
|
||||||
|
|
||||||
INFO("--- waiting\n");
|
|
||||||
while ( !isTerminated )
|
|
||||||
{
|
|
||||||
if ((count = read(fd[1],header,
|
|
||||||
HEADER_SIZE*sizeof(unsigned long))) <= 0)
|
|
||||||
exit(0);
|
|
||||||
/* if this read is interrrupted EINTR, the wrong event is triggered !!! */
|
|
||||||
|
|
||||||
if( header[0] != START_FLAG )
|
|
||||||
continue; /* should find something better for resyncing */
|
|
||||||
|
|
||||||
/* Ignore events that occur during the delay period. */
|
|
||||||
now = time(0);
|
|
||||||
|
|
||||||
/* junk the event body */
|
|
||||||
total=0;
|
|
||||||
remaining = (header[2] - HEADER_SIZE) * sizeof(unsigned long);
|
|
||||||
while (remaining)
|
|
||||||
{
|
|
||||||
if((count=read(fd[1],&body[total],remaining)) < 0)
|
|
||||||
exit(0);
|
|
||||||
remaining -= count;
|
|
||||||
total +=count;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (now < last_time + audio_delay)
|
|
||||||
continue; /* quash event */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* event will equal the number of shifts in the
|
|
||||||
* base-2 header[1] number. Could use log here
|
|
||||||
* but this should be fast enough.
|
|
||||||
*/
|
|
||||||
event = -1;
|
|
||||||
while (header[1])
|
|
||||||
{
|
|
||||||
event++;
|
|
||||||
header[1] >>= 1;
|
|
||||||
}
|
|
||||||
if (event < 0 || event >= MAX_MESSAGES)
|
|
||||||
event=BUILTIN_UNKNOWN;
|
|
||||||
|
|
||||||
execute_event(event); /* execute action */
|
|
||||||
} /* while */
|
|
||||||
|
|
||||||
execute_event(BUILTIN_SHUTDOWN);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* Procedure:
|
|
||||||
*
|
|
||||||
* execute_event - actually executes the actions from lookup table
|
|
||||||
*
|
|
||||||
**********************************************************************/
|
|
||||||
int execute_event(short event)
|
|
||||||
{
|
|
||||||
static char buf[BUFSIZE];
|
|
||||||
|
|
||||||
#ifdef HAVE_RPLAY
|
|
||||||
if (rplay_fd != -1) /* this is the sign that rplay is used */
|
|
||||||
{
|
|
||||||
if (rplay_table[event])
|
|
||||||
if (rplay(rplay_fd, rplay_table[event]) >= 0)
|
|
||||||
last_time = now;
|
|
||||||
else
|
|
||||||
rplay_perror("rplay");
|
|
||||||
return 0;
|
|
||||||
} else /* avoid invalid second execute */
|
|
||||||
#endif
|
|
||||||
if (action_table[event])
|
|
||||||
{
|
|
||||||
sprintf(buf,"%s %s", cmd_line, action_table[event]);
|
|
||||||
#if 1
|
|
||||||
INFO(buf);
|
|
||||||
INFO("\n");
|
|
||||||
|
|
||||||
SendText(fd,buf,0); /* let fvwm2 execute the function */
|
|
||||||
last_time = now;
|
|
||||||
#else
|
|
||||||
if( ! ( ret = system(buf))) /* directly execute external program */
|
|
||||||
last_time = now;
|
|
||||||
return ret;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* Procedure:
|
|
||||||
* config - read the configuration file.
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
char *table[]=
|
|
||||||
{
|
|
||||||
"Cmd",
|
|
||||||
"Delay"
|
|
||||||
#ifdef HAVE_RPLAY
|
|
||||||
,
|
|
||||||
"RplayHost",
|
|
||||||
"RplayPriority",
|
|
||||||
"RplayVolume"
|
|
||||||
#endif
|
|
||||||
}; /* define entries here, if this list becomes unsorted, use LFindToken */
|
|
||||||
|
|
||||||
|
|
||||||
void config(void)
|
|
||||||
{
|
|
||||||
char *buf, *event, *action, *p, *q, **e;
|
|
||||||
int i, found;
|
|
||||||
#ifdef HAVE_RPLAY
|
|
||||||
int volume = RPLAY_DEFAULT_VOLUME,
|
|
||||||
priority = RPLAY_DEFAULT_PRIORITY;
|
|
||||||
char host[128];
|
|
||||||
|
|
||||||
strcpy(host, rplay_default_host());
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Intialize all the actions */
|
|
||||||
|
|
||||||
for (i = 0; i < MAX_MESSAGES+MAX_BUILTIN; i++)
|
|
||||||
{
|
|
||||||
action_table[i] = NULL;
|
|
||||||
#ifdef HAVE_RPLAY
|
|
||||||
rplay_table[i] = NULL;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
while (GetConfigLine(fd,&buf), buf != NULL)
|
|
||||||
{
|
|
||||||
if (buf[strlen(buf)-1] == '\n') { /* if line ends with newline */
|
|
||||||
buf[strlen(buf)-1] = '\0'; /* strip off \n */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Search for MyName (normally *FvwmAudio) */
|
|
||||||
if (strncasecmp(buf, MyName, MyNameLen) == 0)
|
|
||||||
{
|
|
||||||
p = buf+MyNameLen;
|
|
||||||
INFO(buf);
|
|
||||||
INFO("\n");
|
|
||||||
if ((e= FindToken(p,table,char *))) /* config option ? */
|
|
||||||
{
|
|
||||||
p+=strlen(*e); /* skip matched token */
|
|
||||||
q=GetArgument(&p);
|
|
||||||
if (!q)
|
|
||||||
{
|
|
||||||
fprintf(stderr,"%s: %s%s needs a parameter\n",
|
|
||||||
MyName+1, MyName+1,*e);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (e - (char**)table)
|
|
||||||
{
|
|
||||||
case 0: if (q) strcpy(cmd_line, q); /* Cmd */
|
|
||||||
else *cmd_line='\0';
|
|
||||||
INFO("cmd_line = ->");
|
|
||||||
INFO(cmd_line);
|
|
||||||
INFO("<-\n");
|
|
||||||
break;
|
|
||||||
case 1: audio_delay = atoi(q); break; /* Delay */
|
|
||||||
#ifdef HAVE_RPLAY
|
|
||||||
case 2: if (*q == '$') /* RPlayHost */
|
|
||||||
{ /* Check for $HOSTDISPLAY */
|
|
||||||
char *c1= (char *)getenv(q+1), *c2= host;
|
|
||||||
while (c1 && *c1 != ':')
|
|
||||||
*c2++ = *c1++;
|
|
||||||
*c2 = '\0';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
strcpy(host, q);
|
|
||||||
break;
|
|
||||||
case 3: priority = atoi(q); break; /* RplayPriority */
|
|
||||||
case 4: volume = atoi(q); break; /* RplayVolume */
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else /* test for isspace(*p) ??? */
|
|
||||||
{
|
|
||||||
event = GetArgument(&p);
|
|
||||||
action = GetArgument(&p);
|
|
||||||
INFO(event);
|
|
||||||
INFO(" ");
|
|
||||||
INFO(action);
|
|
||||||
INFO("\n");
|
|
||||||
if (!event || !*event || !action || !*action)
|
|
||||||
{
|
|
||||||
fprintf(stderr,"%s: incomplete event definition %s\n",
|
|
||||||
MyName+1, buf);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
for (found = 0,i = 0; !found && i < MAX_MESSAGES+MAX_BUILTIN;
|
|
||||||
i++)
|
|
||||||
{
|
|
||||||
INFO(events[i]);
|
|
||||||
INFO("\n");
|
|
||||||
|
|
||||||
if (MatchToken(event, events[i]))
|
|
||||||
{
|
|
||||||
#ifdef HAVE_RPLAY
|
|
||||||
rplay_table[i] = rplay_create(RPLAY_PLAY);
|
|
||||||
rplay_set(rplay_table[i], RPLAY_APPEND,
|
|
||||||
RPLAY_SOUND, action,
|
|
||||||
RPLAY_PRIORITY, priority,
|
|
||||||
RPLAY_VOLUME, volume,
|
|
||||||
NULL);
|
|
||||||
#endif
|
|
||||||
action_table[i]=action;
|
|
||||||
found=1;
|
|
||||||
INFO("found\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!found) fprintf(stderr,"%s: unknown event type: %s\n",
|
|
||||||
MyName+1, event);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*else INFO("NO CONFIG\n");*/
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef HAVE_RPLAY
|
|
||||||
/*
|
|
||||||
* Builtin rplay support is enabled when FvwmAudioPlayCmd == builtin-rplay.
|
|
||||||
*/
|
|
||||||
if (strcasecmp(cmd_line, "builtin-rplay") == 0)
|
|
||||||
if ((rplay_fd = rplay_open(host)) < 0)
|
|
||||||
{
|
|
||||||
rplay_perror("rplay_open");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* Procedure:
|
|
||||||
* SIGPIPE handler - SIGPIPE means fvwm is dying
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
static RETSIGTYPE
|
|
||||||
TerminateHandler(int nonsense)
|
|
||||||
{
|
|
||||||
isTerminated = True;
|
|
||||||
}
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* Procedure:
|
|
||||||
* Externally callable procedure to quit
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
void DeadPipe(int flag)
|
|
||||||
{
|
|
||||||
execute_event(BUILTIN_SHUTDOWN);
|
|
||||||
exit(flag);
|
|
||||||
}
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
# $OpenBSD: Imakefile,v 1.1.1.1 2006/11/26 10:53:46 matthieu Exp $
|
|
||||||
|
|
||||||
FVWMTOP=../..
|
|
||||||
#include "../../Fvwm.tmpl"
|
|
||||||
|
|
||||||
FvwmSimpleModuleTarget(FvwmEvent)
|
|
||||||
Reference in New Issue
Block a user