From 1c35f432e5656c1a359513b69499fbdc9b64d64f Mon Sep 17 00:00:00 2001 From: Philip Kovacs Date: Sat, 23 Dec 2006 06:01:16 +0000 Subject: [PATCH] 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 --- ChangeLog | 25 + README | 278 ++++++----- app-admin/conky/conky-1.999.ebuild | 8 +- autogen.sh | 2 +- configure.ac.in | 386 +++++++-------- doc/config_settings.xml | 72 ++- doc/conky.1 | 46 +- doc/conkyrc.sample | 5 + doc/docs.xml | 2 +- extras/nano/conky.nanorc | 2 +- extras/vim/syntax/conkyrc.vim | 281 +++++------ src/Makefile.am | 4 - src/audacious.c | 187 ++++---- src/common.c | 18 +- src/conky.c | 311 ++++++++++-- src/conky.h | 49 +- src/freebsd.c | 17 + src/linux.c | 740 +++++++++++++++++++++++------ src/netbsd.c | 17 + src/remotec.c | 69 --- src/remotec.h | 15 - src/remoted.c | 126 ----- src/remoted.h | 11 - src/timed_thread.c | 226 ++++----- src/x11.c | 20 +- 25 files changed, 1773 insertions(+), 1144 deletions(-) delete mode 100644 src/remotec.c delete mode 100644 src/remotec.h delete mode 100644 src/remoted.c delete mode 100644 src/remoted.h diff --git a/ChangeLog b/ChangeLog index 9042e5db..dd8d4eda 100644 --- a/ChangeLog +++ b/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 (default: Conky) + - replaces wm_class_name + - own_window_title (default: - 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. diff --git a/README b/README index 5da32d94..0b4e1fc8 100644 --- a/README +++ b/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 " - 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, . - 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, . + 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 diff --git a/app-admin/conky/conky-1.999.ebuild b/app-admin/conky/conky-1.999.ebuild index a7f78ea2..67a8cb08 100644 --- a/app-admin/conky/conky-1.999.ebuild +++ b/app-admin/conky/conky-1.999.ebuild @@ -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" diff --git a/autogen.sh b/autogen.sh index bb4b2cc0..f9251342 100755 --- a/autogen.sh +++ b/autogen.sh @@ -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 diff --git a/configure.ac.in b/configure.ac.in index fead9511..99c527ef 100644 --- a/configure.ac.in +++ b/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 - #endif - ]) + [#ifdef HAVE_SYS_PARAM_H + #include + #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 - #include ], - [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 ], - [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 + + + + Act as client and connect to libdexter server for remote monitoring? + + + + + + + Full path to libdexter configuration file (default search order: $HOME/.dexterrc; /etc/libdexter/dexter.conf) + + + + + + + Act as server for libdexter services? + + + @@ -219,21 +240,10 @@ - - - Boolean, set pseudo-transparency? - - - - - - - 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. - + + + Manually set the WM_CLASS name. Defaults to "Conky". + @@ -256,6 +266,31 @@ + + + + Manually set the window name. Defaults to "<hostname> - conky". + + + + + + + Boolean, set pseudo-transparency? + + + + + + + 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. + + + @@ -319,13 +354,6 @@ - - - - Manually set the WM_CLASS name. Defaults to "conky". - - - diff --git a/doc/conky.1 b/doc/conky.1 index bc84018b..69631ce0 100644 --- a/doc/conky.1 +++ b/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 " - 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. diff --git a/doc/conkyrc.sample b/doc/conkyrc.sample index 4104fd92..3d4f52d7 100644 --- a/doc/conkyrc.sample +++ b/doc/conkyrc.sample @@ -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 diff --git a/doc/docs.xml b/doc/docs.xml index 6febdf82..62463ece 100644 --- a/doc/docs.xml +++ b/doc/docs.xml @@ -79,7 +79,7 @@ - + diff --git a/extras/nano/conky.nanorc b/extras/nano/conky.nanorc index c10765b6..14b20470 100644 --- a/extras/nano/conky.nanorc +++ b/extras/nano/conky.nanorc @@ -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)\>" diff --git a/extras/vim/syntax/conkyrc.vim b/extras/vim/syntax/conkyrc.vim index 1130287b..1872b249 100644 --- a/extras/vim/syntax/conkyrc.vim +++ b/extras/vim/syntax/conkyrc.vim @@ -1,9 +1,9 @@ " Vim syntax file -" Language: conkyrc -" Author: Ciaran McCreesh -" 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 +" 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 diff --git a/src/Makefile.am b/src/Makefile.am index 80207335..9e26ddaf 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -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) \ diff --git a/src/audacious.c b/src/audacious.c index 9dd66635..beb5a99a 100644 --- a/src/audacious.c +++ b/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); + } } diff --git a/src/common.c b/src/common.c index 6ac265a0..a4a6b05e 100644 --- a/src/common.c +++ b/src/common.c @@ -7,8 +7,6 @@ */ #include "conky.h" -#include "remoted.h" -#include "remotec.h" #include #include #include @@ -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(); diff --git a/src/conky.c b/src/conky.c index 32c22202..33277e1e 100644 --- a/src/conky.c +++ b/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;try0; + 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 diff --git a/src/conky.h b/src/conky.h index a0b5d53b..9c3693df 100644 --- a/src/conky.h +++ b/src/conky.h @@ -32,6 +32,10 @@ #include #endif /* __FreeBSD__ */ +#ifdef HAVE_LIBDEXTER +#include +#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(); diff --git a/src/freebsd.c b/src/freebsd.c index d40f233f..f223b573 100644 --- a/src/freebsd.c +++ b/src/freebsd.c @@ -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 + diff --git a/src/linux.c b/src/linux.c index 83fa5d0d..446e4e4a 100644 --- a/src/linux.c +++ b/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 +#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; icpuinfo_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; iloadavg_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; imeminfo_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; istat_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; iuptime_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; inet_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; idiskstats_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 diff --git a/src/netbsd.c b/src/netbsd.c index 13c562f5..257df88a 100644 --- a/src/netbsd.c +++ b/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 + diff --git a/src/remotec.c b/src/remotec.c deleted file mode 100644 index c0219fc6..00000000 --- a/src/remotec.c +++ /dev/null @@ -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 -#include -#include -#include -#include -#include -#include -#include -#include - -#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; -} diff --git a/src/remotec.h b/src/remotec.h deleted file mode 100644 index 37ed44d5..00000000 --- a/src/remotec.h +++ /dev/null @@ -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(); diff --git a/src/remoted.c b/src/remoted.c deleted file mode 100644 index 9e094e17..00000000 --- a/src/remoted.c +++ /dev/null @@ -1,126 +0,0 @@ -/* -* Conky, a system monitor, based on torsmo -* -* This program is licensed under BSD license, read COPYING -* -* $Id$ -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -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 */ - } -} diff --git a/src/remoted.h b/src/remoted.h deleted file mode 100644 index b1983897..00000000 --- a/src/remoted.h +++ /dev/null @@ -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); diff --git a/src/timed_thread.c b/src/timed_thread.c index b0d71aa5..477189b0 100644 --- a/src/timed_thread.c +++ b/src/timed_thread.c @@ -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; } diff --git a/src/x11.c b/src/x11.c index d35f3037..888f9171 100644 --- a/src/x11.c +++ b/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);