Merge with conky1-extra, Changelog contains the changes
authorNikolas Garofil <ngarofil@users.sourceforge.net>
Sat, 21 Jun 2008 20:37:58 +0000 (20:37 +0000)
committerNikolas Garofil <ngarofil@users.sourceforge.net>
Sat, 21 Jun 2008 20:37:58 +0000 (20:37 +0000)
git-svn-id: https://conky.svn.sourceforge.net/svnroot/conky/trunk/conky1@1193 7f574dfc-610e-0410-a909-a81674777703

17 files changed:
ChangeLog
README
data/conky.conf
doc/config_settings.xml
doc/conky.1
doc/conky.conf
doc/variables.xml
extras/nano/conky.nanorc
extras/vim/syntax/conkyrc.vim
src/common.c
src/conky.c
src/conky.h
src/freebsd.c
src/linux.c
src/netbsd.c
src/openbsd.c
src/x11.c

index 216bb99..4db03b0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -7,6 +7,7 @@
        * Removed redundancy in various parts
 
 2008-06-20
+       * Use output_methods instead of out_to_console
        * Made some functions non-inline to compile with gcc 4.2 and higher
 
 2008-06-19
        * Moved audacious defs into header
        * Fixed 3 bufferoverflows in a struct utmp in users.c
 
+2008-06-09
+       * Graphs can now be logarithmic (except execigraph)
+
 2008-06-08
        * Bugfix, $memgraph wasn't working and needed docs
+       * Code for $lines and $words
        * Bugfix, $execgraph showed 0-0 instead of 0-100 values
 
 2008-06-07
+       * Case-insensitive values for if_up_strictness 
        * Fix bug where DEV_NAME can read uninitialised memory
        * Fix bug where ${if_mounted /}foo$endif prints foo on 1 line for
        each update instead of just 1 line
 
+2008-06-06
+       * Code for $scroll
+       * Code for $memfree and $memeasyfree
+
 2008-06-05
        * Fix bug where conky prints everything twice to STDOUT when
        out_to_console is enabled
+       * Code for show_graph_range
+       * Code for $monitor and $monitor_number
 
 2008-06-04
        * Fix bug where conky tries to free a already freed pointer when you
diff --git a/README b/README
index 0fede25..6679ae9 100644 (file)
--- a/README
+++ b/README
@@ -286,6 +286,14 @@ CONFIGURATION SETTINGS
              Minimum size of window
 
 
+       monitor
+             Number of the monitor on which conky is running
+
+
+       monitor_number
+             Number of monitors
+
+
        mpd_host
              Host of MPD server
 
@@ -612,10 +620,11 @@ VARIABLES
              $cpu for more info on SMP.
 
 
-       cpugraph         (cpu  number)  (height),(width) (gradient colour 1) (gradient
-       colour 2)
+       cpugraph  normal|log (cpu number) (height),(width) (gradient colour 1)
+       (gradient colour 2)
              CPU  usage graph, with optional colours in hex, minus the #. See
-             $cpu for more info on SMP.
+             $cpu for more info on SMP. Uses a logarithmic scale (to see small
+             numbers) when you use "log" instead of "normal".
 
 
        diskio (device)
@@ -623,32 +632,35 @@ VARIABLES
              of sda for /dev/sda. Individual partitions are allowed.
 
 
-       diskiograph  (device)  (height),(width) (gradient  colour 1) (gradient
-       colour 2) (scale)
+       diskiograph  normal|log (device) (height),(width) (gradient colour 1)
+       (gradient colour 2) (scale)
              Disk  IO graph, colours defined in hex, minus the #. If scale is
-             non-zero, it becomes the scale for the graph.
+             non-zero, it becomes the scale for the graph. Uses a logarithmic
+             scale (to see small numbers) when you use "log".
 
 
        diskio_read (device)
              Displays current disk IO for reads. Device as in diskio.
 
 
-       diskiograph_read (device) (height),(width) (gradient colour 1)  (gradi-
-       ent colour 2) (scale)
+       diskiograph_read  normal|log (device) (height),(width) (gradient colour
+       1) (gradient colour 2) (scale)
              Disk IO graph for reads, colours defined in hex, minus the #. If
              scale is non-zero, it becomes the scale for the graph. Device as
-             in diskio.
+             in diskio. Uses a logarithmic scale (to see small numbers) when
+             you use "log" instead of "normal".
 
 
        diskio_write (device)
              Displays current disk IO for writes. Device as in diskio.
 
 
-       diskiograph_write (device) (height),(width) (gradient colour 1) (gradi-
-       ent colour 2) (scale)
+       diskiograph_write  normal|log (device) (height),(width) (gradient colour
+       1) (gradient colour 2) (scale)
              Disk IO graph for writes, colours defined in hex, minus  the  #.
              If scale is non-zero, it becomes the scale for the graph. Device
-             as in diskio.
+             as in diskio. Uses a logarithmic scale (to see small numbers)
+             when you use "log" instead of "normal".
 
 
        disk_protect device
@@ -664,10 +676,11 @@ VARIABLES
              Download speed in KiB with one decimal
 
 
-       downspeedgraph  net  (height),(width)  (gradient         colour  1)  (gradient
-       colour 2) (scale)
+       downspeedgraph  normal|log net (height),(width) (gradient colour        1)
+       (gradient colour 2) (scale)
              Download  speed  graph,  colours defined in hex, minus the #. If
-             scale is non-zero, it becomes the scale for the graph.
+             scale is non-zero, it becomes the scale for the graph. Uses a
+             logarithmic scale (to see small numbers) when you use "log".
 
 
        else   Text to show if any of the above are not true
@@ -697,8 +710,10 @@ VARIABLES
              bar is currently fixed, but that may change in the future.
 
 
-       execgraph command
-             Same as execbar, but graphs values.
+       execgraph (normal|log) command
+             Same as execbar, but graphs values. Uses a logaritmic scale when
+             the log option is given (to see small numbers). Values still have
+             to be between 0 and 100.
 
 
        execi interval command
@@ -995,14 +1010,20 @@ VARIABLES
              The value of /proc/sys/vm/laptop_mode
 
 
+       lines textfile
+             Displays the number of lines in the given file
+
+
        loadavg
              (1,2,3)> System load average, 1 is for past 1 minute, 2 for past
              5 minutes and 3 for past 15 minutes.
 
 
-       loadgraph (height),(width) (gradient colour 1) (gradient colour 2)
+       loadgraph  normal|log (height),(width) (gradient colour 1) (gradient
+       colour 2)
              Load1 average graph, similar to xload, with optional colours  in
-             hex, minus the #.
+             hex, minus the #. Uses a logarithmic scale (to see small numbers)
+             when you use "log" instead of "normal".
 
 
        machine
@@ -1030,8 +1051,19 @@ VARIABLES
              Bar that shows amount of memory in use
 
 
-       memgraph         (height),(width) (gradient colour 1) (gradient colour 2)
+       memeasyfree
+              Amount of free memory including the memory that is very easily freed (buffers/cache)
+
+
+       memfree
+              Amount of free memory
+
+
+       memgraph  normal|log (height),(width) (gradient colour 1) (gradient
+       colour 2)
              Memory usage graph, with optional colours in hex, minus the #
+             Uses a logarithmic scale (to see small numbers) when you use
+             "log" instead of "normal".
 
 
        memmax Total amount of memory
@@ -1190,6 +1222,18 @@ VARIABLES
              Running processes (not sleeping), requires Linux 2.6
 
 
+       scroll length text
+             Scroll  'text' showing 'length' number of characters at the same 
+             time. The text may also contain variables. If a var creates out-
+             put on multiple lines then the lines are placed behind each oth-
+             er separated with a '|'-sign. Do NOT use vars that change colors
+             or otherwise affect the design inside a scrolling text.   If you
+             want spaces between the start and the end of 'text',  place them
+             at the end of 'text' not at the front ("foobar" and "    foobar"
+             can both generate "barfoo" but "foobar    " will keep the spaces
+             like this "bar    foo").
+
+
        shadecolor (color)
              Change shading color
 
@@ -1356,10 +1400,11 @@ VARIABLES
              Upload speed in KiB with one decimal
 
 
-       upspeedgraph net (height),(width) (gradient colour 1) (gradient colour
-       2) (scale)
+       upspeedgraph  normal|log net (height),(width) (gradient colour 1)
+       (gradient colour 2) (scale)
              Upload speed graph, colours defined in  hex,  minus  the  #.  If
-             scale is non-zero, it becomes the scale for the graph.
+             scale is non-zero, it becomes the scale for the graph. Uses a
+             logarithmic scale (to see small numbers) when you use "log".
 
 
        uptime Uptime
@@ -1432,6 +1477,10 @@ VARIABLES
              Wireless link quality bar (Linux only)
 
 
+       words textfile
+             Displays the number of words in the given file
+
+
        xmms2_artist
              Artist in current XMMS2 song
 
index 14c92d7..c1dfab9 100644 (file)
@@ -50,9 +50,10 @@ update_interval 3.0
 uppercase no
 use_spacer no
 show_graph_scale no
+show_graph_range no
 
 TEXT
-$nodename - $sysname $kernel on $machine
+${scroll 16 $nodename - $sysname $kernel on $machine | }
 $hr
 ${color grey}Uptime:$color $uptime
 ${color grey}Frequency (in MHz):$color $freq
index c51d7e9..2bffbe0 100644 (file)
        </varlistentry>
 
        <varlistentry>
+               <term><command><option>show_graph_range</option></command></term>
+               <listitem>
+                       Shows the time range covered by a graph.
+                       <para></para></listitem>
+       </varlistentry>
+
+       <varlistentry>
                <term><command><option>stippled_borders</option></command></term>
                <listitem>
                        Border stippling (dashing) in pixels
