mirror of
https://github.com/Llewellynvdm/conky.git
synced 2024-12-23 19:39:06 +00:00
Conky 1.5.0 -- client/server prototype
git-svn-id: https://conky.svn.sourceforge.net/svnroot/conky/trunk/conky1@818 7f574dfc-610e-0410-a909-a81674777703
This commit is contained in:
parent
c42fe7b6ab
commit
1c35f432e5
25
ChangeLog
25
ChangeLog
@ -1,5 +1,30 @@
|
||||
# $Id$
|
||||
|
||||
2006-12-22
|
||||
* client/server infrastructure and prototype for linux only (so far):
|
||||
- requires libdexter (http://sourceforge.net/projects/libdexter)
|
||||
and the dxt-sysinfo plugin (svn only at the moment).
|
||||
* new config items:
|
||||
- dexter_client yes/no
|
||||
- dexter_server yes/no
|
||||
- dexter_config /path/to/libdexter/config (default: $HOME/.dexterrc)
|
||||
- own_window_class <WM Class Name> (default: Conky)
|
||||
- replaces wm_class_name
|
||||
- own_window_title <Window Title> (default: <hostname> - conky)
|
||||
* removed config items:
|
||||
- wm_class_name (use own_window_class, same function)
|
||||
* configure changes:
|
||||
--disable-network (default=yes) with auto-detection for libdexter.
|
||||
- remove useless --enable-proc-uptime (PROC_UPTIME never referenced).
|
||||
HAVE_SYSINFO and others determine if /proc/uptime is used.
|
||||
- silently disable xft, double-buffer and xdamage if no x11.
|
||||
- change enable/disable labels to reflect defaults accurately.
|
||||
- simplified compile-based checks for sysinfo/getloadavg and by moving
|
||||
them into AC_CHECK_FUNCS.
|
||||
* allow decorated, own_window=yes windows to be given input focus by WM:
|
||||
- do not pass button clicks through to desktop in this scenario as conky
|
||||
immediately loses focus.
|
||||
|
||||
2006-12-13
|
||||
* Clarify LGPL license on timed_thread modules.
|
||||
* Update NEWS files.
|
||||
|
278
README
278
README
@ -43,10 +43,10 @@ COMPILING
|
||||
|
||||
./configure --prefix=/usr --mandir=/usr/share/man --in-
|
||||
fodir=/usr/share/info --datadir=/usr/share --sysconfdir=/etc --local-
|
||||
statedir=/var/lib --enable-xft --enable-own-window --enable-proc-uptime
|
||||
--enable-audacious --enable-bmpx --enable-hddtemp --enable-mpd --en-
|
||||
able-xmms2 --enable-imlib2 --enable-portmon --enable-debug --en-
|
||||
able-double-buffer --enable-xdamage --enable-x11
|
||||
statedir=/var/lib --disable-own-window --enable-audacious --enable-bmpx
|
||||
--disable-hddtemp --disable-mpd --enable-xmms2 --disable-portmon --dis-
|
||||
able-network --enable-debug --disable-x11 --disable-double-buffer
|
||||
--disable-xdamage --disable-xft
|
||||
|
||||
make
|
||||
|
||||
@ -176,6 +176,20 @@ CONFIGURATION SETTINGS
|
||||
Default shading color and border's shading color
|
||||
|
||||
|
||||
dexter_client
|
||||
Act as client and connect to libdexter server for remote moni-
|
||||
toring?
|
||||
|
||||
|
||||
dexter_config
|
||||
Full path to libdexter configuration file (default search order:
|
||||
$HOME/.dexterrc; /etc/libdexter/dexter.conf)
|
||||
|
||||
|
||||
dexter_server
|
||||
Act as server for libdexter services?
|
||||
|
||||
|
||||
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
|
||||
@ -271,18 +285,8 @@ CONFIGURATION SETTINGS
|
||||
Boolean, create own window to draw?
|
||||
|
||||
|
||||
own_window_transparent
|
||||
Boolean, set pseudo-transparency?
|
||||
|
||||
|
||||
own_window_type
|
||||
if own_window is yes, you may specify type normal, desktop or
|
||||
override (default: normal). Desktop windows are special windows
|
||||
that have no window decorations; are always visible on your
|
||||
desktop; do not appear in your pager or taskbar; and are sticky
|
||||
across all workspaces. Override windows are not under the con-
|
||||
trol of the window manager. Hints are ignored. This type of win-
|
||||
dow can be useful for certain situations.
|
||||
own_window_class
|
||||
Manually set the WM_CLASS name. Defaults to "Conky".
|
||||
|
||||
|
||||
own_window_colour colour
|
||||
@ -299,6 +303,24 @@ CONFIGURATION SETTINGS
|
||||
no meaning and are ignored.
|
||||
|
||||
|
||||
own_window_title
|
||||
Manually set the window name. Defaults to "<hostname> - conky".
|
||||
|
||||
|
||||
own_window_transparent
|
||||
Boolean, set pseudo-transparency?
|
||||
|
||||
|
||||
own_window_type
|
||||
if own_window is yes, you may specify type normal, desktop or
|
||||
override (default: normal). Desktop windows are special windows
|
||||
that have no window decorations; are always visible on your
|
||||
desktop; do not appear in your pager or taskbar; and are sticky
|
||||
across all workspaces. Override windows are not under the con-
|
||||
trol of the window manager. Hints are ignored. This type of win-
|
||||
dow can be useful for certain situations.
|
||||
|
||||
|
||||
out_to_console
|
||||
Print text to stdout.
|
||||
|
||||
@ -307,9 +329,9 @@ CONFIGURATION SETTINGS
|
||||
Pad percentages to this many decimals (0 = no padding)
|
||||
|
||||
|
||||
pop3 Default global POP3 server. Arguments are: "host user pass [-i
|
||||
interval] [-p port] [-e command]". Default port is 110, default
|
||||
interval is 5 minutes. If the password is supplied as '*', you
|
||||
pop3 Default global POP3 server. Arguments are: "host user pass [-i
|
||||
interval] [-p port] [-e command]". Default port is 110, default
|
||||
interval is 5 minutes. If the password is supplied as '*', you
|
||||
will be prompted to enter the password when Conky starts.
|
||||
|
||||
|
||||
@ -318,7 +340,7 @@ CONFIGURATION SETTINGS
|
||||
|
||||
|
||||
total_run_times
|
||||
Total number of times for Conky to update before quitting. Zero
|
||||
Total number of times for Conky to update before quitting. Zero
|
||||
makes Conky run forever
|
||||
|
||||
|
||||
@ -340,10 +362,6 @@ CONFIGURATION SETTINGS
|
||||
Use Xft (anti-aliased font and stuff)
|
||||
|
||||
|
||||
wm_class_name
|
||||
Manually set the WM_CLASS name. Defaults to "conky".
|
||||
|
||||
|
||||
xftalpha
|
||||
Alpha of Xft font. Must be a value at or between 1 and 0.
|
||||
|
||||
@ -356,10 +374,10 @@ 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>.
|
||||
Color can be also in #rrggbb format (hex). Note that when displaying
|
||||
bytes, power is 1024 and not 1000 so 1M really means 1024*1024 bytes
|
||||
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>.
|
||||
Color can be also in #rrggbb format (hex). Note that when displaying
|
||||
bytes, power is 1024 and not 1000 so 1M really means 1024*1024 bytes
|
||||
and not 1000*1000.
|
||||
|
||||
addr interface
|
||||
@ -407,7 +425,7 @@ VARIABLES
|
||||
|
||||
|
||||
apm_battery_time
|
||||
Display remaining APM battery life in hh:mm:ss or "unknown" if
|
||||
Display remaining APM battery life in hh:mm:ss or "unknown" if
|
||||
AC adapterstatus is on-line or charging (FreeBSD only)
|
||||
|
||||
|
||||
@ -464,13 +482,13 @@ VARIABLES
|
||||
|
||||
|
||||
battery (num)
|
||||
Battery status and remaining percentage capacity of ACPI or APM
|
||||
battery. ACPI battery number can be given as argument (default
|
||||
Battery status and remaining percentage capacity of ACPI or APM
|
||||
battery. ACPI battery number can be given as argument (default
|
||||
is BAT0).
|
||||
|
||||
|
||||
battery_time (num)
|
||||
Battery charge/discharge time remaining of ACPI battery. ACPI
|
||||
Battery charge/discharge time remaining of ACPI battery. ACPI
|
||||
battery number can be given as argument (default is BAT0).
|
||||
|
||||
|
||||
@ -510,28 +528,28 @@ VARIABLES
|
||||
|
||||
|
||||
cpu (cpuN)
|
||||
CPU usage in percents. For SMP machines, the CPU number can be
|
||||
provided as an argument. ${cpu 0} is the total usage, and ${cpu
|
||||
CPU usage in percents. For SMP machines, the CPU number can be
|
||||
provided as an argument. ${cpu 0} is the total usage, and ${cpu
|
||||
X} (X >= 1) are individual CPUs.
|
||||
|
||||
|
||||
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.
|
||||
|
||||
|
||||
cpugraph (cpu number) (height),(width) (gradient colour 1) (gradient
|
||||
cpugraph (cpu number) (height),(width) (gradient colour 1) (gradient
|
||||
colour 2)
|
||||
CPU usage graph, with optional colours in hex, minus the #. See
|
||||
CPU usage graph, with optional colours in hex, minus the #. See
|
||||
$cpu for more info on SMP.
|
||||
|
||||
|
||||
diskio Displays current disk IO.
|
||||
|
||||
|
||||
diskiograph (height),(width) (gradient colour 1) (gradient colour 2)
|
||||
diskiograph (height),(width) (gradient colour 1) (gradient colour 2)
|
||||
(scale)
|
||||
Disk IO graph, colours defined in hex, minus the #. If scale is
|
||||
Disk IO graph, colours defined in hex, minus the #. If scale is
|
||||
non-zero, it becomes the scale for the graph.
|
||||
|
||||
|
||||
@ -545,7 +563,7 @@ VARIABLES
|
||||
|
||||
downspeedgraph net (height),(width) (gradient colour 1) (gradient
|
||||
colour 2) (scale)
|
||||
Download speed graph, colours defined in hex, minus the #. If
|
||||
Download speed graph, colours defined in hex, minus the #. If
|
||||
scale is non-zero, it becomes the scale for the graph.
|
||||
|
||||
|
||||
@ -566,12 +584,12 @@ 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
|
||||
ing: this takes a lot more resources than other variables. I'd
|
||||
recommend coding wanted behaviour in C and posting a patch.
|
||||
|
||||
|
||||
execbar command
|
||||
Same as exec, except if the first value return is a value be-
|
||||
Same as exec, except if the first value return is a value be-
|
||||
tween 0-100, it will use that number for a bar. The size for the
|
||||
bar is currently fixed, but that may change in the future.
|
||||
|
||||
@ -581,7 +599,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
|
||||
|
||||
|
||||
@ -594,36 +612,36 @@ VARIABLES
|
||||
|
||||
|
||||
font (font)
|
||||
Specify a different font. This new font will apply to the cur-
|
||||
rent line and everything following. You can use a $font with no
|
||||
arguments to change back to the default font (much like with
|
||||
Specify a different font. This new font will apply to the cur-
|
||||
rent line and everything following. You can use a $font with no
|
||||
arguments to change back to the default font (much like with
|
||||
$color)
|
||||
|
||||
|
||||
freq (n)
|
||||
Returns CPU #n's frequency in MHz. CPUs are counted from 1. If
|
||||
Returns CPU #n's frequency in MHz. CPUs are counted from 1. If
|
||||
omitted, the parameter defaults to 1.
|
||||
|
||||
|
||||
freq_g (n)
|
||||
Returns CPU #n's frequency in GHz. CPUs are counted from 1. If
|
||||
Returns CPU #n's frequency in GHz. CPUs are counted from 1. If
|
||||
omitted, the parameter defaults to 1.
|
||||
|
||||
|
||||
freq_dyn
|
||||
Returns CPU frequency in MHz, but is calculated by counting to
|
||||
clock cycles to complete an instruction. Only available for
|
||||
Returns CPU frequency in MHz, but is calculated by counting to
|
||||
clock cycles to complete an instruction. Only available for
|
||||
x86/amd64.
|
||||
|
||||
|
||||
freq_dyn_g
|
||||
Returns CPU frequency in GHz, but is calculated by counting to
|
||||
clock cycles to complete an instruction. Only available for
|
||||
Returns CPU frequency in GHz, but is calculated by counting to
|
||||
clock cycles to complete an instruction. Only available for
|
||||
x86/amd64.
|
||||
|
||||
|
||||
fs_bar (height),(width) fs
|
||||
Bar that shows how much space is used on a file system. height
|
||||
Bar that shows how much space is used on a file system. height
|
||||
is the height in pixels. fs is any file on that file system.
|
||||
|
||||
|
||||
@ -647,14 +665,14 @@ VARIABLES
|
||||
|
||||
|
||||
hddtemp dev, (host,(port))
|
||||
Displays temperature of a selected hard disk drive as reported
|
||||
by the hddtemp daemon running on host:port. Default host is
|
||||
Displays temperature of a selected hard disk drive as reported
|
||||
by the hddtemp daemon running on host:port. Default host is
|
||||
127.0.0.1, default port is 7634.
|
||||
|
||||
|
||||
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
|
||||
Displays first N lines of supplied text text file. If interval
|
||||
is not supplied, Conky assumes 2x Conky's interval. Max of 30
|
||||
lines can be displayed, or until the text buffer is filled.
|
||||
|
||||
|
||||
@ -663,7 +681,7 @@ VARIABLES
|
||||
|
||||
|
||||
iconv_start codeset_from codeset_to
|
||||
Convert text from one codeset to another using GNU iconv. Needs
|
||||
Convert text from one codeset to another using GNU iconv. Needs
|
||||
to be stopped with iconv_stop.
|
||||
|
||||
|
||||
@ -672,75 +690,75 @@ VARIABLES
|
||||
|
||||
|
||||
i2c (dev) type n
|
||||
I2C sensor from sysfs (Linux 2.6). dev may be omitted if you
|
||||
have only one I2C device. type is either in (or vol) meaning
|
||||
I2C sensor from sysfs (Linux 2.6). dev may be omitted if you
|
||||
have only one I2C device. type is either in (or vol) meaning
|
||||
voltage, fan meaning fan or temp/tempf (first in C, second in F)
|
||||
meaning temperature. n is number of the sensor. See
|
||||
meaning temperature. n is number of the sensor. See
|
||||
/sys/bus/i2c/devices/ on your local computer.
|
||||
|
||||
|
||||
i8k_ac_status
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
whether ac power is on, as listed in /proc/i8k (translated to
|
||||
human-readable). Beware that this is by default not enabled by
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
whether ac power is on, as listed in /proc/i8k (translated to
|
||||
human-readable). Beware that this is by default not enabled by
|
||||
i8k itself.
|
||||
|
||||
|
||||
i8k_bios
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
the bios version as listed in /proc/i8k.
|
||||
|
||||
|
||||
i8k_buttons_status
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
the volume buttons status as listed in /proc/i8k.
|
||||
|
||||
|
||||
i8k_cpu_temp
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
the cpu temperature in Celsius, as reported by /proc/i8k.
|
||||
|
||||
|
||||
i8k_cpu_tempf
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
the cpu temperature in Fahrenheit, as reported by /proc/i8k.
|
||||
|
||||
|
||||
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
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
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.
|
||||
|
||||
|
||||
i8k_left_fan_status
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
the left fan status as listed in /proc/i8k (translated to human-
|
||||
readable). Beware, some laptops i8k reports these fans in re-
|
||||
readable). Beware, some laptops i8k reports these fans in re-
|
||||
verse order.
|
||||
|
||||
|
||||
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
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
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.
|
||||
|
||||
|
||||
i8k_right_fan_status
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
the right fan status as listed in /proc/i8k (translated to hu-
|
||||
man-readable). Beware, some laptops i8k reports these fans in
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
the right fan status as listed in /proc/i8k (translated to hu-
|
||||
man-readable). Beware, some laptops i8k reports these fans in
|
||||
reverse order.
|
||||
|
||||
|
||||
i8k_serial
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
your laptop serial number as listed in /proc/i8k.
|
||||
|
||||
|
||||
i8k_version
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
the version formatting of /proc/i8k.
|
||||
|
||||
|
||||
@ -749,13 +767,13 @@ VARIABLES
|
||||
|
||||
|
||||
ibm_temps N
|
||||
If running the IBM ACPI, displays the temperatures from the IBM
|
||||
If running the IBM ACPI, displays the temperatures from the IBM
|
||||
temperature sensors (N=0..7) Sensor 0 is on the CPU, 3 is on the
|
||||
GPU.
|
||||
|
||||
|
||||
ibm_volume
|
||||
If running the IBM ACPI, displays the "master" volume, con-
|
||||
If running the IBM ACPI, displays the "master" volume, con-
|
||||
trolled by the volume keys (0-14).
|
||||
|
||||
|
||||
@ -765,25 +783,25 @@ VARIABLES
|
||||
|
||||
|
||||
if_running (process)
|
||||
if PROCESS is running, display everything if_running and the
|
||||
if PROCESS is running, display everything if_running and the
|
||||
matching $endif
|
||||
|
||||
|
||||
if_existing (file)
|
||||
if FILE exists, display everything between if_existing and the
|
||||
if FILE exists, display everything between if_existing and the
|
||||
matching $endif
|
||||
|
||||
|
||||
if_mounted (mountpoint)
|
||||
if MOUNTPOINT is mounted, display everything between if_mounted
|
||||
if MOUNTPOINT is mounted, display everything between if_mounted
|
||||
and the matching $endif
|
||||
|
||||
|
||||
imap_messages (args)
|
||||
Displays the number of messages in your global IMAP inbox by de-
|
||||
fault. You can define individual IMAP inboxes seperately by
|
||||
fault. You can define individual IMAP inboxes seperately by
|
||||
passing arguments to this object. Arguments are: "host user pass
|
||||
[-i interval] [-p port] [-e command]". Default port is 143, de-
|
||||
[-i interval] [-p port] [-e command]". Default port is 143, de-
|
||||
fault interval is 5 minutes. If the password is supplied as '*',
|
||||
you will be prompted to enter the password when Conky starts.
|
||||
|
||||
@ -792,7 +810,7 @@ VARIABLES
|
||||
Displays the number of unseen messages in your global IMAP inbox
|
||||
by default. You can define individual IMAP inboxes seperately by
|
||||
passing arguments to this object. Arguments are: "host user pass
|
||||
[-i interval] [-p port] [-e command]". Default port is 143, de-
|
||||
[-i interval] [-p port] [-e command]". Default port is 143, de-
|
||||
fault interval is 5 minutes. If the password is supplied as '*',
|
||||
you will be prompted to enter the password when Conky starts.
|
||||
|
||||
@ -813,8 +831,8 @@ VARIABLES
|
||||
Machine, i686 for example
|
||||
|
||||
|
||||
mails Mail count in mail spool. You can use program like fetchmail to
|
||||
get mails from some server using your favourite protocol. See
|
||||
mails Mail count in mail spool. You can use program like fetchmail to
|
||||
get mails from some server using your favourite protocol. See
|
||||
also new_mails.
|
||||
|
||||
|
||||
@ -911,17 +929,17 @@ VARIABLES
|
||||
|
||||
pb_battery item
|
||||
If running on Apple powerbook/ibook, display information on bat-
|
||||
tery status. The item parameter specifies, what information to
|
||||
tery status. The item parameter specifies, what information to
|
||||
display. Exactly one item must be specified. Valid items are:
|
||||
|
||||
status: Display if battery is fully charged, charging, discharg-
|
||||
ing or absent (running on AC)
|
||||
percent: Display charge of battery in percent, if charging or
|
||||
discharging. Nothing will be displayed, if battery is fully
|
||||
percent: Display charge of battery in percent, if charging or
|
||||
discharging. Nothing will be displayed, if battery is fully
|
||||
charged or absent.
|
||||
time: Display the time remaining until the battery will be fully
|
||||
charged or discharged at current rate. Nothing is displayed, if
|
||||
battery is absent or if it's present but fully charged and not
|
||||
charged or discharged at current rate. Nothing is displayed, if
|
||||
battery is absent or if it's present but fully charged and not
|
||||
discharging.
|
||||
|
||||
|
||||
@ -929,17 +947,17 @@ VARIABLES
|
||||
Displays the number of unseen messages in your global POP3 inbox
|
||||
by default. You can define individual POP3 inboxes seperately by
|
||||
passing arguments to this object. Arguments are: "host user pass
|
||||
[-i interval] [-p port] [-e command]". Default port is 110, de-
|
||||
[-i interval] [-p port] [-e command]". Default port is 110, de-
|
||||
fault interval is 5 minutes. If the password is supplied as '*',
|
||||
you will be prompted to enter the password when Conky starts.
|
||||
|
||||
|
||||
pop3_used (args)
|
||||
Displays the amount of space (in MiB, 2^20) used in your global
|
||||
POP3 inbox by default. You can define individual POP3 inboxes
|
||||
seperately by passing arguments to this object. Arguments are:
|
||||
"host user pass [-i interval] [-p port] [-e command]". Default
|
||||
port is 110, default interval is 5 minutes. If the password is
|
||||
Displays the amount of space (in MiB, 2^20) used in your global
|
||||
POP3 inbox by default. You can define individual POP3 inboxes
|
||||
seperately by passing arguments to this object. Arguments are:
|
||||
"host user pass [-i interval] [-p port] [-e command]". Default
|
||||
port is 110, default interval is 5 minutes. If the password is
|
||||
supplied as '*', you will be prompted to enter the password when
|
||||
Conky starts.
|
||||
|
||||
@ -1001,36 +1019,36 @@ VARIABLES
|
||||
The connection index provides you with access to each connection
|
||||
in the port monitor. The monitor will return information for in-
|
||||
dex values from 0 to n-1 connections. Values higher than n-1 are
|
||||
simply ignored. For the "count" item, the connection index must
|
||||
simply ignored. For the "count" item, the connection index must
|
||||
be omitted. It is required for all other items.
|
||||
|
||||
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
|
||||
${tcp_portmon 22 22 rip 0} - displays the remote host ip of the
|
||||
first sshd connection
|
||||
${tcp_portmon 22 22 rip 9} - displays the remote host ip of the
|
||||
${tcp_portmon 22 22 rip 9} - displays the remote host ip of the
|
||||
tenth sshd connection
|
||||
${tcp_portmon 1 1024 rhost 0} - displays the remote host name of
|
||||
the first connection on a privileged port
|
||||
${tcp_portmon 1 1024 rport 4} - displays the remote host port of
|
||||
the fifth connection on a privileged port
|
||||
${tcp_portmon 1 65535 lservice 14} - displays the local service
|
||||
${tcp_portmon 1 65535 lservice 14} - displays the local service
|
||||
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-
|
||||
gle port range for different items and different indexes all use
|
||||
the same monitor internally. In other words, the program avoids
|
||||
the same monitor internally. In other words, the program avoids
|
||||
creating redundant monitors.
|
||||
|
||||
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-
|
||||
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 in-
|
||||
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-
|
||||
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 in-
|
||||
terval at least 6 seconds. See also $execi.
|
||||
|
||||
|
||||
@ -1049,7 +1067,7 @@ VARIABLES
|
||||
|
||||
|
||||
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
|
||||
|
||||
|
||||
@ -1058,23 +1076,23 @@ VARIABLES
|
||||
|
||||
|
||||
tztime (timezone) (format)
|
||||
Local time for specified timezone, see man strftime to get more
|
||||
information about format. The timezone argument is specified in
|
||||
similar fashion as TZ environment variable. For hints, look in
|
||||
Local time for specified timezone, see man strftime to get more
|
||||
information about format. The timezone argument is specified in
|
||||
similar fashion as TZ environment variable. For hints, look in
|
||||
/usr/share/zoneinfo. e.g. US/Pacific, Europe/Zurich, etc.
|
||||
|
||||
|
||||
totaldown net
|
||||
Total download, overflows at 4 GB on Linux with 32-bit arch and
|
||||
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 al-
|
||||
ready done that before conky has started.
|
||||
|
||||
|
||||
top type, num
|
||||
This takes arguments in the form:top (name) (number) Basically,
|
||||
processes are ranked from highest to lowest in terms of cpu us-
|
||||
age, which is what (num) represents. The types are: "name",
|
||||
"pid", "cpu", and "mem". There can be a max of 10 processes
|
||||
This takes arguments in the form:top (name) (number) Basically,
|
||||
processes are ranked from highest to lowest in terms of cpu us-
|
||||
age, which is what (num) represents. The types are: "name",
|
||||
"pid", "cpu", and "mem". There can be a max of 10 processes
|
||||
listed.
|
||||
|
||||
|
||||
@ -1098,9 +1116,9 @@ VARIABLES
|
||||
Upload speed in kilobytes with one decimal
|
||||
|
||||
|
||||
upspeedgraph net (height),(width) (gradient colour 1) (gradient colour
|
||||
upspeedgraph net (height),(width) (gradient colour 1) (gradient colour
|
||||
2) (scale)
|
||||
Upload speed graph, colours defined in hex, minus the #. If
|
||||
Upload speed graph, colours defined in hex, minus the #. If
|
||||
scale is non-zero, it becomes the scale for the graph.
|
||||
|
||||
|
||||
@ -1112,12 +1130,12 @@ VARIABLES
|
||||
|
||||
|
||||
voffset (pixels)
|
||||
Change vertical offset by N pixels. Negative values will cause
|
||||
Change vertical offset by N pixels. Negative values will cause
|
||||
text to overlap. See also $offset.
|
||||
|
||||
|
||||
voltage_mv (n)
|
||||
Returns CPU #n's voltage in mV. CPUs are counted from 1. If
|
||||
Returns CPU #n's voltage in mV. CPUs are counted from 1. If
|
||||
omitted, the parameter defaults to 1.
|
||||
|
||||
|
||||
@ -1140,11 +1158,11 @@ FILES
|
||||
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
|
||||
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
|
||||
useful to find the window to draw to. You can also use -o argument
|
||||
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
|
||||
useful to find the window to draw to. You can also use -o argument
|
||||
which makes Conky to create its own window.
|
||||
|
||||
SEE ALSO
|
||||
|
@ -11,7 +11,7 @@ HOMEPAGE="http://conky.sf.net"
|
||||
LICENSE="BSD"
|
||||
SLOT="0"
|
||||
KEYWORDS="~alpha ~amd64 ~ppc ~ppc64 ~sparc ~x86"
|
||||
IUSE="truetype X ipv6 audacious bmpx hddtemp mpd vim-syntax"
|
||||
IUSE="truetype X ipv6 audacious bmpx hddtemp mpd network vim-syntax"
|
||||
|
||||
DEPEND_COMMON="
|
||||
virtual/libc
|
||||
@ -31,6 +31,9 @@ DEPEND_COMMON="
|
||||
bmpx? ( media-sound/bmpx
|
||||
>=sys-apps/dbus-0.35
|
||||
)
|
||||
network? ( net-libs/libdexter
|
||||
net-libs/dxt-plugins-sysinfo
|
||||
)
|
||||
!ipv6? ( >=dev-libs/glib-2.0 )
|
||||
)"
|
||||
|
||||
@ -66,7 +69,7 @@ src_compile() {
|
||||
mymake="MPD_NO_IPV6=noipv6"
|
||||
fi
|
||||
local myconf
|
||||
myconf="--enable-own-window --enable-proc-uptime"
|
||||
myconf="--enable-own-window"
|
||||
use X && myconf="${myconf} --enable-x11 --enable-double-buffer --enable-xdamage"
|
||||
econf \
|
||||
${myconf} \
|
||||
@ -74,6 +77,7 @@ src_compile() {
|
||||
$(use_enable audacious) \
|
||||
$(use_enable bmpx) \
|
||||
$(use_enable hddtemp ) \
|
||||
$(use_enable network ) \
|
||||
$(use_enable mpd) \
|
||||
$(use_enable !ipv6 portmon) || die "econf failed"
|
||||
emake ${mymake} || die "compile failed"
|
||||
|
@ -23,5 +23,5 @@ sed -e "s/@REVISION@/${revision}/g" \
|
||||
echo Running $ACLOCAL ... && $ACLOCAL
|
||||
echo Running $LIBTOOLIZE --force ... && $LIBTOOLIZE --force
|
||||
echo Running $AUTOHEADER ... && $AUTOHEADER
|
||||
echo Running $AUTOMAKE -a ... && $AUTOMAKE -a
|
||||
echo Running $AUTOMAKE --add-missing ... && $AUTOMAKE --add-missing
|
||||
echo Running $AUTOCONF ... && $AUTOCONF
|
||||
|
386
configure.ac.in
386
configure.ac.in
@ -2,41 +2,47 @@ dnl $Id$
|
||||
|
||||
dnl major, minor and micro version macros.
|
||||
m4_define([conky_version_major], [1])
|
||||
m4_define([conky_version_minor], [4])
|
||||
m4_define([conky_version_micro], [6])
|
||||
m4_define([conky_version_minor], [5])
|
||||
m4_define([conky_version_micro], [0])
|
||||
m4_define([conky_version_tag], [svn]) dnl [] for releases
|
||||
m4_define([conky_version_revision],[r@REVISION@])
|
||||
m4_define([conky_version],
|
||||
[conky_version_major().conky_version_minor().conky_version_micro()ifelse(
|
||||
conky_version_tag(), [svn],
|
||||
[-conky_version_tag()-conky_version_revision()],
|
||||
[ifelse(conky_version_tag(), [], [], [-conky_version_tag()])])])
|
||||
[conky_version_major().conky_version_minor().conky_version_micro()ifelse(
|
||||
conky_version_tag(), [svn],
|
||||
[-conky_version_tag()-conky_version_revision()],
|
||||
[ifelse(conky_version_tag(), [], [], [-conky_version_tag()])])])
|
||||
|
||||
AC_INIT([Conky], [conky_version()], [brenden1@users.sourceforge.net])
|
||||
|
||||
AM_INIT_AUTOMAKE(conky, conky_version())
|
||||
AM_CONFIG_HEADER(src/config.h)
|
||||
dnl
|
||||
dnl C Compiler
|
||||
dnl
|
||||
|
||||
dnl prevent libtool setting LTCFLAGS to default of -g -O2 when CFLAGS unset.
|
||||
dnl libtool must be deleted with make distclean to see this fix.
|
||||
if test x"$CFLAGS" = x""; then
|
||||
AC_SUBST(CFLAGS, [ ])
|
||||
AC_SUBST(CFLAGS, [ ])
|
||||
fi
|
||||
|
||||
dnl
|
||||
dnl Tools
|
||||
dnl
|
||||
AC_PROG_CC
|
||||
AC_PROG_LD
|
||||
AC_PROG_INSTALL
|
||||
AC_PROG_LIBTOOL
|
||||
|
||||
AC_CHECK_PROG(HAVE_PKGCONFIG, pkg-config, yes, no)
|
||||
if test x"$HAVE_PKGCONFIG" = x"no"; then
|
||||
AC_MSG_ERROR([pkg-config is required!])
|
||||
fi
|
||||
PKG_PROG_PKG_CONFIG([0.17.2])
|
||||
|
||||
|
||||
AC_CONFIG_FILES(
|
||||
Makefile
|
||||
doc/Makefile
|
||||
src/Makefile
|
||||
src/build.h
|
||||
)
|
||||
Makefile
|
||||
doc/Makefile
|
||||
src/Makefile
|
||||
src/build.h
|
||||
)
|
||||
|
||||
uname=`uname`
|
||||
|
||||
@ -87,40 +93,29 @@ dnl OWN_WINDOW option
|
||||
dnl
|
||||
|
||||
AC_ARG_ENABLE([own_window],
|
||||
AC_HELP_STRING([--enable-own-window], [enable if you want support for creating own window @<:@default=yes@:>@]),
|
||||
[dah="$enableval"], [dah=yes])
|
||||
AC_HELP_STRING([--disable-own-window],
|
||||
[disable if you do not want support for creating own window @<:@default=yes@:>@]),
|
||||
[dah="$enableval"], [dah=yes])
|
||||
|
||||
if test $dah != "no"; then
|
||||
AC_DEFINE(OWN_WINDOW, 1, [Define if you want support for window creating])
|
||||
fi
|
||||
|
||||
dnl
|
||||
dnl PROC_UPTIME option
|
||||
dnl
|
||||
|
||||
AC_ARG_ENABLE([proc_uptime],
|
||||
AC_HELP_STRING([--enable-proc-uptime], [enable using /proc/uptime for uptime @<:@default=yes@:>@]),
|
||||
[dah="$enableval"], [dah=yes])
|
||||
|
||||
if test $dah = "yes"; then
|
||||
AC_DEFINE(PROC_UPTIME, 1, [Define if you want to use /proc/uptime for uptime])
|
||||
fi
|
||||
|
||||
|
||||
dnl
|
||||
dnl Audacious Media Player
|
||||
dnl
|
||||
|
||||
AC_ARG_ENABLE([audacious],
|
||||
AC_HELP_STRING([--enable-audacious], [enable audacious player support @<:@default=no@:>@]),
|
||||
[want_audacious="$enableval"], [want_audacious=no])
|
||||
AC_HELP_STRING([--enable-audacious], [enable audacious player support @<:@default=no@:>@]),
|
||||
[want_audacious="$enableval"], [want_audacious=no])
|
||||
|
||||
AM_CONDITIONAL(BUILD_AUDACIOUS, test x$want_audacious = xyes)
|
||||
if test x$want_audacious = xyes; then
|
||||
PKG_CHECK_MODULES([AUDACIOUS], [audacious >= 0.1])
|
||||
CFLAGS="$CFLAGS $AUDACIOUS_CFLAGS"
|
||||
LIBS="$LIBS $AUDACIOUS_LIBS"
|
||||
AC_DEFINE(AUDACIOUS, 1, [Define for Audacious support])
|
||||
PKG_CHECK_MODULES([AUDACIOUS], [audacious >= 0.1])
|
||||
CFLAGS="$CFLAGS $AUDACIOUS_CFLAGS"
|
||||
LIBS="$LIBS $AUDACIOUS_LIBS"
|
||||
AC_DEFINE(AUDACIOUS, 1, [Define for Audacious support])
|
||||
fi
|
||||
|
||||
|
||||
@ -129,15 +124,15 @@ dnl BMPx
|
||||
dnl
|
||||
|
||||
AC_ARG_ENABLE([bmpx],
|
||||
AC_HELP_STRING([--enable-bmpx], [enable if you want BMPx support @<:@default=no@:>@]),
|
||||
[want_bmpx="$enableval"], [want_bmpx=no])
|
||||
AC_HELP_STRING([--enable-bmpx], [enable if you want BMPx support @<:@default=no@:>@]),
|
||||
[want_bmpx="$enableval"], [want_bmpx=no])
|
||||
|
||||
AM_CONDITIONAL(BUILD_BMPX, test x$want_bmpx = xyes)
|
||||
if test x$want_bmpx = xyes; then
|
||||
PKG_CHECK_MODULES([BMPX], [bmp-2.0 >= 0.14.0])
|
||||
CFLAGS="$CFLAGS $BMPX_CFLAGS"
|
||||
LIBS="$LIBS $BMPX_LIBS"
|
||||
AC_DEFINE(BMPX, 1, [Define if you want BMPx support])
|
||||
PKG_CHECK_MODULES([BMPX], [bmp-2.0 >= 0.14.0])
|
||||
CFLAGS="$CFLAGS $BMPX_CFLAGS"
|
||||
LIBS="$LIBS $BMPX_LIBS"
|
||||
AC_DEFINE(BMPX, 1, [Define if you want BMPx support])
|
||||
fi
|
||||
|
||||
|
||||
@ -146,8 +141,9 @@ dnl Hddtemp
|
||||
dnl
|
||||
|
||||
AC_ARG_ENABLE([hddtemp],
|
||||
AC_HELP_STRING([--enable-hddtemp], [enable if you want hddtemp support @<:@default=yes@:>@]),
|
||||
[want_hddtemp="$enableval"], [want_hddtemp=yes])
|
||||
AC_HELP_STRING([--disable-hddtemp],
|
||||
[disable if you do not want hddtemp support @<:@default=yes@:>@]),
|
||||
[want_hddtemp="$enableval"], [want_hddtemp=yes])
|
||||
|
||||
AM_CONDITIONAL(BUILD_HDDTEMP, test x$want_hddtemp = xyes)
|
||||
if test x$want_hddtemp = xyes; then
|
||||
@ -159,8 +155,8 @@ dnl MPD
|
||||
dnl
|
||||
|
||||
AC_ARG_ENABLE([mpd],
|
||||
AC_HELP_STRING([--enable-mpd], [enable if you want MPD support @<:@default=yes@:>@]),
|
||||
[want_mpd="$enableval"], [want_mpd=yes])
|
||||
AC_HELP_STRING([--disable-mpd], [disable if you do not want MPD support @<:@default=yes@:>@]),
|
||||
[want_mpd="$enableval"], [want_mpd=yes])
|
||||
|
||||
AM_CONDITIONAL(BUILD_MPD, test x$want_mpd = xyes)
|
||||
if test x$want_mpd = xyes; then
|
||||
@ -172,15 +168,15 @@ dnl XMMS2
|
||||
dnl
|
||||
|
||||
AC_ARG_ENABLE([xmms2],
|
||||
AC_HELP_STRING([--enable-xmms2], [enable if you want XMMS2 support @<:@default=no@:>@]),
|
||||
[want_xmms2="$enableval"], [want_xmms2=no])
|
||||
AC_HELP_STRING([--enable-xmms2], [enable if you want XMMS2 support @<:@default=no@:>@]),
|
||||
[want_xmms2="$enableval"], [want_xmms2=no])
|
||||
|
||||
AM_CONDITIONAL(BUILD_XMMS2, test x$want_xmms2 = xyes)
|
||||
if test x$want_xmms2 = xyes; then
|
||||
PKG_CHECK_MODULES([XMMS2], [xmms2-client])
|
||||
CFLAGS="$CFLAGS $XMMS2_CFLAGS"
|
||||
LIBS="$LIBS $XMMS2_LIBS"
|
||||
AC_DEFINE(XMMS2, 1, [Define if you want XMMS2 support])
|
||||
PKG_CHECK_MODULES([XMMS2], [xmms2-client])
|
||||
CFLAGS="$CFLAGS $XMMS2_CFLAGS"
|
||||
LIBS="$LIBS $XMMS2_LIBS"
|
||||
AC_DEFINE(XMMS2, 1, [Define if you want XMMS2 support])
|
||||
fi
|
||||
|
||||
|
||||
@ -195,36 +191,62 @@ dnl [want_imlib2="$enableval"], [want_imlib2=no])
|
||||
dnl
|
||||
dnl AM_CONDITIONAL(BUILD_IMLIB2, test x$want_imlib2 = xyes)
|
||||
dnl if test x$want_imlib2 = xyes; then
|
||||
dnl PKG_CHECK_MODULES([Imlib2], [imlib2])
|
||||
dnl CFLAGS="$CFLAGS $Imlib2_CFLAGS"
|
||||
dnl LIBS="$LIBS $Imlib2_LIBS"
|
||||
dnl AC_DEFINE(IMLIB2, 1, [Define if you want Imlib2 support])
|
||||
dnl PKG_CHECK_MODULES([Imlib2], [imlib2])
|
||||
dnl CFLAGS="$CFLAGS $Imlib2_CFLAGS"
|
||||
dnl LIBS="$LIBS $Imlib2_LIBS"
|
||||
dnl AC_DEFINE(IMLIB2, 1, [Define if you want Imlib2 support])
|
||||
dnl fi
|
||||
|
||||
|
||||
dnl
|
||||
dnl PORT_MONITORS
|
||||
dnl
|
||||
|
||||
AC_ARG_ENABLE([portmon],
|
||||
AC_HELP_STRING([--enable-portmon], [enable if you want tcp (ip4) port monitoring @<:@default=yes@:>@]),
|
||||
[want_portmon="$enableval"], [want_portmon=yes])
|
||||
AC_HELP_STRING([--disable-portmon],
|
||||
[disable if you do not want tcp (ip4) port monitoring @<:@default=yes@:>@]),
|
||||
[want_portmon="$enableval"], [want_portmon=yes])
|
||||
|
||||
AM_CONDITIONAL(BUILD_PORT_MONITORS, test x$want_portmon = xyes)
|
||||
if test x$want_portmon = xyes; then
|
||||
if test "x$uname" != xLinux; then
|
||||
AC_MSG_NOTICE([port monitors not supported on $uname... disabling])
|
||||
want_portmon=no
|
||||
else
|
||||
AC_CHECK_HEADERS([netdb.h netinet/in.h netinet/tcp.h sys/socket.h arpa/inet.h], [],
|
||||
[PORT_MONITORS_MISSING=yes])
|
||||
if test "x$PORT_MONITORS_MISSING" = xyes; then
|
||||
AC_MSG_ERROR([missing a needed network header for port monitoring])
|
||||
fi
|
||||
PKG_CHECK_MODULES([GLIB], [glib-2.0])
|
||||
CFLAGS="$CFLAGS $GLIB_CFLAGS"
|
||||
LIBS="$LIBS $GLIB_LIBS"
|
||||
AC_DEFINE(TCP_PORT_MONITOR, 1, [Define if you want tcp port monitoring support])
|
||||
fi
|
||||
if test "x$uname" != xLinux; then
|
||||
AC_MSG_NOTICE([port monitors not supported on $uname... disabling])
|
||||
want_portmon=no
|
||||
else
|
||||
AC_CHECK_HEADERS([netdb.h netinet/in.h netinet/tcp.h sys/socket.h arpa/inet.h], [],
|
||||
[PORT_MONITORS_MISSING=yes])
|
||||
if test "x$PORT_MONITORS_MISSING" = xyes; then
|
||||
AC_MSG_ERROR([missing a needed network header for port monitoring])
|
||||
fi
|
||||
PKG_CHECK_MODULES([GLIB], [glib-2.0])
|
||||
CFLAGS="$CFLAGS $GLIB_CFLAGS"
|
||||
LIBS="$LIBS $GLIB_LIBS"
|
||||
AC_DEFINE(TCP_PORT_MONITOR, 1, [Define if you want tcp port monitoring support])
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
dnl
|
||||
dnl Network-based monitoring
|
||||
dnl
|
||||
|
||||
AC_ARG_ENABLE([network],
|
||||
AC_HELP_STRING([--disable-network],
|
||||
[disable if you do not want distributed monitoring @<:@default=yes@:>@]),
|
||||
[want_network="$enableval"], [want_network=yes])
|
||||
if test x"$want_network" = x"yes"; then
|
||||
PKG_CHECK_MODULES([LIBDEXTER], [dexter], [], [AC_MSG_RESULT([no]); want_network=no])
|
||||
if test x"$want_network" = x"yes"; then
|
||||
dnl need GNU string stream extensions
|
||||
AC_CHECK_FUNCS([fmemopen open_memstream flockfile funlockfile putc_unlocked], [], [want_network=no])
|
||||
if test x"$want_network" = x"yes"; then
|
||||
CFLAGS="$CFLAGS $LIBDEXTER_CFLAGS"
|
||||
LIBS="$LIBS $LIBDEXTER_LIBS"
|
||||
AC_DEFINE([HAVE_LIBDEXTER], 1, [Define if using Libdexter])
|
||||
dnl _GNU_SOURCE needed for fmemopen, open_memstream
|
||||
AC_DEFINE([_GNU_SOURCE], [], [Define for GNU source and extensions])
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
@ -234,9 +256,9 @@ dnl
|
||||
|
||||
AM_ICONV
|
||||
if test "$am_cv_func_iconv" != yes; then
|
||||
AC_MSG_WARN([Could not find libiconv])
|
||||
AC_MSG_WARN([Could not find libiconv])
|
||||
else
|
||||
LIBS="$LIBS $LIBICONV"
|
||||
LIBS="$LIBS $LIBICONV"
|
||||
fi
|
||||
|
||||
dnl
|
||||
@ -244,11 +266,12 @@ dnl debug
|
||||
dnl
|
||||
|
||||
AC_ARG_ENABLE([debug],
|
||||
AC_HELP_STRING([--enable-debug], [compile with debug symbols @<:@default=no@:>@]),
|
||||
[want_debug="$enableval"], [want_debug=no])
|
||||
AC_HELP_STRING([--enable-debug], [compile with debug symbols @<:@default=no@:>@]),
|
||||
[want_debug="$enableval"], [want_debug=no])
|
||||
|
||||
if test "x$want_debug" = "xyes" -a $ac_cv_c_compiler_gnu != no; then
|
||||
CFLAGS="$CFLAGS -g3"
|
||||
CFLAGS="$CFLAGS -g3"
|
||||
AC_DEFINE([DEBUG], [], [Define for debugging])
|
||||
fi
|
||||
|
||||
dnl
|
||||
@ -256,53 +279,56 @@ dnl X11
|
||||
dnl
|
||||
|
||||
AC_ARG_ENABLE([x11],
|
||||
AC_HELP_STRING([--enable-x11], [enable if you want X11 support @<:@default=yes@:>@]),
|
||||
[want_x11="$enableval"], [want_x11=yes])
|
||||
AC_HELP_STRING([--disable-x11], [disable if you do not want X11 support @<:@default=yes@:>@]),
|
||||
[want_x11="$enableval"], [want_x11=yes])
|
||||
|
||||
AM_CONDITIONAL(BUILD_X11, test x$want_x11 = xyes)
|
||||
if test "x$want_x11" = "xyes"; then
|
||||
if $PKG_CONFIG --exists x11; then
|
||||
PKG_CHECK_MODULES([X11], [x11])
|
||||
CFLAGS="$CFLAGS $X11_CFLAGS"
|
||||
LIBS="$LIBS $X11_LIBS"
|
||||
PKG_CHECK_MODULES([X11], [x11])
|
||||
CFLAGS="$CFLAGS $X11_CFLAGS"
|
||||
LIBS="$LIBS $X11_LIBS"
|
||||
else
|
||||
dnl non-modular X11 installations
|
||||
AC_PATH_X
|
||||
AC_PATH_XTRA
|
||||
CFLAGS="$CFLAGS $X_CFLAGS"
|
||||
LIBS="$LIBS $X_LIBS"
|
||||
LDFLAGS="$LDFLAGS $LIBS $X_PRE_LIBS"
|
||||
if test "x$no_x" = "xyes"; then
|
||||
AC_MSG_ERROR([Can't locate your X11 installation])
|
||||
fi
|
||||
AC_CHECK_LIB([X11], [XOpenDisplay], [], AC_MSG_ERROR([Could not find XOpenDisplay in -lX11]))
|
||||
dnl non-modular X11 installations
|
||||
AC_PATH_X
|
||||
AC_PATH_XTRA
|
||||
CFLAGS="$CFLAGS $X_CFLAGS"
|
||||
LIBS="$LIBS $X_LIBS"
|
||||
LDFLAGS="$LDFLAGS $LIBS $X_PRE_LIBS"
|
||||
if test "x$no_x" = "xyes"; then
|
||||
AC_MSG_ERROR([Can't locate your X11 installation])
|
||||
fi
|
||||
AC_CHECK_LIB([X11], [XOpenDisplay], [], AC_MSG_ERROR([Could not find XOpenDisplay in -lX11]))
|
||||
fi
|
||||
AC_DEFINE(X11, 1, [Define if you want to use X11])
|
||||
fi
|
||||
|
||||
|
||||
|
||||
dnl
|
||||
dnl Xext Double-buffering Extension
|
||||
dnl
|
||||
|
||||
AC_ARG_ENABLE([double_buffer],
|
||||
AC_HELP_STRING([--enable-double-buffer], [enable for flicker-free operation @<:@default=yes@:>@]),
|
||||
[want_double_buffer="$enableval"], [want_double_buffer=yes])
|
||||
AC_HELP_STRING([--disable-double-buffer],
|
||||
[disable for no Xdbe double-buffering support @<:@default=yes@:>@]),
|
||||
[want_double_buffer="$enableval"], [want_double_buffer=yes])
|
||||
|
||||
if test "x$want_double_buffer" = "xyes"; then
|
||||
if test "x$want_x11" != "xyes"; then
|
||||
AC_MSG_ERROR([--enable-x11 is required for double-buffering])
|
||||
dnl silently disable if no x11
|
||||
want_double_buffer=no
|
||||
else
|
||||
if $PKG_CONFIG --exists xext; then
|
||||
PKG_CHECK_MODULES([XEXT],[xext])
|
||||
CFLAGS="$CFLAGS $XEXT_CFLAGS"
|
||||
LIBS="$LIBS $XEXT_LIBS"
|
||||
else
|
||||
dnl non-modular X11 installation
|
||||
AC_CHECK_LIB([Xext], [XdbeQueryExtension], [LIBS="$LIBS -lXext"],
|
||||
AC_MSG_ERROR([Could not find XdbeQueryExtension in -lXext]))
|
||||
fi
|
||||
AC_DEFINE(HAVE_XDBE, 1, [Define for X11 double-buffering])
|
||||
fi
|
||||
if $PKG_CONFIG --exists xext; then
|
||||
PKG_CHECK_MODULES([XEXT],[xext])
|
||||
CFLAGS="$CFLAGS $XEXT_CFLAGS"
|
||||
LIBS="$LIBS $XEXT_LIBS"
|
||||
else
|
||||
dnl non-modular X11 installation
|
||||
AC_CHECK_LIB([Xext], [XdbeQueryExtension], [LIBS="$LIBS -lXext"],
|
||||
AC_MSG_ERROR([Could not find XdbeQueryExtension in -lXext]))
|
||||
fi
|
||||
AC_DEFINE(HAVE_XDBE, 1, [Define for X11 double-buffering])
|
||||
fi
|
||||
|
||||
|
||||
@ -311,23 +337,26 @@ dnl Xdamage Extension
|
||||
dnl
|
||||
|
||||
AC_ARG_ENABLE([xdamage],
|
||||
AC_HELP_STRING([--enable-xdamage], [enable if you want Xdamage support @<:@default=yes@:>@]),
|
||||
[want_xdamage="$enableval"], [want_xdamage=yes])
|
||||
AC_HELP_STRING([--disable-xdamage],
|
||||
[disable if you do not want Xdamage support @<:@default=yes@:>@]),
|
||||
[want_xdamage="$enableval"], [want_xdamage=yes])
|
||||
|
||||
if test "x$want_xdamage" = "xyes"; then
|
||||
if test "x$want_x11" != "xyes"; then
|
||||
AC_MSG_ERROR([--enable-x11 is required for xdamage])
|
||||
dnl silently disable if no x11
|
||||
want_xdamage=no
|
||||
else
|
||||
if $PKG_CONFIG --exists xdamage; then
|
||||
PKG_CHECK_MODULES([XDAMAGE],[xdamage])
|
||||
CFLAGS="$CFLAGS $XDAMAGE_CFLAGS"
|
||||
LIBS="$LIBS $XDAMAGE_LIBS"
|
||||
else
|
||||
dnl non-modular X11 installation
|
||||
AC_CHECK_LIB([Xdamage], [XDamageQueryExtension], [LIBS="$LIBS -lXdamage"],
|
||||
AC_MSG_ERROR([Could not find XDamageQueryExtension in -lXdamage]))
|
||||
fi
|
||||
AC_DEFINE(HAVE_XDAMAGE, 1, [Define for X11 Xdamage extension])
|
||||
fi
|
||||
if $PKG_CONFIG --exists xdamage; then
|
||||
PKG_CHECK_MODULES([XDAMAGE],[xdamage])
|
||||
CFLAGS="$CFLAGS $XDAMAGE_CFLAGS"
|
||||
LIBS="$LIBS $XDAMAGE_LIBS"
|
||||
else
|
||||
dnl non-modular X11 installation
|
||||
AC_CHECK_LIB([Xdamage], [XDamageQueryExtension], [LIBS="$LIBS -lXdamage"],
|
||||
AC_MSG_ERROR([Could not find XDamageQueryExtension in -lXdamage]))
|
||||
fi
|
||||
AC_DEFINE(HAVE_XDAMAGE, 1, [Define for X11 Xdamage extension])
|
||||
fi
|
||||
|
||||
|
||||
@ -336,17 +365,19 @@ dnl Xft
|
||||
dnl
|
||||
|
||||
AC_ARG_ENABLE([xft],
|
||||
AC_HELP_STRING([--enable-xft], [enable if you want to use Xft @<:@default=yes@:>@]),
|
||||
[want_xft="$enableval"], [want_xft=yes])
|
||||
AC_HELP_STRING([--disable-xft], [disable if you do not want to use Xft @<:@default=yes@:>@]),
|
||||
[want_xft="$enableval"], [want_xft=yes])
|
||||
|
||||
if test x$want_xft = "xyes"; then
|
||||
if test "x$want_x11" != "xyes"; then
|
||||
AC_MSG_ERROR([--enable-x11 is required for xft])
|
||||
dnl silently disable if no x11
|
||||
want_xft=no
|
||||
else
|
||||
PKG_CHECK_MODULES(XFT, [xft])
|
||||
CFLAGS="$CFLAGS $XFT_CFLAGS"
|
||||
LIBS="$LIBS $XFT_LIBS"
|
||||
AC_DEFINE(XFT, 1, [Define for Xft support])
|
||||
fi
|
||||
PKG_CHECK_MODULES(XFT, [xft])
|
||||
CFLAGS="$CFLAGS $XFT_CFLAGS"
|
||||
LIBS="$LIBS $XFT_LIBS"
|
||||
AC_DEFINE(XFT, 1, [Define for Xft support])
|
||||
fi
|
||||
|
||||
|
||||
@ -356,8 +387,8 @@ dnl
|
||||
|
||||
if test x$WANT_KVM = xyes; then
|
||||
AC_CHECK_LIB(kvm, kvm_open,
|
||||
LIBS="$LIBS -lkvm",
|
||||
AC_MSG_ERROR([Could not find kvm_open in -lkvm.])
|
||||
LIBS="$LIBS -lkvm",
|
||||
AC_MSG_ERROR([Could not find kvm_open in -lkvm.])
|
||||
)
|
||||
fi
|
||||
|
||||
@ -366,10 +397,10 @@ dnl devstat
|
||||
dnl
|
||||
|
||||
if test x$WANT_DEVSTAT = xyes; then
|
||||
AC_CHECK_LIB(devstat, devstat_getversion,
|
||||
LIBS="$LIBS -ldevstat",
|
||||
AC_MSG_ERROR([Cound not find devstat_getversion in -ldevstat.])
|
||||
)
|
||||
AC_CHECK_LIB(devstat, devstat_getversion,
|
||||
LIBS="$LIBS -ldevstat",
|
||||
AC_MSG_ERROR([Cound not find devstat_getversion in -ldevstat.])
|
||||
)
|
||||
fi
|
||||
|
||||
dnl
|
||||
@ -378,8 +409,8 @@ dnl
|
||||
|
||||
if test x$WANT_OSSLIB = xyes; then
|
||||
AC_CHECK_LIB(ossaudio, _oss_ioctl,
|
||||
LIBS="$LIBS -lossaudio",
|
||||
AC_MSG_ERROR([Could not find oss_ioctl in -lossaudio.])
|
||||
LIBS="$LIBS -lossaudio",
|
||||
AC_MSG_ERROR([Could not find oss_ioctl in -lossaudio.])
|
||||
)
|
||||
fi
|
||||
|
||||
@ -388,17 +419,17 @@ dnl Some headers
|
||||
dnl
|
||||
|
||||
AC_CHECK_HEADERS([signal.h unistd.h sys/utsname.h sys/stat.h linux/soundcard.h dirent.h mcheck.h \
|
||||
sys/statfs.h sys/param.h pthread.h assert.h errno.h time.h])
|
||||
sys/statfs.h sys/param.h pthread.h assert.h errno.h time.h])
|
||||
AC_CHECK_HEADERS([sys/mount.h], [], [],
|
||||
[#ifdef HAVE_SYS_PARAM_H
|
||||
#include <sys/param.h>
|
||||
#endif
|
||||
])
|
||||
[#ifdef HAVE_SYS_PARAM_H
|
||||
#include <sys/param.h>
|
||||
#endif
|
||||
])
|
||||
dnl
|
||||
dnl Some functions
|
||||
dnl
|
||||
|
||||
AC_CHECK_FUNCS([calloc malloc free popen])
|
||||
AC_CHECK_FUNCS([calloc malloc free popen sysinfo getloadavg])
|
||||
AC_SEARCH_LIBS(clock_gettime, [rt], [], AC_MSG_ERROR([clock_gettime() not found]))
|
||||
|
||||
|
||||
@ -410,29 +441,11 @@ AC_CHECK_PROGS(db2x_xsltproc_cmd, db2x_xsltproc)
|
||||
AC_CHECK_PROGS(db2x_manxml_cmd, db2x_manxml)
|
||||
AC_CHECK_PROGS(xsltproc_cmd, xsltproc)
|
||||
if test x$db2x_xsltproc_cmd = "x" -o x$xsltproc_cmd = "x"; then
|
||||
AM_CONDITIONAL(HAVE_DOCSTUFF, false)
|
||||
AM_CONDITIONAL(HAVE_DOCSTUFF, false)
|
||||
else
|
||||
AM_CONDITIONAL(HAVE_DOCSTUFF, true)
|
||||
AM_CONDITIONAL(HAVE_DOCSTUFF, true)
|
||||
fi
|
||||
|
||||
dnl
|
||||
dnl Check sysinfo()
|
||||
dnl
|
||||
|
||||
if test x$WANT_SYSINFO = xyes; then
|
||||
dah=no
|
||||
AC_MSG_CHECKING(for sysinfo)
|
||||
AC_TRY_COMPILE(
|
||||
[#include <sys/types.h>
|
||||
#include <sys/sysinfo.h>],
|
||||
[struct sysinfo s; sysinfo(&s); (void) s.uptime; ],
|
||||
[AC_MSG_RESULT(yes); dah=yes],
|
||||
[AC_MSG_RESULT(not usable); dah=no])
|
||||
|
||||
if test x$dah = xyes; then
|
||||
AC_DEFINE(HAVE_SYSINFO, 1, [Define if you have sysinfo (Linux)])
|
||||
fi
|
||||
fi
|
||||
|
||||
dnl
|
||||
dnl kstat in Solaris
|
||||
@ -462,17 +475,20 @@ AC_DEFUN([AM_LANGINFO_CODESET],
|
||||
fi
|
||||
])
|
||||
|
||||
dnl
|
||||
dnl Check getloadavg
|
||||
dnl
|
||||
|
||||
AC_MSG_CHECKING(for getloadavg)
|
||||
AC_TRY_COMPILE(
|
||||
[#include <stdlib.h>],
|
||||
[double v[3]; getloadavg(v, 3);],
|
||||
[AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(HAVE_GETLOADAVG, 1, [Define if you have getloadavg])],
|
||||
[AC_MSG_RESULT(no)])
|
||||
dnl ************************
|
||||
dnl * Linker optimizations *
|
||||
dnl ************************
|
||||
AC_MSG_CHECKING([if $LD accepts -O1])
|
||||
case `$LD -O1 -v 2>&1 </dev/null` in
|
||||
*GNU* | *BSD*)
|
||||
LDFLAGS="$LDFLAGS -Wl,-O1"
|
||||
AC_MSG_RESULT([yes])
|
||||
;;
|
||||
*)
|
||||
AC_MSG_RESULT([no])
|
||||
;;
|
||||
esac
|
||||
|
||||
|
||||
dnl
|
||||
@ -493,25 +509,25 @@ cat << EOF
|
||||
|
||||
$PACKAGE $VERSION configured successfully:
|
||||
|
||||
Installing into: $prefix
|
||||
C compiler flags: $CFLAGS
|
||||
Linker flags: $LDFLAGS
|
||||
Libraries: $LIBS
|
||||
Installing into: $prefix
|
||||
C compiler flags: $CFLAGS
|
||||
Linker flags: $LDFLAGS
|
||||
Libraries: $LIBS
|
||||
|
||||
* x11:
|
||||
x11 support: $want_x11
|
||||
xdamage support: $want_xdamage
|
||||
xdbe support: $want_double_buffer
|
||||
xft support: $want_xft
|
||||
x11 support: $want_x11
|
||||
xdamage support: $want_xdamage
|
||||
xdbe support: $want_double_buffer
|
||||
xft support: $want_xft
|
||||
|
||||
* music detection:
|
||||
audacious: $want_audacious
|
||||
bmpx: $want_bmpx
|
||||
mpd: $want_mpd
|
||||
xmms2: $want_xmms2
|
||||
audacious: $want_audacious
|
||||
bmpx: $want_bmpx
|
||||
mpd: $want_mpd
|
||||
xmms2: $want_xmms2
|
||||
|
||||
* general:
|
||||
hddtemp: $want_hddtemp
|
||||
portmon: $want_portmon
|
||||
|
||||
hddtemp: $want_hddtemp
|
||||
portmon: $want_portmon
|
||||
network: $want_network
|
||||
EOF
|
||||
|
@ -55,6 +55,27 @@
|
||||
<para></para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><command><option>dexter_client</option></command></term>
|
||||
<listitem>
|
||||
Act as client and connect to libdexter server for remote monitoring?
|
||||
<para></para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><command><option>dexter_config</option></command></term>
|
||||
<listitem>
|
||||
Full path to libdexter configuration file (default search order: $HOME/.dexterrc; /etc/libdexter/dexter.conf)
|
||||
<para></para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><command><option>dexter_server</option></command></term>
|
||||
<listitem>
|
||||
Act as server for libdexter services?
|
||||
<para></para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><command><option>double_buffer</option></command></term>
|
||||
<listitem>
|
||||
@ -219,21 +240,10 @@
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><command><option>own_window_transparent</option></command></term>
|
||||
<listitem>
|
||||
Boolean, set pseudo-transparency?
|
||||
<para></para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><command><option>own_window_type</option></command></term>
|
||||
<listitem>
|
||||
if own_window is yes, you may specify type normal, desktop or override (default: normal).
|
||||
Desktop windows are special windows that have no window decorations; are always visible
|
||||
on your desktop; do not appear in your pager or taskbar; and are sticky across all workspaces.
|
||||
Override windows are not under the control of the window manager. Hints are ignored. This type
|
||||
of window can be useful for certain situations.
|
||||
<para></para></listitem>
|
||||
<term><command><option>own_window_class</option></command></term>
|
||||
<listitem>
|
||||
Manually set the WM_CLASS name. Defaults to "Conky".
|
||||
<para></para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
@ -256,6 +266,31 @@
|
||||
<para></para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><command><option>own_window_title</option></command></term>
|
||||
<listitem>
|
||||
Manually set the window name. Defaults to "<hostname> - conky".
|
||||
<para></para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><command><option>own_window_transparent</option></command></term>
|
||||
<listitem>
|
||||
Boolean, set pseudo-transparency?
|
||||
<para></para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><command><option>own_window_type</option></command></term>
|
||||
<listitem>
|
||||
if own_window is yes, you may specify type normal, desktop or override (default: normal).
|
||||
Desktop windows are special windows that have no window decorations; are always visible
|
||||
on your desktop; do not appear in your pager or taskbar; and are sticky across all workspaces.
|
||||
Override windows are not under the control of the window manager. Hints are ignored. This type
|
||||
of window can be useful for certain situations.
|
||||
<para></para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><command><option>out_to_console</option></command>
|
||||
</term>
|
||||
@ -319,13 +354,6 @@
|
||||
<para></para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><command><option>wm_class_name</option></command></term>
|
||||
<listitem>
|
||||
Manually set the WM_CLASS name. Defaults to "conky".
|
||||
<para></para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><command><option>xftalpha</option></command></term>
|
||||
<listitem>
|
||||
|
46
doc/conky.1
46
doc/conky.1
@ -44,7 +44,7 @@ Example to compile and run Conky with all optional components (note that some co
|
||||
.TP
|
||||
\fB\*(T<\fBsh autogen.sh\fR\*(T>\fR \*(T<\fB# Only required if building from Svn\fR\*(T>
|
||||
.TP
|
||||
\fB\*(T<\fB\&./configure \fR\*(T>\fR\*(T<\fB\-\-prefix=/usr \-\-mandir=/usr/share/man \-\-infodir=/usr/share/info \-\-datadir=/usr/share \-\-sysconfdir=/etc \-\-localstatedir=/var/lib \-\-enable\-xft \-\-enable\-own\-window \-\-enable\-proc\-uptime \-\-enable\-audacious \-\-enable\-bmpx \-\-enable\-hddtemp \-\-enable\-mpd \-\-enable\-xmms2 \-\-enable\-imlib2 \-\-enable\-portmon \-\-enable\-debug \-\-enable\-double\-buffer \-\-enable\-xdamage \-\-enable\-x11\fR\*(T>
|
||||
\fB\*(T<\fB\&./configure \fR\*(T>\fR\*(T<\fB\-\-prefix=/usr \-\-mandir=/usr/share/man \-\-infodir=/usr/share/info \-\-datadir=/usr/share \-\-sysconfdir=/etc \-\-localstatedir=/var/lib \-\-disable\-own\-window \-\-enable\-audacious \-\-enable\-bmpx \-\-disable\-hddtemp \-\-disable\-mpd \-\-enable\-xmms2 \-\-disable\-portmon \-\-disable\-network \-\-enable\-debug \-\-disable\-x11 \-\-disable\-double\-buffer \-\-disable\-xdamage \-\-disable\-xft\fR\*(T>
|
||||
.TP
|
||||
\fB\*(T<\fBmake\fR\*(T>\fR
|
||||
.TP
|
||||
@ -167,6 +167,18 @@ Default outline color
|
||||
\fB\*(T<\fBdefault_shade_color\fR\*(T>\fR
|
||||
Default shading color and border's shading color
|
||||
|
||||
.TP
|
||||
\fB\*(T<\fBdexter_client\fR\*(T>\fR
|
||||
Act as client and connect to libdexter server for remote monitoring?
|
||||
|
||||
.TP
|
||||
\fB\*(T<\fBdexter_config\fR\*(T>\fR
|
||||
Full path to libdexter configuration file (default search order: $HOME/.dexterrc; /etc/libdexter/dexter.conf)
|
||||
|
||||
.TP
|
||||
\fB\*(T<\fBdexter_server\fR\*(T>\fR
|
||||
Act as server for libdexter services?
|
||||
|
||||
.TP
|
||||
\fB\*(T<\fBdouble_buffer\fR\*(T>\fR
|
||||
Use the Xdbe extension? (eliminates flicker) It is highly recommended to use own window with this one so double buffer won't be so big.
|
||||
@ -259,16 +271,8 @@ Force UTF8? requires XFT
|
||||
Boolean, create own window to draw?
|
||||
|
||||
.TP
|
||||
\fB\*(T<\fBown_window_transparent\fR\*(T>\fR
|
||||
Boolean, set pseudo-transparency?
|
||||
|
||||
.TP
|
||||
\fB\*(T<\fBown_window_type\fR\*(T>\fR
|
||||
if own_window is yes, you may specify type normal, desktop or override (default: normal).
|
||||
Desktop windows are special windows that have no window decorations; are always visible
|
||||
on your desktop; do not appear in your pager or taskbar; and are sticky across all workspaces.
|
||||
Override windows are not under the control of the window manager. Hints are ignored. This type
|
||||
of window can be useful for certain situations.
|
||||
\fB\*(T<\fBown_window_class\fR\*(T>\fR
|
||||
Manually set the WM_CLASS name. Defaults to "Conky".
|
||||
|
||||
.TP
|
||||
\fB\*(T<\fBown_window_colour\fR\*(T>\fR \*(T<\fBcolour\fR\*(T>
|
||||
@ -280,6 +284,22 @@ If own_window is yes, you may use these window manager hints to affect the way C
|
||||
Notes: Use own_window_type desktop as another way to implement many of these hints implicitly.
|
||||
If you use own_window_type override, window manager hints have no meaning and are ignored.
|
||||
|
||||
.TP
|
||||
\fB\*(T<\fBown_window_title\fR\*(T>\fR
|
||||
Manually set the window name. Defaults to "<hostname> - conky".
|
||||
|
||||
.TP
|
||||
\fB\*(T<\fBown_window_transparent\fR\*(T>\fR
|
||||
Boolean, set pseudo-transparency?
|
||||
|
||||
.TP
|
||||
\fB\*(T<\fBown_window_type\fR\*(T>\fR
|
||||
if own_window is yes, you may specify type normal, desktop or override (default: normal).
|
||||
Desktop windows are special windows that have no window decorations; are always visible
|
||||
on your desktop; do not appear in your pager or taskbar; and are sticky across all workspaces.
|
||||
Override windows are not under the control of the window manager. Hints are ignored. This type
|
||||
of window can be useful for certain situations.
|
||||
|
||||
.TP
|
||||
\fB\*(T<\fBout_to_console\fR\*(T>\fR
|
||||
Print text to stdout.
|
||||
@ -316,10 +336,6 @@ Adds spaces after certain objects to stop them from moving other things around.
|
||||
\fB\*(T<\fBuse_xft\fR\*(T>\fR
|
||||
Use Xft (anti-aliased font and stuff)
|
||||
|
||||
.TP
|
||||
\fB\*(T<\fBwm_class_name\fR\*(T>\fR
|
||||
Manually set the WM_CLASS name. Defaults to "conky".
|
||||
|
||||
.TP
|
||||
\fB\*(T<\fBxftalpha\fR\*(T>\fR
|
||||
Alpha of Xft font. Must be a value at or between 1 and 0.
|
||||
|
@ -93,6 +93,11 @@ default_color white
|
||||
default_shade_color black
|
||||
default_outline_color black
|
||||
|
||||
dexter_client no
|
||||
dexter_server no
|
||||
# config file for libdexter (default search path: $HOME/.dexterrc; /etc/libdexter/dexter.conf)
|
||||
dexter_config
|
||||
|
||||
# Text alignment, other possible values are commented
|
||||
#alignment top_left
|
||||
#alignment top_right
|
||||
|
@ -79,7 +79,7 @@
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<command><option>./configure </option></command><option>--prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --datadir=/usr/share --sysconfdir=/etc --localstatedir=/var/lib --enable-xft --enable-own-window --enable-proc-uptime --enable-audacious --enable-bmpx --enable-hddtemp --enable-mpd --enable-xmms2 --enable-imlib2 --enable-portmon --enable-debug --enable-double-buffer --enable-xdamage --enable-x11</option>
|
||||
<command><option>./configure </option></command><option>--prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --datadir=/usr/share --sysconfdir=/etc --localstatedir=/var/lib --disable-own-window --enable-audacious --enable-bmpx --disable-hddtemp --disable-mpd --enable-xmms2 --disable-portmon --disable-network --enable-debug --disable-x11 --disable-double-buffer --disable-xdamage --disable-xft</option>
|
||||
</term>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
|
@ -6,7 +6,7 @@
|
||||
syntax "conky" "\.*conkyrc.*$"
|
||||
|
||||
## Configuration items
|
||||
color green "\<(alignment|background|border_margin|border_width|cpu_avg_samples|default_color|default_shade_color|default_outline_color|double_buffer|draw_borders|draw_graph_borders|draw_shades|draw_outline|font|gap_x|gap_y|imap|mail_spool|max_port_monitor_connections|max_specials|max_user_text|maximum_width|minimum_size|mpd_host|mpd_port|mpd_password|net_avg_samples|no_buffers|out_to_console|override_utf8_locale|own_window|own_window_transparent|own_window_type|own_window_hints|own_window_colour|pad_percents|pop3|stippled_borders|total_run_times|update_interval|uppercase|use_spacer|use_xft|wm_class_name|xftalpha|xftfont)\>"
|
||||
color green "\<(alignment|background|border_margin|border_width|cpu_avg_samples|default_color|default_shade_color|default_outline_color|dexter_client|dexter_config|dexter_server|double_buffer|draw_borders|draw_graph_borders|draw_shades|draw_outline|font|gap_x|gap_y|imap|mail_spool|max_port_monitor_connections|max_specials|max_user_text|maximum_width|minimum_size|mpd_host|mpd_port|mpd_password|net_avg_samples|no_buffers|out_to_console|override_utf8_locale|own_window|own_window_class|own_window_colour|own_window_hints|own_window_title|own_window_transparent|own_window_type|pad_percents|pop3|stippled_borders|total_run_times|update_interval|uppercase|use_spacer|use_xft|xftalpha|xftfont)\>"
|
||||
|
||||
## Variables
|
||||
color brightblue "\<(acpiacadapter|acpifan|acpitemp|acpitempf|addr|adt746xcpu|adt746xfan|align|alignr|apm_adapter|apm_battery_life|apm_battery_time|audacious_bar|audacious_bitrate|audacious_channels|audacious_filename|audacious_frequency|audacious_length|audacious_length_seconds|audacious_playlist_length|audacious_playlist_position|audacious_position|audacious_position_seconds|audacious_status|audacious_title|battery|battery_time|bmpx_album|bmpx_artist|bmpx_bitrate|bmpx_title|bmpx_track|bmpx_uri|buffers|cached|color|colour|cpu|cpubar|diskio|downspeed|downspeedf|else|entropy_avail|entropy_bar|entropy_poolsize|exec|execbar|execgraph|execi|execibar|execigraph|font|freq|freq_dyn|freq_dyn_g|freq_g|fs_bar|fs_free|fs_free_perc|fs_size|fs_used|goto|hddtemp|head|hr|i2c|i8k_ac_status|i8k_bios|i8k_buttons_status|i8k_cpu_temp|i8k_cpu_tempf|i8k_left_fan_rpm|i8k_left_fan_status|i8k_right_fan_rpm|i8k_right_fan_status|i8k_serial|i8k_version|if_existing|if_running|if_mounted|kernel|linkstatus|loadavg|machine|mails|mem|membar|memmax|memperc|mpd_album|mpd_artist|mpd_bar|mpd_bitrate|mpd_elapsed|mpd_file|mpd_length|mpd_name|mpd_percent|mpd_smart|mpd_status|mpd_title|mpd_vol|new_mails|nodename|offset|outlinecolor|pre_exec|processes|running_processes|shadecolor|stippled_hr|swap|swapbar|swapmax|swapperc|sysname|tab|tail|tcp_portmon|texeci|time|top|top_mem|totaldown|totalup|tztime|updates|upspeed|upspeedf|upspeedgraph|uptime|uptime_short|voffset|voltage_mv|voltage_v)\>"
|
||||
|
@ -1,9 +1,9 @@
|
||||
" Vim syntax file
|
||||
" Language: conkyrc
|
||||
" Author: Ciaran McCreesh <ciaranm@gentoo.org>
|
||||
" Version: 20060307
|
||||
" Copyright: Copyright (c) 2005 Ciaran McCreesh
|
||||
" Licence: You may redistribute this under the same terms as Vim itself
|
||||
" Language: conkyrc
|
||||
" Author: Ciaran McCreesh <ciaranm@gentoo.org>
|
||||
" Version: 20060307
|
||||
" Copyright: Copyright (c) 2005 Ciaran McCreesh
|
||||
" Licence: You may redistribute this under the same terms as Vim itself
|
||||
"
|
||||
" $Id$
|
||||
|
||||
@ -22,6 +22,9 @@ syn keyword ConkyrcSetting
|
||||
\ default_color
|
||||
\ default_outline_color
|
||||
\ default_shade_color
|
||||
\ dexter_client
|
||||
\ dexter_config
|
||||
\ dexter_server
|
||||
\ double_buffer
|
||||
\ draw_borders
|
||||
\ draw_graph_borders
|
||||
@ -30,11 +33,11 @@ syn keyword ConkyrcSetting
|
||||
\ font
|
||||
\ gap_x
|
||||
\ gap_y
|
||||
\ imap
|
||||
\ imap
|
||||
\ mail_spool
|
||||
\ max_port_monitor_connections
|
||||
\ max_specials
|
||||
\ max_user_text
|
||||
\ max_port_monitor_connections
|
||||
\ max_specials
|
||||
\ max_user_text
|
||||
\ maximum_width
|
||||
\ minimum_size
|
||||
\ mpd_host
|
||||
@ -45,12 +48,14 @@ syn keyword ConkyrcSetting
|
||||
\ out_to_console
|
||||
\ override_utf8_locale
|
||||
\ own_window
|
||||
\ own_window_class
|
||||
\ own_window_colour
|
||||
\ own_window_hints
|
||||
\ own_window_title
|
||||
\ own_window_transparent
|
||||
\ own_window_type
|
||||
\ own_window_type
|
||||
\ pad_percents
|
||||
\ pop3
|
||||
\ pop3
|
||||
\ stippled_borders
|
||||
\ total_run_times
|
||||
\ update_interval
|
||||
@ -66,11 +71,11 @@ syn keyword ConkyrcConstant
|
||||
\ below
|
||||
\ bottom_left
|
||||
\ bottom_right
|
||||
\ desktop
|
||||
\ desktop
|
||||
\ no
|
||||
\ none
|
||||
\ normal
|
||||
\ override
|
||||
\ normal
|
||||
\ override
|
||||
\ skip_pager
|
||||
\ skip_taskbar
|
||||
\ sticky
|
||||
@ -92,19 +97,19 @@ syn region ConkyrcVar start=/\$\w\@=/ end=/\W\@=\|$/ contained contains=ConkyrcV
|
||||
syn match ConkyrcVarStuff /{\@<=/ms=s contained nextgroup=ConkyrcVarName
|
||||
|
||||
syn keyword ConkyrcVarName contained nextgroup=ConkyrcNumber,ConkyrcColour skipwhite
|
||||
\ acpiacadapter
|
||||
\ acpifan
|
||||
\ acpitemp
|
||||
\ acpitempf
|
||||
\ addr
|
||||
\ adt746xcpu
|
||||
\ adt746xfan
|
||||
\ alignc
|
||||
\ alignr
|
||||
\ apm_adapter
|
||||
\ apm_battery_life
|
||||
\ apm_battery_time
|
||||
\ audacious_bar
|
||||
\ acpiacadapter
|
||||
\ acpifan
|
||||
\ acpitemp
|
||||
\ acpitempf
|
||||
\ addr
|
||||
\ adt746xcpu
|
||||
\ adt746xfan
|
||||
\ alignc
|
||||
\ alignr
|
||||
\ apm_adapter
|
||||
\ apm_battery_life
|
||||
\ apm_battery_time
|
||||
\ audacious_bar
|
||||
\ audacious_bitrate
|
||||
\ audacious_channels
|
||||
\ audacious_filename
|
||||
@ -117,117 +122,117 @@ syn keyword ConkyrcVarName contained nextgroup=ConkyrcNumber,ConkyrcColour skipw
|
||||
\ audacious_position_seconds
|
||||
\ audacious_status
|
||||
\ audacious_title
|
||||
\ battery
|
||||
\ battery_time
|
||||
\ bmpx_album
|
||||
\ bmpx_artist
|
||||
\ bmpx_bitrate
|
||||
\ bmpx_title
|
||||
\ bmpx_track
|
||||
\ bmpx_uri
|
||||
\ buffers
|
||||
\ cached
|
||||
\ color
|
||||
\ colour
|
||||
\ cpu
|
||||
\ cpubar
|
||||
\ diskio
|
||||
\ downspeed
|
||||
\ downspeedf
|
||||
\ else
|
||||
\ entropy_avail
|
||||
\ entropy_bar
|
||||
\ entropy_poolsize
|
||||
\ exec
|
||||
\ execbar
|
||||
\ execgraph
|
||||
\ execi
|
||||
\ execibar
|
||||
\ execigraph
|
||||
\ font
|
||||
\ freq
|
||||
\ freq_dyn
|
||||
\ freq_dyn_g
|
||||
\ freq_g
|
||||
\ fs_bar
|
||||
\ fs_free
|
||||
\ fs_free_perc
|
||||
\ fs_size
|
||||
\ fs_used
|
||||
\ goto
|
||||
\ hddtemp
|
||||
\ head
|
||||
\ hr
|
||||
\ i2c
|
||||
\ i8k_ac_status
|
||||
\ i8k_bios
|
||||
\ i8k_buttons_status
|
||||
\ i8k_cpu_temp
|
||||
\ i8k_cpu_tempf
|
||||
\ i8k_left_fan_rpm
|
||||
\ i8k_left_fan_status
|
||||
\ i8k_right_fan_rpm
|
||||
\ i8k_right_fan_status
|
||||
\ i8k_serial
|
||||
\ i8k_version
|
||||
\ if_existing
|
||||
\ if_mounted
|
||||
\ if_running
|
||||
\ kernel
|
||||
\ linkstatus
|
||||
\ loadavg
|
||||
\ machine
|
||||
\ mails
|
||||
\ mem
|
||||
\ membar
|
||||
\ memmax
|
||||
\ memperc
|
||||
\ mpd_album
|
||||
\ mpd_artist
|
||||
\ mpd_bar
|
||||
\ mpd_bitrate
|
||||
\ mpd_elapsed
|
||||
\ mpd_file
|
||||
\ mpd_length
|
||||
\ mpd_name
|
||||
\ mpd_percent
|
||||
\ mpd_smart
|
||||
\ mpd_status
|
||||
\ mpd_title
|
||||
\ mpd_vol
|
||||
\ new_mails
|
||||
\ nodename
|
||||
\ offset
|
||||
\ outlinecolor
|
||||
\ pre_exec
|
||||
\ processes
|
||||
\ running_processes
|
||||
\ shadecolor
|
||||
\ stippled_hr
|
||||
\ swap
|
||||
\ swapbar
|
||||
\ swapmax
|
||||
\ swapperc
|
||||
\ sysname
|
||||
\ tab
|
||||
\ tail
|
||||
\ tcp_portmon
|
||||
\ texeci
|
||||
\ time
|
||||
\ top
|
||||
\ top_mem
|
||||
\ totaldown
|
||||
\ totalup
|
||||
\ tztime
|
||||
\ updates
|
||||
\ upspeed
|
||||
\ upspeedf
|
||||
\ upspeedgraph
|
||||
\ uptime
|
||||
\ uptime_short
|
||||
\ voffset
|
||||
\ voltage_mv
|
||||
\ voltage_v
|
||||
\ battery
|
||||
\ battery_time
|
||||
\ bmpx_album
|
||||
\ bmpx_artist
|
||||
\ bmpx_bitrate
|
||||
\ bmpx_title
|
||||
\ bmpx_track
|
||||
\ bmpx_uri
|
||||
\ buffers
|
||||
\ cached
|
||||
\ color
|
||||
\ colour
|
||||
\ cpu
|
||||
\ cpubar
|
||||
\ diskio
|
||||
\ downspeed
|
||||
\ downspeedf
|
||||
\ else
|
||||
\ entropy_avail
|
||||
\ entropy_bar
|
||||
\ entropy_poolsize
|
||||
\ exec
|
||||
\ execbar
|
||||
\ execgraph
|
||||
\ execi
|
||||
\ execibar
|
||||
\ execigraph
|
||||
\ font
|
||||
\ freq
|
||||
\ freq_dyn
|
||||
\ freq_dyn_g
|
||||
\ freq_g
|
||||
\ fs_bar
|
||||
\ fs_free
|
||||
\ fs_free_perc
|
||||
\ fs_size
|
||||
\ fs_used
|
||||
\ goto
|
||||
\ hddtemp
|
||||
\ head
|
||||
\ hr
|
||||
\ i2c
|
||||
\ i8k_ac_status
|
||||
\ i8k_bios
|
||||
\ i8k_buttons_status
|
||||
\ i8k_cpu_temp
|
||||
\ i8k_cpu_tempf
|
||||
\ i8k_left_fan_rpm
|
||||
\ i8k_left_fan_status
|
||||
\ i8k_right_fan_rpm
|
||||
\ i8k_right_fan_status
|
||||
\ i8k_serial
|
||||
\ i8k_version
|
||||
\ if_existing
|
||||
\ if_mounted
|
||||
\ if_running
|
||||
\ kernel
|
||||
\ linkstatus
|
||||
\ loadavg
|
||||
\ machine
|
||||
\ mails
|
||||
\ mem
|
||||
\ membar
|
||||
\ memmax
|
||||
\ memperc
|
||||
\ mpd_album
|
||||
\ mpd_artist
|
||||
\ mpd_bar
|
||||
\ mpd_bitrate
|
||||
\ mpd_elapsed
|
||||
\ mpd_file
|
||||
\ mpd_length
|
||||
\ mpd_name
|
||||
\ mpd_percent
|
||||
\ mpd_smart
|
||||
\ mpd_status
|
||||
\ mpd_title
|
||||
\ mpd_vol
|
||||
\ new_mails
|
||||
\ nodename
|
||||
\ offset
|
||||
\ outlinecolor
|
||||
\ pre_exec
|
||||
\ processes
|
||||
\ running_processes
|
||||
\ shadecolor
|
||||
\ stippled_hr
|
||||
\ swap
|
||||
\ swapbar
|
||||
\ swapmax
|
||||
\ swapperc
|
||||
\ sysname
|
||||
\ tab
|
||||
\ tail
|
||||
\ tcp_portmon
|
||||
\ texeci
|
||||
\ time
|
||||
\ top
|
||||
\ top_mem
|
||||
\ totaldown
|
||||
\ totalup
|
||||
\ tztime
|
||||
\ updates
|
||||
\ upspeed
|
||||
\ upspeedf
|
||||
\ upspeedgraph
|
||||
\ uptime
|
||||
\ uptime_short
|
||||
\ voffset
|
||||
\ voltage_mv
|
||||
\ voltage_v
|
||||
|
||||
hi def link ConkyrcComment Comment
|
||||
hi def link ConkyrcSetting Keyword
|
||||
|
@ -62,10 +62,6 @@ conky_SOURCES = \
|
||||
$(netbsd) \
|
||||
$(port_monitors) \
|
||||
$(solaris) \
|
||||
remotec.c \
|
||||
remotec.h \
|
||||
remoted.c \
|
||||
remoted.h \
|
||||
timed_thread.c \
|
||||
timed_thread.h \
|
||||
$(x11) \
|
||||
|
187
src/audacious.c
187
src/audacious.c
@ -41,17 +41,17 @@ static audacious_t audacious_items;
|
||||
* ----------------------------------------- */
|
||||
void update_audacious(void)
|
||||
{
|
||||
/*
|
||||
The worker thread is updating audacious_items array asynchronously to the main
|
||||
conky thread. We merely copy the audacious_items array into the main thread's
|
||||
info structure when the main thread's update cycle fires.
|
||||
*/
|
||||
if (!info.audacious.p_timed_thread)
|
||||
return;
|
||||
/*
|
||||
The worker thread is updating audacious_items array asynchronously to the main
|
||||
conky thread. We merely copy the audacious_items array into the main thread's
|
||||
info structure when the main thread's update cycle fires.
|
||||
*/
|
||||
if (!info.audacious.p_timed_thread)
|
||||
return;
|
||||
|
||||
timed_thread_lock (info.audacious.p_timed_thread);
|
||||
memcpy(&info.audacious.items,audacious_items,sizeof(audacious_items));
|
||||
timed_thread_unlock (info.audacious.p_timed_thread);
|
||||
timed_thread_lock (info.audacious.p_timed_thread);
|
||||
memcpy(&info.audacious.items,audacious_items,sizeof(audacious_items));
|
||||
timed_thread_unlock (info.audacious.p_timed_thread);
|
||||
}
|
||||
|
||||
|
||||
@ -62,13 +62,13 @@ void update_audacious(void)
|
||||
* ------------------------------------------------------------*/
|
||||
int create_audacious_thread(void)
|
||||
{
|
||||
if (!info.audacious.p_timed_thread)
|
||||
info.audacious.p_timed_thread = timed_thread_create (audacious_thread_func, NULL, 1000000);
|
||||
if (!info.audacious.p_timed_thread)
|
||||
info.audacious.p_timed_thread = timed_thread_create (audacious_thread_func, NULL, 1000000);
|
||||
|
||||
if (!info.audacious.p_timed_thread)
|
||||
return (-1);
|
||||
if (!info.audacious.p_timed_thread)
|
||||
return (-1);
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------
|
||||
@ -78,13 +78,13 @@ int create_audacious_thread(void)
|
||||
* ------------------------------------------------ */
|
||||
int destroy_audacious_thread(void)
|
||||
{
|
||||
/* Is a worker is thread running? If not, no error. */
|
||||
if (!info.audacious.p_timed_thread)
|
||||
return(0);
|
||||
/* Is a worker is thread running? If not, no error. */
|
||||
if (!info.audacious.p_timed_thread)
|
||||
return(0);
|
||||
|
||||
timed_thread_destroy (info.audacious.p_timed_thread, &info.audacious.p_timed_thread);
|
||||
timed_thread_destroy (info.audacious.p_timed_thread, &info.audacious.p_timed_thread);
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------
|
||||
@ -92,97 +92,96 @@ int destroy_audacious_thread(void)
|
||||
* --------------------------------------------------- */
|
||||
void *audacious_thread_func(void *pvoid)
|
||||
{
|
||||
static audacious_t items;
|
||||
gint session,playpos,frames,length;
|
||||
gint rate,freq,chans;
|
||||
gchar *psong,*pfilename;
|
||||
static audacious_t items;
|
||||
gint session,playpos,frames,length;
|
||||
gint rate,freq,chans;
|
||||
gchar *psong,*pfilename;
|
||||
|
||||
pvoid=(void *)pvoid; /* avoid warning */
|
||||
session=0;
|
||||
psong=NULL;
|
||||
pfilename=NULL;
|
||||
pvoid=(void *)pvoid; /* avoid warning */
|
||||
session=0;
|
||||
psong=NULL;
|
||||
pfilename=NULL;
|
||||
|
||||
/* Loop until the main thread sets the runnable signal to 0i via timed_thread_destroy. */
|
||||
while (1) {
|
||||
/* Loop until the main thread sets the runnable signal to 0i via timed_thread_destroy. */
|
||||
while (1) {
|
||||
|
||||
if (!xmms_remote_is_running (session)) {
|
||||
memset(&items,0,sizeof(items));
|
||||
strcpy(items[AUDACIOUS_STATUS],"Not running");
|
||||
goto next_iter;
|
||||
}
|
||||
if (!xmms_remote_is_running (session))
|
||||
{
|
||||
memset(&items,0,sizeof(items));
|
||||
strcpy(items[AUDACIOUS_STATUS],"Not running");
|
||||
goto next_iter;
|
||||
}
|
||||
|
||||
/* 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");
|
||||
/* 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 = xmms_remote_get_playlist_pos (session);
|
||||
psong = xmms_remote_get_playlist_title (session, playpos);
|
||||
if (psong) {
|
||||
strncpy(items[AUDACIOUS_TITLE],psong,sizeof(items[AUDACIOUS_TITLE])-1);
|
||||
g_free (psong);
|
||||
psong=NULL;
|
||||
}
|
||||
/* Current song title */
|
||||
playpos = xmms_remote_get_playlist_pos (session);
|
||||
psong = xmms_remote_get_playlist_title (session, playpos);
|
||||
if (psong)
|
||||
{
|
||||
strncpy(items[AUDACIOUS_TITLE],psong,sizeof(items[AUDACIOUS_TITLE])-1);
|
||||
g_free (psong);
|
||||
psong=NULL;
|
||||
}
|
||||
|
||||
/* Current song length as MM:SS */
|
||||
frames = xmms_remote_get_playlist_time (session,playpos);
|
||||
length = frames / 1000;
|
||||
snprintf(items[AUDACIOUS_LENGTH],sizeof(items[AUDACIOUS_LENGTH])-1,
|
||||
"%d:%.2d", length / 60, length % 60);
|
||||
/* Current song length as MM:SS */
|
||||
frames = xmms_remote_get_playlist_time (session,playpos);
|
||||
length = frames / 1000;
|
||||
snprintf(items[AUDACIOUS_LENGTH],sizeof(items[AUDACIOUS_LENGTH])-1, "%d:%.2d", length / 60, length % 60);
|
||||
|
||||
/* Current song length in seconds */
|
||||
snprintf(items[AUDACIOUS_LENGTH_SECONDS],sizeof(items[AUDACIOUS_LENGTH_SECONDS])-1,
|
||||
"%d", length);
|
||||
/* Current song length in seconds */
|
||||
snprintf(items[AUDACIOUS_LENGTH_SECONDS],sizeof(items[AUDACIOUS_LENGTH_SECONDS])-1, "%d", length);
|
||||
|
||||
/* Current song position as MM:SS */
|
||||
frames = xmms_remote_get_output_time (session);
|
||||
length = frames / 1000;
|
||||
snprintf(items[AUDACIOUS_POSITION],sizeof(items[AUDACIOUS_POSITION])-1,
|
||||
"%d:%.2d", length / 60, length % 60);
|
||||
/* Current song position as MM:SS */
|
||||
frames = xmms_remote_get_output_time (session);
|
||||
length = frames / 1000;
|
||||
snprintf(items[AUDACIOUS_POSITION],sizeof(items[AUDACIOUS_POSITION])-1,
|
||||
"%d:%.2d", length / 60, length % 60);
|
||||
|
||||
/* Current song position in seconds */
|
||||
snprintf(items[AUDACIOUS_POSITION_SECONDS],sizeof(items[AUDACIOUS_POSITION_SECONDS])-1,
|
||||
"%d", length);
|
||||
/* Current song position in seconds */
|
||||
snprintf(items[AUDACIOUS_POSITION_SECONDS],sizeof(items[AUDACIOUS_POSITION_SECONDS])-1, "%d", length);
|
||||
|
||||
/* Current song bitrate */
|
||||
xmms_remote_get_info (session, &rate, &freq, &chans);
|
||||
snprintf(items[AUDACIOUS_BITRATE],sizeof(items[AUDACIOUS_BITRATE])-1, "%d", rate);
|
||||
/* Current song bitrate */
|
||||
xmms_remote_get_info (session, &rate, &freq, &chans);
|
||||
snprintf(items[AUDACIOUS_BITRATE],sizeof(items[AUDACIOUS_BITRATE])-1, "%d", rate);
|
||||
|
||||
/* Current song frequency */
|
||||
snprintf(items[AUDACIOUS_FREQUENCY],sizeof(items[AUDACIOUS_FREQUENCY])-1, "%d", freq);
|
||||
/* Current song frequency */
|
||||
snprintf(items[AUDACIOUS_FREQUENCY],sizeof(items[AUDACIOUS_FREQUENCY])-1, "%d", freq);
|
||||
|
||||
/* Current song channels */
|
||||
snprintf(items[AUDACIOUS_CHANNELS],sizeof(items[AUDACIOUS_CHANNELS])-1, "%d", chans);
|
||||
/* Current song channels */
|
||||
snprintf(items[AUDACIOUS_CHANNELS],sizeof(items[AUDACIOUS_CHANNELS])-1, "%d", chans);
|
||||
|
||||
/* Current song filename */
|
||||
pfilename = xmms_remote_get_playlist_file (session,playpos);
|
||||
if (pfilename) {
|
||||
strncpy(items[AUDACIOUS_FILENAME],pfilename,sizeof(items[AUDACIOUS_FILENAME])-1);
|
||||
g_free (pfilename);
|
||||
pfilename=NULL;
|
||||
}
|
||||
/* Current song filename */
|
||||
pfilename = xmms_remote_get_playlist_file (session,playpos);
|
||||
if (pfilename)
|
||||
{
|
||||
strncpy(items[AUDACIOUS_FILENAME],pfilename,sizeof(items[AUDACIOUS_FILENAME])-1);
|
||||
g_free (pfilename);
|
||||
pfilename=NULL;
|
||||
}
|
||||
|
||||
/* Length of the Playlist (number of songs) */
|
||||
length = xmms_remote_get_playlist_length (session);
|
||||
snprintf(items[AUDACIOUS_PLAYLIST_LENGTH],sizeof(items[AUDACIOUS_PLAYLIST_LENGTH])-1, "%d", length);
|
||||
/* Length of the Playlist (number of songs) */
|
||||
length = xmms_remote_get_playlist_length (session);
|
||||
snprintf(items[AUDACIOUS_PLAYLIST_LENGTH],sizeof(items[AUDACIOUS_PLAYLIST_LENGTH])-1, "%d", length);
|
||||
|
||||
/* Playlist position (index of song) */
|
||||
snprintf(items[AUDACIOUS_PLAYLIST_POSITION],sizeof(items[AUDACIOUS_PLAYLIST_POSITION])-1,
|
||||
"%d", playpos+1);
|
||||
/* Playlist position (index of song) */
|
||||
snprintf(items[AUDACIOUS_PLAYLIST_POSITION],sizeof(items[AUDACIOUS_PLAYLIST_POSITION])-1,
|
||||
"%d", playpos+1);
|
||||
|
||||
next_iter:
|
||||
|
||||
/* Deliver the refreshed items array to audacious_items. */
|
||||
timed_thread_lock (info.audacious.p_timed_thread);
|
||||
memcpy(&audacious_items,items,sizeof(items));
|
||||
timed_thread_unlock (info.audacious.p_timed_thread);
|
||||
/* Deliver the refreshed items array to audacious_items. */
|
||||
timed_thread_lock (info.audacious.p_timed_thread);
|
||||
memcpy(&audacious_items,items,sizeof(items));
|
||||
timed_thread_unlock (info.audacious.p_timed_thread);
|
||||
|
||||
if (timed_thread_test (info.audacious.p_timed_thread))
|
||||
timed_thread_exit (info.audacious.p_timed_thread);
|
||||
|
||||
}
|
||||
if (timed_thread_test (info.audacious.p_timed_thread))
|
||||
timed_thread_exit (info.audacious.p_timed_thread);
|
||||
}
|
||||
}
|
||||
|
18
src/common.c
18
src/common.c
@ -7,8 +7,6 @@
|
||||
*/
|
||||
|
||||
#include "conky.h"
|
||||
#include "remoted.h"
|
||||
#include "remotec.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@ -30,6 +28,11 @@ double get_time()
|
||||
return tv.tv_sec + (tv.tv_usec / 1000000.0);
|
||||
}
|
||||
|
||||
#if defined(HAVE_LIBDEXTER) && defined(__linux__)
|
||||
#define USE_OS_SPECIFIC_OPEN_FILE
|
||||
#endif
|
||||
|
||||
#ifndef USE_OS_SPECIFIC_OPEN_FILE
|
||||
FILE *open_file(const char *file, int *reported)
|
||||
{
|
||||
FILE *fp = fopen(file, "r");
|
||||
@ -44,6 +47,7 @@ FILE *open_file(const char *file, int *reported)
|
||||
|
||||
return fp;
|
||||
}
|
||||
#endif
|
||||
|
||||
void variable_substitute(const char *s, char *dest, unsigned int n)
|
||||
{
|
||||
@ -129,6 +133,11 @@ struct net_stat *get_net_stat(const char *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void clear_net_stats (void)
|
||||
{
|
||||
memset (netstats, 0, sizeof(netstats));
|
||||
}
|
||||
|
||||
void format_seconds(char *buf, unsigned int n, long t)
|
||||
{
|
||||
if (t >= 24 * 60 * 60) /* hours necessary when there are days? */
|
||||
@ -157,6 +166,7 @@ static double last_meminfo_update;
|
||||
static double last_fs_update;
|
||||
|
||||
unsigned long long need_mask;
|
||||
#define NEED(a) ((need_mask & (1 << a)) && ((info.mask & (1 << a)) == 0))
|
||||
|
||||
void update_stuff()
|
||||
{
|
||||
@ -178,8 +188,6 @@ void update_stuff()
|
||||
}
|
||||
|
||||
prepare_update();
|
||||
/* client(); this is approximately where the client should be called */
|
||||
#define NEED(a) ((need_mask & (1 << a)) && ((info.mask & (1 << a)) == 0))
|
||||
|
||||
if (NEED(INFO_UPTIME))
|
||||
update_uptime();
|
||||
@ -205,8 +213,6 @@ void update_stuff()
|
||||
if (NEED(INFO_MAIL))
|
||||
update_mail_count();
|
||||
|
||||
|
||||
|
||||
#if defined(__linux__)
|
||||
if (NEED(INFO_I8K))
|
||||
update_i8k();
|
||||
|
311
src/conky.c
311
src/conky.c
@ -95,6 +95,9 @@ static void print_version()
|
||||
#ifdef TCP_PORT_MONITOR
|
||||
" * portmon\n"
|
||||
#endif /* TCP_PORT_MONITOR */
|
||||
#ifdef HAVE_LIBDEXTER
|
||||
" * network\n"
|
||||
#endif
|
||||
"\n");
|
||||
|
||||
exit(0);
|
||||
@ -274,9 +277,6 @@ static char *current_config;
|
||||
/* set to 1 if you want all text to be in uppercase */
|
||||
static unsigned int stuff_in_upper_case;
|
||||
|
||||
/* Update interval */
|
||||
static double update_interval;
|
||||
|
||||
/* Run how many times? */
|
||||
static unsigned long total_run_times;
|
||||
|
||||
@ -380,6 +380,11 @@ static int pad_percents = 0;
|
||||
tcp_port_monitor_args_t tcp_port_monitor_args;
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_LIBDEXTER
|
||||
/* private config items for libdexter */
|
||||
static char *dexter_config = NULL;
|
||||
#endif
|
||||
|
||||
/* Text that is shown */
|
||||
static char original_text[] =
|
||||
"$nodename - $sysname $kernel on $machine\n"
|
||||
@ -1076,7 +1081,6 @@ enum text_object_type {
|
||||
#ifdef TCP_PORT_MONITOR
|
||||
OBJ_tcp_portmon,
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_ICONV
|
||||
OBJ_iconv_start,
|
||||
OBJ_iconv_stop,
|
||||
@ -2006,7 +2010,7 @@ static struct text_object *construct_text_object(const char *s, const char *arg,
|
||||
OBJ(acpitemp, 0) obj->data.i = open_acpi_temperature(arg);
|
||||
END OBJ(acpitempf, 0) obj->data.i = open_acpi_temperature(arg);
|
||||
END OBJ(acpiacadapter, 0)
|
||||
END OBJ(freq, 0)
|
||||
END OBJ(freq, INFO_FREQ)
|
||||
get_cpu_count();
|
||||
if (!arg
|
||||
|| !isdigit(arg[0])
|
||||
@ -2022,7 +2026,7 @@ static struct text_object *construct_text_object(const char *s, const char *arg,
|
||||
obj->data.cpu_index=atoi(&arg[0]);
|
||||
}
|
||||
obj->a = 1;
|
||||
END OBJ(freq_g, 0)
|
||||
END OBJ(freq_g, INFO_FREQ)
|
||||
get_cpu_count();
|
||||
if (!arg
|
||||
|| !isdigit(arg[0])
|
||||
@ -2071,9 +2075,6 @@ static struct text_object *construct_text_object(const char *s, const char *arg,
|
||||
obj->data.cpu_index=atoi(&arg[0]);
|
||||
}
|
||||
obj->a = 1;
|
||||
#else
|
||||
END OBJ(freq, 0);
|
||||
END OBJ(freq_g, 0);
|
||||
#endif /* __linux__ */
|
||||
END OBJ(freq_dyn, 0);
|
||||
END OBJ(freq_dyn_g, 0);
|
||||
@ -3428,15 +3429,15 @@ static void generate_text_internal(char *p, int p_max_size, struct text_object *
|
||||
}
|
||||
} else {
|
||||
if (diskio_value > 1024*1024) {
|
||||
snprintf(p, 6, "%.1fGiB ",
|
||||
snprintf(p, 12, "%.1fGiB ",
|
||||
(double)diskio_value/1024/1024);
|
||||
} else if (diskio_value > 1024) {
|
||||
snprintf(p, 6, "%.1fMiB ",
|
||||
snprintf(p, 12, "%.1fMiB ",
|
||||
(double)diskio_value/1024);
|
||||
} else if (diskio_value > 0) {
|
||||
snprintf(p, 6, "%dKiB ", diskio_value);
|
||||
snprintf(p, 12, "%dKiB ", diskio_value);
|
||||
} else {
|
||||
snprintf(p, 6, "%dB ", diskio_value);
|
||||
snprintf(p, 12, "%dB ", diskio_value);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -3469,8 +3470,10 @@ static void generate_text_internal(char *p, int p_max_size, struct text_object *
|
||||
recv_speed / 1024.0);
|
||||
}
|
||||
OBJ(downspeedgraph) {
|
||||
if (obj->data.net->recv_speed == 0) // this is just to make the ugliness at start go away
|
||||
/*
|
||||
if (obj->data.net->recv_speed == 0)
|
||||
obj->data.net->recv_speed = 0.01;
|
||||
*/
|
||||
new_graph(p, obj->a, obj->b, obj->c, obj->d,
|
||||
(obj->data.net->recv_speed /
|
||||
1024.0), obj->e, 1);
|
||||
@ -4244,8 +4247,10 @@ static void generate_text_internal(char *p, int p_max_size, struct text_object *
|
||||
trans_speed / 1024.0);
|
||||
}
|
||||
OBJ(upspeedgraph) {
|
||||
if (obj->data.net->trans_speed == 0) // this is just to make the ugliness at start go away
|
||||
/*
|
||||
if (obj->data.net->trans_speed == 0)
|
||||
obj->data.net->trans_speed = 0.01;
|
||||
*/
|
||||
new_graph(p, obj->a, obj->b, obj->c, obj->d,
|
||||
(obj->data.net->trans_speed /
|
||||
1024.0), obj->e, 1);
|
||||
@ -5065,7 +5070,6 @@ static void draw_string(const char *s)
|
||||
printf("%s\n", s);
|
||||
fflush(stdout); /* output immediately, don't buffer */
|
||||
}
|
||||
/* daemon_run(s); the daemon can be called here, but we need to have a buffer in daemon_run() and we need to tell it when everything is ready to be sent */
|
||||
memset(tmpstring1,0,TEXT_BUFFER_SIZE);
|
||||
memset(tmpstring2,0,TEXT_BUFFER_SIZE);
|
||||
strncpy(tmpstring1, s, TEXT_BUFFER_SIZE-1);
|
||||
@ -5881,22 +5885,41 @@ static void main_loop()
|
||||
|
||||
case ButtonPress:
|
||||
if (own_window)
|
||||
{
|
||||
{
|
||||
/* if an ordinary window with decorations */
|
||||
if ((window.type==TYPE_NORMAL) && (!TEST_HINT(window.hints,HINT_UNDECORATED)))
|
||||
{
|
||||
/* allow conky to hold input focus.*/
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* forward the click to the desktop window */
|
||||
XUngrabPointer(display, ev.xbutton.time);
|
||||
ev.xbutton.window = window.desktop;
|
||||
XSendEvent(display, ev.xbutton.window, False, ButtonPressMask, &ev);
|
||||
}
|
||||
XSetInputFocus(display, ev.xbutton.window,RevertToParent,ev.xbutton.time);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case ButtonRelease:
|
||||
if (own_window)
|
||||
{
|
||||
/* forward the release to the desktop window */
|
||||
ev.xbutton.window = window.desktop;
|
||||
XSendEvent(display, ev.xbutton.window, False, ButtonReleaseMask, &ev);
|
||||
}
|
||||
break;
|
||||
if (own_window)
|
||||
{
|
||||
/* if an ordinary window with decorations */
|
||||
if ((window.type==TYPE_NORMAL) && (!TEST_HINT(window.hints,HINT_UNDECORATED)))
|
||||
{
|
||||
/* allow conky to hold input focus.*/
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* forward the release to the desktop window */
|
||||
ev.xbutton.window = window.desktop;
|
||||
XSendEvent(display, ev.xbutton.window, False, ButtonReleaseMask, &ev);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
#endif
|
||||
|
||||
@ -6092,6 +6115,12 @@ void clean_up(void)
|
||||
free (specials);
|
||||
specials=NULL;
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBDEXTER
|
||||
dexter_library_exit ();
|
||||
if (dexter_config)
|
||||
free (dexter_config);
|
||||
#endif
|
||||
}
|
||||
|
||||
static int string_to_bool(const char *s)
|
||||
@ -6188,7 +6217,9 @@ static void set_default_configurations(void)
|
||||
own_window = 0;
|
||||
window.type=TYPE_NORMAL;
|
||||
window.hints=0;
|
||||
strcpy(window.wm_class_name, "conky");
|
||||
strcpy(window.class_name, "Conky");
|
||||
update_uname();
|
||||
sprintf(window.title,"%s - conky",info.uname_s.nodename);
|
||||
#endif
|
||||
stippled_borders = 0;
|
||||
border_margin = 3;
|
||||
@ -6522,14 +6553,34 @@ else if (strcasecmp(name, a) == 0 || strcasecmp(name, b) == 0)
|
||||
#ifdef X11
|
||||
#ifdef OWN_WINDOW
|
||||
CONF("own_window") {
|
||||
own_window = string_to_bool(value);
|
||||
if (value)
|
||||
own_window = string_to_bool(value);
|
||||
else
|
||||
CONF_ERR;
|
||||
}
|
||||
CONF("wm_class_name") {
|
||||
memset(window.wm_class_name,0,sizeof(window.wm_class_name));
|
||||
strncpy(window.wm_class_name, value, sizeof(window.wm_class_name)-1);
|
||||
CONF("own_window_class") {
|
||||
if (value)
|
||||
{
|
||||
memset(window.class_name,0,sizeof(window.class_name));
|
||||
strncpy(window.class_name, value, sizeof(window.class_name)-1);
|
||||
}
|
||||
else
|
||||
CONF_ERR;
|
||||
}
|
||||
CONF("own_window_title") {
|
||||
if (value)
|
||||
{
|
||||
memset(window.title,0,sizeof(window.title));
|
||||
strncpy(window.title, value, sizeof(window.title)-1);
|
||||
}
|
||||
else
|
||||
CONF_ERR;
|
||||
}
|
||||
CONF("own_window_transparent") {
|
||||
set_transparent = string_to_bool(value);
|
||||
if (value)
|
||||
set_transparent = string_to_bool(value);
|
||||
else
|
||||
CONF_ERR;
|
||||
}
|
||||
CONF("own_window_colour") {
|
||||
if (value) {
|
||||
@ -6566,6 +6617,8 @@ else if (strcasecmp(name, a) == 0 || strcasecmp(name, b) == 0)
|
||||
}
|
||||
while (p_hint!=NULL);
|
||||
}
|
||||
else
|
||||
CONF_ERR;
|
||||
}
|
||||
CONF("own_window_type") {
|
||||
if (value) {
|
||||
@ -6576,8 +6629,10 @@ else if (strcasecmp(name, a) == 0 || strcasecmp(name, b) == 0)
|
||||
else if (strncmp(value,"override",8)==0)
|
||||
window.type = TYPE_OVERRIDE;
|
||||
else
|
||||
CONF_ERR;
|
||||
CONF_ERR;
|
||||
}
|
||||
else
|
||||
CONF_ERR;
|
||||
}
|
||||
#endif
|
||||
CONF("stippled_borders") {
|
||||
@ -6667,6 +6722,29 @@ else if (strcasecmp(name, a) == 0 || strcasecmp(name, b) == 0)
|
||||
/* else tcp_port_monitor_args.max_port_monitor_connections > 0 as per config */
|
||||
}
|
||||
#endif
|
||||
#ifdef HAVE_LIBDEXTER
|
||||
CONF("dexter_client")
|
||||
{
|
||||
if (value)
|
||||
dexter_client = string_to_bool (value);
|
||||
else
|
||||
CONF_ERR;
|
||||
}
|
||||
CONF("dexter_server")
|
||||
{
|
||||
if (value)
|
||||
dexter_server = string_to_bool (value);
|
||||
else
|
||||
CONF_ERR;
|
||||
}
|
||||
CONF("dexter_config")
|
||||
{
|
||||
if (value)
|
||||
dexter_config = strdup (value);
|
||||
else
|
||||
CONF_ERR;
|
||||
}
|
||||
#endif
|
||||
|
||||
else
|
||||
ERR("%s: %d: no such configuration: '%s'", f, line, name);
|
||||
@ -6933,9 +7011,48 @@ int main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
update_uname();
|
||||
#ifdef HAVE_LIBDEXTER
|
||||
memset (&packet_arrival_time, 0, sizeof (struct timespec));
|
||||
dexter_library_init ();
|
||||
if (dexter_client)
|
||||
{
|
||||
/* wait until some data packets arrive, else conky complains
|
||||
* bittery that /proc filesystems cannot be opened and, worse,
|
||||
* will likely segfault when it references unchecked pointers
|
||||
* in get_text_internal() -- those should be cleaned up.
|
||||
*/
|
||||
int try;
|
||||
const int max_tries=30;
|
||||
gboolean got_packet;
|
||||
GTimeVal timeval;
|
||||
fprintf (stderr, "Conky: waiting for data packets to arrive ...\n");
|
||||
for (try=0;try<max_tries;try++)
|
||||
{
|
||||
/* pause main thread for 1 sec */
|
||||
g_get_current_time (&timeval);
|
||||
g_time_val_add (&timeval, G_USEC_PER_SEC);
|
||||
g_mutex_lock (packet_mutex);
|
||||
/* mutex released before sleeping; re-acquired after time elapses */
|
||||
g_cond_timed_wait (packet_cond, packet_mutex, &timeval);
|
||||
got_packet = packet_arrival_time.tv_sec>0;
|
||||
g_mutex_unlock (packet_mutex);
|
||||
|
||||
if (got_packet)
|
||||
break;
|
||||
}
|
||||
if (got_packet)
|
||||
{
|
||||
fprintf(stderr, "Conky: packets arriving ...\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "Conky: no data packets ...\n");
|
||||
dexter_library_exit ();
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
generate_text();
|
||||
#ifdef X11
|
||||
selected_font = 0;
|
||||
update_text_area(); /* to get initial size of the window */
|
||||
@ -6944,7 +7061,7 @@ int main(int argc, char **argv)
|
||||
(own_window,
|
||||
text_width + border_margin * 2 + 1,
|
||||
text_height + border_margin * 2 + 1,
|
||||
set_transparent, background_colour, info.uname_s.nodename, argv, argc);
|
||||
set_transparent, background_colour, argv, argc);
|
||||
|
||||
selected_font = 0;
|
||||
update_text_area(); /* to position text/window on screen */
|
||||
@ -6988,7 +7105,13 @@ int main(int argc, char **argv)
|
||||
timed_thread_register (info.audacious.p_timed_thread, &info.audacious.p_timed_thread);
|
||||
#endif
|
||||
|
||||
main_loop();
|
||||
/*
|
||||
* ***************
|
||||
* MAIN CONKY LOOP
|
||||
* ***************
|
||||
*
|
||||
*/
|
||||
main_loop();
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
kvm_close(kd);
|
||||
@ -7004,3 +7127,119 @@ void signal_handler(int sig)
|
||||
* and do any signal processing there, NOT here. */
|
||||
g_signal_pending=sig;
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBDEXTER
|
||||
void dexter_library_init (void)
|
||||
{
|
||||
/* start libdexter */
|
||||
if (dexter_client || dexter_server)
|
||||
{
|
||||
GError *error = NULL;
|
||||
dexter_init (dexter_config, &error);
|
||||
if (error)
|
||||
CRIT_ERR ("%s", error->message);
|
||||
|
||||
if (dexter_client)
|
||||
{
|
||||
if (!(info.dexter.channel = dexter_channel_new (NULL, NULL, NULL, dexter_channel_events)))
|
||||
CRIT_ERR("unable to create channel to server");
|
||||
dexter_channel_open (info.dexter.channel, &error);
|
||||
if (error)
|
||||
CRIT_ERR ("%s", error->message);
|
||||
dexter_channel_greet (info.dexter.channel, &error);
|
||||
if (error)
|
||||
CRIT_ERR ("%s", error->message);
|
||||
if (dexter_client_init () < 0)
|
||||
CRIT_ERR ("error initializing dexter client");
|
||||
|
||||
packet_mutex = g_mutex_new ();
|
||||
packet_cond = g_cond_new ();
|
||||
}
|
||||
|
||||
if (dexter_server)
|
||||
{
|
||||
if (!(info.dexter.server = dexter_server_new (NULL, NULL, NULL)))
|
||||
CRIT_ERR("unable to create server");
|
||||
dexter_server_start (info.dexter.server, &error);
|
||||
if (error)
|
||||
CRIT_ERR ("%s", error->message);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void dexter_library_exit (void)
|
||||
{
|
||||
/* shutdown libdexter */
|
||||
if (dexter_client || dexter_server)
|
||||
{
|
||||
GError *error = NULL;
|
||||
|
||||
if (dexter_client)
|
||||
{
|
||||
if (dexter_client_exit () < 0)
|
||||
ERR ("error de-initializing dexter client");
|
||||
if (info.dexter.channel)
|
||||
{
|
||||
dexter_channel_part (info.dexter.channel, &error);
|
||||
if (error)
|
||||
{
|
||||
ERR("%s", error->message);
|
||||
g_clear_error (&error);
|
||||
}
|
||||
dexter_channel_close (info.dexter.channel, &error);
|
||||
if (error)
|
||||
{
|
||||
ERR("%s", error->message);
|
||||
g_clear_error (&error);
|
||||
}
|
||||
dexter_channel_free (info.dexter.channel);
|
||||
info.dexter.channel=NULL;
|
||||
}
|
||||
|
||||
if (packet_mutex)
|
||||
{
|
||||
g_mutex_free (packet_mutex);
|
||||
packet_mutex=NULL;
|
||||
}
|
||||
if (packet_cond)
|
||||
{
|
||||
g_cond_free (packet_cond);
|
||||
packet_cond=NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (dexter_server)
|
||||
{
|
||||
if (info.dexter.server)
|
||||
{
|
||||
dexter_server_stop (info.dexter.server, &error);
|
||||
if (error)
|
||||
{
|
||||
ERR("%s", error->message);
|
||||
g_clear_error (&error);
|
||||
}
|
||||
dexter_server_free (info.dexter.server);
|
||||
info.dexter.server=NULL;
|
||||
}
|
||||
}
|
||||
|
||||
dexter_exit ();
|
||||
}
|
||||
}
|
||||
|
||||
void dexter_channel_events (DexterChannel *channel, gint event)
|
||||
{
|
||||
if (!channel)
|
||||
return;
|
||||
|
||||
/* if server disconnects we get this event. we also get it normally
|
||||
* following dexter_channel_part(). */
|
||||
if (event == DEXTER_CHANNEL_EVENT_NOCONN)
|
||||
{
|
||||
fprintf (stderr, "Conky: channel to server closed\n");
|
||||
if (dexter_client && (dexter_client_exit () < 0))
|
||||
ERR ("error de-initializing dexter client");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
49
src/conky.h
49
src/conky.h
@ -32,6 +32,10 @@
|
||||
#include <machine/apm_bios.h>
|
||||
#endif /* __FreeBSD__ */
|
||||
|
||||
#ifdef HAVE_LIBDEXTER
|
||||
#include <dexter.h>
|
||||
#endif
|
||||
|
||||
#ifdef AUDACIOUS
|
||||
#include "audacious.h"
|
||||
#endif
|
||||
@ -198,6 +202,35 @@ struct entropy_s {
|
||||
#define MAX_PORT_MONITOR_CONNECTIONS_DEFAULT 256
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_LIBDEXTER
|
||||
/* main start/stop for libdexter */
|
||||
void dexter_library_init (void);
|
||||
void dexter_library_exit (void);
|
||||
|
||||
/* os-specific init/exit for libdexter client activity */
|
||||
int dexter_client_init (void);
|
||||
int dexter_client_exit (void);
|
||||
|
||||
/* dexter channel events, i.e. we want to know if channel closes */
|
||||
void dexter_channel_events (DexterChannel *, gint);
|
||||
|
||||
/* info struct for libdexter */
|
||||
struct dexter_s {
|
||||
DexterChannel *channel;
|
||||
DexterServer *server;
|
||||
DexterServiceBroker *broker;
|
||||
};
|
||||
|
||||
/* public config items for libdexter */
|
||||
int dexter_client;
|
||||
int dexter_server;
|
||||
|
||||
/* data packet arrival time */
|
||||
struct timespec packet_arrival_time;
|
||||
GMutex *packet_mutex;
|
||||
GCond *packet_cond;
|
||||
#endif
|
||||
|
||||
enum {
|
||||
INFO_CPU = 0,
|
||||
INFO_MAIL = 1,
|
||||
@ -246,6 +279,9 @@ enum {
|
||||
#include "libmpdclient.h"
|
||||
#endif
|
||||
|
||||
/* Update interval */
|
||||
double update_interval;
|
||||
|
||||
volatile int g_signal_pending;
|
||||
|
||||
struct information {
|
||||
@ -298,7 +334,10 @@ struct information {
|
||||
struct process *first_process;
|
||||
unsigned long looped;
|
||||
#ifdef TCP_PORT_MONITOR
|
||||
tcp_port_monitor_collection_t * p_tcp_port_monitor_collection;
|
||||
tcp_port_monitor_collection_t * p_tcp_port_monitor_collection;
|
||||
#endif
|
||||
#ifdef HAVE_LIBDEXTER
|
||||
struct dexter_s dexter;
|
||||
#endif
|
||||
short kflags; /* kernel settings, see enum KFLAG */
|
||||
struct entropy_s entropy;
|
||||
@ -375,7 +414,8 @@ struct conky_window {
|
||||
int width;
|
||||
int height;
|
||||
#ifdef OWN_WINDOW
|
||||
char wm_class_name[256];
|
||||
char class_name[256];
|
||||
char title[256];
|
||||
int x;
|
||||
int y;
|
||||
unsigned int type;
|
||||
@ -402,8 +442,8 @@ extern int workarea[4];
|
||||
extern struct conky_window window;
|
||||
|
||||
void init_X11();
|
||||
void init_window(int use_own_window, int width, int height, int set_trans, int back_colour, char * nodename,
|
||||
char **argv, int argc);
|
||||
void init_window(int use_own_window, int width, int height, int set_trans, int back_colour,
|
||||
char **argv, int argc);
|
||||
void create_gc();
|
||||
void set_transparent_background(Window win);
|
||||
long get_x11_color(const char *);
|
||||
@ -426,6 +466,7 @@ void variable_substitute(const char *s, char *dest, unsigned int n);
|
||||
void format_seconds(char *buf, unsigned int n, long t);
|
||||
void format_seconds_short(char *buf, unsigned int n, long t);
|
||||
struct net_stat *get_net_stat(const char *dev);
|
||||
void clear_net_stats(void);
|
||||
|
||||
void update_stuff();
|
||||
|
||||
|
@ -918,3 +918,20 @@ void
|
||||
free_all_processes(void)
|
||||
{
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBDEXTER
|
||||
/* return 0 on success, -1 on failure */
|
||||
int dexter_client_init (void)
|
||||
{
|
||||
/* init libdexter for freebsd-specific client-side activity */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* return 0 on success, -1 on failure */
|
||||
int dexter_client_exit (void)
|
||||
{
|
||||
/* de-init libdexter for freebsd-specific client-side activity */
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
740
src/linux.c
740
src/linux.c
@ -32,81 +32,72 @@
|
||||
#define SHORTSTAT_TEMPL "%*s %llu %llu %llu"
|
||||
#define LONGSTAT_TEMPL "%*s %llu %llu %llu "
|
||||
|
||||
|
||||
static struct sysinfo s_info;
|
||||
#ifdef HAVE_LIBDEXTER
|
||||
/* need the procraw service from the libdexter dxt-sysinfo plugin */
|
||||
#include <dxt-sysinfo/procraw-public.h>
|
||||
#define PROCRAW_SERVICE_UUID "ce975a10-0e52-458a-a4b9-253734760436"
|
||||
/* timed sampler that delivers the procraw data */
|
||||
static DexterTimedSampler *procraw_sampler = NULL;
|
||||
/* procraw structure used as /proc surrogate */
|
||||
static DxtSysinfoProcrawData procraw_data;
|
||||
/* data selector mask for the service */
|
||||
gint procraw_mask;
|
||||
#endif
|
||||
|
||||
static int show_nice_processes;
|
||||
|
||||
/* this flags tells the linux routines to use the /proc system
|
||||
* where possible, even if other api's are available, e.g. sysinfo()
|
||||
* or getloadavg(). the reason for this is to allow for /proc-based
|
||||
* distributed monitoring. using a flag in this manner creates less
|
||||
* confusing code.
|
||||
*/
|
||||
static int prefer_proc = 0;
|
||||
|
||||
void prepare_update()
|
||||
{
|
||||
}
|
||||
|
||||
static void update_sysinfo()
|
||||
{
|
||||
sysinfo(&s_info);
|
||||
|
||||
info.uptime = (double) s_info.uptime;
|
||||
|
||||
/* there was some problem with these */
|
||||
#if 0
|
||||
// info.loadavg[0] = s_info.loads[0] / 100000.0f;
|
||||
info.loadavg[1] = s_info.loads[1] / 100000.0f;
|
||||
info.loadavg[2] = s_info.loads[2] / 100000.0f;
|
||||
gkrelltop_process_find_top_three info.mask |= 1 << INFO_LOADAVG;
|
||||
#endif
|
||||
|
||||
info.procs = s_info.procs;
|
||||
|
||||
/* these aren't nice, no cache and should check kernel version for mem_unit */
|
||||
#if 0
|
||||
info.memmax = s_info.totalram;
|
||||
info.mem = s_info.totalram - s_info.freeram;
|
||||
info.swapmax = s_info.totalswap;
|
||||
info.swap = s_info.totalswap - s_info.swap;
|
||||
info.mask |= 1 << INFO_MEM;
|
||||
#endif
|
||||
|
||||
info.mask |= (1 << INFO_UPTIME) | (1 << INFO_PROCS);
|
||||
}
|
||||
|
||||
void update_uptime()
|
||||
{
|
||||
/* prefers sysinfo() for uptime, I don't really know which one is better
|
||||
* (=faster?) */
|
||||
#ifdef USE_PROC_UPTIME
|
||||
static int rep;
|
||||
FILE *fp = open_file("/proc/uptime", &rep);
|
||||
if (!fp)
|
||||
return 0;
|
||||
fscanf(fp, "%lf", &info.uptime);
|
||||
fclose(fp);
|
||||
|
||||
info.mask |= (1 << INFO_UPTIME);
|
||||
#else
|
||||
update_sysinfo();
|
||||
#ifdef HAVE_SYSINFO
|
||||
if (!prefer_proc)
|
||||
{
|
||||
struct sysinfo s_info;
|
||||
sysinfo(&s_info);
|
||||
info.uptime = (double) s_info.uptime;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
static int rep = 0;
|
||||
FILE *fp;
|
||||
|
||||
if (!(fp = open_file("/proc/uptime", &rep)))
|
||||
{
|
||||
return;
|
||||
}
|
||||
fscanf(fp, "%lf", &info.uptime);
|
||||
fclose(fp);
|
||||
}
|
||||
info.mask |= (1 << INFO_UPTIME);
|
||||
}
|
||||
|
||||
/* these things are also in sysinfo except Buffers:, that's why I'm reading
|
||||
* them from proc */
|
||||
|
||||
static FILE *meminfo_fp;
|
||||
|
||||
void update_meminfo()
|
||||
{
|
||||
static int rep;
|
||||
FILE *meminfo_fp;
|
||||
static int rep = 0;
|
||||
/* unsigned int a; */
|
||||
char buf[256];
|
||||
|
||||
info.mem = info.memmax = info.swap = info.swapmax = info.bufmem =
|
||||
info.buffers = info.cached = 0;
|
||||
|
||||
if (meminfo_fp == NULL)
|
||||
meminfo_fp = open_file("/proc/meminfo", &rep);
|
||||
else
|
||||
fseek(meminfo_fp, 0, SEEK_SET);
|
||||
if (meminfo_fp == NULL)
|
||||
return;
|
||||
if (!(meminfo_fp = open_file("/proc/meminfo", &rep)))
|
||||
return;
|
||||
|
||||
while (!feof(meminfo_fp)) {
|
||||
if (fgets(buf, 255, meminfo_fp) == NULL)
|
||||
@ -133,21 +124,21 @@ void update_meminfo()
|
||||
info.bufmem = info.cached + info.buffers;
|
||||
|
||||
info.mask |= (1 << INFO_MEM) | (1 << INFO_BUFFERS);
|
||||
|
||||
fclose (meminfo_fp);
|
||||
}
|
||||
|
||||
static FILE *net_dev_fp;
|
||||
static FILE *net_wireless_fp;
|
||||
|
||||
inline void update_net_stats()
|
||||
{
|
||||
static int rep;
|
||||
FILE *net_dev_fp;
|
||||
static int rep = 0;
|
||||
// FIXME: arbitrary size chosen to keep code simple.
|
||||
int i, i2;
|
||||
unsigned int curtmp1, curtmp2;
|
||||
unsigned int k;
|
||||
struct ifconf conf;
|
||||
|
||||
|
||||
char buf[256];
|
||||
double delta;
|
||||
|
||||
@ -157,13 +148,8 @@ inline void update_net_stats()
|
||||
return;
|
||||
|
||||
/* open file and ignore first two lines */
|
||||
if (net_dev_fp == NULL) {
|
||||
net_dev_fp = open_file("/proc/net/dev", &rep);
|
||||
}
|
||||
else
|
||||
fseek(net_dev_fp, 0, SEEK_SET);
|
||||
if (!net_dev_fp)
|
||||
return;
|
||||
if (!(net_dev_fp = open_file("/proc/net/dev", &rep)))
|
||||
return;
|
||||
|
||||
fgets(buf, 255, net_dev_fp); /* garbage */
|
||||
fgets(buf, 255, net_dev_fp); /* garbage (field names) */
|
||||
@ -265,17 +251,17 @@ inline void update_net_stats()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
/* fclose(net_dev_fp); net_dev_fp = NULL; */
|
||||
fclose(net_dev_fp);
|
||||
|
||||
info.mask |= (1 << INFO_NET);
|
||||
}
|
||||
|
||||
inline void update_wifi_stats()
|
||||
{
|
||||
/** wireless stats patch by Bobby Beckmann **/
|
||||
static int rep;
|
||||
static int rep = 0;
|
||||
int i;
|
||||
char buf[256];
|
||||
/*open file and ignore first two lines sorry, this code sucks ass right now, i'll clean it up later */
|
||||
@ -325,7 +311,27 @@ int result;
|
||||
|
||||
void update_total_processes()
|
||||
{
|
||||
update_sysinfo();
|
||||
#ifdef HAVE_SYSINFO
|
||||
if (!prefer_proc)
|
||||
{
|
||||
struct sysinfo s_info;
|
||||
sysinfo(&s_info);
|
||||
info.procs = s_info.procs;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
static int rep = 0;
|
||||
FILE *fp;
|
||||
|
||||
if (!(fp = open_file("/proc/loadavg", &rep)))
|
||||
{
|
||||
return;
|
||||
}
|
||||
fscanf(fp, "%*f %*f %*f %*d/%hd", &info.procs );
|
||||
fclose(fp);
|
||||
}
|
||||
info.mask |= (1 << INFO_PROCS);
|
||||
}
|
||||
|
||||
#define CPU_SAMPLE_COUNT 15
|
||||
@ -345,10 +351,6 @@ struct cpu_info {
|
||||
double cpu_val[CPU_SAMPLE_COUNT];
|
||||
};
|
||||
static short cpu_setup = 0;
|
||||
static int rep;
|
||||
|
||||
|
||||
static FILE *stat_fp;
|
||||
|
||||
/*
|
||||
determine if this kernel gives us "extended" statistics information in /proc/stat.
|
||||
@ -364,16 +366,16 @@ void determine_longstat(char * buf) {
|
||||
|
||||
void get_cpu_count()
|
||||
{
|
||||
FILE *stat_fp;
|
||||
static int rep = 0;
|
||||
|
||||
if (info.cpu_usage) {
|
||||
return;
|
||||
}
|
||||
char buf[256];
|
||||
if (stat_fp == NULL)
|
||||
stat_fp = open_file("/proc/stat", &rep);
|
||||
else
|
||||
fseek(stat_fp, 0, SEEK_SET);
|
||||
if (stat_fp == NULL)
|
||||
return;
|
||||
|
||||
if (!(stat_fp = open_file("/proc/stat", &rep)))
|
||||
return;
|
||||
|
||||
info.cpu_count = 0;
|
||||
|
||||
@ -389,6 +391,8 @@ void get_cpu_count()
|
||||
}
|
||||
}
|
||||
info.cpu_usage = malloc((info.cpu_count + 1) * sizeof(float));
|
||||
|
||||
fclose (stat_fp);
|
||||
}
|
||||
|
||||
#define TMPL_LONGSTAT "%*s %llu %llu %llu %llu %llu %llu %llu %llu"
|
||||
@ -396,6 +400,8 @@ void get_cpu_count()
|
||||
|
||||
inline static void update_stat()
|
||||
{
|
||||
FILE *stat_fp;
|
||||
static int rep = 0;
|
||||
static struct cpu_info *cpu = NULL;
|
||||
char buf[256];
|
||||
unsigned int i;
|
||||
@ -411,24 +417,19 @@ inline static void update_stat()
|
||||
cpu_setup = 1;
|
||||
}
|
||||
|
||||
if (stat_template == NULL) {
|
||||
if (!stat_template) {
|
||||
stat_template = KFLAG_ISSET(KFLAG_IS_LONGSTAT) ? TMPL_LONGSTAT : TMPL_SHORTSTAT ;
|
||||
}
|
||||
|
||||
if (cpu == NULL) {
|
||||
malloc_cpu_size = (info.cpu_count + 1) * sizeof(struct cpu_info);
|
||||
if (!cpu) {
|
||||
malloc_cpu_size = (info.cpu_count + 1) * sizeof(struct cpu_info);
|
||||
cpu = malloc(malloc_cpu_size);
|
||||
memset(cpu, 0, malloc_cpu_size);
|
||||
}
|
||||
|
||||
if (stat_fp == NULL) {
|
||||
stat_fp = open_file("/proc/stat", &rep);
|
||||
} else {
|
||||
fseek(stat_fp, 0, SEEK_SET);
|
||||
}
|
||||
if (stat_fp == NULL) {
|
||||
return;
|
||||
}
|
||||
if (!(stat_fp = open_file("/proc/stat", &rep)))
|
||||
return;
|
||||
|
||||
index = 0;
|
||||
while (!feof(stat_fp)) {
|
||||
if (fgets(buf, 255, stat_fp) == NULL)
|
||||
@ -464,7 +465,7 @@ inline static void update_stat()
|
||||
info.mask |= (1 << INFO_CPU);
|
||||
|
||||
double delta = current_update_time - last_update_time;
|
||||
if (delta <= 0.001) return;
|
||||
if (delta <= 0.001) break;
|
||||
|
||||
cpu[index].cpu_val[0] = (cpu[index].cpu_active_total - cpu[index].cpu_last_active_total) /
|
||||
(float )(cpu[index].cpu_total - cpu[index].cpu_last_total);
|
||||
@ -490,6 +491,7 @@ inline static void update_stat()
|
||||
}
|
||||
|
||||
}
|
||||
fclose (stat_fp);
|
||||
}
|
||||
|
||||
void update_running_processes()
|
||||
@ -505,26 +507,29 @@ void update_cpu_usage()
|
||||
void update_load_average()
|
||||
{
|
||||
#ifdef HAVE_GETLOADAVG
|
||||
double v[3];
|
||||
getloadavg(v, 3);
|
||||
info.loadavg[0] = (float) v[0];
|
||||
info.loadavg[1] = (float) v[1];
|
||||
info.loadavg[2] = (float) v[2];
|
||||
#else
|
||||
static int rep;
|
||||
FILE *fp;
|
||||
|
||||
fp = open_file("/proc/loadavg", &rep);
|
||||
if (!fp) {
|
||||
v[0] = v[1] = v[2] = 0.0;
|
||||
return;
|
||||
}
|
||||
|
||||
fscanf(fp, "%f %f %f", &info.loadavg[0], &info.loadavg[1],
|
||||
&info.loadavg[2]);
|
||||
|
||||
fclose(fp);
|
||||
if (!prefer_proc)
|
||||
{
|
||||
double v[3];
|
||||
getloadavg(v, 3);
|
||||
info.loadavg[0] = (float) v[0];
|
||||
info.loadavg[1] = (float) v[1];
|
||||
info.loadavg[2] = (float) v[2];
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
static int rep = 0;
|
||||
FILE *fp;
|
||||
|
||||
if (!(fp = open_file("/proc/loadavg", &rep)))
|
||||
{
|
||||
info.loadavg[0] = info.loadavg[1] = info.loadavg[2] = 0.0;
|
||||
return;
|
||||
}
|
||||
fscanf(fp, "%f %f %f", &info.loadavg[0], &info.loadavg[1], &info.loadavg[2]);
|
||||
fclose(fp);
|
||||
}
|
||||
info.mask |= (1 << INFO_LOADAVG);
|
||||
}
|
||||
|
||||
#define PROC_I8K "/proc/i8k"
|
||||
@ -613,7 +618,7 @@ open_i2c_sensor(const char *dev, const char *type, int n, int *div,
|
||||
|
||||
/* if i2c device is NULL or *, get first */
|
||||
if (dev == NULL || strcmp(dev, "*") == 0) {
|
||||
static int rep;
|
||||
static int rep = 0;
|
||||
if (!get_first_file_in_a_directory(I2C_DIR, buf, &rep))
|
||||
return -1;
|
||||
dev = buf;
|
||||
@ -731,7 +736,7 @@ double get_i2c_info(int *fd, int div, char *devtype, char *type)
|
||||
|
||||
void get_adt746x_fan( char * p_client_buffer, size_t client_buffer_size )
|
||||
{
|
||||
static int rep;
|
||||
static int rep = 0;
|
||||
char adt746x_fan_state[64];
|
||||
FILE *fp;
|
||||
|
||||
@ -764,7 +769,7 @@ void get_adt746x_fan( char * p_client_buffer, size_t client_buffer_size )
|
||||
|
||||
void get_adt746x_cpu( char * p_client_buffer, size_t client_buffer_size )
|
||||
{
|
||||
static int rep;
|
||||
static int rep = 0;
|
||||
char adt746x_cpu_state[64];
|
||||
FILE *fp;
|
||||
|
||||
@ -855,33 +860,34 @@ void get_freq_dynamic( char * p_client_buffer, size_t client_buffer_size, char *
|
||||
char get_freq( char * p_client_buffer, size_t client_buffer_size, char * p_format, int divisor, unsigned int cpu )
|
||||
{
|
||||
FILE *f;
|
||||
static int rep = 0;
|
||||
char frequency[32];
|
||||
char s[256];
|
||||
double freq = 0;
|
||||
char current_freq_file[128];
|
||||
|
||||
cpu--;
|
||||
snprintf(current_freq_file, 127, "%s/cpu%d/%s",
|
||||
CPUFREQ_PREFIX, cpu, CPUFREQ_POSTFIX);
|
||||
|
||||
if ( !p_client_buffer || client_buffer_size <= 0 || !p_format || divisor <= 0 )
|
||||
return 0;
|
||||
|
||||
f = fopen(current_freq_file, "r");
|
||||
if (f) {
|
||||
/* if there's a cpufreq /sys node, read the current frequency from this node;
|
||||
* divide by 1000 to get Mhz. */
|
||||
if (fgets(s, sizeof(s), f)) {
|
||||
s[strlen(s)-1] = '\0';
|
||||
freq = strtod(s, NULL);
|
||||
}
|
||||
fclose(f);
|
||||
snprintf( p_client_buffer, client_buffer_size, p_format, (freq/1000)/divisor );
|
||||
return 1;
|
||||
if (!prefer_proc)
|
||||
{
|
||||
char current_freq_file[128];
|
||||
snprintf(current_freq_file, 127, "%s/cpu%d/%s",CPUFREQ_PREFIX, cpu-1, CPUFREQ_POSTFIX);
|
||||
f = fopen(current_freq_file, "r");
|
||||
if (f)
|
||||
{
|
||||
/* if there's a cpufreq /sys node, read the current frequency from this node;
|
||||
* divide by 1000 to get Mhz. */
|
||||
if (fgets(s, sizeof(s), f)) {
|
||||
s[strlen(s)-1] = '\0';
|
||||
freq = strtod(s, NULL);
|
||||
}
|
||||
fclose(f);
|
||||
snprintf( p_client_buffer, client_buffer_size, p_format, (freq/1000)/divisor );
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
cpu++;
|
||||
f = fopen("/proc/cpuinfo", "r"); //open the CPU information file
|
||||
f = open_file("/proc/cpuinfo", &rep); //open the CPU information file
|
||||
if (!f) {
|
||||
perror("Conky: Failed to access '/proc/cpuinfo' at get_freq()");
|
||||
return 0;
|
||||
@ -1003,7 +1009,7 @@ char get_voltage( char * p_client_buffer, size_t client_buffer_size, char * p_fo
|
||||
|
||||
void get_acpi_fan( char * p_client_buffer, size_t client_buffer_size )
|
||||
{
|
||||
static int rep;
|
||||
static int rep = 0;
|
||||
char buf[256];
|
||||
char buf2[256];
|
||||
FILE *fp;
|
||||
@ -1038,7 +1044,7 @@ void get_acpi_fan( char * p_client_buffer, size_t client_buffer_size )
|
||||
|
||||
void get_acpi_ac_adapter( char * p_client_buffer, size_t client_buffer_size )
|
||||
{
|
||||
static int rep;
|
||||
static int rep = 0;
|
||||
char buf[256];
|
||||
char buf2[256];
|
||||
FILE *fp;
|
||||
@ -1094,7 +1100,7 @@ int open_acpi_temperature(const char *name)
|
||||
int fd;
|
||||
|
||||
if (name == NULL || strcmp(name, "*") == 0) {
|
||||
static int rep;
|
||||
static int rep = 0;
|
||||
if (!get_first_file_in_a_directory
|
||||
(ACPI_THERMAL_DIR, buf, &rep))
|
||||
return -1;
|
||||
@ -1199,7 +1205,7 @@ static double last_battery_time;
|
||||
|
||||
void get_battery_stuff(char *buf, unsigned int n, const char *bat, int item)
|
||||
{
|
||||
static int rep, rep2;
|
||||
static int rep = 0, rep2 = 0;
|
||||
char acpi_path[128];
|
||||
snprintf(acpi_path, 127, ACPI_BATTERY_BASE_PATH "/%s/state", bat);
|
||||
|
||||
@ -1225,8 +1231,8 @@ void get_battery_stuff(char *buf, unsigned int n, const char *bat, int item)
|
||||
|
||||
/* read last full capacity if it's zero */
|
||||
if (acpi_last_full == 0) {
|
||||
static int rep;
|
||||
char path[128];
|
||||
static int rep = 0;
|
||||
char path[128];
|
||||
FILE *fp;
|
||||
snprintf(path, 127,
|
||||
ACPI_BATTERY_BASE_PATH "/%s/info", bat);
|
||||
@ -1396,7 +1402,7 @@ static double pb_battery_info_update;
|
||||
#define PMU_PATH "/proc/pmu"
|
||||
void get_powerbook_batt_info(char *buf, size_t n, int i)
|
||||
{
|
||||
static int rep;
|
||||
static int rep = 0;
|
||||
const char* batt_path = PMU_PATH "/battery_0";
|
||||
const char* info_path = PMU_PATH "/info";
|
||||
int flags, charge, max_charge, ac = -1;
|
||||
@ -1503,7 +1509,8 @@ void update_top()
|
||||
void update_diskio()
|
||||
{
|
||||
static unsigned int last = UINT_MAX;
|
||||
static FILE* fp;
|
||||
FILE* fp;
|
||||
static int rep=0;
|
||||
|
||||
char buf[512];
|
||||
int major, minor;
|
||||
@ -1511,11 +1518,8 @@ void update_diskio()
|
||||
unsigned int reads, writes = 0;
|
||||
int col_count = 0;
|
||||
|
||||
if (!fp) {
|
||||
fp = fopen("/proc/diskstats", "r");
|
||||
} else {
|
||||
fseek(fp, 0, SEEK_SET);
|
||||
}
|
||||
if (!(fp =open_file("/proc/diskstats", &rep)))
|
||||
return;
|
||||
|
||||
/* read reads and writes from all disks (minor = 0), including
|
||||
* cd-roms and floppies, and summ them up
|
||||
@ -1551,6 +1555,8 @@ void update_diskio()
|
||||
last = current;
|
||||
|
||||
diskio_value = tot;
|
||||
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
/* Here come the IBM ACPI-specific things. For reference, see
|
||||
@ -1780,26 +1786,444 @@ Peter Tarjan (ptarjan@citromail.hu)
|
||||
|
||||
void update_entropy (void)
|
||||
{
|
||||
static int rep;
|
||||
const char *entropy_avail = "/proc/sys/kernel/random/entropy_avail";
|
||||
const char *entropy_poolsize = "/proc/sys/kernel/random/poolsize";
|
||||
FILE *fp1, *fp2;
|
||||
static int rep = 0;
|
||||
const char *entropy_avail = "/proc/sys/kernel/random/entropy_avail";
|
||||
const char *entropy_poolsize = "/proc/sys/kernel/random/poolsize";
|
||||
FILE *fp1, *fp2;
|
||||
|
||||
info.entropy.entropy_avail=0;
|
||||
info.entropy.poolsize=0;
|
||||
info.entropy.entropy_avail=0;
|
||||
info.entropy.poolsize=0;
|
||||
|
||||
if ((fp1 = open_file (entropy_avail, &rep))==NULL)
|
||||
return;
|
||||
if ((fp1 = open_file (entropy_avail, &rep))==NULL)
|
||||
return;
|
||||
|
||||
if ((fp2 = open_file (entropy_poolsize, &rep))==NULL)
|
||||
if ((fp2 = open_file (entropy_poolsize, &rep))==NULL)
|
||||
{
|
||||
fclose (fp1);
|
||||
return;
|
||||
}
|
||||
|
||||
fscanf (fp1, "%u", &info.entropy.entropy_avail);
|
||||
fscanf (fp2, "%u", &info.entropy.poolsize);
|
||||
|
||||
fclose (fp1);
|
||||
fclose (fp2);
|
||||
|
||||
info.mask |= (1 << INFO_ENTROPY);
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBDEXTER
|
||||
FILE *open_file(const char *file, int *reported)
|
||||
{
|
||||
/* this version of open_file() is the hook that ties the client/server code
|
||||
* into conky. if conky wants to open a /proc file that the server is feeding
|
||||
* us, we do not return an ordinary file stream pointer to the local /proc
|
||||
* filesystem. instead, we return a string stream pointer to the proc surrogate,
|
||||
* so conky parses remote data as if it were local.
|
||||
*/
|
||||
FILE *fp;
|
||||
|
||||
if ((strcmp (file,"/proc/cpuinfo")==0) && (procraw_mask & PROCRAW_CPUINFO))
|
||||
{
|
||||
if (!procraw_sampler)
|
||||
return NULL;
|
||||
fp = fmemopen (procraw_data.cpuinfo, procraw_data.cpuinfo_sz, "r");
|
||||
}
|
||||
else if ((strcmp (file,"/proc/loadavg")==0) && (procraw_mask & PROCRAW_LOADAVG))
|
||||
{
|
||||
if (!procraw_sampler)
|
||||
return NULL;
|
||||
fp = fmemopen (procraw_data.loadavg, procraw_data.loadavg_sz, "r");
|
||||
}
|
||||
else if ((strcmp (file,"/proc/meminfo")==0) && (procraw_mask & PROCRAW_MEMINFO))
|
||||
{
|
||||
if (!procraw_sampler)
|
||||
return NULL;
|
||||
fp = fmemopen (procraw_data.meminfo, procraw_data.meminfo_sz, "r");
|
||||
}
|
||||
else if ((strcmp (file,"/proc/stat")==0) && (procraw_mask & PROCRAW_STAT))
|
||||
{
|
||||
if (!procraw_sampler)
|
||||
return NULL;
|
||||
fp = fmemopen (procraw_data.stat, procraw_data.stat_sz, "r");
|
||||
}
|
||||
else if ((strcmp (file,"/proc/uptime")==0) && (procraw_mask & PROCRAW_UPTIME))
|
||||
{
|
||||
if (!procraw_sampler)
|
||||
return NULL;
|
||||
fp = fmemopen (procraw_data.uptime, procraw_data.uptime_sz, "r");
|
||||
}
|
||||
else if ((strcmp (file,"/proc/net/dev")==0) && (procraw_mask & PROCRAW_NET_DEV))
|
||||
{
|
||||
if (!procraw_sampler)
|
||||
return NULL;
|
||||
fp = fmemopen (procraw_data.net_dev, procraw_data.net_dev_sz, "r");
|
||||
}
|
||||
else if ((strcmp (file,"/proc/diskstats")==0) && (procraw_mask & PROCRAW_DISKSTATS))
|
||||
{
|
||||
if (!procraw_sampler)
|
||||
return NULL;
|
||||
fp = fmemopen (procraw_data.diskstats, procraw_data.diskstats_sz, "r");
|
||||
}
|
||||
else
|
||||
{
|
||||
fp = fopen(file, "r");
|
||||
}
|
||||
|
||||
if (!fp)
|
||||
{
|
||||
if (!reported || *reported == 0)
|
||||
{
|
||||
fclose (fp1);
|
||||
return;
|
||||
ERR("can't open %s: %s", file, strerror(errno));
|
||||
if (reported)
|
||||
*reported = 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
return fp;
|
||||
}
|
||||
|
||||
void sampler_data_callback (gpointer sampler, gpointer sampler_data)
|
||||
{
|
||||
/* callback runs in a thread */
|
||||
if (!sampler)
|
||||
return;
|
||||
|
||||
if (sampler_data)
|
||||
{
|
||||
FILE *out;
|
||||
char *p;
|
||||
unsigned int i;
|
||||
DxtSysinfoProcrawData *data = (DxtSysinfoProcrawData *)sampler_data;
|
||||
|
||||
/* use GNU string streams and stdio locking to exchange data with main thread. */
|
||||
|
||||
/* update /proc/cpuinfo surrogate */
|
||||
for (;data->cpuinfo;)
|
||||
{
|
||||
if (!(out = open_memstream (&procraw_data.cpuinfo, &procraw_data.cpuinfo_sz)))
|
||||
break;
|
||||
|
||||
flockfile (out);
|
||||
if (procraw_data.cpuinfo)
|
||||
{
|
||||
free (procraw_data.cpuinfo); procraw_data.cpuinfo=NULL;
|
||||
}
|
||||
for (p=data->cpuinfo, i=0; i<data->cpuinfo_sz; i++, p++)
|
||||
{
|
||||
/* we have the FILE lock so use faster putc_unlocked() */
|
||||
if (fputc_unlocked (*p, out) == EOF)
|
||||
break;
|
||||
}
|
||||
fclose (out);
|
||||
funlockfile (out);
|
||||
break;
|
||||
}
|
||||
|
||||
fscanf (fp1, "%u", &info.entropy.entropy_avail);
|
||||
fscanf (fp2, "%u", &info.entropy.poolsize);
|
||||
/* update /proc/loadavg surrogate */
|
||||
for (;data->loadavg;)
|
||||
{
|
||||
if (!(out = open_memstream (&procraw_data.loadavg, &procraw_data.loadavg_sz)))
|
||||
break;
|
||||
|
||||
fclose (fp1);
|
||||
fclose (fp2);
|
||||
flockfile (out);
|
||||
if (procraw_data.loadavg)
|
||||
{
|
||||
free (procraw_data.loadavg); procraw_data.loadavg=NULL;
|
||||
}
|
||||
for (p=data->loadavg, i=0; i<data->loadavg_sz; i++, p++)
|
||||
{
|
||||
/* we have the FILE lock so use faster putc_unlocked() */
|
||||
if (fputc_unlocked (*p, out) == EOF)
|
||||
break;
|
||||
}
|
||||
fclose (out);
|
||||
funlockfile (out);
|
||||
break;
|
||||
}
|
||||
|
||||
/* update /proc/meminfo surrogate */
|
||||
for (;data->meminfo;)
|
||||
{
|
||||
if (!(out = open_memstream (&procraw_data.meminfo, &procraw_data.meminfo_sz)))
|
||||
break;
|
||||
|
||||
flockfile (out);
|
||||
if (procraw_data.meminfo)
|
||||
{
|
||||
free (procraw_data.meminfo); procraw_data.meminfo=NULL;
|
||||
}
|
||||
for (p=data->meminfo, i=0; i<data->meminfo_sz; i++, p++)
|
||||
{
|
||||
/* we have the FILE lock so use faster putc_unlocked() */
|
||||
if (fputc_unlocked (*p, out) == EOF)
|
||||
break;
|
||||
}
|
||||
fclose (out);
|
||||
funlockfile (out);
|
||||
break;
|
||||
}
|
||||
|
||||
/* update /proc/stat surrogate */
|
||||
for (;data->stat;)
|
||||
{
|
||||
if (!(out = open_memstream (&procraw_data.stat, &procraw_data.stat_sz)))
|
||||
break;
|
||||
|
||||
flockfile (out);
|
||||
if (procraw_data.stat)
|
||||
{
|
||||
free (procraw_data.stat); procraw_data.stat=NULL;
|
||||
}
|
||||
for (p=data->stat, i=0; i<data->stat_sz; i++, p++)
|
||||
{
|
||||
/* we have the FILE lock so use faster putc_unlocked() */
|
||||
if (fputc_unlocked (*p, out) == EOF)
|
||||
break;
|
||||
}
|
||||
fclose (out);
|
||||
funlockfile (out);
|
||||
break;
|
||||
}
|
||||
|
||||
/* update /proc/uptime surrogate */
|
||||
for (;data->uptime;)
|
||||
{
|
||||
if (!(out = open_memstream (&procraw_data.uptime, &procraw_data.uptime_sz)))
|
||||
break;
|
||||
|
||||
flockfile (out);
|
||||
if (procraw_data.uptime)
|
||||
{
|
||||
free (procraw_data.uptime); procraw_data.uptime=NULL;
|
||||
}
|
||||
for (p=data->uptime, i=0; i<data->uptime_sz; i++, p++)
|
||||
{
|
||||
/* we have the FILE lock so use faster putc_unlocked() */
|
||||
if (fputc_unlocked (*p, out) == EOF)
|
||||
break;
|
||||
}
|
||||
fclose (out);
|
||||
funlockfile (out);
|
||||
break;
|
||||
}
|
||||
|
||||
/* update /proc/net/dev surrogate */
|
||||
for (;data->net_dev;)
|
||||
{
|
||||
if (!(out = open_memstream (&procraw_data.net_dev, &procraw_data.net_dev_sz)))
|
||||
break;
|
||||
|
||||
flockfile (out);
|
||||
if (procraw_data.net_dev)
|
||||
{
|
||||
free (procraw_data.net_dev); procraw_data.net_dev=NULL;
|
||||
}
|
||||
for (p=data->net_dev, i=0; i<data->net_dev_sz; i++, p++)
|
||||
{
|
||||
/* we have the FILE lock so use faster putc_unlocked() */
|
||||
if (fputc_unlocked (*p, out) == EOF)
|
||||
break;
|
||||
}
|
||||
fclose (out);
|
||||
funlockfile (out);
|
||||
break;
|
||||
}
|
||||
|
||||
/* update /proc/diskstats surrogate */
|
||||
for (;data->diskstats;)
|
||||
{
|
||||
if (!(out = open_memstream (&procraw_data.diskstats, &procraw_data.diskstats_sz)))
|
||||
break;
|
||||
|
||||
flockfile (out);
|
||||
if (procraw_data.diskstats)
|
||||
{
|
||||
free (procraw_data.diskstats); procraw_data.diskstats=NULL;
|
||||
}
|
||||
for (p=data->diskstats, i=0; i<data->diskstats_sz; i++, p++)
|
||||
{
|
||||
/* we have the FILE lock so use faster putc_unlocked() */
|
||||
if (fputc_unlocked (*p, out) == EOF)
|
||||
break;
|
||||
}
|
||||
fclose (out);
|
||||
funlockfile (out);
|
||||
break;
|
||||
}
|
||||
|
||||
/* record data packet arrival time */
|
||||
g_mutex_lock (packet_mutex);
|
||||
clock_gettime (CLOCK_REALTIME, &packet_arrival_time);
|
||||
g_mutex_unlock (packet_mutex);
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "Conky: data packet arrived\n");
|
||||
#endif
|
||||
|
||||
} /* if (sampler_data) ... */
|
||||
}
|
||||
|
||||
/* return 0 on success, -1 on failure */
|
||||
int dexter_client_init (void)
|
||||
{
|
||||
/* init libdexter for linux-specific client-side activity */
|
||||
|
||||
DexterServiceBroker *broker;
|
||||
DexterPluginServiceGroup *service_group;
|
||||
DexterPluginService *procraw_service;
|
||||
DexterSamplerDataCallback *callbacks;
|
||||
GError *error = NULL;
|
||||
|
||||
/* create a service broker so we can query the server for its services */
|
||||
if (!(broker = dexter_service_broker_new (info.dexter.channel)))
|
||||
{
|
||||
ERR ("unable to create service broker");
|
||||
return (-1);
|
||||
}
|
||||
|
||||
/* fetch the services from the server */
|
||||
service_group = dexter_service_broker_get_services (broker, DEXTER_SERVICE_SAMPLER, &error);
|
||||
if (error)
|
||||
{
|
||||
ERR("%s", error->message);
|
||||
g_clear_error (&error);
|
||||
dexter_service_broker_free (broker);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
/* dont need service broker any more */
|
||||
dexter_service_broker_free (broker);
|
||||
broker=NULL;
|
||||
|
||||
/* find the procraw service */
|
||||
procraw_service=NULL;
|
||||
if (!dexterplugin_service_group_find_uuid (&procraw_service, service_group, PROCRAW_SERVICE_UUID))
|
||||
{
|
||||
ERR ("server doesn't offer the procraw service: (%s)", PROCRAW_SERVICE_UUID);
|
||||
dexterplugin_service_group_free (service_group);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
/* create null-terminated callback list with one callback on it */
|
||||
callbacks = g_new0 (DexterSamplerDataCallback, 2);
|
||||
callbacks[0] = sampler_data_callback;
|
||||
|
||||
/* create the procraw timed sampler, timed to match conky's update_interval */
|
||||
procraw_sampler = dexter_timedsampler_new (procraw_service, update_interval*G_USEC_PER_SEC,
|
||||
callbacks, info.dexter.channel, &error);
|
||||
if (error)
|
||||
{
|
||||
ERR("%s", error->message);
|
||||
g_clear_error (&error);
|
||||
dexterplugin_service_group_free (service_group);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
/* free callbacks as libdexter makes internal copy */
|
||||
g_free (callbacks);
|
||||
callbacks=NULL;
|
||||
|
||||
/* initialize the timed sampler */
|
||||
procraw_mask = 0;
|
||||
if (need_mask & (1 << INFO_FREQ))
|
||||
procraw_mask |= PROCRAW_CPUINFO;
|
||||
if (need_mask & (1 << INFO_LOADAVG))
|
||||
procraw_mask |= PROCRAW_LOADAVG;
|
||||
if ((need_mask & (1 << INFO_MEM)) || (need_mask & (1 << INFO_BUFFERS)))
|
||||
procraw_mask |= PROCRAW_MEMINFO;
|
||||
if ((need_mask & (1 << INFO_CPU)) || (need_mask & (1 << INFO_PROCS)) ||
|
||||
(need_mask & (1 << INFO_RUN_PROCS)) || (need_mask & (1 << INFO_FREQ )))
|
||||
procraw_mask |= PROCRAW_STAT;
|
||||
if (need_mask & (1 << INFO_UPTIME))
|
||||
procraw_mask |= PROCRAW_UPTIME;
|
||||
if (need_mask & (1 << INFO_NET))
|
||||
procraw_mask |= PROCRAW_NET_DEV;
|
||||
if (need_mask & (1 << INFO_DISKIO))
|
||||
procraw_mask |= PROCRAW_DISKSTATS;
|
||||
|
||||
dexter_timedsampler_initialize (procraw_sampler, &procraw_mask, NULL, &error);
|
||||
if (error)
|
||||
{
|
||||
ERR("%s", error->message);
|
||||
g_clear_error (&error);
|
||||
dexter_timedsampler_free (procraw_sampler, NULL);
|
||||
dexterplugin_service_group_free (service_group);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
/* start the timed sampler and begin receiving updates from server */
|
||||
dexter_timedsampler_start (procraw_sampler, &error);
|
||||
if (error)
|
||||
{
|
||||
ERR("%s", error->message);
|
||||
g_clear_error (&error);
|
||||
dexter_timedsampler_free (procraw_sampler, NULL);
|
||||
dexterplugin_service_group_free (service_group);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
dexterplugin_service_group_free (service_group);
|
||||
|
||||
/* so far, so good. tell the linux routines to read /proc,
|
||||
* even if other api's are available. */
|
||||
prefer_proc = 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* return 0 on success, -1 on failure */
|
||||
int dexter_client_exit (void)
|
||||
{
|
||||
/* de-init libdexter for linux-specific client-side activity */
|
||||
|
||||
if (procraw_sampler)
|
||||
{
|
||||
dexter_timedsampler_stop (procraw_sampler, NULL);
|
||||
dexter_timedsampler_free (procraw_sampler, NULL);
|
||||
procraw_sampler=NULL;
|
||||
}
|
||||
|
||||
/* free left-over sampler data. ok to do this without thread sync because
|
||||
* this function runs in the same thread that conky issues open_file(). */
|
||||
if (procraw_data.cpuinfo)
|
||||
{
|
||||
free (procraw_data.cpuinfo); procraw_data.cpuinfo=NULL;
|
||||
}
|
||||
if (procraw_data.loadavg)
|
||||
{
|
||||
free (procraw_data.loadavg); procraw_data.loadavg=NULL;
|
||||
}
|
||||
if (procraw_data.meminfo)
|
||||
{
|
||||
free (procraw_data.meminfo); procraw_data.meminfo=NULL;
|
||||
}
|
||||
if (procraw_data.stat)
|
||||
{
|
||||
free (procraw_data.stat); procraw_data.stat=NULL;
|
||||
}
|
||||
if (procraw_data.uptime)
|
||||
{
|
||||
free (procraw_data.uptime); procraw_data.uptime=NULL;
|
||||
}
|
||||
if (procraw_data.net_dev)
|
||||
{
|
||||
free (procraw_data.net_dev); procraw_data.net_dev=NULL;
|
||||
}
|
||||
if (procraw_data.diskstats)
|
||||
{
|
||||
free (procraw_data.diskstats); procraw_data.diskstats=NULL;
|
||||
}
|
||||
|
||||
info.uptime=0.0;
|
||||
info.procs=0;
|
||||
info.mem = info.memmax = info.swap = info.swapmax = info.bufmem = info.buffers = info.cached = 0;
|
||||
info.run_procs=0;
|
||||
if (info.cpu_usage)
|
||||
{
|
||||
memset(info.cpu_usage, 0, info.cpu_count * sizeof (float));
|
||||
}
|
||||
clear_net_stats ();
|
||||
diskio_value=0;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
17
src/netbsd.c
17
src/netbsd.c
@ -370,3 +370,20 @@ void get_acpi_fan( char * p_client_buffer, size_t client_buffer_size )
|
||||
void update_entropy (void)
|
||||
{
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBDEXTER
|
||||
/* return 0 on success, -1 on failure */
|
||||
int dexter_client_init (void)
|
||||
{
|
||||
/* init libdexter for netbsd-specific client-side activity */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* return 0 on success, -1 on failure */
|
||||
int dexter_client_exit (void)
|
||||
{
|
||||
/* de-init libdexter for netbsd-specific client-side activity */
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -1,69 +0,0 @@
|
||||
/*
|
||||
* Conky, a system monitor, based on torsmo
|
||||
*
|
||||
* This program is licensed under BSD license, read COPYING
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
/*
|
||||
|
||||
okay, nothing here right now. thanks for coming out
|
||||
|
||||
*/
|
||||
|
||||
#include "conky.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <netdb.h>
|
||||
#include <sys/types.h>
|
||||
#include <netinet/in.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
#define PORT 3490 // the port client will be connecting to
|
||||
|
||||
#define MAXDATASIZE 100 // max number of bytes we can get at once
|
||||
|
||||
void client()
|
||||
{
|
||||
int sockfd, numbytes;
|
||||
char buf[MAXDATASIZE];
|
||||
struct hostent *he;
|
||||
struct sockaddr_in their_addr; // connector's address information
|
||||
if ((he=gethostbyname("localhost")) == NULL) { // get the host info
|
||||
perror("gethostbyname");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
|
||||
perror("socket");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
their_addr.sin_family = AF_INET; // host byte order
|
||||
their_addr.sin_port = htons(PORT); // short, network byte order
|
||||
their_addr.sin_addr = *((struct in_addr *)he->h_addr);
|
||||
memset(&(their_addr.sin_zero), '\0', 8); // zero the rest of the struct
|
||||
|
||||
if (connect(sockfd, (struct sockaddr *)&their_addr,
|
||||
sizeof(struct sockaddr)) == -1) {
|
||||
perror("connect");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if ((numbytes=recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) {
|
||||
perror("recv");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
buf[numbytes] = '\0';
|
||||
|
||||
printf("Received: %s",buf);
|
||||
|
||||
close(sockfd);
|
||||
|
||||
return;
|
||||
}
|
@ -1,15 +0,0 @@
|
||||
/*
|
||||
* Conky, a system monitor, based on torsmo
|
||||
*
|
||||
* This program is licensed under BSD license, read COPYING
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
/*
|
||||
|
||||
okay, nothing here right now. thanks for coming out
|
||||
|
||||
*/
|
||||
|
||||
void client();
|
126
src/remoted.c
126
src/remoted.c
@ -1,126 +0,0 @@
|
||||
/*
|
||||
* Conky, a system monitor, based on torsmo
|
||||
*
|
||||
* This program is licensed under BSD license, read COPYING
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#include <pthread.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <sys/wait.h>
|
||||
#include <signal.h>
|
||||
|
||||
static pthread_t daemon_thread;
|
||||
static int daemon_status = 0;
|
||||
static char *data;
|
||||
|
||||
/* okay, heres how it will basically work.
|
||||
* when something connects, it will first send the conkyrc on the local (daemonized) server
|
||||
* after this, it will simply continue to send all the buffered text to the remote client
|
||||
* http://analyser.oli.tudelft.nl/beej/mirror/net/html/
|
||||
* http://www.kegel.com/c10k.html
|
||||
*/
|
||||
|
||||
#define MYPORT 3490 // the port users will be connecting to
|
||||
|
||||
#define BACKLOG 10 // how many pending connections queue will hold
|
||||
|
||||
void sigchld_handler(/*int s*/)
|
||||
{
|
||||
while(wait(NULL) > 0);
|
||||
}
|
||||
|
||||
void *daemon_loop()
|
||||
{
|
||||
/* do something */
|
||||
|
||||
|
||||
|
||||
int sockfd, new_fd; // listen on sock_fd, new connection on new_fd
|
||||
struct sockaddr_in my_addr; // my address information
|
||||
struct sockaddr_in their_addr; // connector's address information
|
||||
socklen_t sin_size;
|
||||
struct sigaction sa;
|
||||
int yes=1;
|
||||
|
||||
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
|
||||
perror("socket");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)) == -1) {
|
||||
perror("setsockopt");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
my_addr.sin_family = AF_INET; // host byte order
|
||||
my_addr.sin_port = htons(MYPORT); // short, network byte order
|
||||
my_addr.sin_addr.s_addr = INADDR_ANY; // automatically fill with my IP
|
||||
memset(&(my_addr.sin_zero), '\0', 8); // zero the rest of the struct
|
||||
|
||||
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))
|
||||
== -1) {
|
||||
perror("bind");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (listen(sockfd, BACKLOG) == -1) {
|
||||
perror("listen");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
sa.sa_handler = sigchld_handler; // reap all dead processes
|
||||
sigemptyset(&sa.sa_mask);
|
||||
sa.sa_flags = SA_RESTART;
|
||||
if (sigaction(SIGCHLD, &sa, NULL) == -1) {
|
||||
perror("sigaction");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
while(1) { // main accept() loop
|
||||
sin_size = sizeof(struct sockaddr_in);
|
||||
if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr,
|
||||
&sin_size)) == -1) {
|
||||
perror("accept");
|
||||
continue;
|
||||
}
|
||||
printf("server: got connection from %s\n",
|
||||
inet_ntoa(their_addr.sin_addr));
|
||||
if (!fork()) { // this is the child process
|
||||
close(sockfd); // child doesn't need the listener
|
||||
if (send(new_fd, data, 14, 0) == -1)
|
||||
perror("send");
|
||||
close(new_fd);
|
||||
exit(0);
|
||||
}
|
||||
close(new_fd); // parent doesn't need this
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void daemon_run(const char *s)
|
||||
{
|
||||
/* create thread, keep an eye on it */
|
||||
data = (char *)s;
|
||||
int iret;
|
||||
if (!daemon_status) {
|
||||
daemon_status = 1;
|
||||
iret = pthread_create(&daemon_thread, NULL, daemon_loop, NULL);
|
||||
} else if (daemon_status == 1) {
|
||||
/* thread is still running, we'll just wait for it to finish for now */
|
||||
pthread_join(daemon_thread, NULL);
|
||||
daemon_status = 0;
|
||||
} else {
|
||||
/* something else */
|
||||
}
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
/*
|
||||
* Conky, a system monitor, based on torsmo
|
||||
*
|
||||
* This program is licensed under BSD license, read COPYING
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#include "conky.h"
|
||||
|
||||
void daemon_run(const char *s);
|
@ -35,20 +35,20 @@
|
||||
/* private */
|
||||
struct _timed_thread
|
||||
{
|
||||
pthread_t thread; /* thread itself */
|
||||
pthread_attr_t thread_attr; /* thread attributes */
|
||||
pthread_mutex_t cs_mutex; /* critical section mutex */
|
||||
pthread_mutex_t runnable_mutex; /* only for the runnable_cond */
|
||||
pthread_cond_t runnable_cond; /* signalled to stop the thread */
|
||||
unsigned int interval_usecs; /* timed_thread_test() wait interval in microseconds */
|
||||
pthread_t thread; /* thread itself */
|
||||
pthread_attr_t thread_attr; /* thread attributes */
|
||||
pthread_mutex_t cs_mutex; /* critical section mutex */
|
||||
pthread_mutex_t runnable_mutex; /* only for the runnable_cond */
|
||||
pthread_cond_t runnable_cond; /* signalled to stop the thread */
|
||||
unsigned int interval_usecs; /* timed_thread_test() wait interval in microseconds */
|
||||
};
|
||||
|
||||
/* linked list of created threads */
|
||||
typedef struct _timed_thread_list
|
||||
{
|
||||
timed_thread *p_timed_thread;
|
||||
timed_thread **addr_of_p_timed_thread;
|
||||
struct _timed_thread_list *next;
|
||||
timed_thread *p_timed_thread;
|
||||
timed_thread **addr_of_p_timed_thread;
|
||||
struct _timed_thread_list *next;
|
||||
} timed_thread_node, timed_thread_list;
|
||||
|
||||
static timed_thread_list *p_timed_thread_list_head = NULL;
|
||||
@ -59,33 +59,33 @@ static timed_thread_list *p_timed_thread_list_tail = NULL;
|
||||
timed_thread*
|
||||
timed_thread_create (void *(*start_routine)(void*), void *arg, unsigned int interval_usecs)
|
||||
{
|
||||
timed_thread *p_timed_thread;
|
||||
timed_thread *p_timed_thread;
|
||||
|
||||
assert ((start_routine != NULL) && (interval_usecs >= MINIMUM_INTERVAL_USECS));
|
||||
assert ((start_routine != NULL) && (interval_usecs >= MINIMUM_INTERVAL_USECS));
|
||||
|
||||
if ((p_timed_thread = calloc (sizeof(timed_thread), 1)) == 0)
|
||||
return NULL;
|
||||
if ((p_timed_thread = calloc (sizeof(timed_thread), 1)) == 0)
|
||||
return NULL;
|
||||
|
||||
/* init attributes, e.g. joinable thread */
|
||||
pthread_attr_init (&p_timed_thread->thread_attr);
|
||||
pthread_attr_setdetachstate (&p_timed_thread->thread_attr, PTHREAD_CREATE_JOINABLE);
|
||||
/* init mutexes */
|
||||
pthread_mutex_init (&p_timed_thread->cs_mutex, NULL);
|
||||
pthread_mutex_init (&p_timed_thread->runnable_mutex, NULL);
|
||||
/* init cond */
|
||||
pthread_cond_init (&p_timed_thread->runnable_cond, NULL);
|
||||
/* init attributes, e.g. joinable thread */
|
||||
pthread_attr_init (&p_timed_thread->thread_attr);
|
||||
pthread_attr_setdetachstate (&p_timed_thread->thread_attr, PTHREAD_CREATE_JOINABLE);
|
||||
/* init mutexes */
|
||||
pthread_mutex_init (&p_timed_thread->cs_mutex, NULL);
|
||||
pthread_mutex_init (&p_timed_thread->runnable_mutex, NULL);
|
||||
/* init cond */
|
||||
pthread_cond_init (&p_timed_thread->runnable_cond, NULL);
|
||||
|
||||
p_timed_thread->interval_usecs = interval_usecs;
|
||||
p_timed_thread->interval_usecs = interval_usecs;
|
||||
|
||||
/* create thread */
|
||||
if (pthread_create (&p_timed_thread->thread, &p_timed_thread->thread_attr, start_routine, arg))
|
||||
{
|
||||
timed_thread_destroy (p_timed_thread, NULL);
|
||||
return NULL;
|
||||
}
|
||||
/* create thread */
|
||||
if (pthread_create (&p_timed_thread->thread, &p_timed_thread->thread_attr, start_routine, arg))
|
||||
{
|
||||
timed_thread_destroy (p_timed_thread, NULL);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*fprintf (stderr, "created timed thread 0x%08X\n", (unsigned)p_timed_thread);*/
|
||||
return p_timed_thread;
|
||||
/*fprintf (stderr, "created timed thread 0x%08X\n", (unsigned)p_timed_thread);*/
|
||||
return p_timed_thread;
|
||||
}
|
||||
|
||||
|
||||
@ -94,27 +94,27 @@ timed_thread_create (void *(*start_routine)(void*), void *arg, unsigned int inte
|
||||
void
|
||||
timed_thread_destroy (timed_thread* p_timed_thread, timed_thread** addr_of_p_timed_thread)
|
||||
{
|
||||
assert (p_timed_thread != NULL);
|
||||
assert ((addr_of_p_timed_thread == NULL) || (*addr_of_p_timed_thread == p_timed_thread));
|
||||
assert (p_timed_thread != NULL);
|
||||
assert ((addr_of_p_timed_thread == NULL) || (*addr_of_p_timed_thread == p_timed_thread));
|
||||
|
||||
/* signal thread to stop */
|
||||
pthread_mutex_lock (&p_timed_thread->runnable_mutex);
|
||||
pthread_cond_signal (&p_timed_thread->runnable_cond);
|
||||
pthread_mutex_unlock (&p_timed_thread->runnable_mutex);
|
||||
/* signal thread to stop */
|
||||
pthread_mutex_lock (&p_timed_thread->runnable_mutex);
|
||||
pthread_cond_signal (&p_timed_thread->runnable_cond);
|
||||
pthread_mutex_unlock (&p_timed_thread->runnable_mutex);
|
||||
|
||||
/* join the terminating thread */
|
||||
pthread_join (p_timed_thread->thread, NULL);
|
||||
/* join the terminating thread */
|
||||
pthread_join (p_timed_thread->thread, NULL);
|
||||
|
||||
/* clean up */
|
||||
pthread_attr_destroy (&p_timed_thread->thread_attr);
|
||||
pthread_mutex_destroy (&p_timed_thread->cs_mutex);
|
||||
pthread_mutex_destroy (&p_timed_thread->runnable_mutex);
|
||||
pthread_cond_destroy (&p_timed_thread->runnable_cond);
|
||||
/* clean up */
|
||||
pthread_attr_destroy (&p_timed_thread->thread_attr);
|
||||
pthread_mutex_destroy (&p_timed_thread->cs_mutex);
|
||||
pthread_mutex_destroy (&p_timed_thread->runnable_mutex);
|
||||
pthread_cond_destroy (&p_timed_thread->runnable_cond);
|
||||
|
||||
/*fprintf (stderr, "Conky: destroying thread 0x%08X\n", (unsigned)p_timed_thread);*/
|
||||
free (p_timed_thread);
|
||||
if (addr_of_p_timed_thread)
|
||||
*addr_of_p_timed_thread = NULL;
|
||||
/*fprintf (stderr, "Conky: destroying thread 0x%08X\n", (unsigned)p_timed_thread);*/
|
||||
free (p_timed_thread);
|
||||
if (addr_of_p_timed_thread)
|
||||
*addr_of_p_timed_thread = NULL;
|
||||
}
|
||||
|
||||
|
||||
@ -122,9 +122,9 @@ timed_thread_destroy (timed_thread* p_timed_thread, timed_thread** addr_of_p_tim
|
||||
int
|
||||
timed_thread_lock (timed_thread* p_timed_thread)
|
||||
{
|
||||
assert (p_timed_thread != NULL);
|
||||
assert (p_timed_thread != NULL);
|
||||
|
||||
return pthread_mutex_lock (&p_timed_thread->cs_mutex);
|
||||
return pthread_mutex_lock (&p_timed_thread->cs_mutex);
|
||||
}
|
||||
|
||||
|
||||
@ -132,9 +132,9 @@ timed_thread_lock (timed_thread* p_timed_thread)
|
||||
int
|
||||
timed_thread_unlock (timed_thread* p_timed_thread)
|
||||
{
|
||||
assert (p_timed_thread != NULL);
|
||||
assert (p_timed_thread != NULL);
|
||||
|
||||
return pthread_mutex_unlock (&p_timed_thread->cs_mutex);
|
||||
return pthread_mutex_unlock (&p_timed_thread->cs_mutex);
|
||||
}
|
||||
|
||||
|
||||
@ -144,37 +144,37 @@ timed_thread_unlock (timed_thread* p_timed_thread)
|
||||
int
|
||||
timed_thread_test (timed_thread* p_timed_thread)
|
||||
{
|
||||
struct timespec abstime, reltime;
|
||||
int rc;
|
||||
struct timespec abstime, reltime;
|
||||
int rc;
|
||||
|
||||
assert (p_timed_thread != NULL);
|
||||
assert (p_timed_thread != NULL);
|
||||
|
||||
/* acquire runnable_cond mutex */
|
||||
if (pthread_mutex_lock (&p_timed_thread->runnable_mutex))
|
||||
return (-1); /* could not acquire runnable_cond mutex, so tell caller to exit thread */
|
||||
/* acquire runnable_cond mutex */
|
||||
if (pthread_mutex_lock (&p_timed_thread->runnable_mutex))
|
||||
return (-1); /* could not acquire runnable_cond mutex, so tell caller to exit thread */
|
||||
|
||||
/* get the absolute time in the future we stop waiting for condition to signal */
|
||||
clock_gettime (CLOCK_REALTIME, &abstime);
|
||||
/* seconds portion of the microseconds interval */
|
||||
reltime.tv_sec = (time_t)(p_timed_thread->interval_usecs / 1000000);
|
||||
/* remaining microseconds convert to nanoseconds */
|
||||
reltime.tv_nsec = (long)((p_timed_thread->interval_usecs % 1000000) * 1000);
|
||||
/* absolute future time */
|
||||
abstime.tv_sec += reltime.tv_sec;
|
||||
abstime.tv_nsec += reltime.tv_nsec;
|
||||
/* get the absolute time in the future we stop waiting for condition to signal */
|
||||
clock_gettime (CLOCK_REALTIME, &abstime);
|
||||
/* seconds portion of the microseconds interval */
|
||||
reltime.tv_sec = (time_t)(p_timed_thread->interval_usecs / 1000000);
|
||||
/* remaining microseconds convert to nanoseconds */
|
||||
reltime.tv_nsec = (long)((p_timed_thread->interval_usecs % 1000000) * 1000);
|
||||
/* absolute future time */
|
||||
abstime.tv_sec += reltime.tv_sec;
|
||||
abstime.tv_nsec += reltime.tv_nsec;
|
||||
|
||||
/* release mutex and wait until future time for runnable_cond to signal */
|
||||
rc = pthread_cond_timedwait (&p_timed_thread->runnable_cond,
|
||||
&p_timed_thread->runnable_mutex,
|
||||
&abstime);
|
||||
/* mutex re-acquired, so release it */
|
||||
pthread_mutex_unlock (&p_timed_thread->runnable_mutex);
|
||||
/* release mutex and wait until future time for runnable_cond to signal */
|
||||
rc = pthread_cond_timedwait (&p_timed_thread->runnable_cond,
|
||||
&p_timed_thread->runnable_mutex,
|
||||
&abstime);
|
||||
/* mutex re-acquired, so release it */
|
||||
pthread_mutex_unlock (&p_timed_thread->runnable_mutex);
|
||||
|
||||
if (rc==0)
|
||||
return 1; /* runnable_cond was signaled, so tell caller to exit thread */
|
||||
if (rc==0)
|
||||
return 1; /* runnable_cond was signaled, so tell caller to exit thread */
|
||||
|
||||
/* tell caller not to exit yet */
|
||||
return 0;
|
||||
/* tell caller not to exit yet */
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@ -182,9 +182,9 @@ timed_thread_test (timed_thread* p_timed_thread)
|
||||
void
|
||||
timed_thread_exit (timed_thread* p_timed_thread)
|
||||
{
|
||||
assert (p_timed_thread != NULL);
|
||||
assert (p_timed_thread != NULL);
|
||||
|
||||
pthread_exit (NULL);
|
||||
pthread_exit (NULL);
|
||||
}
|
||||
|
||||
|
||||
@ -192,32 +192,32 @@ timed_thread_exit (timed_thread* p_timed_thread)
|
||||
int
|
||||
timed_thread_register (timed_thread* p_timed_thread, timed_thread** addr_of_p_timed_thread)
|
||||
{
|
||||
timed_thread_node *p_node;
|
||||
timed_thread_node *p_node;
|
||||
|
||||
assert (p_timed_thread != NULL);
|
||||
assert ((addr_of_p_timed_thread == NULL) || (*addr_of_p_timed_thread == p_timed_thread));
|
||||
|
||||
if ((p_node = calloc (sizeof (timed_thread_node), 1)) == 0)
|
||||
return 0;
|
||||
|
||||
p_node->p_timed_thread = p_timed_thread;
|
||||
p_node->addr_of_p_timed_thread = addr_of_p_timed_thread;
|
||||
p_node->next = NULL;
|
||||
|
||||
if (!p_timed_thread_list_tail)
|
||||
{
|
||||
/* first node of empty list */
|
||||
p_timed_thread_list_tail = p_node;
|
||||
p_timed_thread_list_head = p_node;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* add node to tail of non-empty list */
|
||||
p_timed_thread_list_tail->next = p_node;
|
||||
p_timed_thread_list_tail = p_node;
|
||||
}
|
||||
assert (p_timed_thread != NULL);
|
||||
assert ((addr_of_p_timed_thread == NULL) || (*addr_of_p_timed_thread == p_timed_thread));
|
||||
|
||||
if ((p_node = calloc (sizeof (timed_thread_node), 1)) == 0)
|
||||
return 0;
|
||||
|
||||
p_node->p_timed_thread = p_timed_thread;
|
||||
p_node->addr_of_p_timed_thread = addr_of_p_timed_thread;
|
||||
p_node->next = NULL;
|
||||
|
||||
if (!p_timed_thread_list_tail)
|
||||
{
|
||||
/* first node of empty list */
|
||||
p_timed_thread_list_tail = p_node;
|
||||
p_timed_thread_list_head = p_node;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* add node to tail of non-empty list */
|
||||
p_timed_thread_list_tail->next = p_node;
|
||||
p_timed_thread_list_tail = p_node;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@ -225,19 +225,19 @@ timed_thread_register (timed_thread* p_timed_thread, timed_thread** addr_of_p_ti
|
||||
void
|
||||
timed_thread_destroy_registered_threads (void)
|
||||
{
|
||||
timed_thread_node *p_node, *p_next;
|
||||
timed_thread_node *p_node, *p_next;
|
||||
|
||||
for (p_node=p_timed_thread_list_head;
|
||||
p_node;
|
||||
p_node=p_next)
|
||||
{
|
||||
p_next = p_node->next;
|
||||
timed_thread_destroy (p_node->p_timed_thread, p_node->addr_of_p_timed_thread);
|
||||
free (p_node);
|
||||
p_node = NULL;
|
||||
}
|
||||
for (p_node=p_timed_thread_list_head;
|
||||
p_node;
|
||||
p_node=p_next)
|
||||
{
|
||||
p_next = p_node->next;
|
||||
timed_thread_destroy (p_node->p_timed_thread, p_node->addr_of_p_timed_thread);
|
||||
free (p_node);
|
||||
p_node = NULL;
|
||||
}
|
||||
|
||||
p_timed_thread_list_head = NULL;
|
||||
p_timed_thread_list_tail = NULL;
|
||||
p_timed_thread_list_head = NULL;
|
||||
p_timed_thread_list_tail = NULL;
|
||||
}
|
||||
|
||||
|
20
src/x11.c
20
src/x11.c
@ -26,8 +26,6 @@ int use_xdbe;
|
||||
int use_xft = 0;
|
||||
#endif
|
||||
|
||||
#define WINDOW_NAME_FMT "%s - conky"
|
||||
|
||||
/* some basic X11 stuff */
|
||||
Display *display;
|
||||
int display_width;
|
||||
@ -185,8 +183,8 @@ inline void set_transparent_background(Window win)
|
||||
//XClearWindow(display, win); not sure why this was here
|
||||
}
|
||||
|
||||
void init_window(int own_window, int w, int h, int set_trans, int back_colour, char * nodename,
|
||||
char **argv, int argc)
|
||||
void init_window(int own_window, int w, int h, int set_trans, int back_colour,
|
||||
char **argv, int argc)
|
||||
{
|
||||
/* There seems to be some problems with setting transparent background (on
|
||||
* fluxbox this time). It doesn't happen always and I don't know why it
|
||||
@ -194,8 +192,6 @@ void init_window(int own_window, int w, int h, int set_trans, int back_colour, c
|
||||
set_transparent = set_trans;
|
||||
background_colour = back_colour;
|
||||
|
||||
nodename = (char *)nodename;
|
||||
|
||||
#ifdef OWN_WINDOW
|
||||
if (own_window) {
|
||||
|
||||
@ -245,28 +241,26 @@ void init_window(int own_window, int w, int h, int set_trans, int back_colour, c
|
||||
XClassHint classHint;
|
||||
XWMHints wmHint;
|
||||
Atom xa;
|
||||
char window_title[256];
|
||||
|
||||
/* Parent is root window so WM can take control */
|
||||
window.window = XCreateWindow(display,
|
||||
window.root,
|
||||
window.x, window.y, w, h, 0,
|
||||
window.x, window.y, w, h, 0,
|
||||
CopyFromParent,
|
||||
InputOutput,
|
||||
CopyFromParent,
|
||||
CWBackPixel|CWOverrideRedirect,
|
||||
&attrs);
|
||||
|
||||
classHint.res_name = window.wm_class_name;
|
||||
classHint.res_name = window.class_name;
|
||||
classHint.res_class = classHint.res_name;
|
||||
|
||||
wmHint.flags = InputHint | StateHint;
|
||||
wmHint.input = False;
|
||||
/* allow decorated windows to be given input focus by WM */
|
||||
wmHint.input = TEST_HINT(window.hints,HINT_UNDECORATED) ? False : True;
|
||||
wmHint.initial_state = NormalState;
|
||||
|
||||
sprintf(window_title,WINDOW_NAME_FMT,nodename);
|
||||
|
||||
XmbSetWMProperties (display, window.window, window_title, NULL,
|
||||
XmbSetWMProperties (display, window.window, window.title, NULL,
|
||||
argv, argc,
|
||||
NULL, &wmHint, &classHint);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user