mirror of
https://github.com/Llewellynvdm/conky.git
synced 2024-12-23 19:39:06 +00:00
xmms/bmp/audacious/infopipe reorgamization
git-svn-id: https://conky.svn.sourceforge.net/svnroot/conky/trunk/conky@487 7f574dfc-610e-0410-a909-a81674777703
This commit is contained in:
parent
ed34f5d401
commit
6d24365953
90
README
90
README
@ -4,16 +4,16 @@ conky(1) conky(1)
|
||||
|
||||
NAME
|
||||
conky - A system monitor for X originally based on the torsmo code, but
|
||||
more kickass. It just keeps on given'er. Yeah.
|
||||
more kickass. It just keeps on given’er. Yeah.
|
||||
|
||||
SYNOPSIS
|
||||
conky [options]
|
||||
|
||||
DESCRIPTION
|
||||
Conky is a system monitor for X originally based on the torsmo code.
|
||||
Since it's original conception, Conky has changed a fair bit from it's
|
||||
Since it’s original conception, Conky has changed a fair bit from it’s
|
||||
predecessor. Conky can display just about anything, either on your
|
||||
root desktop or in it's own window. Conky has many built-in objects,
|
||||
root desktop or in it’s own window. Conky has many built-in objects,
|
||||
as well as the ability to execute programs and scripts, then display
|
||||
the output from stdout.
|
||||
|
||||
@ -28,11 +28,11 @@ COMPILING
|
||||
libraries installed. This should be a package along the lines of
|
||||
"libx11-dev or xorg-x11-dev".
|
||||
|
||||
Gentoo users -- Conky is in Gentoo's Portage... simply use "emerge app-
|
||||
Gentoo users -- Conky is in Gentoo’s Portage... simply use "emerge app-
|
||||
admin/conky" for installation. There is also usually an up-to-date
|
||||
ebuild within Conky's package or in CVS.
|
||||
ebuild within Conky’s package or in CVS.
|
||||
|
||||
Debian,etc. users -- Conky will be in Debian's repositories soon (by
|
||||
Debian,etc. users -- Conky will be in Debian’s repositories soon (by
|
||||
mid-September, hopefully), and then Ubuntu shortly thereafter. Until
|
||||
then, "dpkg -i" the .deb package to install.
|
||||
|
||||
@ -43,7 +43,7 @@ COMPILING
|
||||
|
||||
./configure --prefix=/usr --mandir=/usr/share/man
|
||||
--infodir=/usr/share/info --datadir=/usr/share --sysconfdir=/etc
|
||||
--localstatedir=/var/lib --enable-xft --enable-seti --enable-dou-
|
||||
--localstatedir=/var/lib --enable-xft --enable-seti --enable-dou‐
|
||||
ble-buffer --enable-own-window --enable-proc-uptime --enable-mpd
|
||||
--enable-mldonkey --enable-x11 --enable-portmon --enable-bmpx
|
||||
--enable-infopipe
|
||||
@ -54,14 +54,14 @@ COMPILING
|
||||
|
||||
src/conky
|
||||
|
||||
Conky probably doesn't compile with compilers other than gcc and icc.
|
||||
It doesn't compile with C89 compiler and not even with pure C99. It
|
||||
uses a few things that might not exist: strdup(), strcasecmp(), strn-
|
||||
Conky probably doesn’t compile with compilers other than gcc and icc.
|
||||
It doesn’t compile with C89 compiler and not even with pure C99. It
|
||||
uses a few things that might not exist: strdup(), strcasecmp(), strn‐
|
||||
casecmp(), optarg variable with getopt() and long long (not in C89).
|
||||
Crashes in file system statistics stuff when compiled with icc, I don't
|
||||
Crashes in file system statistics stuff when compiled with icc, I don’t
|
||||
know exactly why.
|
||||
|
||||
You can disable 'drawing to own window' feature in case you don't need
|
||||
You can disable ’drawing to own window’ feature in case you don’t need
|
||||
it by passing --disable-own-window to configure -script.
|
||||
|
||||
|
||||
@ -72,14 +72,14 @@ YOU SHOULD KNOW
|
||||
rest of Conky.
|
||||
|
||||
If you do use them, please do not complain about memory or CPU usage,
|
||||
unless you think something's seriously wrong (mem leak, etc.).
|
||||
unless you think something’s seriously wrong (mem leak, etc.).
|
||||
|
||||
An easy way to force Conky to reload your ~/.conkyrc: "killall -SIGUSR1
|
||||
conky". Saves you the trouble of having to kill and then restart.
|
||||
|
||||
IMPORTANT: For previous Conky users, Conky 1.3 no longer supports the
|
||||
metar stuff. mdsplib was causing way too many problems. Hopefully
|
||||
there'll be a better solution in Conky 2.x...
|
||||
there’ll be a better solution in Conky 2.x...
|
||||
|
||||
OPTIONS
|
||||
Command line options override configurations defined in configuration
|
||||
@ -114,7 +114,7 @@ OPTIONS
|
||||
|
||||
|
||||
-t TEXT
|
||||
Text to render, remember single quotes, like -t ' $uptime '
|
||||
Text to render, remember single quotes, like -t ’ $uptime ’
|
||||
|
||||
|
||||
-u SECONDS
|
||||
@ -136,14 +136,14 @@ OPTIONS
|
||||
CONFIGURATION SETTINGS
|
||||
Default configuration file is $HOME/.conkyrc (can be changed from
|
||||
conky.c among other things). See conkyrc.sample. If installing from
|
||||
Debian package, this should be in /usr/share/doc/conky/examples ("gun-
|
||||
Debian package, this should be in /usr/share/doc/conky/examples ("gun‐
|
||||
zip conkyrc.sample.gz" to get conkyrc.sample).
|
||||
|
||||
You might want to copy it to $HOME/.conkyrc and then start modifying
|
||||
it. Other configs can be found at http://conky.sf.net
|
||||
|
||||
alignment
|
||||
Aligned position on screen, may be top_left, top_right, bot-
|
||||
Aligned position on screen, may be top_left, top_right, bot‐
|
||||
tom_left, bottom_right, or none
|
||||
|
||||
|
||||
@ -173,7 +173,7 @@ CONFIGURATION SETTINGS
|
||||
|
||||
|
||||
default_shade_color
|
||||
Default shading color and border's shading color
|
||||
Default shading color and border’s shading color
|
||||
|
||||
|
||||
default_outline_color
|
||||
@ -181,8 +181,8 @@ CONFIGURATION SETTINGS
|
||||
|
||||
|
||||
double_buffer
|
||||
Use the Xdbe extension? (eliminates flicker) It is highly recom-
|
||||
mended to use own window with this one so double buffer won't be
|
||||
Use the Xdbe extension? (eliminates flicker) It is highly recom‐
|
||||
mended to use own window with this one so double buffer won’t be
|
||||
so big.
|
||||
|
||||
|
||||
@ -330,7 +330,7 @@ CONFIGURATION SETTINGS
|
||||
VARIABLES
|
||||
Colors are parsed using XParsecolor(), there might be a list of them:
|
||||
/usr/X11R6/lib/X11/rgb.txt. Also, http://sedition.com/perl/rgb.html
|
||||
[http://sedition.com/perl/rgb.html]. Color can be also in #rrggbb for-
|
||||
[http://sedition.com/perl/rgb.html]. Color can be also in #rrggbb for‐
|
||||
mat (hex). Note that when displaying bytes, power is 1024 and not 1000
|
||||
so 1M really means 1024*1024 bytes and not 1000*1000.
|
||||
|
||||
@ -430,7 +430,7 @@ VARIABLES
|
||||
|
||||
|
||||
cpubar (cpu number) (height),(width)
|
||||
Bar that shows CPU usage, height is bar's height in pixels. See
|
||||
Bar that shows CPU usage, height is bar’s height in pixels. See
|
||||
$cpu for more info on SMP.
|
||||
|
||||
|
||||
@ -467,8 +467,8 @@ VARIABLES
|
||||
|
||||
|
||||
exec command
|
||||
Executes a shell command and displays the output in conky. warn-
|
||||
ing: this takes a lot more resources than other variables. I'd
|
||||
Executes a shell command and displays the output in conky. warn‐
|
||||
ing: this takes a lot more resources than other variables. I’d
|
||||
recommend coding wanted behaviour in C and posting a patch.
|
||||
|
||||
|
||||
@ -483,7 +483,7 @@ VARIABLES
|
||||
|
||||
|
||||
execi interval command
|
||||
Same as exec but with specific interval. Interval can't be less
|
||||
Same as exec but with specific interval. Interval can’t be less
|
||||
than update_interval in configuration. See also $texeci
|
||||
|
||||
|
||||
@ -540,7 +540,7 @@ VARIABLES
|
||||
|
||||
head logfile lines (interval)
|
||||
Displays first N lines of supplied text text file. If interval
|
||||
is not supplied, Conky assumes 2x Conky's interval. Max of 30
|
||||
is not supplied, Conky assumes 2x Conky’s interval. Max of 30
|
||||
lines can be displayed, or until the text buffer is filled.
|
||||
|
||||
|
||||
@ -585,7 +585,7 @@ VARIABLES
|
||||
|
||||
i8k_left_fan_rpm
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
the left fan's rate of rotation, in revolutions per minute as
|
||||
the left fan’s rate of rotation, in revolutions per minute as
|
||||
listed in /proc/i8k. Beware, some laptops i8k reports these fans
|
||||
in reverse order.
|
||||
|
||||
@ -599,7 +599,7 @@ VARIABLES
|
||||
|
||||
i8k_right_fan_rpm
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
the right fan's rate of rotation, in revolutions per minute as
|
||||
the right fan’s rate of rotation, in revolutions per minute as
|
||||
listed in /proc/i8k. Beware, some laptops i8k reports these fans
|
||||
in reverse order.
|
||||
|
||||
@ -740,7 +740,7 @@ VARIABLES
|
||||
|
||||
|
||||
mpd_bar (height),(width)
|
||||
Bar of mpd's progress
|
||||
Bar of mpd’s progress
|
||||
|
||||
|
||||
mpd_bitrate
|
||||
@ -756,19 +756,19 @@ VARIABLES
|
||||
|
||||
|
||||
mpd_vol
|
||||
MPD's volume
|
||||
MPD’s volume
|
||||
|
||||
|
||||
mpd_elapsed
|
||||
Song's elapsed time
|
||||
Song’s elapsed time
|
||||
|
||||
|
||||
mpd_length
|
||||
Song's length
|
||||
Song’s length
|
||||
|
||||
|
||||
mpd_percent
|
||||
Percent of song's progress
|
||||
Percent of song’s progress
|
||||
|
||||
|
||||
mpd_random
|
||||
@ -861,7 +861,7 @@ VARIABLES
|
||||
|
||||
Examples:
|
||||
|
||||
${tcp_portmon 6881 6999 count} - displays the number of connec-
|
||||
${tcp_portmon 6881 6999 count} - displays the number of connec‐
|
||||
tions in the bittorrent port range
|
||||
|
||||
${tcp_portmon 22 22 rip 0} - displays the remote host ip of the
|
||||
@ -880,7 +880,7 @@ VARIABLES
|
||||
name of the fifteenth connection in the range of all ports
|
||||
|
||||
Note that port monitor variables which share the same port range
|
||||
actually refer to the same monitor, so many references to a sin-
|
||||
actually refer to the same monitor, so many references to a sin‐
|
||||
gle port range for different items and different indexes all use
|
||||
the same monitor internally. In other words, the program avoids
|
||||
creating redundant monitors.
|
||||
@ -888,7 +888,7 @@ VARIABLES
|
||||
texeci interval command
|
||||
Runs a command at an interval inside a thread and displays the
|
||||
output. Same as $execi, except the command is run inside a
|
||||
thread. Use this if you have a slow script to keep Conky updat-
|
||||
thread. Use this if you have a slow script to keep Conky updat‐
|
||||
ing. You should make the interval slightly longer then the time
|
||||
it takes your script to execute. For example, if you have a
|
||||
script that take 5 seconds to execute, you should make the
|
||||
@ -901,18 +901,18 @@ VARIABLES
|
||||
|
||||
tail logfile lines (interval)
|
||||
Displays last N lines of supplied text text file. If interval is
|
||||
not supplied, Conky assumes 2x Conky's interval. Max of 30 lines
|
||||
not supplied, Conky assumes 2x Conky’s interval. Max of 30 lines
|
||||
can be displayed, or until the text buffer is filled.
|
||||
|
||||
|
||||
time (format)
|
||||
Local time, see man strftime to get more information about for-
|
||||
Local time, see man strftime to get more information about for‐
|
||||
mat
|
||||
|
||||
|
||||
totaldown net
|
||||
Total download, overflows at 4 GB on Linux with 32-bit arch and
|
||||
there doesn't seem to be a way to know how many times it has
|
||||
there doesn’t seem to be a way to know how many times it has
|
||||
already done that before conky has started.
|
||||
|
||||
|
||||
@ -975,7 +975,7 @@ VARIABLES
|
||||
|
||||
|
||||
EXAMPLES
|
||||
conky -t '${time %D %H:%m}' -o -u 30
|
||||
conky -t ’${time %D %H:%m}’ -o -u 30
|
||||
Start Conky in its own window with date and clock as text and 30
|
||||
sec update interval.
|
||||
|
||||
@ -986,9 +986,9 @@ FILES
|
||||
~/.conkyrc default configuration file
|
||||
|
||||
BUGS
|
||||
Drawing to root or some other desktop window directly doesn't work with
|
||||
all window managers. Especially doesn't work well with Gnome and it has
|
||||
been reported that it doesn't work with KDE either. Nautilus can be
|
||||
Drawing to root or some other desktop window directly doesn’t work with
|
||||
all window managers. Especially doesn’t work well with Gnome and it has
|
||||
been reported that it doesn’t work with KDE either. Nautilus can be
|
||||
disabled from drawing to desktop with program gconf-editor. Uncheck
|
||||
show_desktop in /apps/nautilus/preferences/. There is -w switch in
|
||||
Conky to set some specific window id. You might find xwininfo -tree
|
||||
@ -998,13 +998,13 @@ BUGS
|
||||
SEE ALSO
|
||||
http://conky.sourceforge.net [http://conky.sourceforge.net]
|
||||
|
||||
http://www.sourceforge.net/projects/conky [http://www.source-
|
||||
http://www.sourceforge.net/projects/conky [http://www.source‐
|
||||
forge.net/projects/conky]
|
||||
|
||||
#conky on irc.freenode.net
|
||||
|
||||
AUTHORS
|
||||
The Conky dev team. What's up now!
|
||||
The Conky dev team. What’s up now!
|
||||
|
||||
|
||||
|
||||
|
18
configure.in
18
configure.in
@ -1,6 +1,6 @@
|
||||
AC_INIT([Conky],[1.3.6_CVS_20060107],[brenden1@users.sourceforge.net])
|
||||
AC_INIT([Conky],[1.3.6_CVS_20060108],[brenden1@users.sourceforge.net])
|
||||
|
||||
AM_INIT_AUTOMAKE(conky, 1.3.6_CVS_20060107)
|
||||
AM_INIT_AUTOMAKE(conky, 1.3.6_CVS_20060108)
|
||||
AM_CONFIG_HEADER(src/config.h)
|
||||
AC_PROG_LIBTOOL
|
||||
|
||||
@ -99,7 +99,7 @@ case x$xmms_support in
|
||||
xnone|xyes|xno)
|
||||
;;
|
||||
xxmms)
|
||||
AC_DEFINE(XMMS, 1, [Define for XMMS support])
|
||||
AC_DEFINE(XMMS_H, 1, [Define for XMMS support])
|
||||
echo "Sorry, xmms isn't supported yet"
|
||||
exit -1
|
||||
;;
|
||||
@ -107,16 +107,16 @@ case x$xmms_support in
|
||||
PKG_CHECK_MODULES([BMP], [bmp], [])
|
||||
CFLAGS="$CFLAGS $BMP_CFLAGS"
|
||||
LIBS="$LIBS $BMP_LIBS"
|
||||
AC_DEFINE(BMP, 1, [Define for BMP support])
|
||||
AC_DEFINE(BMP_H, 1, [Define for BMP support])
|
||||
;;
|
||||
xaudacious)
|
||||
PKG_CHECK_MODULES([AUDACIOUS], [audacious >= 0.1])
|
||||
CFLAGS="$CFLAGS $AUDACIOUS_CFLAGS"
|
||||
LIBS="$LIBS $AUDACIOUS_LIBS"
|
||||
AC_DEFINE(AUDACIOUS, 1, [Define for Audacious support])
|
||||
AC_DEFINE(AUDACIOUS_H, 1, [Define for Audacious support])
|
||||
;;
|
||||
xinfopipe)
|
||||
AC_DEFINE(INFOPIPE, 1, [Define for XMMS/BMP InfoPipe support])
|
||||
AC_DEFINE(INFOPIPE_H, 1, [Define for XMMS/BMP InfoPipe support])
|
||||
;;
|
||||
*)
|
||||
echo "Error: invalid xmms-status specified: $xmms_support"
|
||||
@ -124,9 +124,9 @@ case x$xmms_support in
|
||||
;;
|
||||
esac
|
||||
AM_CONDITIONAL(BUILD_XMMS, test x$xmms_support = xxmms)
|
||||
AM_CONDITIONAL(BUILD_BMP, test x$xmms_support = xbmp)
|
||||
AM_CONDITIONAL(BUILD_AUDACIOUS, test x$xmms_support = xaudacious)
|
||||
AM_CONDITIONAL(BUILD_INFOPIPE, test x$xmms_support = xinfopipe)
|
||||
AM_CONDITIONAL(BUILD_XMMS_BMP, test x$xmms_support = xbmp)
|
||||
AM_CONDITIONAL(BUILD_XMMS_AUDACIOUS, test x$xmms_support = xaudacious)
|
||||
AM_CONDITIONAL(BUILD_XMMS_INFOPIPE, test x$xmms_support = xinfopipe)
|
||||
|
||||
dnl
|
||||
dnl BMPx
|
||||
|
@ -1,17 +1,25 @@
|
||||
bin_PROGRAMS = conky
|
||||
|
||||
if BUILD_AUDACIOUS
|
||||
audacious = audacious.c
|
||||
if BUILD_XMMS
|
||||
xmms = xmms.c xmms.h
|
||||
endif
|
||||
|
||||
if BUILD_XMMS_BMP
|
||||
xmms = xmms.c xmms.h
|
||||
endif
|
||||
|
||||
if BUILD_XMMS_AUDACIOUS
|
||||
xmms = xmms.c xmms.h
|
||||
endif
|
||||
|
||||
if BUILD_XMMS_INFOPIPE
|
||||
xmms = xmms.c xmms.h
|
||||
endif
|
||||
|
||||
if BUILD_BMPX
|
||||
bmpx = bmpx.c
|
||||
endif
|
||||
|
||||
if BUILD_INFOPIPE
|
||||
infopipe = infopipe.c
|
||||
endif
|
||||
|
||||
if BUILD_SETI
|
||||
seti = seti.c
|
||||
endif
|
||||
@ -50,7 +58,7 @@ if BUILD_X11
|
||||
x11 = x11.c
|
||||
endif
|
||||
|
||||
conky_SOURCES = common.c fs.c $(linux) mail.c mixer.c $(seti) $(mpd) $(solaris) $(freebsd) $(netbsd) $(port_monitors) conky.c conky.h $(x11) $(mldonkey) remoted.c remoted.h remotec.c remotec.h $(audacious) $(bmpx) $(infopipe)
|
||||
conky_SOURCES = common.c fs.c $(linux) mail.c mixer.c $(seti) $(mpd) $(solaris) $(freebsd) $(netbsd) $(port_monitors) conky.c conky.h $(x11) $(mldonkey) remoted.c remoted.h remotec.c remotec.h $(xmms) $(bmpx)
|
||||
|
||||
AM_LDFLAGS = $(X11_LIBS) $(XFT_LIBS) $(CAIRO_LIBS) $(PTHREAD_LIBS) -lm
|
||||
|
||||
|
154
src/audacious.c
154
src/audacious.c
@ -1,154 +0,0 @@
|
||||
/* -------------------------------------------------------------------------
|
||||
* audacious.c: conky support for Audacious media player
|
||||
*
|
||||
* http://audacious-media-player.org
|
||||
*
|
||||
* Copyright (C) 2005 Philip Kovacs kovacsp3@comcast.net
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
* --------------------------------------------------------------------------- */
|
||||
|
||||
#include <pthread.h>
|
||||
/*#include <glib.h>*/
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <audacious/beepctrl.h>
|
||||
#include "audacious.h"
|
||||
#include "conky.h"
|
||||
|
||||
/* access to this item array is synchronized with mutexes */
|
||||
static audacious_t g_items;
|
||||
|
||||
/* ----------------------------------------
|
||||
* Conky update function for Audacious data.
|
||||
* ---------------------------------------- */
|
||||
void update_audacious(void)
|
||||
{
|
||||
/*
|
||||
The worker thread is updating ihe g_items array asynchronously to the main
|
||||
conky thread. We merely copy the g_items array into the main thread's info
|
||||
structure when the main thread's update cycle fires. Note that using the
|
||||
mutexes here makes it easier since we won't have to do any sync in conky.c.
|
||||
*/
|
||||
pthread_mutex_lock(&info.audacious.item_mutex);
|
||||
memcpy(&info.audacious.items,g_items,sizeof(g_items));
|
||||
pthread_mutex_unlock(&info.audacious.item_mutex);
|
||||
}
|
||||
|
||||
|
||||
/* --------------------------------------------------
|
||||
* Worker thread function for Audacious data sampling.
|
||||
* -------------------------------------------------- */
|
||||
void *audacious_thread_func(void *pvoid)
|
||||
{
|
||||
int runnable;
|
||||
static audacious_t items;
|
||||
int session,playpos,frames,length;
|
||||
int rate,freq,chans;
|
||||
char *psong;
|
||||
|
||||
pvoid=(void*)pvoid; /* useless cast to avoid unused var warning */
|
||||
session=0;
|
||||
|
||||
/* Grab the runnable signal. Should be non-zero here or we do nothing. */
|
||||
pthread_mutex_lock(&info.audacious.runnable_mutex);
|
||||
runnable=info.audacious.runnable;
|
||||
pthread_mutex_unlock(&info.audacious.runnable_mutex );
|
||||
|
||||
/* Loop until the main thread sets the runnable signal to 0. */
|
||||
while(runnable) {
|
||||
|
||||
for (;;) { /* convenience loop so we can break below */
|
||||
|
||||
if (!xmms_remote_is_running(session)) {
|
||||
memset(&items,0,sizeof(items));
|
||||
strcpy(items[AUDACIOUS_STATUS],"Not running");
|
||||
break;
|
||||
}
|
||||
|
||||
/* Player status */
|
||||
if (xmms_remote_is_paused(session))
|
||||
strcpy(items[AUDACIOUS_STATUS],"Paused");
|
||||
else if (xmms_remote_is_playing(session))
|
||||
strcpy(items[AUDACIOUS_STATUS],"Playing");
|
||||
else
|
||||
strcpy(items[AUDACIOUS_STATUS],"Stopped");
|
||||
|
||||
/* Current song title */
|
||||
playpos = (int) xmms_remote_get_playlist_pos(session);
|
||||
psong = (char *) xmms_remote_get_playlist_title(session, playpos);
|
||||
if (psong)
|
||||
strncpy(items[AUDACIOUS_SONG],psong,sizeof(items[AUDACIOUS_SONG]));
|
||||
|
||||
/* Current song length as MM:SS */
|
||||
frames = xmms_remote_get_playlist_time(session,playpos);
|
||||
length = frames / 1000;
|
||||
snprintf(items[AUDACIOUS_SONG_LENGTH],sizeof(items[AUDACIOUS_SONG_LENGTH]),
|
||||
"%d:%.2d", length / 60, length % 60);
|
||||
|
||||
/* Current song length in seconds */
|
||||
snprintf(items[AUDACIOUS_SONG_LENGTH_SECONDS],sizeof(items[AUDACIOUS_SONG_LENGTH_SECONDS]),
|
||||
"%d", length);
|
||||
|
||||
/* Current song length in frames */
|
||||
snprintf(items[AUDACIOUS_SONG_LENGTH_FRAMES],sizeof(items[AUDACIOUS_SONG_LENGTH_FRAMES]),
|
||||
"%d", frames);
|
||||
|
||||
/* Current song output length as MM:SS */
|
||||
frames = xmms_remote_get_output_time(session);
|
||||
length = frames / 1000;
|
||||
snprintf(items[AUDACIOUS_SONG_OUTPUT_LENGTH],sizeof(items[AUDACIOUS_SONG_OUTPUT_LENGTH]),
|
||||
"%d:%.2d", length / 60, length % 60);
|
||||
|
||||
/* Current song output length in seconds */
|
||||
snprintf(items[AUDACIOUS_SONG_OUTPUT_LENGTH_SECONDS],sizeof(items[AUDACIOUS_SONG_OUTPUT_LENGTH_SECONDS]),
|
||||
"%d", length);
|
||||
|
||||
/* Current song output length in frames */
|
||||
snprintf(items[AUDACIOUS_SONG_OUTPUT_LENGTH_FRAMES],sizeof(items[AUDACIOUS_SONG_OUTPUT_LENGTH_FRAMES]),
|
||||
"%d", frames);
|
||||
|
||||
/* Current song bitrate */
|
||||
xmms_remote_get_info(session, &rate, &freq, &chans);
|
||||
snprintf(items[AUDACIOUS_SONG_BITRATE],sizeof(items[AUDACIOUS_SONG_BITRATE]), "%d", rate);
|
||||
|
||||
/* Current song frequency */
|
||||
snprintf(items[AUDACIOUS_SONG_FREQUENCY],sizeof(items[AUDACIOUS_SONG_FREQUENCY]), "%d", freq);
|
||||
|
||||
/* Current song channels */
|
||||
snprintf(items[AUDACIOUS_SONG_CHANNELS],sizeof(items[AUDACIOUS_SONG_CHANNELS]), "%d", chans);
|
||||
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
/* Deliver the refreshed items array to g_items. */
|
||||
pthread_mutex_lock(&info.audacious.item_mutex);
|
||||
memcpy(&g_items,items,sizeof(items));
|
||||
pthread_mutex_unlock(&info.audacious.item_mutex);
|
||||
|
||||
/* Grab the runnable signal for next loop. */
|
||||
pthread_mutex_lock(&info.audacious.runnable_mutex);
|
||||
runnable=info.audacious.runnable;
|
||||
pthread_mutex_unlock(&info.audacious.runnable_mutex);
|
||||
|
||||
sleep(1);
|
||||
}
|
||||
|
||||
pthread_exit(NULL);
|
||||
}
|
13
src/common.c
13
src/common.c
@ -226,18 +226,15 @@ void update_stuff()
|
||||
if (NEED(INFO_MPD))
|
||||
update_mpd();
|
||||
#endif
|
||||
#ifdef AUDACIOUS
|
||||
if (NEED(INFO_AUDACIOUS))
|
||||
update_audacious();
|
||||
#if defined(XMMS_H) || defined(BMP_H) || defined(AUDACIOUS_H) || defined(INFOPIPE_H)
|
||||
if (NEED(INFO_XMMS))
|
||||
update_xmms();
|
||||
#endif
|
||||
#ifdef BMPX
|
||||
if (NEED(INFO_BMPX))
|
||||
update_bmpx();
|
||||
#endif
|
||||
#ifdef INFOPIPE
|
||||
if (NEED(INFO_INFOPIPE))
|
||||
update_infopipe();
|
||||
update_bmpx();
|
||||
#endif
|
||||
|
||||
if (NEED(INFO_LOADAVG))
|
||||
update_load_average();
|
||||
|
||||
|
271
src/conky.c
271
src/conky.c
@ -892,19 +892,20 @@ enum text_object_type {
|
||||
OBJ_mpd_track,
|
||||
OBJ_mpd_percent,
|
||||
#endif
|
||||
#ifdef AUDACIOUS
|
||||
OBJ_audacious_status,
|
||||
OBJ_audacious_song,
|
||||
OBJ_audacious_song_length,
|
||||
OBJ_audacious_song_length_seconds,
|
||||
OBJ_audacious_song_length_frames,
|
||||
OBJ_audacious_song_output_length,
|
||||
OBJ_audacious_song_output_length_seconds,
|
||||
OBJ_audacious_song_output_length_frames,
|
||||
OBJ_audacious_song_bitrate,
|
||||
OBJ_audacious_song_frequency,
|
||||
OBJ_audacious_song_channels,
|
||||
OBJ_audacious_bar,
|
||||
#if defined(XMMS_H) || defined(BMP_H) || defined(AUDACIOUS_H) || defined(INFOPIPE_H)
|
||||
OBJ_xmms_status,
|
||||
OBJ_xmms_title,
|
||||
OBJ_xmms_length,
|
||||
OBJ_xmms_length_seconds,
|
||||
OBJ_xmms_position,
|
||||
OBJ_xmms_position_seconds,
|
||||
OBJ_xmms_bitrate,
|
||||
OBJ_xmms_frequency,
|
||||
OBJ_xmms_channels,
|
||||
OBJ_xmms_filename,
|
||||
OBJ_xmms_playlist_length,
|
||||
OBJ_xmms_playlist_position,
|
||||
OBJ_xmms_bar,
|
||||
#endif
|
||||
#ifdef BMPX
|
||||
OBJ_bmpx_title,
|
||||
@ -914,23 +915,6 @@ enum text_object_type {
|
||||
OBJ_bmpx_uri,
|
||||
OBJ_bmpx_bitrate,
|
||||
#endif
|
||||
#ifdef INFOPIPE
|
||||
OBJ_infopipe_protocol,
|
||||
OBJ_infopipe_version,
|
||||
OBJ_infopipe_status,
|
||||
OBJ_infopipe_playlist_tunes,
|
||||
OBJ_infopipe_playlist_currtune,
|
||||
OBJ_infopipe_usec_position,
|
||||
OBJ_infopipe_position,
|
||||
OBJ_infopipe_usec_time,
|
||||
OBJ_infopipe_time,
|
||||
OBJ_infopipe_bitrate,
|
||||
OBJ_infopipe_frequency,
|
||||
OBJ_infopipe_channels,
|
||||
OBJ_infopipe_title,
|
||||
OBJ_infopipe_file,
|
||||
OBJ_infopipe_bar,
|
||||
#endif
|
||||
#ifdef TCP_PORT_MONITOR
|
||||
OBJ_tcp_portmon,
|
||||
#endif
|
||||
@ -1825,19 +1809,20 @@ int a = stippled_borders, b = 1;
|
||||
(void) scan_bar(arg, &obj->data.pair.a, &obj->data.pair.b);
|
||||
END
|
||||
#endif
|
||||
#ifdef AUDACIOUS
|
||||
OBJ(audacious_status, INFO_AUDACIOUS) END
|
||||
OBJ(audacious_song, INFO_AUDACIOUS) END
|
||||
OBJ(audacious_song_length, INFO_AUDACIOUS) END
|
||||
OBJ(audacious_song_length_seconds, INFO_AUDACIOUS) END
|
||||
OBJ(audacious_song_length_frames, INFO_AUDACIOUS) END
|
||||
OBJ(audacious_song_output_length, INFO_AUDACIOUS) END
|
||||
OBJ(audacious_song_output_length_seconds, INFO_AUDACIOUS) END
|
||||
OBJ(audacious_song_output_length_frames, INFO_AUDACIOUS) END
|
||||
OBJ(audacious_song_bitrate, INFO_AUDACIOUS) END
|
||||
OBJ(audacious_song_frequency, INFO_AUDACIOUS) END
|
||||
OBJ(audacious_song_channels, INFO_AUDACIOUS) END
|
||||
OBJ(audacious_bar, INFO_AUDACIOUS)
|
||||
#if defined(XMMS_H) || defined(BMP_H) || defined(AUDACIOUS_H) || defined(INFOPIPE_H)
|
||||
OBJ(xmms_status, INFO_XMMS) END
|
||||
OBJ(xmms_title, INFO_XMMS) END
|
||||
OBJ(xmms_length, INFO_XMMS) END
|
||||
OBJ(xmms_length_seconds, INFO_XMMS) END
|
||||
OBJ(xmms_position, INFO_XMMS) END
|
||||
OBJ(xmms_position_seconds, INFO_XMMS) END
|
||||
OBJ(xmms_bitrate, INFO_XMMS) END
|
||||
OBJ(xmms_frequency, INFO_XMMS) END
|
||||
OBJ(xmms_channels, INFO_XMMS) END
|
||||
OBJ(xmms_filename, INFO_XMMS) END
|
||||
OBJ(xmms_playlist_length, INFO_XMMS) END
|
||||
OBJ(xmms_playlist_position, INFO_XMMS) END
|
||||
OBJ(xmms_bar, INFO_XMMS)
|
||||
(void) scan_bar(arg, &obj->a, &obj->b);
|
||||
END
|
||||
#endif
|
||||
@ -1861,25 +1846,6 @@ int a = stippled_borders, b = 1;
|
||||
memset(&(info.bmpx), 0, sizeof(struct bmpx_s));
|
||||
END
|
||||
#endif
|
||||
#ifdef INFOPIPE
|
||||
OBJ(infopipe_protocol, INFO_INFOPIPE) END
|
||||
OBJ(infopipe_version, INFO_INFOPIPE) END
|
||||
OBJ(infopipe_status, INFO_INFOPIPE) END
|
||||
OBJ(infopipe_playlist_tunes, INFO_INFOPIPE) END
|
||||
OBJ(infopipe_playlist_currtune, INFO_INFOPIPE) END
|
||||
OBJ(infopipe_usec_position, INFO_INFOPIPE) END
|
||||
OBJ(infopipe_position, INFO_INFOPIPE) END
|
||||
OBJ(infopipe_usec_time, INFO_INFOPIPE) END
|
||||
OBJ(infopipe_time, INFO_INFOPIPE) END
|
||||
OBJ(infopipe_bitrate, INFO_INFOPIPE) END
|
||||
OBJ(infopipe_frequency, INFO_INFOPIPE) END
|
||||
OBJ(infopipe_channels, INFO_INFOPIPE) END
|
||||
OBJ(infopipe_title, INFO_INFOPIPE) END
|
||||
OBJ(infopipe_file, INFO_INFOPIPE) END
|
||||
OBJ(infopipe_bar, INFO_INFOPIPE)
|
||||
(void) scan_bar(arg, &obj->a, &obj->b);
|
||||
END
|
||||
#endif
|
||||
#ifdef TCP_PORT_MONITOR
|
||||
OBJ(tcp_portmon, INFO_TCP_PORT_MONITOR)
|
||||
int argc, port_begin, port_end, item, connection_index;
|
||||
@ -3135,46 +3101,48 @@ static void generate_text_internal(char *p, int p_max_size, struct text_object *
|
||||
255.0f));
|
||||
}
|
||||
#endif
|
||||
#ifdef AUDACIOUS
|
||||
OBJ(audacious_status) {
|
||||
snprintf(p, p_max_size, "%s", cur->audacious.items[AUDACIOUS_STATUS]);
|
||||
}
|
||||
OBJ(audacious_song) {
|
||||
snprintf(p, p_max_size, "%s", cur->audacious.items[AUDACIOUS_SONG]);
|
||||
#if defined(XMMS_H) || defined(BMP_H) || defined(AUDACIOUS_H) || defined(INFOPIPE_H)
|
||||
OBJ(xmms_status) {
|
||||
snprintf(p, p_max_size, "%s", cur->xmms.items[XMMS_STATUS]);
|
||||
}
|
||||
OBJ(audacious_song_length) {
|
||||
snprintf(p, p_max_size, "%s", cur->audacious.items[AUDACIOUS_SONG_LENGTH]);
|
||||
OBJ(xmms_title) {
|
||||
snprintf(p, p_max_size, "%s", cur->xmms.items[XMMS_TITLE]);
|
||||
}
|
||||
OBJ(audacious_song_length_seconds) {
|
||||
snprintf(p, p_max_size, "%s", cur->audacious.items[AUDACIOUS_SONG_LENGTH_SECONDS]);
|
||||
OBJ(xmms_length) {
|
||||
snprintf(p, p_max_size, "%s", cur->xmms.items[XMMS_LENGTH]);
|
||||
}
|
||||
OBJ(audacious_song_length_frames) {
|
||||
snprintf(p, p_max_size, "%s", cur->audacious.items[AUDACIOUS_SONG_LENGTH_FRAMES]);
|
||||
OBJ(xmms_length_seconds) {
|
||||
snprintf(p, p_max_size, "%s", cur->xmms.items[XMMS_LENGTH_SECONDS]);
|
||||
}
|
||||
OBJ(audacious_song_output_length) {
|
||||
snprintf(p, p_max_size, "%s", cur->audacious.items[AUDACIOUS_SONG_OUTPUT_LENGTH]);
|
||||
OBJ(xmms_position) {
|
||||
snprintf(p, p_max_size, "%s", cur->xmms.items[XMMS_POSITION]);
|
||||
}
|
||||
OBJ(audacious_song_output_length_seconds) {
|
||||
snprintf(p, p_max_size, "%s", cur->audacious.items[AUDACIOUS_SONG_OUTPUT_LENGTH_SECONDS]);
|
||||
OBJ(xmms_position_seconds) {
|
||||
snprintf(p, p_max_size, "%s", cur->xmms.items[XMMS_POSITION_SECONDS]);
|
||||
}
|
||||
OBJ(audacious_song_output_length_frames) {
|
||||
snprintf(p, p_max_size, "%s", cur->audacious.items[AUDACIOUS_SONG_OUTPUT_LENGTH_FRAMES]);
|
||||
OBJ(xmms_bitrate) {
|
||||
snprintf(p, p_max_size, "%s", cur->xmms.items[XMMS_BITRATE]);
|
||||
}
|
||||
OBJ(audacious_song_bitrate) {
|
||||
snprintf(p, p_max_size, "%s", cur->audacious.items[AUDACIOUS_SONG_BITRATE]);
|
||||
OBJ(xmms_frequency) {
|
||||
snprintf(p, p_max_size, "%s", cur->xmms.items[XMMS_FREQUENCY]);
|
||||
}
|
||||
OBJ(audacious_song_frequency) {
|
||||
snprintf(p, p_max_size, "%s", cur->audacious.items[AUDACIOUS_SONG_FREQUENCY]);
|
||||
OBJ(xmms_channels) {
|
||||
snprintf(p, p_max_size, "%s", cur->xmms.items[XMMS_CHANNELS]);
|
||||
}
|
||||
OBJ(audacious_song_channels) {
|
||||
snprintf(p, p_max_size, "%s", cur->audacious.items[AUDACIOUS_STATUS]);
|
||||
OBJ(xmms_filename) {
|
||||
snprintf(p, p_max_size, "%s", cur->xmms.items[XMMS_FILENAME]);
|
||||
}
|
||||
OBJ(audacious_bar) {
|
||||
OBJ(xmms_playlist_length) {
|
||||
snprintf(p, p_max_size, "%s", cur->xmms.items[XMMS_PLAYLIST_LENGTH]);
|
||||
}
|
||||
OBJ(xmms_playlist_position) {
|
||||
snprintf(p, p_max_size, "%s", cur->xmms.items[XMMS_PLAYLIST_POSITION]);
|
||||
}
|
||||
OBJ(xmms_bar) {
|
||||
double progress;
|
||||
progress= atof(cur->audacious.items[AUDACIOUS_SONG_OUTPUT_LENGTH_SECONDS]) /
|
||||
atof(cur->audacious.items[AUDACIOUS_SONG_LENGTH_SECONDS]);
|
||||
progress= atof(cur->xmms.items[XMMS_POSITION_SECONDS]) /
|
||||
atof(cur->xmms.items[XMMS_LENGTH_SECONDS]);
|
||||
new_bar(p,obj->a,obj->b,(int)(progress*255.0f));
|
||||
|
||||
}
|
||||
#endif
|
||||
#ifdef BMPX
|
||||
@ -3196,56 +3164,6 @@ static void generate_text_internal(char *p, int p_max_size, struct text_object *
|
||||
OBJ(bmpx_bitrate) {
|
||||
snprintf(p, p_max_size, "%i", cur->bmpx.bitrate);
|
||||
}
|
||||
#endif
|
||||
#ifdef INFOPIPE
|
||||
OBJ(infopipe_protocol) {
|
||||
snprintf(p, p_max_size, "%s", cur->infopipe.items[INFOPIPE_PROTOCOL]);
|
||||
}
|
||||
OBJ(infopipe_version) {
|
||||
snprintf(p, p_max_size, "%s", cur->infopipe.items[INFOPIPE_VERSION]);
|
||||
}
|
||||
OBJ(infopipe_status) {
|
||||
snprintf(p, p_max_size, "%s", cur->infopipe.items[INFOPIPE_STATUS]);
|
||||
}
|
||||
OBJ(infopipe_playlist_tunes) {
|
||||
snprintf(p, p_max_size, "%s", cur->infopipe.items[INFOPIPE_PLAYLIST_TUNES]);
|
||||
}
|
||||
OBJ(infopipe_playlist_currtune) {
|
||||
snprintf(p, p_max_size, "%s", cur->infopipe.items[INFOPIPE_PLAYLIST_CURRTUNE]);
|
||||
}
|
||||
OBJ(infopipe_usec_position) {
|
||||
snprintf(p, p_max_size, "%s", cur->infopipe.items[INFOPIPE_USEC_POSITION]);
|
||||
}
|
||||
OBJ(infopipe_position) {
|
||||
snprintf(p, p_max_size, "%s", cur->infopipe.items[INFOPIPE_POSITION]);
|
||||
}
|
||||
OBJ(infopipe_usec_time) {
|
||||
snprintf(p, p_max_size, "%s", cur->infopipe.items[INFOPIPE_USEC_TIME]);
|
||||
}
|
||||
OBJ(infopipe_time) {
|
||||
snprintf(p, p_max_size, "%s", cur->infopipe.items[INFOPIPE_TIME]);
|
||||
}
|
||||
OBJ(infopipe_bitrate) {
|
||||
snprintf(p, p_max_size, "%s", cur->infopipe.items[INFOPIPE_BITRATE]);
|
||||
}
|
||||
OBJ(infopipe_frequency) {
|
||||
snprintf(p, p_max_size, "%s", cur->infopipe.items[INFOPIPE_FREQUENCY]);
|
||||
}
|
||||
OBJ(infopipe_channels) {
|
||||
snprintf(p, p_max_size, "%s", cur->infopipe.items[INFOPIPE_CHANNELS]);
|
||||
}
|
||||
OBJ(infopipe_title) {
|
||||
snprintf(p, p_max_size, "%s", cur->infopipe.items[INFOPIPE_TITLE]);
|
||||
}
|
||||
OBJ(infopipe_file) {
|
||||
snprintf(p, p_max_size, "%s", cur->infopipe.items[INFOPIPE_FILE]);
|
||||
}
|
||||
OBJ(infopipe_bar) {
|
||||
double progress;
|
||||
progress= atof(cur->infopipe.items[INFOPIPE_USEC_POSITION]) /
|
||||
atof(cur->infopipe.items[INFOPIPE_USEC_TIME]);
|
||||
new_bar(p,obj->a,obj->b,(int)(progress*255.0f));
|
||||
}
|
||||
#endif
|
||||
OBJ(top) {
|
||||
if (obj->data.top.type == TOP_NAME
|
||||
@ -5567,71 +5485,40 @@ int main(int argc, char **argv)
|
||||
ERR("error setting signal handler: %s", strerror(errno) );
|
||||
}
|
||||
|
||||
#ifdef AUDACIOUS
|
||||
/* joinable thread for audacious activity */
|
||||
pthread_attr_init(&info.audacious.thread_attr);
|
||||
pthread_attr_setdetachstate(&info.audacious.thread_attr, PTHREAD_CREATE_JOINABLE);
|
||||
#if defined(XMMS_H) || defined(BMP_H) || defined(AUDACIOUS_H) || defined(INFOPIPE_H)
|
||||
/* joinable thread for xmms activity */
|
||||
pthread_attr_init(&info.xmms.thread_attr);
|
||||
pthread_attr_setdetachstate(&info.xmms.thread_attr, PTHREAD_CREATE_JOINABLE);
|
||||
/* init mutexex */
|
||||
pthread_mutex_init(&info.audacious.item_mutex, NULL);
|
||||
pthread_mutex_init(&info.audacious.runnable_mutex, NULL);
|
||||
pthread_mutex_init(&info.xmms.item_mutex, NULL);
|
||||
pthread_mutex_init(&info.xmms.runnable_mutex, NULL);
|
||||
/* init runnable condition for worker thread */
|
||||
pthread_mutex_lock(&info.audacious.runnable_mutex);
|
||||
info.audacious.runnable=1;
|
||||
pthread_mutex_unlock(&info.audacious.runnable_mutex);
|
||||
if (pthread_create(&info.audacious.thread, &info.audacious.thread_attr, audacious_thread_func, NULL))
|
||||
pthread_mutex_lock(&info.xmms.runnable_mutex);
|
||||
info.xmms.runnable=1;
|
||||
pthread_mutex_unlock(&info.xmms.runnable_mutex);
|
||||
if (pthread_create(&info.xmms.thread, &info.xmms.thread_attr, xmms_thread_func, NULL))
|
||||
{
|
||||
CRIT_ERR("unable to create audacious thread!");
|
||||
}
|
||||
#endif
|
||||
#ifdef INFOPIPE
|
||||
/* joinable thread for infopipe activity */
|
||||
pthread_attr_init(&info.infopipe.thread_attr);
|
||||
pthread_attr_setdetachstate(&info.infopipe.thread_attr, PTHREAD_CREATE_JOINABLE);
|
||||
/* init mutexex */
|
||||
pthread_mutex_init(&info.infopipe.item_mutex, NULL);
|
||||
pthread_mutex_init(&info.infopipe.runnable_mutex, NULL);
|
||||
/* init runnable condition for worker thread */
|
||||
pthread_mutex_lock(&info.infopipe.runnable_mutex);
|
||||
info.infopipe.runnable=1;
|
||||
pthread_mutex_unlock(&info.infopipe.runnable_mutex);
|
||||
if (pthread_create(&info.infopipe.thread, &info.infopipe.thread_attr, infopipe_thread_func, NULL))
|
||||
{
|
||||
CRIT_ERR("unable to create infopipe thread!");
|
||||
CRIT_ERR("unable to create xmms thread!");
|
||||
}
|
||||
#endif
|
||||
|
||||
main_loop();
|
||||
|
||||
#ifdef AUDACIOUS
|
||||
/* signal audacious worker thread to terminate */
|
||||
pthread_mutex_lock(&info.audacious.runnable_mutex);
|
||||
info.audacious.runnable=0;
|
||||
pthread_mutex_unlock(&info.audacious.runnable_mutex);
|
||||
#if defined(XMMS_H) || defined(BMP_H) || defined(AUDACIOUS_H) || defined(INFOPIPE_H)
|
||||
/* signal xmms worker thread to terminate */
|
||||
pthread_mutex_lock(&info.xmms.runnable_mutex);
|
||||
info.xmms.runnable=0;
|
||||
pthread_mutex_unlock(&info.xmms.runnable_mutex);
|
||||
/* destroy thread attribute and wait for thread */
|
||||
pthread_attr_destroy(&info.audacious.thread_attr);
|
||||
if (pthread_join(info.audacious.thread, NULL))
|
||||
pthread_attr_destroy(&info.xmms.thread_attr);
|
||||
if (pthread_join(info.xmms.thread, NULL))
|
||||
{
|
||||
ERR("error joining audacious thread");
|
||||
ERR("error joining xmms thread");
|
||||
}
|
||||
/* destroy mutexes */
|
||||
pthread_mutex_destroy(&info.audacious.item_mutex);
|
||||
pthread_mutex_destroy(&info.audacious.runnable_mutex);
|
||||
pthread_mutex_destroy(&info.xmms.item_mutex);
|
||||
pthread_mutex_destroy(&info.xmms.runnable_mutex);
|
||||
#endif
|
||||
#ifdef INFOPIPE
|
||||
/* signal infopipe worker thread to terminate */
|
||||
pthread_mutex_lock(&info.infopipe.runnable_mutex);
|
||||
info.infopipe.runnable=0;
|
||||
pthread_mutex_unlock(&info.infopipe.runnable_mutex);
|
||||
/* destroy thread attribute and wait for thread */
|
||||
pthread_attr_destroy(&info.infopipe.thread_attr);
|
||||
if (pthread_join(info.infopipe.thread, NULL))
|
||||
{
|
||||
ERR("error joining infopipe thread");
|
||||
}
|
||||
/* destroy mutexes */
|
||||
pthread_mutex_destroy(&info.infopipe.item_mutex);
|
||||
pthread_mutex_destroy(&info.infopipe.runnable_mutex);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
44
src/conky.h
44
src/conky.h
@ -9,7 +9,7 @@
|
||||
#ifndef _conky_h_
|
||||
#define _conky_h_
|
||||
|
||||
#if defined(AUDACIOUS) || defined(INFOPIPE)
|
||||
#if defined(XMMS_H) || defined(BMP_H) || defined(AUDACIOUS_H) || defined(INFOPIPE_H)
|
||||
#include <pthread.h>
|
||||
#endif
|
||||
#if defined(HAS_MCHECK_H)
|
||||
@ -127,12 +127,12 @@ struct mpd_s {
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef AUDACIOUS
|
||||
#include "audacious.h"
|
||||
struct audacious_s {
|
||||
audacious_t items; /* e.g. items[AUDACIOUS_STATUS] yields char[] */
|
||||
int runnable; /* used to signal infopipe thread to stop */
|
||||
pthread_t thread; /* worker thread for infopipe updating */
|
||||
#if defined(XMMS_H) || defined(BMP_H) || defined(AUDACIOUS_H) || defined(INFOPIPE_H)
|
||||
#include "xmms.h"
|
||||
struct xmms_s {
|
||||
xmms_t items; /* e.g. items[XMMS_STATUS] yields char[] */
|
||||
int runnable; /* used to signal worker thread to stop */
|
||||
pthread_t thread; /* worker thread for xmms updating */
|
||||
pthread_attr_t thread_attr; /* thread attributes */
|
||||
pthread_mutex_t item_mutex; /* mutex for item array */
|
||||
pthread_mutex_t runnable_mutex; /* mutex for runnable flag */
|
||||
@ -151,18 +151,6 @@ struct bmpx_s {
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef INFOPIPE
|
||||
#include "infopipe.h"
|
||||
struct infopipe_s {
|
||||
infopipe_t items; /* e.g. items[INFOPIPE_STATUS] yields char[] */
|
||||
int runnable; /* used to signal infopipe thread to stop */
|
||||
pthread_t thread; /* worker thread for infopipe updating */
|
||||
pthread_attr_t thread_attr; /* thread attributes */
|
||||
pthread_mutex_t item_mutex; /* mutex for item array */
|
||||
pthread_mutex_t runnable_mutex; /* mutex for runnable flag */
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef TCP_PORT_MONITOR
|
||||
#include "libtcp-portmon.h"
|
||||
#define MIN_PORT_MONITORS_DEFAULT 16
|
||||
@ -200,14 +188,11 @@ enum {
|
||||
#ifdef TCP_PORT_MONITOR
|
||||
INFO_TCP_PORT_MONITOR = 22,
|
||||
#endif
|
||||
#if defined(XMMS_H) || defined(BMP_H) || defined(AUDACIOUS_H) || defined(INFOPIPE_H)
|
||||
INFO_XMMS = 23,
|
||||
#endif
|
||||
#ifdef BMPX
|
||||
INFO_BMPX = 23,
|
||||
#endif
|
||||
#ifdef INFOPIPE
|
||||
INFO_INFOPIPE = 24,
|
||||
#endif
|
||||
#ifdef AUDACIOUS
|
||||
INFO_AUDACIOUS = 25,
|
||||
INFO_BMPX = 24,
|
||||
#endif
|
||||
};
|
||||
|
||||
@ -252,14 +237,11 @@ struct information {
|
||||
struct mpd_s mpd;
|
||||
mpd_Connection *conn;
|
||||
#endif
|
||||
#ifdef AUDACIOUS
|
||||
struct audacious_s audacious;
|
||||
#if defined(XMMS_H) || defined(BMP_H) || defined(AUDACIOUS_H) || defined(INFOPIPE_H)
|
||||
struct xmms_s xmms;
|
||||
#endif
|
||||
#ifdef BMPX
|
||||
struct bmpx_s bmpx;
|
||||
#endif
|
||||
#ifdef INFOPIPE
|
||||
struct infopipe_s infopipe;
|
||||
#endif
|
||||
struct process *cpu[10];
|
||||
struct process *memu[10];
|
||||
|
264
src/xmms.c
Normal file
264
src/xmms.c
Normal file
@ -0,0 +1,264 @@
|
||||
/* -------------------------------------------------------------------------
|
||||
* xmms.c: conky support for XMMS-related projects
|
||||
*
|
||||
* Copyright (C) 2005 Philip Kovacs kovacsp3@comcast.net
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
* --------------------------------------------------------------------------- */
|
||||
|
||||
#include <pthread.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#if defined(XMMS_H)
|
||||
#include <xmms/xmmsctrl.h>
|
||||
#elif defined(BMP_H)
|
||||
#include <bmp/beepctrl.h>
|
||||
#elif defined(AUDACIOUS_H)
|
||||
#include <audacious/beepctrl.h>
|
||||
#elif defined(INFOPIPE_H)
|
||||
#include <sys/select.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/types.h>
|
||||
#include <fcntl.h>
|
||||
#define INFOPIPE_NAMED_PIPE "/tmp/xmms-info"
|
||||
#endif
|
||||
|
||||
#include "xmms.h"
|
||||
#include "conky.h"
|
||||
|
||||
|
||||
/* access to this item array is synchronized with mutexes */
|
||||
static xmms_t g_items;
|
||||
|
||||
/* ------------------------------------
|
||||
* Conky update function for XMMS data.
|
||||
* ------------------------------------ */
|
||||
void update_xmms(void)
|
||||
{
|
||||
/*
|
||||
The worker thread is updating the g_items array asynchronously to the main
|
||||
conky thread. We merely copy the g_items array into the main thread's info
|
||||
structure when the main thread's update cycle fires. Note that using the
|
||||
mutexes here makes it easier since we won't have to do any sync in conky.c.
|
||||
*/
|
||||
pthread_mutex_lock(&info.xmms.item_mutex);
|
||||
memcpy(&info.xmms.items,g_items,sizeof(g_items));
|
||||
pthread_mutex_unlock(&info.xmms.item_mutex);
|
||||
}
|
||||
|
||||
|
||||
#if defined(XMMS_H) || defined(BMP_H) || defined(AUDACIOUS_H)
|
||||
/* ------------------------------------------------------------
|
||||
* Worker thread function for XMMS/BMP/Audacious data sampling.
|
||||
* ------------------------------------------------------------ */
|
||||
void *xmms_thread_func(void *pvoid)
|
||||
{
|
||||
int runnable;
|
||||
static xmms_t items;
|
||||
int session,playpos,frames,length;
|
||||
int rate,freq,chans;
|
||||
char *psong,*pfilename;
|
||||
|
||||
pvoid=(void*)pvoid; /* useless cast to avoid unused var warning */
|
||||
session=0;
|
||||
|
||||
/* Grab the runnable signal. Should be non-zero here or we do nothing. */
|
||||
pthread_mutex_lock(&info.xmms.runnable_mutex);
|
||||
runnable=info.xmms.runnable;
|
||||
pthread_mutex_unlock(&info.xmms.runnable_mutex );
|
||||
|
||||
/* Loop until the main thread sets the runnable signal to 0. */
|
||||
while(runnable) {
|
||||
|
||||
for (;;) { /* convenience loop so we can break below */
|
||||
|
||||
if (!xmms_remote_is_running(session)) {
|
||||
memset(&items,0,sizeof(items));
|
||||
strcpy(items[XMMS_STATUS],"Not running");
|
||||
break;
|
||||
}
|
||||
|
||||
/* Player status */
|
||||
if (xmms_remote_is_paused(session))
|
||||
strcpy(items[XMMS_STATUS],"Paused");
|
||||
else if (xmms_remote_is_playing(session))
|
||||
strcpy(items[XMMS_STATUS],"Playing");
|
||||
else
|
||||
strcpy(items[XMMS_STATUS],"Stopped");
|
||||
|
||||
/* Current song title */
|
||||
playpos = (int) xmms_remote_get_playlist_pos(session);
|
||||
psong = (char *) xmms_remote_get_playlist_title(session, playpos);
|
||||
if (psong)
|
||||
strncpy(items[XMMS_TITLE],psong,sizeof(items[XMMS_TITLE]));
|
||||
|
||||
/* Current song length as MM:SS */
|
||||
frames = xmms_remote_get_playlist_time(session,playpos);
|
||||
length = frames / 1000;
|
||||
snprintf(items[XMMS_LENGTH],sizeof(items[XMMS_LENGTH]),
|
||||
"%d:%.2d", length / 60, length % 60);
|
||||
|
||||
/* Current song length in seconds */
|
||||
snprintf(items[XMMS_LENGTH_SECONDS],sizeof(items[XMMS_LENGTH_SECONDS]),
|
||||
"%d", length);
|
||||
|
||||
/* Current song position as MM:SS */
|
||||
frames = xmms_remote_get_output_time(session);
|
||||
length = frames / 1000;
|
||||
snprintf(items[XMMS_POSITION],sizeof(items[XMMS_POSITION]),
|
||||
"%d:%.2d", length / 60, length % 60);
|
||||
|
||||
/* Current song position in seconds */
|
||||
snprintf(items[XMMS_POSITION_SECONDS],sizeof(items[XMMS_POSITION_SECONDS]),
|
||||
"%d", length);
|
||||
|
||||
/* Current song bitrate */
|
||||
xmms_remote_get_info(session, &rate, &freq, &chans);
|
||||
snprintf(items[XMMS_BITRATE],sizeof(items[XMMS_BITRATE]), "%d", rate);
|
||||
|
||||
/* Current song frequency */
|
||||
snprintf(items[XMMS_FREQUENCY],sizeof(items[XMMS_FREQUENCY]), "%d", freq);
|
||||
|
||||
/* Current song channels */
|
||||
snprintf(items[XMMS_CHANNELS],sizeof(items[XMMS_CHANNELS]), "%d", chans);
|
||||
|
||||
/* Current song filename */
|
||||
pfilename = xmms_remote_get_playlist_file(session,playpos);
|
||||
strncpy(items[XMMS_FILENAME],pfilename,sizeof(items[XMMS_FILENAME]));
|
||||
|
||||
/* Length of the Playlist (number of songs) */
|
||||
length = xmms_remote_get_playlist_length(session);
|
||||
snprintf(items[XMMS_PLAYLIST_LENGTH],sizeof(items[XMMS_PLAYLIST_LENGTH]), "%d", length);
|
||||
|
||||
/* Playlist position (index of song) */
|
||||
snprintf(items[XMMS_PLAYLIST_POSITION],sizeof(items[XMMS_PLAYLIST_POSITION]), "%d", playpos+1);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
/* Deliver the refreshed items array to g_items. */
|
||||
pthread_mutex_lock(&info.xmms.item_mutex);
|
||||
memcpy(&g_items,items,sizeof(items));
|
||||
pthread_mutex_unlock(&info.xmms.item_mutex);
|
||||
|
||||
/* Grab the runnable signal for next loop. */
|
||||
pthread_mutex_lock(&info.xmms.runnable_mutex);
|
||||
runnable=info.xmms.runnable;
|
||||
pthread_mutex_unlock(&info.xmms.runnable_mutex);
|
||||
|
||||
sleep(1);
|
||||
}
|
||||
|
||||
pthread_exit(NULL);
|
||||
}
|
||||
|
||||
#elif defined(INFOPIPE_H)
|
||||
/* --------------------------------------------------
|
||||
* Worker thread function for InfoPipe data sampling.
|
||||
* -------------------------------------------------- */
|
||||
void *xmms_thread_func(void *pvoid)
|
||||
{
|
||||
int i,rc,fd,runnable;
|
||||
fd_set readset;
|
||||
struct timeval tm;
|
||||
static char buf[2048]; /* should equal or exceed sizeof(infopipe_t) */
|
||||
static xmms_t items;
|
||||
char *pbuf,c;
|
||||
|
||||
pvoid=(void*)pvoid; /* useless cast to avoid unused var warning */
|
||||
|
||||
/* Grab the runnable signal. Should be non-zero here or we do nothing. */
|
||||
pthread_mutex_lock(&info.infopipe.runnable_mutex);
|
||||
runnable=info.infopipe.runnable;
|
||||
pthread_mutex_unlock(&info.infopipe.runnable_mutex );
|
||||
|
||||
/* Loop until the main thread sets the runnable signal to 0. */
|
||||
while(runnable) {
|
||||
|
||||
for (;;) { /* convenience loop so we can break below */
|
||||
|
||||
memset(buf,0,sizeof(buf));
|
||||
|
||||
if ((fd=open(INFOPIPE_NAMED_PIPE, O_RDONLY | O_NONBLOCK)) < 0) {
|
||||
/* InfoPipe is not running */
|
||||
memset(items,0,sizeof(items));
|
||||
strcpy(items[INFOPIPE_STATUS],"Not running");
|
||||
break;
|
||||
}
|
||||
|
||||
FD_ZERO(&readset);
|
||||
FD_SET(fd,&readset);
|
||||
|
||||
/* On Linux, select() reduces the timer by the amount of time not slept,
|
||||
* so we must reset the timer with each loop. */
|
||||
tm.tv_sec=1;
|
||||
tm.tv_usec=0;
|
||||
rc=select(fd+1,&readset,NULL,NULL,&tm);
|
||||
|
||||
if (rc == -1) {
|
||||
/* -- debug --
|
||||
perror("infopipe select()");
|
||||
*/
|
||||
}
|
||||
else if (rc && FD_ISSET(fd,&readset)) { /* ready to read */
|
||||
|
||||
if (read(fd,buf,sizeof(buf)) > 0) { /* buf has data */
|
||||
|
||||
pbuf=buf;
|
||||
for (i=0;i<14;i++) {
|
||||
/* 14 lines of key: value pairs presented in a known order */
|
||||
if ( sscanf(pbuf,"%*[^:]: %[^\n]",items[i]) == EOF )
|
||||
break;
|
||||
while((c = *pbuf++) && (c != '\n'));
|
||||
}
|
||||
|
||||
/* -- debug --
|
||||
for(i=0;i<14;i++)
|
||||
printf("%s\n",items[i]);
|
||||
*/
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* -- debug --
|
||||
printf("no infopipe data\n");
|
||||
*/
|
||||
}
|
||||
|
||||
close(fd);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
/* Deliver the refreshed items array to g_items. */
|
||||
pthread_mutex_lock(&info.infopipe.item_mutex);
|
||||
memcpy(&g_items,items,sizeof(items));
|
||||
pthread_mutex_unlock(&info.infopipe.item_mutex);
|
||||
|
||||
/* Grab the runnable signal for next loop. */
|
||||
pthread_mutex_lock(&info.infopipe.runnable_mutex);
|
||||
runnable=info.infopipe.runnable;
|
||||
pthread_mutex_unlock(&info.infopipe.runnable_mutex);
|
||||
|
||||
sleep(1);
|
||||
}
|
||||
|
||||
pthread_exit(NULL);
|
||||
}
|
||||
|
||||
#endif
|
@ -1,7 +1,5 @@
|
||||
/* -------------------------------------------------------------------------
|
||||
* audacious.h: conky support for Audacious audio player
|
||||
*
|
||||
* http://audacious-media-player.org
|
||||
* xmms.h: conky support for XMMS-related projects
|
||||
*
|
||||
* Copyright (C) 2005 Philip Kovacs kovacsp3@comcast.net
|
||||
*
|
||||
@ -22,31 +20,31 @@
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
* --------------------------------------------------------------------------- */
|
||||
|
||||
#ifndef AUDACIOUS_H
|
||||
#define AUDACIOUS_H
|
||||
#ifndef XMMS_H
|
||||
#define XMMS_H
|
||||
|
||||
/* 11 keys comprise the audacious information. */
|
||||
enum _audacious_keys {
|
||||
AUDACIOUS_STATUS,
|
||||
AUDACIOUS_SONG,
|
||||
AUDACIOUS_SONG_LENGTH,
|
||||
AUDACIOUS_SONG_LENGTH_SECONDS,
|
||||
AUDACIOUS_SONG_LENGTH_FRAMES,
|
||||
AUDACIOUS_SONG_OUTPUT_LENGTH,
|
||||
AUDACIOUS_SONG_OUTPUT_LENGTH_SECONDS,
|
||||
AUDACIOUS_SONG_OUTPUT_LENGTH_FRAMES,
|
||||
AUDACIOUS_SONG_BITRATE,
|
||||
AUDACIOUS_SONG_FREQUENCY,
|
||||
AUDACIOUS_SONG_CHANNELS
|
||||
enum _xmms_items {
|
||||
XMMS_STATUS=0,
|
||||
XMMS_TITLE,
|
||||
XMMS_LENGTH,
|
||||
XMMS_LENGTH_SECONDS,
|
||||
XMMS_POSITION,
|
||||
XMMS_POSITION_SECONDS,
|
||||
XMMS_BITRATE,
|
||||
XMMS_FREQUENCY,
|
||||
XMMS_CHANNELS,
|
||||
XMMS_FILENAME,
|
||||
XMMS_PLAYLIST_LENGTH,
|
||||
XMMS_PLAYLIST_POSITION,
|
||||
};
|
||||
|
||||
/* 11 slots for the audacious values */
|
||||
typedef char audacious_t[11][128];
|
||||
|
||||
/* 12 slots for the xmms values */
|
||||
typedef char xmms_t[12][128];
|
||||
|
||||
/* Service routine for the conky main thread */
|
||||
void update_audacious(void);
|
||||
void update_xmms(void);
|
||||
|
||||
/* Thread function */
|
||||
void *audacious_thread_func(void *);
|
||||
void *xmms_thread_func(void *);
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user