index cd727a9..7974b4c 100644 (file)
@@ -1,4 +1,4 @@
-'\" -*- coding: us-ascii -*-
+.\" -*- coding: us-ascii -*-
 .if \n(.g .ds T< \\FC
 .if \n(.g .ds T> \\F[\n[.fam]]
 .de URL
@@ -30,7 +30,7 @@ using scripts and other external programs.
 Conky has more than 250 built in objects, including support for
 a plethora of OS stats (uname, uptime, CPU usage, mem usage, disk
 usage, "top" like process stats, and network monitoring, just to name a few),
-built in IMAP and POP3 support, built in support for many popular
+built in IMAP and POP3 support, built in support for many popular 
 music players (MPD, XMMS2, BMPx, Audacious), and much much more.
 Conky can display this info either as text, or using simple progress
 bars and graph widgets, with different fonts and colours.
@@ -42,11 +42,11 @@ or stop by #conky on irc.freenode.net if you have questions or want to contribut
 Thanks for your interest in Conky.
 .SH COMPILING
 For users compiling from source on a binary distro, make sure you have the X development
-libraries installed. This should be a package along the lines of "libx11-dev" or
+libraries installed. This should be a package along the lines of "libx11-dev" or 
 "xorg-x11-dev" for X11 libs, and similar "-dev" format for the other libs required (depending
 on your configure options).
 .PP
-Conky has (for some time) been available in the repositories of most popular distributions.
+Conky has (for some time) been available in the repositories of most popular distributions. 
 Here are some installation instructions for a few:
 .PP
 Gentoo users -- Conky is in Gentoo's Portage... simply use "emerge app-admin/conky" for installation.
@@ -139,7 +139,7 @@ Y position
 Number of times to update Conky (and quit)
 
 .SH "CONFIGURATION SETTINGS"
-Default configuration file location is $HOME/.conkyrc or
+Default configuration file location is $HOME/.conkyrc or 
 ${sysconfdir}/conky/conky.conf. On most systems, sysconfdir is /etc,
 and you can find the sample config file there (/etc/conky/conky.conf).
 .PP
@@ -339,6 +339,10 @@ Shortens units to a single character (kiB->k, GiB->G, etc.). Default is off.
 Shows the maximum value in scaled graphs.
 
 .TP 
+\fB\*(T<\fBshow_graph_range\fR\*(T>\fR
+Shows the time range covered by a graph.
+
+.TP 
 \fB\*(T<\fBstippled_borders\fR\*(T>\fR
 Border stippling (dashing) in pixels
 
@@ -560,32 +564,32 @@ CPU usage in percents. For SMP machines, the CPU number can be provided as an ar
 Bar that shows CPU usage, height is bar's height in pixels. See $cpu for more info on SMP.
 
 .TP 
-\fB\*(T<\fBcpugraph\fR\*(T>\fR \*(T<\fB(cpu number) (height),(width) (gradient colour 1) (gradient colour 2)\fR\*(T> 
-CPU usage graph, with optional colours in hex, minus the #. See $cpu for more info on SMP.
+\fB\*(T<\fBcpugraph\fR\*(T>\fR \*(T<\fBnormal|log (cpu number) (height),(width) (gradient colour 1) (gradient colour 2)\fR\*(T> 
+CPU usage graph, with optional colours in hex, minus the #. See $cpu for more info on SMP. Uses a logarithmic scale (to see small numbers) when you use "log" instead of "normal".
 
 .TP 
 \fB\*(T<\fBdiskio\fR\*(T>\fR \*(T<\fB(device)\fR\*(T> 
 Displays current disk IO. Device is optional, and takes the form of sda for /dev/sda. Individual partitions are allowed.
 
 .TP 
-\fB\*(T<\fBdiskiograph\fR\*(T>\fR \*(T<\fB(device) (height),(width) (gradient colour 1) (gradient colour 2) (scale)\fR\*(T> 
-Disk IO graph, colours defined in hex, minus the #. If scale is non-zero, it becomes the scale for the graph.
+\fB\*(T<\fBdiskiograph\fR\*(T>\fR \*(T<\fBnormal|log (device) (height),(width) (gradient colour 1) (gradient colour 2) (scale)\fR\*(T> 
+Disk IO graph, colours defined in hex, minus the #. If scale is non-zero, it becomes the scale for the graph. Uses a logarithmic scale (to see small numbers) when you use "log" instead of "normal".
 
 .TP 
 \fB\*(T<\fBdiskio_read\fR\*(T>\fR \*(T<\fB(device)\fR\*(T> 
 Displays current disk IO for reads. Device as in diskio.
 
 .TP 
-\fB\*(T<\fBdiskiograph_read\fR\*(T>\fR \*(T<\fB(device) (height),(width) (gradient colour 1) (gradient colour 2) (scale)\fR\*(T> 
-Disk IO graph for reads, colours defined in hex, minus the #. If scale is non-zero, it becomes the scale for the graph. Device as in diskio.
+\fB\*(T<\fBdiskiograph_read\fR\*(T>\fR \*(T<\fBnormal|log (device) (height),(width) (gradient colour 1) (gradient colour 2) (scale)\fR\*(T> 
+Disk IO graph for reads, colours defined in hex, minus the #. If scale is non-zero, it becomes the scale for the graph. Device as in diskio. Uses a logarithmic scale (to see small numbers) when you use "log" instead of "normal".
 
 .TP 
 \fB\*(T<\fBdiskio_write\fR\*(T>\fR \*(T<\fB(device)\fR\*(T> 
 Displays current disk IO for writes. Device as in diskio.
 
 .TP 
-\fB\*(T<\fBdiskiograph_write\fR\*(T>\fR \*(T<\fB(device) (height),(width) (gradient colour 1) (gradient colour 2) (scale)\fR\*(T> 
-Disk IO graph for writes, colours defined in hex, minus the #. If scale is non-zero, it becomes the scale for the graph. Device as in diskio.
+\fB\*(T<\fBdiskiograph_write\fR\*(T>\fR \*(T<\fBnormal|log (device) (height),(width) (gradient colour 1) (gradient colour 2) (scale)\fR\*(T> 
+Disk IO graph for writes, colours defined in hex, minus the #. If scale is non-zero, it becomes the scale for the graph. Device as in diskio. Uses a logarithmic scale (to see small numbers) when you use "log" instead of "normal".
 
 .TP 
 \fB\*(T<\fBdisk_protect\fR\*(T>\fR \*(T<\fBdevice\fR\*(T> 
@@ -600,8 +604,8 @@ Download speed in KiB
 Download speed in KiB with one decimal
 
 .TP 
-\fB\*(T<\fBdownspeedgraph\fR\*(T>\fR \*(T<\fBnet (height),(width) (gradient colour 1) (gradient colour 2) (scale)\fR\*(T> 
-Download speed graph, colours defined in hex, minus the #. If scale is non-zero, it becomes the scale for the graph.
+\fB\*(T<\fBdownspeedgraph\fR\*(T>\fR \*(T<\fBnormal|log net (height),(width) (gradient colour 1) (gradient colour 2) (scale)\fR\*(T> 
+Download speed graph, colours defined in hex, minus the #. If scale is non-zero, it becomes the scale for the graph. Uses a logarithmic scale (to see small numbers) when you use "log" instead of "normal".
 
 .TP 
 \fB\*(T<\fBelse\fR\*(T>\fR 
@@ -628,8 +632,8 @@ Executes a shell command and displays the output in conky. warning: this takes a
 Same as exec, except if the first value return is a value between 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.
 
 .TP 
-\fB\*(T<\fBexecgraph\fR\*(T>\fR \*(T<\fBcommand\fR\*(T> 
-Same as execbar, but graphs values.
+\fB\*(T<\fBexecgraph\fR\*(T>\fR \*(T<\fB(normal|log) command\fR\*(T> 
+Same as execbar, but graphs values. Uses a logaritmic scale when the log option is given (to see small numbers). Values still have to be between 0 and 100.
 
 .TP 
 \fB\*(T<\fBexeci\fR\*(T>\fR \*(T<\fBinterval command\fR\*(T> 
@@ -854,12 +858,16 @@ Kernel version
 The value of /proc/sys/vm/laptop_mode
 
 .TP 
+\fB\*(T<\fBlines\fR\*(T>\fR \*(T<\fBtextfile\fR\*(T> 
+Displays the number of lines in the given file
+
+.TP 
 \fB\*(T<\fBloadavg\fR\*(T>\fR 
 (1,2,3)> System load average, 1 is for past 1 minute, 2 for past 5 minutes and 3 for past 15 minutes.
 
 .TP 
-\fB\*(T<\fBloadgraph\fR\*(T>\fR \*(T<\fB(height),(width) (gradient colour 1) (gradient colour 2)\fR\*(T> 
-Load1 average graph, similar to xload, with optional colours in hex, minus the #.
+\fB\*(T<\fBloadgraph\fR\*(T>\fR \*(T<\fBnormal|log (height),(width) (gradient colour 1) (gradient colour 2)\fR\*(T> 
+Load1 average graph, similar to xload, with optional colours in hex, minus the #. Uses a logarithmic scale (to see small numbers) when you use "log" instead of "normal".
 
 .TP 
 \fB\*(T<\fBmachine\fR\*(T>\fR 
@@ -885,8 +893,16 @@ Amount of memory in use
 Bar that shows amount of memory in use
 
 .TP 
-\fB\*(T<\fBmemgraph\fR\*(T>\fR \*(T<\fB(height),(width) (gradient colour 1) (gradient colour 2)\fR\*(T> 
-Memory usage graph
+\fB\*(T<\fBmemeasyfree\fR\*(T>\fR 
+Amount of free memory including the memory that is very easily freed (buffers/cache)
+
+.TP 
+\fB\*(T<\fBmemfree\fR\*(T>\fR 
+Amount of free memory
+
+.TP 
+\fB\*(T<\fBmemgraph\fR\*(T>\fR \*(T<\fBnormal|log (height),(width) (gradient colour 1) (gradient colour 2)\fR\*(T> 
+Memory usage graph. Uses a logarithmic scale (to see small numbers) when you use "log" instead of "normal".
 
 .TP 
 \fB\*(T<\fBmemmax\fR\*(T>\fR 
@@ -897,6 +913,14 @@ Total amount of memory
 Percentage of memory in use
 
 .TP 
+\fB\*(T<\fBmonitor\fR\*(T>\fR 
+Number of the monitor on which conky is running
+
+.TP 
+\fB\*(T<\fBmonitor_number\fR\*(T>\fR 
+Number of monitors
+
+.TP 
 \fB\*(T<\fBmpd_artist\fR\*(T>\fR 
 Artist in current MPD song must be enabled at compile
 
@@ -1133,6 +1157,10 @@ Move text over by N pixels. See also $voffset.
 Download and parse RSS feeds. Action may be one of the following: feed_title, item_title (with num par), item_desc (with num par) and item_titles.
 
 .TP 
+\fB\*(T<\fBscroll\fR\*(T>\fR \*(T<\fBlength text\fR\*(T> 
+Scroll 'text' showing 'length' number of characters at the same time. The text may also contain variables. If a var creates output on multiple lines then the lines are placed behind each other separated with a '|'-sign. Do NOT use vars that change colors or otherwise affect the design inside a scrolling text. If you want spaces between the start and the end of 'text', place them at the end of 'text' not at the front ("foobar" and "    foobar" can both generate "barfoo" but "foobar    " will keep the spaces like this "bar    foo").
+
+.TP 
 \fB\*(T<\fBtab\fR\*(T>\fR \*(T<\fB(width, (start))\fR\*(T> 
 Puts a tab of the specified width, starting from column 'start'.
 
@@ -1181,8 +1209,8 @@ Upload speed in KiB
 Upload speed in KiB with one decimal
 
 .TP 
-\fB\*(T<\fBupspeedgraph\fR\*(T>\fR \*(T<\fBnet (height),(width) (gradient colour 1) (gradient colour 2) (scale)\fR\*(T> 
-Upload speed graph, colours defined in hex, minus the #. If scale is non-zero, it becomes the scale for the graph.
+\fB\*(T<\fBupspeedgraph\fR\*(T>\fR \*(T<\fBnormal|log net (height),(width) (gradient colour 1) (gradient colour 2) (scale)\fR\*(T> 
+Upload speed graph, colours defined in hex, minus the #. If scale is non-zero, it becomes the scale for the graph. Uses a logarithmic scale (to see small numbers) when you use "log" instead of "normal".
 
 .TP 
 \fB\*(T<\fBuptime\fR\*(T>\fR 
@@ -1257,6 +1285,10 @@ Wireless link quality in percents (Linux only)
 Wireless link quality bar (Linux only)
 
 .TP 
+\fB\*(T<\fBwords\fR\*(T>\fR \*(T<\fBtextfile\fR\*(T> 
+Displays the number of words in the given file
+
+.TP 
 \fB\*(T<\fBxmms2_artist\fR\*(T>\fR 
 Artist in current XMMS2 song
 
index df7dd4e..4b220e5 100644 (file)
@@ -128,6 +128,9 @@ use_spacer none
 # Shows the maximum value in scaled graphs.
 show_graph_scale no
 
+# Shows the time range covered by a graph.
+show_graph_range no
+
 # Allow each port monitor to track at most this many connections (if 0 or not set, default is 256)
 #max_port_monitor_connections 256
 
index ac786dd..2fc3f1f 100644 (file)
        <varlistentry>
                <term>
                        <command><option>cpugraph</option></command>
-                       <option>(cpu number) (height),(width) (gradient colour 1) (gradient colour 2)</option>
+                       <option>normal|log (cpu number) (height),(width) (gradient colour 1) (gradient colour 2)</option>
                </term>
                <listitem>
-                       CPU usage graph, with optional colours in hex, minus the #.  See $cpu for more info on SMP.
+                       CPU usage graph, with optional colours in hex, minus the #.  See $cpu for more info on SMP. Uses a logarithmic scale (to see small numbers) when you use "log" instead of "normal".
                        <para></para></listitem>
        </varlistentry>
 
        <varlistentry>
                <term>
                        <command><option>diskiograph</option></command>
-                       <option>(device) (height),(width) (gradient colour 1) (gradient colour 2) (scale)</option>
+                       <option>normal|log (device) (height),(width) (gradient colour 1) (gradient colour 2) (scale)</option>
                </term>
                <listitem>
-                       Disk IO graph, colours defined in hex, minus the #.  If scale is non-zero, it becomes the scale for the graph.
+                       Disk IO graph, colours defined in hex, minus the #.  If scale is non-zero, it becomes the scale for the graph. Uses a logarithmic scale (to see small numbers) when you use "log" instead of "normal".
                        <para></para></listitem>
        </varlistentry>
 
        <varlistentry>
                <term>
                        <command><option>diskiograph_read</option></command>
-                       <option>(device) (height),(width) (gradient colour 1) (gradient colour 2) (scale)</option>
+                       <option>normal|log (device) (height),(width) (gradient colour 1) (gradient colour 2) (scale)</option>
                </term>
                <listitem>
-                       Disk IO graph for reads, colours defined in hex, minus the #.  If scale is non-zero, it becomes the scale for the graph.  Device as in diskio.
+                       Disk IO graph for reads, colours defined in hex, minus the #.  If scale is non-zero, it becomes the scale for the graph.  Device as in diskio. Uses a logarithmic scale (to see small numbers) when you use "log" instead of "normal".
                        <para></para></listitem>
        </varlistentry>
 
        <varlistentry>
                <term>
                        <command><option>diskiograph_write</option></command>
-                       <option>(device) (height),(width) (gradient colour 1) (gradient colour 2) (scale)</option>
+                       <option>normal|log (device) (height),(width) (gradient colour 1) (gradient colour 2) (scale)</option>
                </term>
                <listitem>
-                       Disk IO graph for writes, colours defined in hex, minus the #.  If scale is non-zero, it becomes the scale for the graph.  Device as in diskio.
+                       Disk IO graph for writes, colours defined in hex, minus the #.  If scale is non-zero, it becomes the scale for the graph.  Device as in diskio. Uses a logarithmic scale (to see small numbers) when you use "log" instead of "normal".
                        <para></para></listitem>
        </varlistentry>
 
        <varlistentry>
                <term>
                        <command><option>downspeedgraph</option></command>
-                       <option>net (height),(width) (gradient colour 1) (gradient colour 2) (scale)</option>
+                       <option>normal|log net (height),(width) (gradient colour 1) (gradient colour 2) (scale)</option>
                </term>
                <listitem>
-                       Download speed graph, colours defined in hex, minus the #.  If scale is non-zero, it becomes the scale for the graph.
+                       Download speed graph, colours defined in hex, minus the #.  If scale is non-zero, it becomes the scale for the graph. Uses a logarithmic scale (to see small numbers) when you use "log" instead of "normal".
                        <para></para></listitem>
        </varlistentry>
 
        <varlistentry>
                <term>
                        <command><option>execgraph</option></command>
-                       <option>command</option>
+                       <option>(normal|log) command</option>
                </term>
                <listitem>
-                       Same as execbar, but graphs values.
+                       Same as execbar, but graphs values. Uses a logaritmic scale when the log option is given (to see small numbers). Values still have to be between 0 and 100.
                        <para></para></listitem>
        </varlistentry>
 
        <varlistentry>
                <term>
                        <command><option>loadgraph</option></command>
-                       <option>(height),(width) (gradient colour 1) (gradient colour 2)</option>
+                       <option>normal|log (height),(width) (gradient colour 1) (gradient colour 2)</option>
                </term>
                <listitem>
-                       Load1 average graph, similar to xload, with optional colours in hex, minus the #.
+                       Load1 average graph, similar to xload, with optional colours in hex, minus the #. Uses a logarithmic scale (to see small numbers) when you use "log" instead of "normal".
+                       <para></para></listitem>
+       </varlistentry>
+
+       <varlistentry>
+               <term>
+                       <command><option>lines</option></command>
+                       <option>textfile</option>
+               </term>
+               <listitem>
+                       Displays the number of lines in the given file
                        <para></para></listitem>
        </varlistentry>
 
        <varlistentry>
                <term>
                        <command><option>memgraph</option></command>
-                       <option>(height),(width) (gradient colour 1) (gradient colour 2)</option>
+                       <option>normal|log (height),(width) (gradient colour 1) (gradient colour 2)</option>
                </term>
                <listitem>
-                       Memory usage graph
+                       Memory usage graph. Uses a logarithmic scale (to see small numbers) when you use "log" instead of "normal".
+                       <para></para></listitem>
+       </varlistentry>
+
+       <varlistentry>
+               <term>
+                       <command><option>memeasyfree</option></command>
+               </term>
+               <listitem>
+                       Amount of free memory including the memory that is very easily freed (buffers/cache)
+                       <para></para></listitem>
+       </varlistentry>
+
+       <varlistentry>
+               <term>
+                       <command><option>memfree</option></command>
+               </term>
+               <listitem>
+                       Amount of free memory
                        <para></para></listitem>
        </varlistentry>
 
 
        <varlistentry>
                <term>
+                       <command><option>monitor</option></command>
+               </term>
+               <listitem>
+                       Number of the monitor on which conky is running
+                       <para></para></listitem>
+       </varlistentry>
+
+       <varlistentry>
+               <term>
+                       <command><option>monitor_number</option></command>
+               </term>
+               <listitem>
+                       Number of monitors
+                       <para></para></listitem>
+       </varlistentry>
+
+       <varlistentry>
+               <term>
                        <command><option>mpd_artist</option></command>
                </term>
                <listitem>
 
        <varlistentry>
                <term>
+                       <command><option>scroll</option></command>
+                       <option>length text</option>
+               </term>
+               <listitem>
+                       Scroll 'text' showing 'length' number of characters at the same time. The text may also contain variables. If a var creates output on multiple lines then the lines are placed behind each other separated with a '|'-sign. Do NOT use vars that change colors or otherwise affect the design inside a scrolling text. If you want spaces between the start and the end of 'text', place them at the end of 'text' not at the front ("foobar" and "    foobar" can both generate "barfoo" but "foobar    " will keep the spaces like this "bar    foo").
+                       <para></para></listitem>
+       </varlistentry>
+
+       <varlistentry>
+               <term>
                        <command><option>shadecolor</option></command>
                        <option>(color)</option>
                </term>
        <varlistentry>
                <term>
                        <command><option>upspeedgraph</option></command>
-                       <option>net (height),(width) (gradient colour 1) (gradient colour 2) (scale)</option>
+                       <option>normal|log net (height),(width) (gradient colour 1) (gradient colour 2) (scale)</option>
                </term>
                <listitem>
-                       Upload speed graph, colours defined in hex, minus the #.  If scale is non-zero, it becomes the scale for the graph.
+                       Upload speed graph, colours defined in hex, minus the #.  If scale is non-zero, it becomes the scale for the graph. Uses a logarithmic scale (to see small numbers) when you use "log" instead of "normal".
                        <para></para></listitem>
        </varlistentry>
 
 
        <varlistentry>
                <term>
+                       <command><option>words</option></command>
+                       <option>textfile</option>
+               </term>
+               <listitem>
+                       Displays the number of words in the given file
+                       <para></para></listitem>
+       </varlistentry>
+
+       <varlistentry>
+               <term>
                        <command><option>xmms2_artist</option></command>
                </term>
                <listitem>
index 39906bc..8dc0435 100644 (file)
@@ -6,13 +6,13 @@
 syntax "conky" "(\.*conkyrc.*$|conky.conf)"
 
 ## Configuration items
-color green "\<(alignment|background|show_graph_scale|border_margin|border_width|color0|color1|color2|color3|color4|color5|color6|color7|color8|color9|default_color|default_shade_color|default_shadecolor|default_outline_color|default_outlinecolor|imap|pop3|mpd_host|mpd_port|mpd_password|music_player_interval|sensor_device|cpu_avg_samples|net_avg_samples|double_buffer|override_utf8_locale|draw_borders|draw_graph_borders|draw_shades|draw_outline|out_to_console|use_spacer|use_xft|font|xftalpha|xftfont|use_xft|gap_x|gap_y|mail_spool|minimum_size|maximum_width|no_buffers|top_cpu_separate|short_units|pad_percents|own_window|own_window_class|own_window_title|own_window_transparent|own_window_colour|own_window_hints|own_window_type|stippled_borders|temp1|temp2|update_interval|total_run_times|uppercase|max_specials|max_user_text|text_buffer_size|max_port_monitor_connections)\>"
+color green "\<(alignment|background|show_graph_range|show_graph_scale|border_margin|border_width|color0|color1|color2|color3|color4|color5|color6|color7|color8|color9|default_color|default_shade_color|default_shadecolor|default_outline_color|default_outlinecolor|imap|pop3|mpd_host|mpd_port|mpd_password|music_player_interval|sensor_device|cpu_avg_samples|net_avg_samples|double_buffer|override_utf8_locale|draw_borders|draw_graph_borders|draw_shades|draw_outline|out_to_console|use_spacer|use_xft|font|xftalpha|xftfont|use_xft|gap_x|gap_y|mail_spool|minimum_size|maximum_width|no_buffers|top_cpu_separate|short_units|pad_percents|own_window|own_window_class|own_window_title|own_window_transparent|own_window_colour|own_window_hints|own_window_type|stippled_borders|temp1|temp2|update_interval|total_run_times|uppercase|max_specials|max_user_text|text_buffer_size|max_port_monitor_connections)\>"
 
 ## Configuration item constants
 color yellow "\<(above|below|bottom_left|bottom_right|bottom_middle|desktop|no|none|normal|override|skip_pager|skip_taskbar|sticky|top_left|top_right|top_middle|middle_left|middle_right|undecorated|yes)\>"
 
 ## Variables
-color brightblue "\<(acpitemp|acpitempf|freq|freq_g|voltage_mv|voltage_v|wireless_essid|wireless_mode|wireless_bitrate|wireless_ap|wireless_link_qual|wireless_link_qual_max|wireless_link_qual_perc|wireless_link_bar|freq_dyn|freq_dyn_g|adt746xcpu|adt746xfan|acpifan|acpiacadapter|battery|battery_time|battery_percent|battery_bar|buffers|cached|cpu|cpubar|cpugraph|loadgraph|color|color0|color1|color2|color3|color4|color5|color6|color7|color8|color9|conky_version|conky_build_date|conky_build_arch|disk_protect|i8k_version|i8k_bios|i8k_serial|i8k_cpu_temp|i8k_cpu_tempf|i8k_left_fan_status|i8k_right_fan_status|i8k_left_fan_rpm|i8k_right_fan_rpm|i8k_ac_status|i8k_buttons_status|ibm_fan|ibm_temps|ibm_volume|ibm_brightness|if_up|if_gw|gw_iface|gw_ip|laptop_mode|pb_battery|obsd_sensors_temp|obsd_sensors_fan|obsd_sensors_volt|obsd_vendor|obsd_product|font|diskio|diskio_write|diskio_read|diskiograph|diskiograph_read|diskiograph_write|downspeed|downspeedf|downspeedgraph|else|endif|addr|addrs|image|exec|execp|execbar|execgraph|execibar|execigraph|execi|execpi|texeci|imap_unseen|imap_messages|pop3_unseen|pop3_used|fs_bar|fs_free|fs_free_perc|fs_size|fs_type|fs_used|fs_bar_free|fs_used_perc|loadavg|goto|tab|hr|nameserver|rss|hddtemp|offset|voffset|i2c|platform|hwmon|alignr|alignc|if_empty|if_existing|if_mounted|if_running|ioscheduler|kernel|machine|mem|memmax|memperc|membar|memgraph|mixer|mixerl|mixerr|mixerbar|mixerlbar|mixerrbar|mails|mboxscan|new_mails|nodename|outlinecolor|processes|running_processes|shadecolor|stippled_hr|swap|swapmax|swapperc|swapbar|sysname|time|utime|tztime|totaldown|totalup|updates|upspeed|upspeedf|upspeedgraph|uptime_short|uptime|user_names|user_terms|user_times|user_number|apm_adapter|apm_battery_life|apm_battery_time|mpd_title|mpd_artist|mpd_album|mpd_random|mpd_repeat|mpd_track|mpd_name|mpd_file|mpd_vol|mpd_bitrate|mpd_status|mpd_elapsed|mpd_length|mpd_percent|mpd_bar|mpd_smart|xmms2_artist|xmms2_album|xmms2_title|xmms2_genre|xmms2_comment|xmms2_url|xmms2_status|xmms2_date|xmms2_tracknr|xmms2_bitrate|xmms2_id|xmms2_size|xmms2_elapsed|xmms2_duration|xmms2_percent|xmms2_bar|xmms2_playlist|xmms2_timesplayed|xmms2_smart|audacious_status|audacious_title|audacious_length|audacious_length_seconds|audacious_position|audacious_position_seconds|audacious_bitrate|audacious_frequency|audacious_channels|audacious_filename|audacious_playlist_length|audacious_playlist_position|audacious_bar|bmpx_title|bmpx_artist|bmpx_album|bmpx_uri|bmpx_track|bmpx_bitrate|top|top_mem|tail|head|tcp_portmon|iconv_start|iconv_stop|entropy_avail|entropy_poolsize|entropy_bar|smapi|if_smapi_bat_installed|smapi_bat_perc|smapi_bat_bar)\>"
+color brightblue "\<(acpitemp|acpitempf|freq|freq_g|voltage_mv|voltage_v|wireless_essid|wireless_mode|wireless_bitrate|wireless_ap|wireless_link_qual|wireless_link_qual_max|wireless_link_qual_perc|wireless_link_bar|freq_dyn|freq_dyn_g|adt746xcpu|adt746xfan|acpifan|acpiacadapter|battery|battery_time|battery_percent|battery_bar|buffers|cached|cpu|cpubar|cpugraph|loadgraph|lines|color|color0|color1|color2|color3|color4|color5|color6|color7|color8|color9|conky_version|conky_build_date|conky_build_arch|disk_protect|i8k_version|i8k_bios|i8k_serial|i8k_cpu_temp|i8k_cpu_tempf|i8k_left_fan_status|i8k_right_fan_status|i8k_left_fan_rpm|i8k_right_fan_rpm|i8k_ac_status|i8k_buttons_status|ibm_fan|ibm_temps|ibm_volume|ibm_brightness|if_up|if_gw|gw_iface|gw_ip|laptop_mode|pb_battery|obsd_sensors_temp|obsd_sensors_fan|obsd_sensors_volt|obsd_vendor|obsd_product|font|diskio|diskio_write|diskio_read|diskiograph|diskiograph_read|diskiograph_write|downspeed|downspeedf|downspeedgraph|else|endif|addr|addrs|image|exec|execp|execbar|execgraph|execibar|execigraph|execi|execpi|texeci|imap_unseen|imap_messages|pop3_unseen|pop3_used|fs_bar|fs_free|fs_free_perc|fs_size|fs_type|fs_used|fs_bar_free|fs_used_perc|loadavg|goto|tab|hr|nameserver|rss|hddtemp|offset|voffset|i2c|platform|hwmon|alignr|alignc|if_empty|if_existing|if_mounted|if_running|ioscheduler|kernel|machine|mem|memeasyfree|memfree|memmax|memperc|membar|memgraph|mixer|mixerl|mixerr|mixerbar|mixerlbar|mixerrbar|mails|mboxscan|new_mails|nodename|outlinecolor|processes|running_processes|scroll|shadecolor|stippled_hr|swap|swapmax|swapperc|swapbar|sysname|time|utime|tztime|totaldown|totalup|updates|upspeed|upspeedf|upspeedgraph|uptime_short|uptime|user_names|user_terms|user_times|user_number|apm_adapter|apm_battery_life|apm_battery_time|monitor|monitor_number|mpd_title|mpd_artist|mpd_album|mpd_random|mpd_repeat|mpd_track|mpd_name|mpd_file|mpd_vol|mpd_bitrate|mpd_status|mpd_elapsed|mpd_length|mpd_percent|mpd_bar|mpd_smart|words|xmms2_artist|xmms2_album|xmms2_title|xmms2_genre|xmms2_comment|xmms2_url|xmms2_status|xmms2_date|xmms2_tracknr|xmms2_bitrate|xmms2_id|xmms2_size|xmms2_elapsed|xmms2_duration|xmms2_percent|xmms2_bar|xmms2_playlist|xmms2_timesplayed|xmms2_smart|audacious_status|audacious_title|audacious_length|audacious_length_seconds|audacious_position|audacious_position_seconds|audacious_bitrate|audacious_frequency|audacious_channels|audacious_filename|audacious_playlist_length|audacious_playlist_position|audacious_bar|bmpx_title|bmpx_artist|bmpx_album|bmpx_uri|bmpx_track|bmpx_bitrate|top|top_mem|tail|head|tcp_portmon|iconv_start|iconv_stop|entropy_avail|entropy_poolsize|entropy_bar|smapi|if_smapi_bat_installed|smapi_bat_perc|smapi_bat_bar)\>"
 
 
 color brightblue "\$\{?[0-9A-Z_!@#$*?-]+\}?"
index f9ed2a7..67c50a1 100644 (file)
@@ -17,6 +17,7 @@ syn keyword ConkyrcSetting
                        \ alignment
                        \ background
                        \ show_graph_scale
+                       \ show_graph_range
                        \ border_margin
                        \ border_width
                        \ color0
@@ -248,6 +249,8 @@ syn keyword ConkyrcVarName contained nextgroup=ConkyrcNumber,ConkyrcColour skipw
                        \ kernel
                        \ machine
                        \ mem
+                       \ memeasyfree
+                       \ memfree
                        \ memmax
                        \ memperc
                        \ membar
@@ -265,6 +268,9 @@ syn keyword ConkyrcVarName contained nextgroup=ConkyrcNumber,ConkyrcColour skipw
                        \ outlinecolor
                        \ processes
                        \ running_processes
+                       \ scroll
+                       \ lines
+                       \ words
                        \ shadecolor
                        \ stippled_hr
                        \ swap
@@ -290,6 +296,8 @@ syn keyword ConkyrcVarName contained nextgroup=ConkyrcNumber,ConkyrcColour skipw
                        \ apm_adapter
                        \ apm_battery_life
                        \ apm_battery_time
+                       \ monitor
+                       \ monitor_number
                        \ mpd_title
                        \ mpd_artist
                        \ mpd_album
index 82d16bf..78edc5a 100644 (file)
@@ -357,9 +357,16 @@ void update_stuff(void)
                update_meminfo();
                if (no_buffers) {
                        info.mem -= info.bufmem;
+                       info.memeasyfree += info.bufmem;
                }
                last_meminfo_update = current_update_time;
        }
+       
+#ifdef X11
+       if (NEED(INFO_X11)) {
+               update_x11info();
+       }
+#endif
 
        if (NEED(INFO_TOP)) {
                update_top();
index 8c6fc52..2d96c60 100644 (file)
@@ -337,6 +337,7 @@ static int cpu_avg_samples, net_avg_samples;
 #ifdef X11
 
 static int show_graph_scale;
+static int show_graph_range;
 
 /* Position on the screen */
 static int text_alignment;
@@ -591,7 +592,6 @@ long fwd_fcharfind(FILE *fp, char val, unsigned int step)
        }
        fseek(fp, orig_pos, SEEK_SET);
        return ret;
-#undef BUFSZ
 }
 
 #ifndef HAVE_MEMRCHR
@@ -647,7 +647,6 @@ long rev_fcharfind(FILE *fp, char val, unsigned int step)
                ret = file_pos + buf_pos;
        }
        return ret;
-#undef BUFSZ
 }
 
 static void new_bar(char *buf, int w, int h, int usage)
@@ -692,7 +691,7 @@ static void new_font(char *buf, char *args)
        if (args) {
                struct special_t *s = new_special(buf, FONT);
 
-               if (s->font_added > font_count || !s->font_added || strncmp(args, fonts[s->font_added].name, DEFAULT_TEXT_BUFFER_SIZE)) {
+               if (s->font_added > font_count || !s->font_added || (strncmp(args, fonts[s->font_added].name, DEFAULT_TEXT_BUFFER_SIZE) != EQUAL) ) {
                        int tmp = selected_font;
 
                        selected_font = s->font_added = addfont(args);
@@ -708,17 +707,23 @@ static void new_font(char *buf, char *args)
        }
 }
 #endif
-void graph_append(struct special_t *graph, double f)
+void graph_append(struct special_t *graph, double f, char showaslog)
 {
        int i;
 
+       if (showaslog) {
+               f = log10(f + 1);
+       }
+       
        if (!graph->scaled && f > graph->graph_scale) {
                f = graph->graph_scale;
        }
 
+/* Already happens in new_graph
        if (graph->scaled) {
                graph->graph_scale = 1;
        }
+*/
        graph->graph[0] = f;    /* add new data */
        /* shift all the data by 1 */
        for (i = graph->graph_width - 1; i > 0; i--) {
@@ -757,7 +762,7 @@ static unsigned int adjust_colors(unsigned int color)
 }
 
 static void new_graph(char *buf, int w, int h, unsigned int first_colour,
-               unsigned int second_colour, double i, int scale, int append)
+               unsigned int second_colour, double i, int scale, int append, char showaslog)
 {
        struct special_t *s = new_special(buf, GRAPH);
 
@@ -788,18 +793,26 @@ static void new_graph(char *buf, int w, int h, unsigned int first_colour,
        /* if (s->width) {
                s->graph_width = s->width - 2;  // subtract 2 for rectangle around
        } */
+       if (showaslog) {
+               s->graph_scale = log10(s->graph_scale + 1);
+       }
        if (append) {
-               graph_append(s, i);
+               graph_append(s, i, showaslog);
        }
 }
 
+#define LOGGRAPH "log"
+#define NORMGRAPH "normal"
+
 static char *scan_graph(const char *args, int *w, int *h,
                unsigned int *first_colour, unsigned int *last_colour,
-               unsigned int *scale)
+               unsigned int *scale, char *showaslog)
 {
        char buf[64];
+       char showaslogbuf[strlen(NORMGRAPH)+1];
        buf[0] = 0;
 
+       *showaslog = FALSE;
        /* zero width means all space that is available */
        *w = 0;
        *h = 25;
@@ -808,57 +821,69 @@ static char *scan_graph(const char *args, int *w, int *h,
        *scale = 0;
        /* graph's argument is either height or height,width */
        if (args) {
-               if (sscanf(args, "%d,%d %x %x %u", h, w, first_colour, last_colour,
-                               scale) == 5) {
+               if (sscanf(args, "%6s %d,%d %x %x %u", showaslogbuf, h, w, first_colour, last_colour,
+                               scale) == 6) {
+                       *showaslog = ( strncasecmp(showaslogbuf, LOGGRAPH, strlen(showaslogbuf)) == EQUAL ) ? TRUE : FALSE ;
                        return NULL;
                }
                *scale = 0;
-               if (sscanf(args, "%d,%d %x %x", h, w, first_colour, last_colour) == 4) {
+               if (sscanf(args, "%6s %d,%d %x %x", showaslogbuf, h, w, first_colour, last_colour) == 5) {
+                       *showaslog = ( strncasecmp(showaslogbuf, LOGGRAPH, strlen(showaslogbuf)) == EQUAL ) ? TRUE : FALSE ;
                        return NULL;
                }
-               if (sscanf(args, "%63s %d,%d %x %x %u", buf, h, w, first_colour,
-                               last_colour, scale) == 6) {
+               if (sscanf(args, "%6s %63s %d,%d %x %x %u", showaslogbuf, buf, h, w, first_colour,
+                               last_colour, scale) == 7) {
+                       *showaslog = ( strncasecmp(showaslogbuf, LOGGRAPH, strlen(showaslogbuf)) == EQUAL ) ? TRUE : FALSE ;
                        return strndup(buf, text_buffer_size);
                }
                *scale = 0;
-               if (sscanf(args, "%63s %d,%d %x %x", buf, h, w, first_colour,
-                               last_colour) == 5) {
+               if (sscanf(args, "%6s %63s %d,%d %x %x", showaslogbuf, buf, h, w, first_colour,
+                               last_colour) == 6) {
+                       *showaslog = ( strncasecmp(showaslogbuf, LOGGRAPH, strlen(showaslogbuf)) == EQUAL ) ? TRUE : FALSE ;
                        return strndup(buf, text_buffer_size);
                }
                buf[0] = '\0';
                *h = 25;
                *w = 0;
-               if (sscanf(args, "%x %x %u", first_colour, last_colour, scale) == 3) {
+               if (sscanf(args, "%6s %x %x %u", showaslogbuf, first_colour, last_colour, scale) == 4) {
+                       *showaslog = ( strncasecmp(showaslogbuf, LOGGRAPH, strlen(showaslogbuf)) == EQUAL ) ? TRUE : FALSE ;
                        return NULL;
                }
                *scale = 0;
-               if (sscanf(args, "%x %x", first_colour, last_colour) == 2) {
+               if (sscanf(args, "%6s %x %x", showaslogbuf, first_colour, last_colour) == 3) {
+                       *showaslog = ( strncasecmp(showaslogbuf, LOGGRAPH, strlen(showaslogbuf)) == EQUAL ) ? TRUE : FALSE ;
                        return NULL;
                }
-               if (sscanf(args, "%63s %x %x %u", buf, first_colour, last_colour,
-                               scale) == 4) {
+               if (sscanf(args, "%6s %63s %x %x %u", showaslogbuf, buf, first_colour, last_colour,
+                               scale) == 5) {
+                       *showaslog = ( strncasecmp(showaslogbuf, LOGGRAPH, strlen(showaslogbuf)) == EQUAL ) ? TRUE : FALSE ;
                        return strndup(buf, text_buffer_size);
                }
                *scale = 0;
-               if (sscanf(args, "%63s %x %x", buf, first_colour, last_colour) == 3) {
+               if (sscanf(args, "%6s %63s %x %x", showaslogbuf, buf, first_colour, last_colour) == 4) {
+                       *showaslog = ( strncasecmp(showaslogbuf, LOGGRAPH, strlen(showaslogbuf)) == EQUAL ) ? TRUE : FALSE ;
                        return strndup(buf, text_buffer_size);
                }
                buf[0] = '\0';
                *first_colour = 0;
                *last_colour = 0;
-               if (sscanf(args, "%d,%d %u", h, w, scale) == 3) {
+               if (sscanf(args, "%6s %d,%d %u", showaslogbuf, h, w, scale) == 4) {
+                       *showaslog = ( strncasecmp(showaslogbuf, LOGGRAPH, strlen(showaslogbuf)) == EQUAL ) ? TRUE : FALSE ;
                        return NULL;
                }
                *scale = 0;
-               if (sscanf(args, "%d,%d", h, w) == 2) {
+               if (sscanf(args, "%6s %d,%d", showaslogbuf, h, w) == 3) {
+                       *showaslog = ( strncasecmp(showaslogbuf, LOGGRAPH, strlen(showaslogbuf)) == EQUAL ) ? TRUE : FALSE ;
                        return NULL;
                }
-               if (sscanf(args, "%63s %d,%d %u", buf, h, w, scale) < 4) {
+               if (sscanf(args, "%6s %63s %d,%d %u", showaslogbuf, buf, h, w, scale) < 5) {
                        *scale = 0;
                        //TODO: check the return value and throw an error?
-                       sscanf(args, "%63s %d,%d", buf, h, w);
+                       sscanf(args, "%6s %63s %d,%d", showaslogbuf, buf, h, w);
+                       *showaslog = ( strncasecmp(showaslogbuf, LOGGRAPH, strlen(showaslogbuf)) == EQUAL ) ? TRUE : FALSE ;
                }
 
+               *showaslog = ( strncasecmp(showaslogbuf, LOGGRAPH, strlen(showaslogbuf)) == EQUAL ) ? TRUE : FALSE ;
                return strndup(buf, text_buffer_size);
        }
 
@@ -1181,12 +1206,16 @@ enum text_object_type {
        OBJ_top_mem,
        OBJ_tail,
        OBJ_head,
+       OBJ_lines,
+       OBJ_words,
        OBJ_kernel,
        OBJ_loadavg,
        OBJ_machine,
        OBJ_mails,
        OBJ_mboxscan,
        OBJ_mem,
+       OBJ_memeasyfree,
+       OBJ_memfree,
        OBJ_membar,
        OBJ_memgraph,
        OBJ_memmax,
@@ -1199,6 +1228,10 @@ enum text_object_type {
        OBJ_mixerbar,
        OBJ_mixerlbar,
        OBJ_mixerrbar,
+#ifdef X11
+       OBJ_monitor,
+       OBJ_monitor_number,
+#endif
        OBJ_nameserver,
        OBJ_new_mails,
        OBJ_nodename,
@@ -1336,6 +1369,7 @@ enum text_object_type {
        OBJ_smapi_bat_perc,
        OBJ_if_smapi_bat_installed,
 #endif
+       OBJ_scroll,
        OBJ_entropy_avail,
        OBJ_entropy_poolsize,
        OBJ_entropy_bar
@@ -1453,6 +1487,12 @@ struct text_object {
                        int delay;
                } rss;
 #endif
+               struct {
+                       char *text;
+                       unsigned int show;
+                       unsigned int start;
+               } scroll;
+               
                struct local_mail_s local_mail;
 #ifdef NVIDIA
                struct nvidia_s nvidia;
@@ -1464,6 +1504,7 @@ struct text_object {
        long line;
        unsigned int c, d, e;
        float f;
+       char showaslog;
        char global_mode;
 };
 
@@ -2312,6 +2353,9 @@ static void free_text_objects(struct text_object_list *text_object_list)
                                free_mpd_vars(&info.mpd);
                                break;
 #endif
+                       case OBJ_scroll:
+                               free(obj->data.scroll.text);
+                               break;
                }
        }
        free(text_object_list->text_objects);
@@ -2566,11 +2610,11 @@ static struct text_object *construct_text_object(const char *s,
                        obj->data.s = strndup(DEV_NAME(arg), text_buffer_size);
        END OBJ(laptop_mode, 0)
        END OBJ(pb_battery, 0)
-               if (arg && strcmp(arg, "status") == 0) {
+               if (arg && strcmp(arg, "status") == EQUAL) {
                        obj->data.i = PB_BATT_STATUS;
-               } else if (arg && strcmp(arg, "percent") == 0) {
+               } else if (arg && strcmp(arg, "percent") == EQUAL) {
                        obj->data.i = PB_BATT_PERCENT;
-               } else if (arg && strcmp(arg, "time") == 0) {
+               } else if (arg && strcmp(arg, "time") == EQUAL) {
                        obj->data.i = PB_BATT_TIME;
                } else {
                        ERR("pb_battery: needs one argument: status, percent or time");
@@ -2619,7 +2663,7 @@ static struct text_object *construct_text_object(const char *s,
        END OBJ(cached, INFO_BUFFERS)
        END OBJ(cpu, INFO_CPU)
                if (arg) {
-                       if (strncmp(arg, "cpu", 3) == 0 && isdigit(arg[3])) {
+                       if (strncmp(arg, "cpu", 3) == EQUAL && isdigit(arg[3])) {
                                obj->data.cpu_index = atoi(&arg[3]);
                                arg += 4;
                        } else {
@@ -2630,7 +2674,7 @@ static struct text_object *construct_text_object(const char *s,
                }
        END OBJ(cpubar, INFO_CPU)
                if (arg) {
-                       if (strncmp(arg, "cpu", 3) == 0 && isdigit(arg[3])) {
+                       if (strncmp(arg, "cpu", 3) == EQUAL && isdigit(arg[3])) {
                                obj->data.cpu_index = atoi(&arg[3]);
                                arg += 4;
                        } else {
@@ -2643,10 +2687,10 @@ static struct text_object *construct_text_object(const char *s,
                }
        END OBJ(cpugraph, INFO_CPU)
                char *buf = scan_graph(arg, &obj->a, &obj->b, &obj->c, &obj->d,
-                       &obj->e);
+                       &obj->e, &obj->showaslog);
 
                if (buf) {
-                       if (strncmp(buf, "cpu", 3) == 0 && isdigit(buf[3])) {
+                       if (strncmp(buf, "cpu", 3) == EQUAL && isdigit(buf[3])) {
                                obj->data.cpu_index = atoi(&buf[3]);
                        } else {
                                obj->data.cpu_index = 0;
@@ -2655,7 +2699,7 @@ static struct text_object *construct_text_object(const char *s,
                }
        END OBJ(loadgraph, INFO_LOADAVG)
                char *buf = scan_graph(arg, &obj->a, &obj->b, &obj->c, &obj->d,
-                               &obj->e);
+                               &obj->e, &obj->showaslog);
                if (buf) {
                        int a = 1, r = 3;
                        if (arg) {
@@ -2685,7 +2729,7 @@ static struct text_object *construct_text_object(const char *s,
                }
        END OBJ(diskiograph, INFO_DISKIO)
                char *buf = scan_graph(DEV_NAME(arg), &obj->a, &obj->b, &obj->c, &obj->d,
-                       &obj->e);
+                       &obj->e, &obj->showaslog);
 
                if (buf) {
                        obj->data.diskio = prepare_diskio_stat(buf);
@@ -2695,7 +2739,7 @@ static struct text_object *construct_text_object(const char *s,
                }
        END OBJ(diskiograph_read, INFO_DISKIO)
                char *buf = scan_graph(DEV_NAME(arg), &obj->a, &obj->b, &obj->c, &obj->d,
-                       &obj->e);
+                       &obj->e, &obj->showaslog);
 
                if (buf) {
                        obj->data.diskio = prepare_diskio_stat(buf);
@@ -2705,7 +2749,7 @@ static struct text_object *construct_text_object(const char *s,
                }
        END OBJ(diskiograph_write, INFO_DISKIO)
                char *buf = scan_graph(DEV_NAME(arg), &obj->a, &obj->b, &obj->c, &obj->d,
-                       &obj->e);
+                       &obj->e, &obj->showaslog);
 
                if (buf) {
                        obj->data.diskio = prepare_diskio_stat(buf);
@@ -2757,7 +2801,7 @@ static struct text_object *construct_text_object(const char *s,
                }
        END OBJ(downspeedgraph, INFO_NET)
                char *buf = scan_graph(arg, &obj->a, &obj->b, &obj->c, &obj->d,
-                       &obj->e);
+                       &obj->e, &obj->showaslog);
 
                if (buf) {
                        obj->data.net = get_net_stat(buf);
@@ -3044,19 +3088,19 @@ static struct text_object *construct_text_object(const char *s,
                        return NULL;
                }
                if (sscanf(arg, "%63s %i", buf, &n) == 2) {
-                       if (strcmp(buf, "name") == 0) {
+                       if (strcmp(buf, "name") == EQUAL) {
                                obj->data.top.type = TOP_NAME;
-                       } else if (strcmp(buf, "cpu") == 0) {
+                       } else if (strcmp(buf, "cpu") == EQUAL) {
                                obj->data.top.type = TOP_CPU;
-                       } else if (strcmp(buf, "pid") == 0) {
+                       } else if (strcmp(buf, "pid") == EQUAL) {
                                obj->data.top.type = TOP_PID;
-                       } else if (strcmp(buf, "mem") == 0) {
+                       } else if (strcmp(buf, "mem") == EQUAL) {
                                obj->data.top.type = TOP_MEM;
-                       } else if (strcmp(buf, "time") == 0) {
+                       } else if (strcmp(buf, "time") == EQUAL) {
                                obj->data.top.type = TOP_TIME;
-                       } else if (strcmp(buf, "mem_res") == 0) {
+                       } else if (strcmp(buf, "mem_res") == EQUAL) {
                                obj->data.top.type = TOP_MEM_RES;
-                       } else if (strcmp(buf, "mem_vsize") == 0) {
+                       } else if (strcmp(buf, "mem_vsize") == EQUAL) {
                                obj->data.top.type = TOP_MEM_VSIZE;
                        } else {
                                ERR("invalid arg for top");
@@ -3084,19 +3128,19 @@ static struct text_object *construct_text_object(const char *s,
                        return NULL;
                }
                if (sscanf(arg, "%63s %i", buf, &n) == 2) {
-                       if (strcmp(buf, "name") == 0) {
+                       if (strcmp(buf, "name") == EQUAL) {
                                obj->data.top.type = TOP_NAME;
-                       } else if (strcmp(buf, "cpu") == 0) {
+                       } else if (strcmp(buf, "cpu") == EQUAL) {
                                obj->data.top.type = TOP_CPU;
-                       } else if (strcmp(buf, "pid") == 0) {
+                       } else if (strcmp(buf, "pid") == EQUAL) {
                                obj->data.top.type = TOP_PID;
-                       } else if (strcmp(buf, "mem") == 0) {
+                       } else if (strcmp(buf, "mem") == EQUAL) {
                                obj->data.top.type = TOP_MEM;
-                       } else if (strcmp(buf, "time") == 0) {
+                       } else if (strcmp(buf, "time") == EQUAL) {
                                obj->data.top.type = TOP_TIME;
-                       } else if (strcmp(buf, "mem_res") == 0) {
+                       } else if (strcmp(buf, "mem_res") == EQUAL) {
                                obj->data.top.type = TOP_MEM_RES;
-                       } else if (strcmp(buf, "mem_vsize") == 0) {
+                       } else if (strcmp(buf, "mem_vsize") == EQUAL) {
                                obj->data.top.type = TOP_MEM_VSIZE;
                        } else {
                                ERR("invalid arg for top");
@@ -3292,6 +3336,18 @@ static struct text_object *construct_text_object(const char *s,
                }
                /* asumming all else worked */
                obj->data.tail.buffer = malloc(text_buffer_size * 20);
+       END OBJ(lines, 0)
+               if (arg) {
+                       obj->data.s = strdup(arg);
+               }else{
+                       CRIT_ERR("lines needs a argument");
+               }
+       END OBJ(words, 0)
+               if (arg) {
+                       obj->data.s = strdup(arg);
+               }else{
+                       CRIT_ERR("words needs a argument");
+               }
        END OBJ(loadavg, INFO_LOADAVG)
                int a = 1, b = 2, c = 3, r = 3;
 
@@ -3406,13 +3462,15 @@ static struct text_object *construct_text_object(const char *s,
                obj->data.mboxscan.output[0] = 1;
                strncpy(obj->data.mboxscan.args, arg, text_buffer_size);
        END OBJ(mem, INFO_MEM)
+       END OBJ(memeasyfree, INFO_MEM)
+       END OBJ(memfree, INFO_MEM)
        END OBJ(memmax, INFO_MEM)
        END OBJ(memperc, INFO_MEM)
        END OBJ(membar, INFO_MEM)
                scan_bar(arg, &obj->data.pair.a, &obj->data.pair.b);
        END OBJ(memgraph, INFO_MEM)
                char *buf = scan_graph(arg, &obj->a, &obj->b, &obj->c, &obj->d,
-                       &obj->e);
+                       &obj->e, &obj->showaslog);
 
                if (buf) {
                        free(buf);
@@ -3432,6 +3490,10 @@ static struct text_object *construct_text_object(const char *s,
        END OBJ(mixerrbar, INFO_MIXER)
                scan_mixer_bar(arg, &obj->data.mixerbar.l, &obj->data.mixerbar.w,
                        &obj->data.mixerbar.h);
+#ifdef X11
+       END OBJ(monitor, INFO_X11)
+       END OBJ(monitor_number, INFO_X11)
+#endif
        END OBJ(new_mails, 0)
                float n1;
                char box[256], dst[256];
@@ -3580,7 +3642,7 @@ static struct text_object *construct_text_object(const char *s,
 
        END OBJ(upspeedgraph, INFO_NET)
                char *buf = scan_graph(arg, &obj->a, &obj->b, &obj->c, &obj->d,
-                       &obj->e);
+                       &obj->e, &obj->showaslog);
 
                if (buf) {
                        obj->data.net = get_net_stat(buf);
@@ -3818,23 +3880,23 @@ static struct text_object *construct_text_object(const char *s,
                if (port_begin > port_end) {
                        CRIT_ERR("tcp_portmon: starting port must be <= ending port");
                }
-               if (strncmp(itembuf, "count", 31) == 0) {
+               if (strncmp(itembuf, "count", 31) == EQUAL) {
                        item = COUNT;
-               } else if (strncmp(itembuf, "rip", 31) == 0) {
+               } else if (strncmp(itembuf, "rip", 31) == EQUAL) {
                        item = REMOTEIP;
-               } else if (strncmp(itembuf, "rhost", 31) == 0) {
+               } else if (strncmp(itembuf, "rhost", 31) == EQUAL) {
                        item = REMOTEHOST;
-               } else if (strncmp(itembuf, "rport", 31) == 0) {
+               } else if (strncmp(itembuf, "rport", 31) == EQUAL) {
                        item = REMOTEPORT;
-               } else if (strncmp(itembuf, "rservice", 31) == 0) {
+               } else if (strncmp(itembuf, "rservice", 31) == EQUAL) {
                        item = REMOTESERVICE;
-               } else if (strncmp(itembuf, "lip", 31) == 0) {
+               } else if (strncmp(itembuf, "lip", 31) == EQUAL) {
                        item = LOCALIP;
-               } else if (strncmp(itembuf, "lhost", 31) == 0) {
+               } else if (strncmp(itembuf, "lhost", 31) == EQUAL) {
                        item = LOCALHOST;
-               } else if (strncmp(itembuf, "lport", 31) == 0) {
+               } else if (strncmp(itembuf, "lport", 31) == EQUAL) {
                        item = LOCALPORT;
-               } else if (strncmp(itembuf, "lservice", 31) == 0) {
+               } else if (strncmp(itembuf, "lservice", 31) == EQUAL) {
                        item = LOCALSERVICE;
                } else {
                        CRIT_ERR("tcp_portmon: invalid item specified");
@@ -3885,6 +3947,14 @@ static struct text_object *construct_text_object(const char *s,
        END OBJ(entropy_poolsize, INFO_ENTROPY)
        END OBJ(entropy_bar, INFO_ENTROPY)
                scan_bar(arg, &obj->a, &obj->b);
+       END OBJ(scroll, 0)
+               int n;
+               if (arg && sscanf(arg, "%u %n", &obj->data.scroll.show, &n) > 0) {
+                       obj->data.scroll.text = strndup(arg + n, text_buffer_size);
+                       obj->data.scroll.start = 0;
+               } else {
+                       CRIT_ERR("scroll needs arguments: <length> <text>");
+               }
 #ifdef NVIDIA
        END OBJ(nvidia, 0)
                if (!arg){
@@ -4523,11 +4593,11 @@ static void generate_text_internal(char *p, int p_max_size,
                        OBJ(cpugraph) {
                                new_graph(p, obj->a, obj->b, obj->c, obj->d, (unsigned int)
                                        round_to_int(cur->cpu_usage[obj->data.cpu_index] * 100),
-                                       100, 1);
+                                       100, 1, obj->showaslog);
                        }
                        OBJ(loadgraph) {
                                new_graph(p, obj->a, obj->b, obj->c, obj->d, cur->loadavg[0],
-                                       obj->e, 1);
+                                       obj->e, 1, obj->showaslog);
                        }
                        OBJ(color) {
                                new_fg(p, obj->data.l);
@@ -4754,28 +4824,28 @@ static void generate_text_internal(char *p, int p_max_size,
                        OBJ(diskiograph) {
                                if (obj->data.diskio) {
                                        new_graph(p, obj->a, obj->b, obj->c, obj->d,
-                                               obj->data.diskio->current, obj->e, 1);
+                                               obj->data.diskio->current, obj->e, 1, obj->showaslog);
                                } else {
                                        new_graph(p, obj->a, obj->b, obj->c, obj->d, info.diskio_value,
-                                               obj->e, 1);
+                                               obj->e, 1, obj->showaslog);
                                }
                        }
                        OBJ(diskiograph_read) {
                                if (obj->data.diskio) {
                                        new_graph(p, obj->a, obj->b, obj->c, obj->d,
-                                               obj->data.diskio->current_read, obj->e, 1);
+                                               obj->data.diskio->current_read, obj->e, 1, obj->showaslog);
                                } else {
                                        new_graph(p, obj->a, obj->b, obj->c, obj->d,
-                                               info.diskio_read_value, obj->e, 1);
+                                               info.diskio_read_value, obj->e, 1, obj->showaslog);
                                }
                        }
                        OBJ(diskiograph_write) {
                                if (obj->data.diskio) {
                                        new_graph(p, obj->a, obj->b, obj->c, obj->d,
-                                               obj->data.diskio->current_write, obj->e, 1);
+                                               obj->data.diskio->current_write, obj->e, 1, obj->showaslog);
                                } else {
                                        new_graph(p, obj->a, obj->b, obj->c, obj->d,
-                                               info.diskio_write_value, obj->e, 1);
+                                               info.diskio_write_value, obj->e, 1, obj->showaslog);
                                }
                        }
                        OBJ(downspeed) {
@@ -4788,7 +4858,7 @@ static void generate_text_internal(char *p, int p_max_size,
                        }
                        OBJ(downspeedgraph) {
                                new_graph(p, obj->a, obj->b, obj->c, obj->d,
-                                       obj->data.net->recv_speed / 1024.0, obj->e, 1);
+                                       obj->data.net->recv_speed / 1024.0, obj->e, 1, obj->showaslog);
                        }
                        OBJ(else) {
                                if (!if_jumped) {
@@ -4890,14 +4960,22 @@ static void generate_text_internal(char *p, int p_max_size,
                                }
                        }
                        OBJ(execgraph) {
+                               char showaslog = FALSE;
                                double barnum;
 
-                               read_exec(obj->data.s, p, p_max_size);
+                               if(strncasecmp(obj->data.s, LOGGRAPH" ", strlen(LOGGRAPH" ")) == EQUAL) {
+                                       showaslog = TRUE;
+                                       read_exec(obj->data.s + strlen(LOGGRAPH" ") * sizeof(char), p, p_max_size);
+                               } else if(strncasecmp(obj->data.s, NORMGRAPH" ", strlen(NORMGRAPH" ")) == EQUAL) {
+                                       read_exec(obj->data.s + strlen(NORMGRAPH" ") * sizeof(char), p, p_max_size);
+                               } else {
+                                       read_exec(obj->data.s, p, p_max_size);
+                               }
                                barnum = get_barnum(p);
 
                                if (barnum >= 0.0) {
                                        new_graph(p, 0, 25, obj->c, obj->d, round_to_int(barnum),
-                                               100, 1);
+                                               100, 1, showaslog);
                                }
                        }
                        OBJ(execibar) {
@@ -4928,7 +5006,7 @@ static void generate_text_internal(char *p, int p_max_size,
                                        }
                                        obj->data.execi.last_update = current_update_time;
                                }
-                               new_graph(p, 0, 25, obj->c, obj->d, round_to_int(obj->f), 100, 0);
+                               new_graph(p, 0, 25, obj->c, obj->d, (int) (obj->f), 100, 1, FALSE);
                        }
                        OBJ(execi) {
                                if (current_update_time - obj->data.execi.last_update
@@ -5130,14 +5208,14 @@ static void generate_text_internal(char *p, int p_max_size,
                                if (data == NULL) {
                                        snprintf(p, p_max_size, "prss: Error reading RSS data\n");
                                } else {
-                                       if (!strcmp(obj->data.rss.action, "feed_title")) {
+                                       if (strcmp(obj->data.rss.action, "feed_title") == EQUAL) {
                                                str = data->title;
                                                // remove trailing new line if one exists
                                                if (str[strlen(str) - 1] == '\n') {
                                                        str[strlen(str) - 1] = 0;
                                                }
                                                snprintf(p, p_max_size, "%s", str);
-                                       } else if (!strcmp(obj->data.rss.action, "item_title")) {
+                                       } else if (strcmp(obj->data.rss.action, "item_title") == EQUAL) {
                                                if (obj->data.rss.act_par < data->item_count) {
                                                        str = data->items[obj->data.rss.act_par].title;
                                                        // remove trailing new line if one exists
@@ -5146,7 +5224,7 @@ static void generate_text_internal(char *p, int p_max_size,
                                                        }
                                                        snprintf(p, p_max_size, "%s", str);
                                                }
-                                       } else if (!strcmp(obj->data.rss.action, "item_desc")) {
+                                       } else if (strcmp(obj->data.rss.action, "item_desc") == EQUAL) {
                                                if (obj->data.rss.act_par < data->item_count) {
                                                        str =
                                                                data->items[obj->data.rss.act_par].description;
@@ -5156,7 +5234,7 @@ static void generate_text_internal(char *p, int p_max_size,
                                                        }
                                                        snprintf(p, p_max_size, "%s", str);
                                                }
-                                       } else if (!strcmp(obj->data.rss.action, "item_titles")) {
+                                       } else if (strcmp(obj->data.rss.action, "item_titles") == EQUAL) {
                                                if (data->item_count > 0) {
                                                        int itmp;
                                                        int show;
@@ -5333,6 +5411,12 @@ static void generate_text_internal(char *p, int p_max_size,
                        OBJ(mem) {
                                human_readable(cur->mem * 1024, p, 255, "mem");
                        }
+                       OBJ(memeasyfree) {
+                               human_readable(cur->memeasyfree * 1024, p, 255, "memeasyfree");
+                       }
+                       OBJ(memfree) {
+                               human_readable(cur->memfree * 1024, p, 255, "memfree");
+                       }
                        OBJ(memmax) {
                                human_readable(cur->memmax * 1024, p, 255, "memmax");
                        }
@@ -5349,7 +5433,7 @@ static void generate_text_internal(char *p, int p_max_size,
                        OBJ(memgraph) {
                                new_graph(p, obj->a, obj->b, obj->c, obj->d,
                                        cur->memmax ? (cur->mem * 100.0) / (cur->memmax) : 0.0,
-                                       100, 1);
+                                       100, 1, obj->showaslog);
                        }
 
                        /* mixer stuff */
@@ -5374,6 +5458,14 @@ static void generate_text_internal(char *p, int p_max_size,
                                new_bar(p, obj->data.mixerbar.w, obj->data.mixerbar.h,
                                        mixer_get_right(obj->data.mixerbar.l) * 255 / 100);
                        }
+#ifdef X11
+                       OBJ(monitor) {
+                               snprintf(p, p_max_size, "%d", cur->x11.monitor.current);
+                       }
+                       OBJ(monitor_number) {
+                               snprintf(p, p_max_size, "%d", cur->x11.monitor.number);
+                       }
+#endif
 
                        /* mail stuff */
                        OBJ(mails) {
@@ -5487,7 +5579,7 @@ static void generate_text_internal(char *p, int p_max_size,
                        }
                        OBJ(upspeedgraph) {
                                new_graph(p, obj->a, obj->b, obj->c, obj->d,
-                                       obj->data.net->trans_speed / 1024.0, obj->e, 1);
+                                       obj->data.net->trans_speed / 1024.0, obj->e, 1, obj->showaslog);
                        }
                        OBJ(uptime_short) {
                                format_seconds_short(p, p_max_size, (int) cur->uptime);
@@ -5971,6 +6063,55 @@ head:
                                // parse_conky_vars(obj->data.tail.buffer, p, cur);
                        }
 
+                       OBJ(lines) {
+                               FILE *fp = fopen(obj->data.s,"r");
+                       
+                               if(fp != NULL) {
+                                       char buf[BUFSZ];
+                                       int j, lines;
+                               
+                                       lines = 0;
+                                       while(fgets(buf, BUFSZ, fp) != NULL){
+                                               for(j = 0; buf[j] != 0; j++) {
+                                                       if(buf[j] == '\n') {
+                                                               lines++;
+                                                       }
+                                               }
+                                       }
+                                       sprintf(p, "%d", lines);
+                                       fclose(fp);
+                               } else {
+                                       sprintf(p, "File Unreadable");
+                               }
+                       }
+
+                       OBJ(words) {
+                               FILE *fp = fopen(obj->data.s,"r");
+                       
+                               if(fp != NULL) {
+                                       char buf[BUFSZ];
+                                       int j, words;
+                                       char inword = FALSE;
+                               
+                                       words = 0;
+                                       while(fgets(buf, BUFSZ, fp) != NULL){
+                                               for(j = 0; buf[j] != 0; j++) {
+                                                       if(!isspace(buf[j])) {
+                                                               if(inword == FALSE) {
+                                                                       words++;
+                                                                       inword = TRUE;
+                                                               }
+                                                       } else {
+                                                               inword = FALSE;
+                                                       }
+                                               }
+                                       }
+                                       sprintf(p, "%d", words);
+                                       fclose(fp);
+                               } else {
+                                       sprintf(p, "File Unreadable");
+                               }
+                       }
 #ifdef TCP_PORT_MONITOR
                        OBJ(tcp_portmon) {
                                /* grab a pointer to this port monitor */
@@ -6056,6 +6197,37 @@ head:
                                        new_bar(p, obj->a, obj->b, 0);
                        }
 #endif /* SMAPI */
+                       OBJ(scroll) {
+                               unsigned int j;
+                               char *tmp;
+                               parse_conky_vars(obj->data.scroll.text, p, cur);
+#define LINESEPARATOR '|'
+                               //place all the lines behind each other with LINESEPARATOR between them
+                               for(j = 0; p[j] != 0; j++) {
+                                       if(p[j]=='\n') {
+                                               p[j]=LINESEPARATOR;
+                                       }
+                               }
+                               //scroll the output obj->data.scroll.start places by copying that many chars from
+                               //the front of the string to tmp, scrolling the rest to the front and placing tmp
+                               //at the back of the string
+                               tmp = calloc(obj->data.scroll.start + 1, sizeof(char));
+                               strncpy(tmp, p, obj->data.scroll.start); tmp[obj->data.scroll.start] = 0;
+                               for(j = obj->data.scroll.start; p[j] != 0; j++){
+                                       p[j - obj->data.scroll.start] = p[j];
+                               }
+                               strcpy(&p[j - obj->data.scroll.start], tmp);
+                               free(tmp);
+                               //only show the requested number of chars
+                               if(obj->data.scroll.show < j) {
+                                       p[obj->data.scroll.show] = 0;
+                               }
+                               //next time, scroll a place more or reset scrolling if we are at the end
+                               obj->data.scroll.start++;
+                               if(obj->data.scroll.start == j){
+                                        obj->data.scroll.start = 0;
+                               }
+                       }
 #ifdef NVIDIA
                        OBJ(nvidia) {
                                int hol = (strcmp((char*)&obj->data.nvidia.arg, "gpufreq")) ? 1 : 0;
@@ -6414,7 +6586,7 @@ static void draw_string(const char *s)
        }
 
        width_of_s = get_string_width(s);
-       if (out_to_console && draw_mode == FG) {
+       if ((output_methods & TO_STDOUT) && draw_mode == FG) {
                printf("%s\n", s);
                fflush(stdout); /* output immediately, don't buffer */
        }
@@ -6714,8 +6886,6 @@ static void draw_line(char *s)
                                        float gradient_update = 0;
                                        unsigned long last_colour = current_color;
                                        unsigned long tmpcolour = current_color;
-                                       int show_scale_x = cur_x + font_ascent() / 2;
-                                       int show_scale_y = cur_y + font_height() / 2;
                                        if (cur_x - text_start_x > maximum_width
                                                        && maximum_width > 0) {
                                                break;
@@ -6783,11 +6953,56 @@ static void draw_line(char *s)
                                        } else {
                                                set_foreground_color(default_fg_color);
                                        } */
+                                       if (show_graph_range) {
+                                               int tmp_x = cur_x;
+                                               int tmp_y = cur_y;
+                                               unsigned short int seconds = update_interval * w;
+                                               char *tmp_day_str;
+                                               char *tmp_hour_str;
+                                               char *tmp_min_str;
+                                               char *tmp_sec_str;
+                                               unsigned short int timeunits;
+                                               if(seconds!=0){
+                                                       timeunits = seconds / 86400; seconds %= 86400;
+                                                       if( timeunits > 0 ) {
+                                                               asprintf(&tmp_day_str, "%dd", timeunits);
+                                                       }else{
+                                                               tmp_day_str = strdup("");
+                                                       }
+                                                       timeunits = seconds / 3600; seconds %= 3600;
+                                                       if( timeunits > 0 ) {
+                                                               asprintf(&tmp_hour_str, "%dh", timeunits);
+                                                       }else{
+                                                               tmp_hour_str = strdup("");
+                                                       }
+                                                       timeunits = seconds / 60; seconds %= 60;
+                                                       if(timeunits > 0) {
+                                                               asprintf(&tmp_min_str, "%dm", timeunits);
+                                                       }else{
+                                                               tmp_min_str = strdup("");
+                                                       }
+                                                       if(seconds > 0) {
+                                                               asprintf(&tmp_sec_str, "%ds", seconds);
+                                                       }else{
+                                                               tmp_sec_str = strdup("");
+                                                       }
+                                                       asprintf(&tmp_str, "%s%s%s%s", tmp_day_str, tmp_hour_str, tmp_min_str, tmp_sec_str);
+                                                       free(tmp_day_str); free(tmp_hour_str); free(tmp_min_str); free(tmp_sec_str);
+                                               }else{
+                                                       asprintf(&tmp_str, "Range not possible"); //should never happen, but better safe then sorry
+                                               }
+                                               cur_x += (w / 2) - (font_ascent() * (strlen(tmp_str) / 2));
+                                               cur_y += font_height() / 2;
+                                               draw_string(tmp_str);
+                                               free(tmp_str);
+                                               cur_x = tmp_x;
+                                               cur_y = tmp_y;
+                                       }
                                        if (show_graph_scale && (specials[special_index].show_scale == 1)) {
                                                int tmp_x = cur_x;
                                                int tmp_y = cur_y;
-                                               cur_x = show_scale_x;
-                                               cur_y = show_scale_y;
+                                               cur_x += font_ascent() / 2;
+                                               cur_y += font_height() / 2;
                                                tmp_str = (char *)
                                                        calloc(log10(floor(specials[special_index].graph_scale)) + 4,
                                                                        sizeof(char));
@@ -7556,11 +7771,11 @@ static int string_to_bool(const char *s)
        if (!s) {
                // Assumes an option without a true/false means true
                return 1;
-       } else if (strcasecmp(s, "yes") == 0) {
+       } else if (strcasecmp(s, "yes") == EQUAL) {
                return 1;
-       } else if (strcasecmp(s, "true") == 0) {
+       } else if (strcasecmp(s, "true") == EQUAL) {
                return 1;
-       } else if (strcasecmp(s, "1") == 0) {
+       } else if (strcasecmp(s, "1") == EQUAL) {
                return 1;
        }
        return 0;
@@ -7569,39 +7784,39 @@ static int string_to_bool(const char *s)
 #ifdef X11
 static enum alignment string_to_alignment(const char *s)
 {
-       if (strcasecmp(s, "top_left") == 0) {
+       if (strcasecmp(s, "top_left") == EQUAL) {
                return TOP_LEFT;
-       } else if (strcasecmp(s, "top_right") == 0) {
+       } else if (strcasecmp(s, "top_right") == EQUAL) {
                return TOP_RIGHT;
-       } else if (strcasecmp(s, "top_middle") == 0) {
+       } else if (strcasecmp(s, "top_middle") == EQUAL) {
                return TOP_MIDDLE;
-       } else if (strcasecmp(s, "bottom_left") == 0) {
+       } else if (strcasecmp(s, "bottom_left") == EQUAL) {
                return BOTTOM_LEFT;
-       } else if (strcasecmp(s, "bottom_right") == 0) {
+       } else if (strcasecmp(s, "bottom_right") == EQUAL) {
                return BOTTOM_RIGHT;
-       } else if (strcasecmp(s, "bottom_middle") == 0) {
+       } else if (strcasecmp(s, "bottom_middle") == EQUAL) {
                return BOTTOM_MIDDLE;
-       } else if (strcasecmp(s, "middle_left") == 0) {
+       } else if (strcasecmp(s, "middle_left") == EQUAL) {
                return MIDDLE_LEFT;
-       } else if (strcasecmp(s, "middle_right") == 0) {
+       } else if (strcasecmp(s, "middle_right") == EQUAL) {
                return MIDDLE_RIGHT;
-       } else if (strcasecmp(s, "tl") == 0) {
+       } else if (strcasecmp(s, "tl") == EQUAL) {
                return TOP_LEFT;
-       } else if (strcasecmp(s, "tr") == 0) {
+       } else if (strcasecmp(s, "tr") == EQUAL) {
                return TOP_RIGHT;
-       } else if (strcasecmp(s, "tm") == 0) {
+       } else if (strcasecmp(s, "tm") == EQUAL) {
                return TOP_MIDDLE;
-       } else if (strcasecmp(s, "bl") == 0) {
+       } else if (strcasecmp(s, "bl") == EQUAL) {
                return BOTTOM_LEFT;
-       } else if (strcasecmp(s, "br") == 0) {
+       } else if (strcasecmp(s, "br") == EQUAL) {
                return BOTTOM_RIGHT;
-       } else if (strcasecmp(s, "bm") == 0) {
+       } else if (strcasecmp(s, "bm") == EQUAL) {
                return BOTTOM_MIDDLE;
-       } else if (strcasecmp(s, "ml") == 0) {
+       } else if (strcasecmp(s, "ml") == EQUAL) {
                return MIDDLE_LEFT;
-       } else if (strcasecmp(s, "mr") == 0) {
+       } else if (strcasecmp(s, "mr") == EQUAL) {
                return MIDDLE_RIGHT;
-       } else if (strcasecmp(s, "none") == 0) {
+       } else if (strcasecmp(s, "none") == EQUAL) {
                return NONE;
        }
        return TOP_LEFT;
@@ -7643,12 +7858,13 @@ static void set_default_configurations(void)
 #endif
        use_spacer = NO_SPACER;
 #ifdef X11
-       out_to_console = 0;
+       output_methods = TO_X;
 #else
-       out_to_console = 1;
+       output_methods = TO_STDOUT;
 #endif
 #ifdef X11
        show_graph_scale = 0;
+       show_graph_range = 0;
        default_fg_color = WhitePixel(display, screen);
        default_bg_color = BlackPixel(display, screen);
        default_out_color = BlackPixel(display, screen);
@@ -7684,6 +7900,8 @@ static void set_default_configurations(void)
        border_margin = 3;
        border_width = 1;
        text_alignment = BOTTOM_LEFT;
+       info.x11.monitor.number = 1;
+       info.x11.monitor.current = 0;
 #endif /* X11 */
 
        free(current_mail_spool);
@@ -7804,6 +8022,9 @@ static void load_config_file(const char *f)
                CONF("show_graph_scale") {
                        show_graph_scale = string_to_bool(value);
                }
+               CONF("show_graph_range") {
+                       show_graph_range = string_to_bool(value);
+               }
                CONF("border_margin") {
                        if (value) {
                                border_margin = strtol(value, 0, 0);
@@ -8012,15 +8233,15 @@ static void load_config_file(const char *f)
                }
 #endif /* X11 */
                CONF("out_to_console") {
-                       out_to_console = string_to_bool(value);
+                       if(string_to_bool(value)) output_methods |= TO_STDOUT;
                }
                CONF("use_spacer") {
                        if (value) {
-                               if (strcasecmp(value, "left") == 0) {
+                               if (strcasecmp(value, "left") == EQUAL) {
                                        use_spacer = LEFT_SPACER;
-                               } else if (strcasecmp(value, "right") == 0) {
+                               } else if (strcasecmp(value, "right") == EQUAL) {
                                        use_spacer = RIGHT_SPACER;
-                               } else if (strcasecmp(value, "none") == 0) {
+                               } else if (strcasecmp(value, "none") == EQUAL) {
                                        use_spacer = NO_SPACER;
                                } else {
                                        use_spacer = string_to_bool(value);
@@ -8200,17 +8421,17 @@ static void load_config_file(const char *f)
                                if ((p_hint = strtok_r(value, delim, &p_save)) != NULL) {
                                        do {
                                                /* fprintf(stderr, "hint [%s] parsed\n", p_hint); */
-                                               if (strncmp(p_hint, "undecorate", 10) == 0) {
+                                               if (strncmp(p_hint, "undecorate", 10) == EQUAL) {
                                                        SET_HINT(window.hints, HINT_UNDECORATED);
-                                               } else if (strncmp(p_hint, "below", 5) == 0) {
+                                               } else if (strncmp(p_hint, "below", 5) == EQUAL) {
                                                        SET_HINT(window.hints, HINT_BELOW);
-                                               } else if (strncmp(p_hint, "above", 5) == 0) {
+                                               } else if (strncmp(p_hint, "above", 5) == EQUAL) {
                                                        SET_HINT(window.hints, HINT_ABOVE);
-                                               } else if (strncmp(p_hint, "sticky", 6) == 0) {
+                                               } else if (strncmp(p_hint, "sticky", 6) == EQUAL) {
                                                        SET_HINT(window.hints, HINT_STICKY);
-                                               } else if (strncmp(p_hint, "skip_taskbar", 12) == 0) {
+                                               } else if (strncmp(p_hint, "skip_taskbar", 12) == EQUAL) {
                                                        SET_HINT(window.hints, HINT_SKIP_TASKBAR);
-                                               } else if (strncmp(p_hint, "skip_pager", 10) == 0) {
+                                               } else if (strncmp(p_hint, "skip_pager", 10) == EQUAL) {
                                                        SET_HINT(window.hints, HINT_SKIP_PAGER);
                                                } else {
                                                        CONF_ERR;
@@ -8225,13 +8446,13 @@ static void load_config_file(const char *f)
                }
                CONF("own_window_type") {
                        if (value) {
-                               if (strncmp(value, "normal", 6) == 0) {
+                               if (strncmp(value, "normal", 6) == EQUAL) {
                                        window.type = TYPE_NORMAL;
-                               } else if (strncmp(value, "desktop", 7) == 0) {
+                               } else if (strncmp(value, "desktop", 7) == EQUAL) {
                                        window.type = TYPE_DESKTOP;
-                               } else if (strncmp(value, "dock", 7) == 0) {
+                               } else if (strncmp(value, "dock", 7) == EQUAL) {
                                        window.type = TYPE_DOCK;
-                               } else if (strncmp(value, "override", 8) == 0) {
+                               } else if (strncmp(value, "override", 8) == EQUAL) {
                                        window.type = TYPE_OVERRIDE;
                                } else {
                                        CONF_ERR;
@@ -8355,11 +8576,11 @@ static void load_config_file(const char *f)
                        if (!value) {
                                ERR("incorrect if_up_strictness value, defaulting to 'up'");
                                ifup_strictness = IFUP_UP;
-                       } else if (!strcmp(value, "up")) {
+                       } else if (strcasecmp(value, "up") == EQUAL) {
                                ifup_strictness = IFUP_UP;
-                       } else if (!strcmp(value, "link")) {
+                       } else if (strcasecmp(value, "link") == EQUAL) {
                                ifup_strictness = IFUP_LINK;
-                       } else if (!strcmp(value, "address")) {
+                       } else if (strcasecmp(value, "address") == EQUAL) {
                                ifup_strictness = IFUP_ADDR;
                        } else {
                                ERR("incorrect if_up_strictness value, defaulting to 'up'");
@@ -8727,9 +8948,7 @@ int main(int argc, char **argv)
 
        selected_font = 0;
        update_text_area();     /* to position text/window on screen */
-#endif /* X11 */
 
-#ifdef X11
 #ifdef OWN_WINDOW
        if (own_window && !fixed_pos) {
                XMoveWindow(display, window.window, window.x, window.y);
index 7e0e958..de86516 100644 (file)
@@ -34,6 +34,8 @@
 #include <mcheck.h>
 #endif /* HAS_MCHECK_H */
 
+#define EQUAL 0        //returnvalue of strcmp-variants when strings are equal
+
 #include "config.h"
 #include <sys/utsname.h>
 #include <stdio.h>
@@ -197,6 +199,17 @@ struct gateway_info {
        int count;
 };
 
+#ifdef X11
+struct monitor_info {
+       int number;
+       int current;
+};
+
+struct x11_info {
+       struct monitor_info monitor;
+};
+#endif
+
 #ifdef TCP_PORT_MONITOR
 #include "libtcp-portmon.h"
 #endif
@@ -244,10 +257,13 @@ enum {
 #endif
        INFO_USERS = 26,
        INFO_GW = 27,
-       INFO_DNS = 28
 #ifdef NVIDIA
-,      INFO_NVIDIA = 29
+       INFO_NVIDIA = 28,
 #endif
+#ifdef X11
+       INFO_X11 = 29,
+#endif
+       INFO_DNS = 30
 
 };
 
@@ -279,7 +295,7 @@ struct information {
        double uptime;
 
        /* memory information in kilobytes */
-       unsigned long long mem, memmax, swap, swapmax;
+       unsigned long long mem, memeasyfree, memfree, memmax, swap, swapmax;
        unsigned long long bufmem, buffers, cached;
 
        unsigned short procs;
@@ -325,6 +341,10 @@ struct information {
        struct entropy_s entropy;
        double music_player_interval;
 
+#ifdef X11
+       struct x11_info x11;
+#endif
+
        short kflags;   /* kernel settings, see enum KFLAG */
 
        unsigned int diskio_value;
@@ -347,7 +367,9 @@ enum {
 #define KFLAG_FLIP(a) info.kflags ^= a
 #define KFLAG_ISSET(a) info.kflags & a
 
-int out_to_console;
+#define TO_X 1
+#define TO_STDOUT 2
+int output_methods;
 
 int top_cpu;
 int top_mem;
@@ -385,6 +407,10 @@ void free_dns_data(void);
 void update_dns_data(void);
 void update_users(void);
 
+#ifdef X11
+void update_x11info(void);
+#endif
+
 void update_stuff(void);
 
 int round_to_int(float f);
index bcebc31..822489f 100644 (file)
@@ -165,6 +165,7 @@ void update_meminfo()
 
        info.memmax = total_pages * (pagesize >> 10);
        info.mem = (total_pages - free_pages - inactive_pages) * (pagesize >> 10);
+       info.memeasyfree = info.memfree = info.memmax - info.mem;
 
        if ((swapmode(&swap_avail, &swap_free)) >= 0) {
                info.swapmax = swap_avail;
index 33954c8..8652484 100644 (file)
@@ -132,7 +132,7 @@ void update_meminfo(void)
        char buf[256];
 
        info.mem = info.memmax = info.swap = info.swapmax = info.bufmem =
-               info.buffers = info.cached = 0;
+               info.buffers = info.cached = info.memfree = info.memeasyfree = 0;
 
        if (!(meminfo_fp = open_file("/proc/meminfo", &rep))) {
                return;
@@ -146,7 +146,7 @@ void update_meminfo(void)
                if (strncmp(buf, "MemTotal:", 9) == 0) {
                        sscanf(buf, "%*s %llu", &info.memmax);
                } else if (strncmp(buf, "MemFree:", 8) == 0) {
-                       sscanf(buf, "%*s %llu", &info.mem);
+                       sscanf(buf, "%*s %llu", &info.memfree);
                } else if (strncmp(buf, "SwapTotal:", 10) == 0) {
                        sscanf(buf, "%*s %llu", &info.swapmax);
                } else if (strncmp(buf, "SwapFree:", 9) == 0) {
@@ -158,7 +158,8 @@ void update_meminfo(void)
                }
        }
 
-       info.mem = info.memmax - info.mem;
+       info.mem = info.memmax - info.memfree;
+       info.memeasyfree = info.memfree;
        info.swap = info.swapmax - info.swap;
 
        info.bufmem = info.cached + info.buffers;
index 89864a1..db1f511 100644 (file)
@@ -119,9 +119,6 @@ void update_meminfo()
        struct uvmexp_sysctl uvmexp;
        size_t size = sizeof(uvmexp);
 
-       info.memmax = info.mem = 0;
-       info.swapmax = info.swap = 0;
-
        if (sysctl(mib, 2, &uvmexp, &size, NULL, 0) < 0) {
                warn("could not get memory info");
                return;
@@ -133,6 +130,7 @@ void update_meminfo()
 
        info.memmax = (total_pages * pagesize) >> 10;
        info.mem = ((total_pages - free_pages - inactive_pages) * pagesize) >> 10;
+       info.memeasyfree = info.memfree = info.memmax - info.mem;
 
        if (swapmode(&swap_avail, &swap_free) >= 0) {
                info.swapmax = swap_avail;
index e972938..524ebd7 100644 (file)
@@ -175,6 +175,7 @@ void update_meminfo()
 
        info.memmax = pagetok(vmtotal.t_rm) + pagetok(vmtotal.t_free);
        info.mem = pagetok(vmtotal.t_rm);
+       info.memeasyfree = info.memfree = info.memmax - info.mem;
 
        if ((swapmode(&swap_used, &swap_avail)) >= 0) {
                info.swapmax = swap_avail;
index 4769de9..f62e02b 100644 (file)
--- a/src/x11.c
+++ b/src/x11.c
@@ -550,4 +550,10 @@ void create_gc(void)
                GCFunction | GCGraphicsExposures, &values);
 }
 
+void update_x11info(void)
+{
+       struct information *current_info = &info;
+       current_info->x11.monitor.number = XScreenCount(display);
+       current_info->x11.monitor.current = XDefaultScreen(display);
+}
 #endif /* X11 */