From b7983c111ef4b095466761c3c390140788279a5b Mon Sep 17 00:00:00 2001 From: Creamy Goodness Date: Mon, 20 Dec 2010 03:48:56 -0700 Subject: [PATCH] nothing interesting --- .gitignore | 2 + configure | 52 ++-- configure.ac | 14 +- configure.ac.in | 4 +- debian/changelog | 2 +- debian/control | 2 +- doc/Makefile.in | 2 + lua/libimlib2.c | 11 +- lua_scripts/LEDFont.ttf | Bin 0 -> 60456 bytes lua_scripts/LoadAll.lua | 28 ++ lua_scripts/bargraph_eng.lua | 580 +++++++++++++++++++++++++++++++++++++ lua_scripts/box.lua | 309 ++++++++++++++++++++ lua_scripts/graph.lua | 529 ++++++++++++++++++++++++++++++++++ lua_scripts/luatraverse.lua | 195 +++++++++++++ lua_scripts/misc.lua | 204 +++++++++++++ lua_scripts/n900-kobol.jpg | Bin 0 -> 98431 bytes lua_scripts/piechart.lua | 654 ++++++++++++++++++++++++++++++++++++++++++ lua_scripts/strict.lua | 42 +++ lua_scripts/testCairo.lua | 236 +++++++++++++++ lua_scripts/text.lua | 557 +++++++++++++++++++++++++++++++++++ src/Makefile.in | 89 +++--- src/config.h.in | 3 - src/dbus/Makefile | 8 +- 23 files changed, 3426 insertions(+), 97 deletions(-) create mode 100644 lua_scripts/LEDFont.ttf create mode 100644 lua_scripts/LoadAll.lua create mode 100644 lua_scripts/bargraph_eng.lua create mode 100644 lua_scripts/box.lua create mode 100644 lua_scripts/graph.lua create mode 100644 lua_scripts/luatraverse.lua create mode 100644 lua_scripts/misc.lua create mode 100644 lua_scripts/n900-kobol.jpg create mode 100644 lua_scripts/piechart.lua create mode 100644 lua_scripts/strict.lua create mode 100644 lua_scripts/testCairo.lua create mode 100644 lua_scripts/text.lua diff --git a/.gitignore b/.gitignore index 2af02ba..5f2fe07 100644 --- a/.gitignore +++ b/.gitignore @@ -54,3 +54,5 @@ doc/*.mxml patches/ doc/conky.1 README + +*.bak \ No newline at end of file diff --git a/configure b/configure index e149bfa..589a1b1 100644 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.61 for Conky 1.8.5. +# Generated by GNU Autoconf 2.61 for Conky 1.8.5_pre2390. # # Report bugs to . # @@ -728,8 +728,8 @@ SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='Conky' PACKAGE_TARNAME='conky' -PACKAGE_VERSION='1.8.5' -PACKAGE_STRING='Conky 1.8.5' +PACKAGE_VERSION='1.8.5_pre2390' +PACKAGE_STRING='Conky 1.8.5_pre2390' PACKAGE_BUGREPORT='brenden1@users.sourceforge.net' # Factoring default headers for most tests. @@ -1528,7 +1528,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures Conky 1.8.5 to adapt to many kinds of systems. +\`configure' configures Conky 1.8.5_pre2390 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1602,7 +1602,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of Conky 1.8.5:";; + short | recursive ) echo "Configuration of Conky 1.8.5_pre2390:";; esac cat <<\_ACEOF @@ -1810,7 +1810,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -Conky configure 1.8.5 +Conky configure 1.8.5_pre2390 generated by GNU Autoconf 2.61 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, @@ -1824,7 +1824,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by Conky $as_me 1.8.5, which was +It was created by Conky $as_me 1.8.5_pre2390, which was generated by GNU Autoconf 2.61. Invocation command line was $ $0 $@ @@ -2487,7 +2487,7 @@ fi # Define the identity of the package. PACKAGE=conky - VERSION=1.8.5 + VERSION=1.8.5_pre2390 cat >>confdefs.h <<_ACEOF @@ -20667,12 +20667,12 @@ if test -n "$PKG_CONFIG"; then pkg_cv_Audacious_CFLAGS="$Audacious_CFLAGS" else if test -n "$PKG_CONFIG" && \ - { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"audacious >= 1.4.0 dbus-glib-1 glib-2.0 gobject-2.0\"") >&5 - ($PKG_CONFIG --exists --print-errors "audacious >= 1.4.0 dbus-glib-1 glib-2.0 gobject-2.0") 2>&5 + { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"audacious >= 1.4.0 audclient dbus-glib-1 glib-2.0 gobject-2.0\"") >&5 + ($PKG_CONFIG --exists --print-errors "audacious >= 1.4.0 audclient dbus-glib-1 glib-2.0 gobject-2.0") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then - pkg_cv_Audacious_CFLAGS=`$PKG_CONFIG --cflags "audacious >= 1.4.0 dbus-glib-1 glib-2.0 gobject-2.0" 2>/dev/null` + pkg_cv_Audacious_CFLAGS=`$PKG_CONFIG --cflags "audacious >= 1.4.0 audclient dbus-glib-1 glib-2.0 gobject-2.0" 2>/dev/null` else pkg_failed=yes fi @@ -20685,12 +20685,12 @@ if test -n "$PKG_CONFIG"; then pkg_cv_Audacious_LIBS="$Audacious_LIBS" else if test -n "$PKG_CONFIG" && \ - { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"audacious >= 1.4.0 dbus-glib-1 glib-2.0 gobject-2.0\"") >&5 - ($PKG_CONFIG --exists --print-errors "audacious >= 1.4.0 dbus-glib-1 glib-2.0 gobject-2.0") 2>&5 + { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"audacious >= 1.4.0 audclient dbus-glib-1 glib-2.0 gobject-2.0\"") >&5 + ($PKG_CONFIG --exists --print-errors "audacious >= 1.4.0 audclient dbus-glib-1 glib-2.0 gobject-2.0") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then - pkg_cv_Audacious_LIBS=`$PKG_CONFIG --libs "audacious >= 1.4.0 dbus-glib-1 glib-2.0 gobject-2.0" 2>/dev/null` + pkg_cv_Audacious_LIBS=`$PKG_CONFIG --libs "audacious >= 1.4.0 audclient dbus-glib-1 glib-2.0 gobject-2.0" 2>/dev/null` else pkg_failed=yes fi @@ -20709,14 +20709,14 @@ else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then - Audacious_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "audacious >= 1.4.0 dbus-glib-1 glib-2.0 gobject-2.0"` + Audacious_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "audacious >= 1.4.0 audclient dbus-glib-1 glib-2.0 gobject-2.0"` else - Audacious_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "audacious >= 1.4.0 dbus-glib-1 glib-2.0 gobject-2.0"` + Audacious_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "audacious >= 1.4.0 audclient dbus-glib-1 glib-2.0 gobject-2.0"` fi # Put the nasty error message in config.log where it belongs echo "$Audacious_PKG_ERRORS" >&5 - { { echo "$as_me:$LINENO: error: Package requirements (audacious >= 1.4.0 dbus-glib-1 glib-2.0 gobject-2.0) were not met: + { { echo "$as_me:$LINENO: error: Package requirements (audacious >= 1.4.0 audclient dbus-glib-1 glib-2.0 gobject-2.0) were not met: $Audacious_PKG_ERRORS @@ -20727,7 +20727,7 @@ Alternatively, you may set the environment variables Audacious_CFLAGS and Audacious_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. " >&5 -echo "$as_me: error: Package requirements (audacious >= 1.4.0 dbus-glib-1 glib-2.0 gobject-2.0) were not met: +echo "$as_me: error: Package requirements (audacious >= 1.4.0 audclient dbus-glib-1 glib-2.0 gobject-2.0) were not met: $Audacious_PKG_ERRORS @@ -21430,7 +21430,7 @@ fi if test x$want_apcupsd = xyes; then - if test x"$uname" != xLinux; then + if test x"$uname" != xLinux -a x"$uname" != xFreeBSD; then { echo "$as_me:$LINENO: apcupsd not supported on $uname... disabling" >&5 echo "$as_me: apcupsd not supported on $uname... disabling" >&6;} want_apcupsd="not supported on $uname" @@ -21464,7 +21464,7 @@ fi if test x$want_iostats = xyes; then - if test x"$uname" != xLinux; then + if test x"$uname" != xLinux -a x"$uname" != xFreeBSD; then { echo "$as_me:$LINENO: iostats not supported on $uname... disabling" >&5 echo "$as_me: iostats not supported on $uname... disabling" >&6;} want_iostats="not supported on $uname" @@ -27756,13 +27756,6 @@ else fi fi -if test x$want_alsa = xyes; then - -cat >>confdefs.h <<\_ACEOF -#define MIXER_IS_ALSA 1 -_ACEOF - -fi @@ -29510,7 +29503,7 @@ exec 6>&1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by Conky $as_me 1.8.5, which was +This file was extended by Conky $as_me 1.8.5_pre2390, which was generated by GNU Autoconf 2.61. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -29563,7 +29556,7 @@ Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ -Conky config.status 1.8.5 +Conky config.status 1.8.5_pre2390 configured by $0, generated by GNU Autoconf 2.61, with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" @@ -30681,6 +30674,7 @@ $PACKAGE $VERSION configured successfully: ALSA mixer: $want_alsa apcupsd: $want_apcupsd I/O stats: $want_iostats + ncurses: $want_ncurses * Lua ($want_lua) bindings: Cairo: $want_lua_cairo diff --git a/configure.ac b/configure.ac index 11dd695..bec8b23 100644 --- a/configure.ac +++ b/configure.ac @@ -4,8 +4,8 @@ dnl major, minor and micro version macros. m4_define([conky_version_major], [1]) m4_define([conky_version_minor], [8]) m4_define([conky_version_micro], [5]) -m4_define([conky_version_tag]) dnl, [pre]) dnl [] for releases -m4_define([conky_version_revision],[_rc3]) +m4_define([conky_version_tag], [pre]) dnl [] for releases +m4_define([conky_version_revision],[_pre2390]) m4_define([conky_version], [conky_version_major().conky_version_minor().conky_version_micro()ifelse( conky_version_tag(), [pre], @@ -150,7 +150,7 @@ AC_ARG_ENABLE([audacious], AM_CONDITIONAL(BUILD_AUDACIOUS, test x$want_audacious = xyes -o x$want_audacious = xlegacy) if test x$want_audacious = xyes; then - PKG_CHECK_MODULES([Audacious], [audacious >= 1.4.0 dbus-glib-1 glib-2.0 gobject-2.0]) + PKG_CHECK_MODULES([Audacious], [audacious >= 1.4.0 audclient dbus-glib-1 glib-2.0 gobject-2.0]) conky_CFLAGS="$conky_CFLAGS $Audacious_CFLAGS" conky_LIBS="$conky_LIBS $Audacious_LIBS" save_CPPFLAGS="$CPPFLAGS" @@ -239,7 +239,7 @@ AC_ARG_ENABLE([apcupsd], [want_apcupsd="$enableval"], [want_apcupsd=yes]) if test x$want_apcupsd = xyes; then - if test x"$uname" != xLinux; then + if test x"$uname" != xLinux -a x"$uname" != xFreeBSD; then AC_MSG_NOTICE([apcupsd not supported on $uname... disabling]) want_apcupsd="not supported on $uname" else @@ -259,7 +259,7 @@ AC_ARG_ENABLE([iostats], [want_iostats="$enableval"], [want_iostats=yes]) if test x$want_iostats = xyes; then - if test x"$uname" != xLinux; then + if test x"$uname" != xLinux -a x"$uname" != xFreeBSD; then AC_MSG_NOTICE([iostats not supported on $uname... disabling]) want_iostats="not supported on $uname" else @@ -768,9 +768,6 @@ fi if test x$want_alsa = xyes; then AC_CHECK_LIB(asound, snd_pcm_open,conky_LIBS="$conky_LIBS -lasound", want_alsa=no) fi -if test x$want_alsa = xyes; then -AC_DEFINE(MIXER_IS_ALSA, 1, [Define if the mixers use ALSA]) -fi dnl dnl Some headers dnl @@ -1012,6 +1009,7 @@ dnl OpenMP: $want_openmp ALSA mixer: $want_alsa apcupsd: $want_apcupsd I/O stats: $want_iostats + ncurses: $want_ncurses * Lua ($want_lua) bindings: Cairo: $want_lua_cairo diff --git a/configure.ac.in b/configure.ac.in index 3f40c2b..1904627 100644 --- a/configure.ac.in +++ b/configure.ac.in @@ -2,8 +2,8 @@ # dnl major, minor and micro version macros. m4_define([conky_version_major], [1]) -m4_define([conky_version_minor], [8]) -m4_define([conky_version_micro], [5]) +m4_define([conky_version_minor], [9]) +m4_define([conky_version_micro], [6]) m4_define([conky_version_tag], [pre]) dnl [] for releases m4_define([conky_version_revision],[_pre@REVISION@]) m4_define([conky_version], diff --git a/debian/changelog b/debian/changelog index 1724864..bf1c4df 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,4 @@ -conky (1.9.5-1) unstable; urgency=low +conky (1.9.6-1) unstable; urgency=low * New maemo release: - i'm too lazy to fill this in for now diff --git a/debian/control b/debian/control index 238c7a7..ee1ea7f 100644 --- a/debian/control +++ b/debian/control @@ -6,7 +6,7 @@ XSBC-Original-Maintainer: Cesare Tirabassi Build-Depends: debhelper (>= 5.0.0), libtool, automake, pkg-config (>= 0.19), libx11-dev, libxft-dev, libxdamage-dev, libxext-dev, libglib2.0-dev, - libxml2-dev, libimlib2-dev, + libxml2-dev, libimlib2-dev (>= 1.4.0), libiw-dev[!kfreebsd-i386 !kfreebsd-amd64 !hurd-i386], libasound2-dev [!kfreebsd-i386 !kfreebsd-amd64 !hurd-i386], libkvm-dev [kfreebsd-i386 kfreebsd-amd64], diff --git a/doc/Makefile.in b/doc/Makefile.in index e8a9a83..e9248e0 100644 --- a/doc/Makefile.in +++ b/doc/Makefile.in @@ -489,6 +489,8 @@ uninstall-man: uninstall-man1 @HAVE_DOCSTUFF_TRUE@ sed -i "s/\xE2//g" README @HAVE_DOCSTUFF_TRUE@ sed -i "s/\x80//g" README @HAVE_DOCSTUFF_TRUE@ sed -i "s/\x90/-/g" README +@HAVE_DOCSTUFF_TRUE@ sed -i "s/\x94/-/g" README +@HAVE_DOCSTUFF_TRUE@ sed -i "s/\x9f/-/g" README @HAVE_DOCSTUFF_TRUE@ mv README ${top_srcdir} @HAVE_DOCSTUFF_TRUE@ xsltproc ${srcdir}/variables.xsl ${srcdir}/variables.xml > variables.html @HAVE_DOCSTUFF_TRUE@ xsltproc ${srcdir}/config_settings.xsl ${srcdir}/config_settings.xml > config_settings.html diff --git a/lua/libimlib2.c b/lua/libimlib2.c index 880fd7f..96cd218 100644 --- a/lua/libimlib2.c +++ b/lua/libimlib2.c @@ -16,7 +16,10 @@ TOLUA_API int tolua_imlib2_open (lua_State* tolua_S); #include #include #define _userdata void* - +#define TOLUA_DISABLE_tolua_imlib2_imlib_get_next_font_in_fallback_chain00 +#define TOLUA_DISABLE_tolua_imlib2_imlib_insert_font_into_fallback_chain00 +#define TOLUA_DISABLE_tolua_imlib2_imlib_remove_font_from_fallback_chain00 +#define TOLUA_DISABLE_tolua_imlib2_imlib_get_prev_font_in_fallback_chain00 /* function to release collected object via destructor */ #ifdef __cplusplus @@ -6717,7 +6720,7 @@ TOLUA_API int tolua_imlib2_open (lua_State* tolua_S) tolua_function(tolua_S,"imlib_context_pop",tolua_imlib2_imlib_context_pop00); tolua_function(tolua_S,"imlib_context_get",tolua_imlib2_imlib_context_get00); tolua_function(tolua_S,"imlib_context_set_display",tolua_imlib2_imlib_context_set_display00); - tolua_function(tolua_S,"imlib_context_disconnect_display",tolua_imlib2_imlib_context_disconnect_display00); + //tolua_function(tolua_S,"imlib_context_disconnect_display",tolua_imlib2_imlib_context_disconnect_display00); tolua_function(tolua_S,"imlib_context_set_visual",tolua_imlib2_imlib_context_set_visual00); tolua_function(tolua_S,"imlib_context_set_colormap",tolua_imlib2_imlib_context_set_colormap00); tolua_function(tolua_S,"imlib_context_set_drawable",tolua_imlib2_imlib_context_set_drawable00); @@ -6842,10 +6845,10 @@ TOLUA_API int tolua_imlib2_open (lua_State* tolua_S) tolua_function(tolua_S,"imlib_image_tile",tolua_imlib2_imlib_image_tile00); tolua_function(tolua_S,"imlib_load_font",tolua_imlib2_imlib_load_font00); tolua_function(tolua_S,"imlib_free_font",tolua_imlib2_imlib_free_font00); - tolua_function(tolua_S,"imlib_insert_font_into_fallback_chain",tolua_imlib2_imlib_insert_font_into_fallback_chain00); +/* tolua_function(tolua_S,"imlib_insert_font_into_fallback_chain",tolua_imlib2_imlib_insert_font_into_fallback_chain00); tolua_function(tolua_S,"imlib_remove_font_from_fallback_chain",tolua_imlib2_imlib_remove_font_from_fallback_chain00); tolua_function(tolua_S,"imlib_get_prev_font_in_fallback_chain",tolua_imlib2_imlib_get_prev_font_in_fallback_chain00); - tolua_function(tolua_S,"imlib_get_next_font_in_fallback_chain",tolua_imlib2_imlib_get_next_font_in_fallback_chain00); + tolua_function(tolua_S,"imlib_get_next_font_in_fallback_chain",tolua_imlib2_imlib_get_next_font_in_fallback_chain00);*/ tolua_function(tolua_S,"imlib_text_draw",tolua_imlib2_imlib_text_draw00); tolua_function(tolua_S,"imlib_text_draw_with_return_metrics",tolua_imlib2_imlib_text_draw_with_return_metrics00); tolua_function(tolua_S,"imlib_get_text_size",tolua_imlib2_imlib_get_text_size00); diff --git a/lua_scripts/LEDFont.ttf b/lua_scripts/LEDFont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1b931e95f2b3512dbff85394da3820114061efa9 GIT binary patch literal 60456 zcmeIb34B%6wLiZ1xpU@`^j(rT@Bs@B%m*UHWRyVgGE+&M(;?>+zT)4&<-x#yg_ z_u6Z(d95v^5TZa_AS`0};-jZd$0z!G7uyltYr58ce4FzoA>+4V>h!G7aT`h zx8d_!_*~b!X5`Gre_oDfx98ydWZV0c(e%Yq!X;i_x7*T(_bh zC&&%LCal`~+WWY&O&w*6m@doJlbQE(moAtuIz{jUO}iuZoVdYqpq#;XYJ%V=L>b_R zGwH!*7gAlsxrXm(OZ>x^7OTzfaJq7G^YRM{i;7E1%gQHJRJuK0pFdC)tgfl83x(?& z8k?G1CQq5#I&FH}jP{uwky*3%o3sA`2X@Y#H~*jo2OqNV(8CU2^ra&fFFEq4qn93Y z>~Y7RaN+CO|bMATPU+|R+ zzk1Qdmt1<;*Dk+e{gqc;z2WQETzlR1H+M)!nb{5mxI;z~fQim0iph=ZP`tkj2s~tK>8}TOK4A%46h7GAd7( z=gDidN400P?bhJ&ra*}*x%^MiK< z@2#$>zP|dt8m-1&Q&>|{Q(oh#sj6wLX|7pV(^V6#)oP1st3x8Bh4Mm0p|VhA$QP;$ zwS;Db=7jn~7lbYfT^3p&x;AusXjACH(4(QpLR&-6hF%HJ33rC)g_noB!z;t9KhVa; zFl<3_yVPW!tds%SDrd?4OCSZu_i+ zwr@ykySpZ!w|#j{54Sy-rR_`1wr@yk`_Dozhi98@kA_eCK#Yxzy{;qOl(AQER*cQ1 zU%_FlELJB(tVoExU*3DhCm-)U4cqd)r+l(=?~!|#829bDc+d5FF52__o-6kpy=UcX zrwQ@e$nG0<-?{sW-Me<*LwD`|+wRkMpNeDaZn3*)x7@XA*UDWd?>ceUal4l8I&#-x zyXNnjv#Whq&CX3bH}1S==UqE*-x=L`#?IlL{X19h1a;VX{a;wo{4xK(Tv-;!2wIp%;?b^-Sg5YLr2>%c5>e<}6Cjv`dHE&wPKU*6cN7-c=UPPvWe!nDkBlU-|xjA_Dhy5DRpo5`!~C_y4ZVuzbtjT@gtR5uGoZj+C{$DAFb3}*z(Yb zvF*Z%wu|OY&4x=FwW|Z&!B|prw+J-hz)rhn1rxGS14`9zx2Z!r{qQo{X}MJ=dA%o9 zslC8kCt-Z=(XIg>CD>F5pQsg$Vyf7P-*@Izx_wQ}QyrZSN3O>^c?!UUrnt~RG{qrp z<&)|g?43?)X<0>GsL{c#qG_Xms1>8F1=QAvC_sG(PAlW?b- z-nvbc6K>;@6PI!oq#Ys$m$ryX0-md=titVq7~*8m)ez`%yw$aJkVhs@aq-0*Lfjky zA;tv>rj#zW0&f9R0;Qw2KBTb7qF^ieyN-^w1i*gc^F@B>l~!+H%r6gd`@L0pz8Ee_ zt1q^NJ~qby*-t$FZroUMgxh_@6rU&HE2w(NPumsPrU{5~&7GFQGF(dryH)`Jc?f3Pf$H#Zh0{RvzNVI(~Y0 zgX4ja40|_u1NZt{ync6;^wQA87Wp>$@L%4ij(dCQss!5O4$F06=dGbw{yhQjCd>=j z=xT_);G?l?c_ZL|+Z_ndpuMgSVd5}Wz3%tFU0D^5ec)=4Wwo_5szh%vqVnwwBl-i3 zrnPAD6icVAw5hq3z`tD-f+P|6a{>5Hn=`+@LCu*QOgnwN+7%M;Xw4AQ_;ydQ8lzR= z52(>{W5{X1H4L~-O%e&>NkiqPp(=H{ipwh@u9L71Q5}S(gvVnV4U?m`aeCX#4m)45 z(g-<)#b(bdD09&0bf`H}U))CXLLU}=snlt@AuMhuY zi+Ci4i2%j6=rc$GUuxNbFJ<86CcnQ4Q%X}%m&{p+1KLGB(WP;ih()t%)GwWbFzYb5 z1~Ee7r620!C)zCSZKdV4rIy-uVA?YeG~FL+dZ6jykZf&;{UWTL8~Y=TJ)Xj-ix14F z=w?f;g&wuE`|fXgAY=uG*Cz@TaFfXr18TL8;; z&`gnahcz7L^I_NP^Ytd4%NZFi@(slDD#cy$KKU_offBI*?FFeXDkf5&Ur?gZHi0!7 z1RFHQAlNzFSSG^7CEVCjrouW;;|X62q8iy`Fs?W7K?YX1-7BWk)NAT?ySp*HMCI5M zkRg|#Ej-%5d#I@3A-DvILCu^kLJ2HZLtp_+Dwi}gEa`1%=*4XdAr;;(*8^jkDkX6u z6KCe=g2xsC84dG8YNPm{vj%6mk+7_& zDo8ZQ=dVejL6a(&2Dv?HG^ie(scTeBIt=+K3$dvnaOHs5lvKLGk`?!@B^u)__g2@1 z8X9TTw}^=lnYLmFQF|gQ#kEZBvyzqACWDN)tFn@jF;S&00xbves2USQxeryeLrKqf zFr@N8j)w?FT23xtVRJZ%^MOt)ateWEGZ4j2B-V{h%^;L}Tr8qDLjL1}W*wL%p;^)~yPX;7aoc+{7+1 zdz92(T}{j+1Z|<*p-&|y0pR6obmghBXCfqK#kQc2a+M)uH50Qo$2Q^#8Rp}-wT0Y6EMpdaC42dAR=&wF=UMc_<^ z1+z<%GlAf`oasoyZ>xzXq;(M`IFB)$VF3k4hlRp$>M(Vj5k(0n44yn(btzEfk{AdC z$fbVgTdWS~nM!}j<1sJb`CbScAq<3Sz9(aQwZe8&+AcOGInY90o+KwI*;+zCa98P5 zKrZ1CU*d*ZDVqaTv6o1>ggOzQ52~LY%!gZPKBViImPsB=S<)~t9h8Pay|nm(xE#P` z%w(@%-R<)rfuA5@bqA`H{yZ@hkVNw;Le=${C|M97_Dd*uvNZNdM9vC8kkS>6I06)a z%pDlXi3B`pP$3QDYJ!R}&WS=OaVUz z0KlzhZGqsBB13CrtuDMmwyUC)7iQA_b2SU4 z)6&Oup#X-Cbbj(Fh$zn)XF(Zrkckjc5~NckrEzGf39V$Jsv9Vh_&yO5I&iMl#T zyOWl8n%)dGz0>qTs(Qy-;V003zJ;I2C;6WA1(UCA14m4;T}Dh5!bxn>=5XcYljLV8 z5be4iai5{-7)M!2>}@UWlvXKQjMhT_Pt+>kYQ5>pp!`gVP;+E z0m3a8>q2>^E~F2n)yle%v>Un*EWW^G2nm?#7Dql14hn!%p|_SvJ4%xsw+I##3nf$w z5*6V;g^C1W31V^v70IUTFc=tTUOo|k)(#k8U}?9dNKYA5qzbldC0kq)B`I_E2V{#s z_MRsYNGAiSYEqp47}`da2#Xd$P_*Tj)YiccP!y~VD+ZLO#AREK$6JLj9J&60!Y^f6 zXJMskIv(MC>$O6JZt5Ku{BClag=(M2)V zOAdru((#TzHda+B3m6%dIHpVG#Uzy}nf%-Y?fgu_#@xap7QjkM6|@qpfNp?cl2`HT zO318Plo8g-K$eS3RR7Bf9*zPiCLV8sfzQqcK6Wl7oA*kU%B|bJlccUHlFSV=ccQeV zO;Kt!+qDxd4+>K%Ve1cxZzw$R`3X5v8XqsCZd1senx}4itO3mQHiTFnA?sB`LGQ z)X|gG5_2x-DtdxWqOhM}K-{zxl=L#f4lAZJkU-jjysVie5Z%p!DXvu)D9YUc2{~)GNG@E z_uQY**Py5u_Yk2g!IUm6r767~uCoFfRco%-#}pty69md>0tE=+_L_P{0qWp`BP76U zEPw@WjX*yjpJGNQfMJ&_0J(&nSiu24Wsn9>ko-3Zq=9V|c}0mf3f=TC!F}30lzB=w z&1Iq!^4ef!WZ_9(|JNh27qig}>52WZs`4$iWXX9+^dnV|Cyn)M=;){C)fp@}<8fi8 zl}@4^@RBH*d%|2e(T1@v_G=(Z3fDE%)VM`M`6858BVQa&a|9O2e5*1~GJYg@$XU>| zS|HFdUPCDZnmcmy6Xtl5!4blQ?zv|d2z!A^4uC}9)-E-j_ByXhv?QNJqfx~6qf*m; zr0bk;(so*$EFdLeZwA*C`)?6eM!s)_fNVd6m)xt`oLzm4`=WHSDNIL6%u2HK1Etzs zmB^~dnMa1;7zxGcsXZp-}S@HF_MpPVwe!@?SpWKVAF_Rx8Ds@y-ss z^9Piza9pgzuq9j0O3ATP+nyck8lG?bRX7Rhys;0f3_DsN_7}3F#l~I_zX>7C!gdCd zOcZ~jSQ2YaegUYGBNyHt#=5u^mr*<`P%4kJut+gog^KybdK^hMqcE|XQf2N*W-%;z znEXV$UN`+^@NrON!ndi#nJv9g$*aLQf*2~$RuzQMX|=M{CGCdPmB4n=W&QMU1zp_% zo5{)LFpdPtgEV*wMVJ^hN%nWJ6R)janL!dpH__Yi9r(v?*8QeQBTT-6b&9O&+Pvi| zxBIGt+2xU)!e+FO?*l?*9^y%liU6}P9U28DG)OqlXNtsz;T+vCToqJc8W-0wxpn&= zNn@Df7I=byCW+Aaw#V-c$Pt?93+i91e=Q9RaMdw}8+0}H(VGo_tWT6v4ZAp5)c)-u zOZSi^;|oOq1;y<|Be7Y^dHA;*;>V|v;xd`rvq^EFo4OQ-&|^h6*}QHmfqh+(nSD!g zdVqpb?i3QG2y{u}yn#wdQk`yDU^Py+%6?Cm?hG$$EBhU+6>OEo{MW6rdRUINgsrlL zWrmqu$$so+$z+uU=TvN;r9309Bf#2DA-FJ`VAW*GW`fOOzY`1zD)xy(n`-NAYBGfs zGi65<^%uofvUy>h&yN6(jU?cuSzx_>pYOtki$e=l6o=dQ zfd4t4R-QzUbo*IwB_Au3Oew{A)VJ$~D_wnL zgKR|tsvQ!JHU3iu$1xw6_~slF;k}KBZ-FICHy$Vlr^34A`KYk&4w{c-4b2NEh#4kH zc!RAlW2uM|gb4u%jB1$-)M>EEs7n8X1(I35wsz96Ey(o+z+n62{l1 zx^fMV^&M;RqejgsR%6+JZOv87%*ri@9spI4Rxt^e$khZ&-4 zn(V5gYL)a63Paj1t*ND0z_@!B{%V*2iQ7VU)lGobT#gHK>TzNF(zyK0G)UtLR3T?a zF%32bIZ5Y59H$agCphvHm4g5`C9>-hT88m|8baz-aXyg&1%f1-YR9JIL11hQo{Tsi z2pi(*Ky5?H6;jIab!|2kohLUo-qdh&Z1lRu>l+%bZ@jKSuDGe;rUoe+8e_k0koeaS zdl|uZzi*I%hWgm=8gT%lNcaC;M{_NUXTXfJ#ULn#&eZf%P|o~B`+tH4m~46AA=qcU z2+ciUWD4w4;zbfo|0d~-2Me&>!7mHqp%ljaQ}#KUf6J7|Yl22-o@+K&4%9`aj6BP1 zWP(}&?7XNhcCSG| zxj*&cH(d?y$&a6NHM~%}O3_fO@Qghr9@BQ1G~`?w)np6%oJ9LtymMQP=@k#Coufy9 zZ4qo{fdl}ep|tf%;sfN0pg?preJ+U+YBz>sv~`;W(75pcA`dez;H>d&^aXHJ7H^8uwh%PtAG*)kpiJa1q*w& zG%E$yDbH2~hj=?WlxItifvQ)b#r-n?3V+oUf(`zAt6O~l*7V^1L3q!mc;$Xou}#(5 z&9OgK#e6kW{k|YzBgIPXA$fx3K=`XgDZ*f(GS=2Ru4?FMiZ&c|r1nrlPfx?qN8>(i z>_++c*bBgsP)ZDF+=0v3ir`QhMVsy_dfXQ~2eR2kzC|RX(Jx+uUkuxIZF@4+2m_B0d zRx)Ko@cS473;^eoIGwJ-vhqr|!bJu*7@937uf#O!LJY%fD>kCJORF8!v4at@9f>^? zkW=8(j`6}z>Y!6GU0Z$|ldfV@d-5qgP{lVvdr&7*SeUDSncz(z=#IMtHL#$S2 zSJI}!m^*aD;T~f8A@75GWB9iaLX2kTlIR+Ns-62jXbWy|r zr5W%9Y-2S?Wp#9rvV$p@Y)At)k4*E9f!sXrk@JXQr3j$%F#kuhO$urz1xUkkYgo_D z!#FFO0$IAcwR1-C&7#%bC?^HyM?zl+i!lsU^Sg(qW zkxm{y8^;(c|Adj?zF)nLD679P!+|^jwdA=g9EChCmKJp1CT+0$Eu8& zDsUMz!Yb|h02)Ms{dBpm9JuM+9_U(X0E29<_EsehAOf!uII6I=8u-~(QGs!5D<1<6u0h~GRM!$xpdh^(4>kqCsoQ#263A+FzhbMznI7fB37U5xtRuX{%ei9T4bG} zK_-r-z4qybpD1@T_agQjGJg#$^orFO(d>3k3WZGfE@!aBl#~3JJ}O(&>EOA@tFnYXML1-;Nzg}=EnoxtsZ~uZO9)SilEzC5>urxmnzVo zjS2lBOWkLX(k2wBkx}QZrJg4Tu@_R;fycQ8Ma5;63XfY$;|XQ)s9qzmEn^(}IKrA4 zrxAP0(0Jow8$rnXW=br3y5x2aQ6Mu?X#&2C>`pTfT|?*OUuEHI3RL z{VG$CilIKSf6O2I$aGa0%9BP(Q)00szMV_5sj_@1>(3m>E#MU@RwvnQ3|0%@6xoO% z-MIKJN)n;?ED67v5>8XCh@|e-TPRSCk=Hh74if8utIv7@^1(Ssp0ke4i~UA#4Mk?U zMK{yWd>96FCp8gI%Ftp)XQr7LB8IY~PU49Dt)QIbK-wbMiDDeEZ{v3hcwKzgdDW;XdY`|!V%C?02b2ItI)eMp3^_DvrpRcS~1V*lm$N@vw-Za-T~ zdRUUoL;JnrNNPVvhQnS0mjGybQZDW!CIgm&VmQ$=I_~r+3!5D^BUt931P3&c^|g+U za$7qRR@*|{<_h*c-h6H2Z8NTm{k5#{-B9dZYPR8ul(SQK|UU4mX;N(r@%UtETl$)(Ki?N z3xFPJS*0{n5jw_L%TMHPMj*A zk(tsYC<+OE%oIkKCJ^b)dWRxA3H@`Dea6rp^v+RST%5>ow^FE!*{2l3qI3OtPrQPn zu`<}3{sn@7Lj_K&&af<(F%(`2ILXPD$wFN+ zPxiV@Bz`;gv5II&$S_Y83OF|vb!(I~$lNlnyC+S_6mDrs4Mu#kp7Ud8Pn=>(8M&oC zrYXZ`PCq5$8J4#ssgB}&GDs^~jBbcfM!5xy-8SKeOOiB>G#Zjon&bR+cq=G-Jz*xM zncGZnMZLn(kP>EfM^CdCxy<5KW|ErP9ZDbiX(+?(PMN@&;9x^>z8DUu`{zB7IJ|Drl0&*tgpr6+S zJIy977|zkzk8(Fl7PR zCwr1IZs>vr)WjSWu|{elv_jJ^%9Tmv3cXZ=PX(kYe{ITtx09*#m zQ(~_YDPp^{IXgUp?3bA!7*A${l5UjCFy`(Ap_;2h75R%ww4WGYEyQwbGlO@JClJX3 z;@C%24kq><+0DpPN3;oPvj{Duk}_>Dm6kimV)yK&E$i1eUVcTx`t>cBUU5auH5(eP zzPe$W^|wCPvrTSY#tx(fEe;P+PgpurPSN@_10O@Ax}pX=Chz7AhBWA7=9L7(CFe zaDrh0nI&US$@~PnaSg|HTXT~#$CIq;85$nvq+1a#r&4WAyGh*8&LfczTBa(_fsQF> zNfq1MDaJbxtX5=TJbQa0T`Ns8M%<*#?yY`U+)I2dKKw882K_Zt+Q{T=Sl`>L*!(V+ zF*0|;2w(Mg-3Sj21a|Z#Iy|U?!>5SPM9UBCwB+VfEs8CId!QScD|BTkK|SK&%>CVR z38FJmQfVyqAc)lwm6$x4#)Q3y$q{f#*8Dgb-ev?IQ?`%drCUv28mD@33qR)<i5^xXmP8y>$!unS35a@lC9WIjNAnXFDz zM4R|4QJO6NLCf?u{MIy*O17iOR4Yp*EfAe2Pa$7PhiF#Gmg5GKezpvwPV3}p(~&9H zj2et>$dp3@UJL)&ctOv#gob%~b%qwaKo#m?)|H}WO*H)oth%r6iyu>X~hWfNa$cM!BD6i*J;4>78;%RF*eOKI@w0@ z(~Zz{{9rQ;@z{H)(W8EAGOo3@scS800STxRGC}Th!1B!j!%(Xk__;@{qOH9)F|sn% z`N2u}rrx#mlv7GS&4^vn*LUpv`K*nOb<4!ery7p#up$T?-p9f+BjYY1DlX12wwVmW z6mY026(wJ85ggZIqmVeo{nBHSa+T{58KdwD5$kBxt?hapFg?+M*aYg1kj)z6&aj&ON>J^ z>6qd?%6t~DIYv1m8HxodwgY3n!ra7hs0XjzKHexao9V9Gk))u~T`8q2OetNE3+hx^ zr4(5@X%tK$*>DecTEk7v;P_PRutjnF5WhwzhN-2P*aVOV$(f?PLU>kT`Gg^!nB@c= zLg(`P0`=?6+%thVHS+Hp%+^6EIa)$%)@deXuzwNbB@nShG;zGJiD^U$v&BxdF&+H> zO>b3L%Xq!Lo+?K{G&<@i@H!R$^NHE( z0OskVpck29fGjn&&>`5exg7$JvTXWrub*POK`XrUy3ZFY)X4>TI_+MRaH&*Di+fdd}KgF%rl z1Y`linauQc%+V&9Fd)n!PQzHDqeKbNM4?1A^c&6;e;;_mnc|r+EDN-1@K!J954?vo z4D~`(?X?7Jl@g<8%uNicpC5vxL6TB39uRdsBnu4h*R>8H5GFz zLEp#_*ONirP;os)@wlFSY8Oc%TIUftL}WOZ6jo)eOix#WPLUL>1sovB<2-Q2c+T2* zF=iQhk|spxHDW(&gp#fpBnbg2flBXER~7$P-ARa6TCDTHFJ8YCyBn`xml3X4#JIpe3rVHr?%@9^}lwz8{Ny@n2`u$FC#gNxC$`{UY%%?z@S^XOMGpmLZ0jZP=hAD4d6= z`6u4cTF{DIw1aZNI8RPRi;>fjqQy{&qX;q=)$+%<ea!RJBtY>h+#6v%}>7gH= zBi2T*zpmW<$zdrm)6k)Zccz5iT*oqw5ka2F)xMAsIGK1|N{~?+uS<%?N#u4LleqX7 zv%eX5U`l_}cwlmW6S&|;rUc5;7y4pGSY_djDP7LQ8QPt&MntAb%0kc*a znI3do!*+hOUa8UVh0DLm4tZ&<_XBa z5G}0;uEOp74PS@AiR*g0q{Wr1gnaA~5TZo>)>5(+kROSHBPfyP6s&%MB~Sd``hdSd zTjdS-QGerFzyDfPlf*g^+T-FvOBk};G?ugxfWQhx2~-MNU`FW|@OfK6Qgz8zWoyA* z4KFx12YzH!409E7x$@T1>60oZO{yrfJM4A`Qp3aH_8BufX3p$zpqS*ONo~{VL;DQ+ zqPB)^D*sY$iPMRKflfzBZf=>=fe+4-+!~wBmgjWj+5iBo6hdcKnV&igo5Zu*3FuEfB5MwhZ(XNvg zK%cOz)EuY*Y0FA^tAZ+&Wgja@Ro8=@P)eHaIOPw#lF7pX>G20+Z&#Ijs{%FhXkYBF zz_dKylgNqZWujWE5NTB8*&PhLQY~vJoTZ6ZhKkokv7%i?u=@m{S>KIbTk=R#q28gx zxq96|7b<*oA_@}qH5nsSX<81Yti>b25E<~cK_8@bx6}e#T;xB3Im#;#sX|`7UP*k7 z2hR7(u{(+}ZV!fKLVUEUO1kEI?Wv2$sq z2h>)L#7nCtEvXfW+k&uJkte`V9^UKDdng~ z#+jqO%{)7G7XB8}?rPc{LOaT3s11NplsWs3jZWE0tc|*gJUUekVj^fwtDEc~m zMJQ!~;v)#zL=q*&qL2g0>S+=?%RJs-xS^Rs9JUBMM?KIYuE<8`s0UQJL~t3!nUNz^ zWl`$Ez9CLhLy-j(c0h6Z>iU01{N76`zB%@ykxkh^A1Q(-a!(}kL;w}*W1k>jr#SX! zuh;FNl}cU=$bKHC9K`M*Q8viSmc(9v{dMUIL_Fj{9eX5cbsDv%+-929g=HwX(`hR) z3t$*4%OQKXnv4IWrw?12reIQVU=M+l1AEMsmGz}UFVtX7iy5n!5ag@AYt2yoM^DUyBF zfDCJqnXAkJ%4(Il450yA1lOxV@6*@!y{<|j-D^Lr;X)76n!(=R4L#G-SvAV`crHvgYKMZ(cPQA8J^3rdY z$UMZkzwZvnrwNnrrXID8Q)kWI z|A0?7Br5S$AE!?}GDjskLO%5fUC7~Ax~t^2Y=e|ir9r7P9Nk3~ArO(IiS>vaZ9&8* zagk#&ZYcHyvf@y@*2c0EW4FGtSK@-IcB-H3BDR3#3c!PxK&T?|k8HUlSJ7o+j;P_U z$4#tf1E7W1Kj29C%~)aJU5L`Kl_KUFrKLCngaYH3OYow|5GOSfC#|TjLO)}Kf^5;( zD#QBRSeTnays*>&36NAyg#<{og9b+zWlq%{KHrZ+VP_d~H_i^;JY2hB`JN@Y1HKa=80L?HMH`&hSF}VYZ#Z5t?m2Gfv`Uv>x3Ub z!u~d_Z8`4Zh9KRRT*{wBpOtu{E9<3F8)tRHd|)#X7%WG={{ac1l9VIKt56n{={b@r zzE#I#g~)o6B=Ny)Nov)AC%#qI&r5*D9{-rXlxU0@K#BYqJppC!DF*9ISj|eFFy{AQ z?NBTxr^@kbgw9DzhbD?VRe$h$-_=(yONtB2Fgmx6L;I~L$`5fR<8nWl=zJPc*+P27 zft`g^PpYC)Ed|puS+UNE({?QQnH1MWg-L*+L_y+fzd2M^w5`&zM@4Rhe3n0=#O%ueuuE(3+B>i^E%84clr56)~c9>QT&;H@^rG^hTK$=6q>2kxEJZYwJ+x zr?iSnuRIBi?c4r0FhMsNxf=9=`zW>4)e==TJYyBXGFrifGD%`R@JHi9viAd1%NiRQYWDe@nK$@&z4KeXA)Ye^2!mtC>1RWg6V}7)~ae~ z>BJ_4^(*=nW-d*uxK5kirnoeN!7M(guQF9nbibTSZ?q?!8{~{LOh`b5JSEqA{a*hR zQa*cV{o)?;>>z`BB_`lj$$VOn@G{^X5HCX9f{rtoQl*y^1F$N``jCZusL4TSF2zN3 zbJb$24S9_KH*y>qsAh%pcw#7EXT*Fnc96x1F_Z=LJj&F9fL>6hFE30*V?a%eg)Y>m zYC@4>2NxeG(1nizs?R8oAsX@x_c?z5IqruHN{sa)K_?IvN=)4|_OASe_BPhLzgk>X z2}=vxdp3*1iC*Zo7V!T8F%utw4!U7F%e}N4`>c?rX zo||hga5#%yC3Pivfzp!tN#(T|7l*?x@urf3yh*t^p29+JeqKecZ(4b2uplo_I-Sn) z{Ct0LaYJQ!O@4l(&jtgJ-J0vLmlYP&mRp@RtHV;{E6A_Rt^bK{a&b|G9e3c*qS=b_ z^D6UQo{|!OUS6?Hv(j3>g_XH3f0_1ki%rvP7Ms;-vz8SV)_W>vRt0AHCLP$=Fwg60 zEX=QPIdZHPOF@1?RY`HP$CB%)Y$+|PDJrVWakt`b*~$K`ZNShnhX{G32Obc3MTI57k1>vMPm4KbHnngUSKQC^IafCnz+8ijqQA;&=)Y^gxk^I^Y@5~P) zkq>8jcWCi-1u1_2*jN7<(TP6>ax)hv z>wp{#sZZ5DA@$oyWYLXlY#i0#3A5yvD3zuV<~_pyJi>pv%Cnjmin4QFGxtd`MbLM! zMqS&x47P~(vBiFD6b6*`cf6i=X`65Qm|vEgOzKWC#k3}9!s@Nt;q@=V?{hsCwG2@Q z^g3EqgK2uE1+l0@`m*#+wjX9>tXwlN*Wt=T4SZtxD#w;rJ3x{ANwi)nk#VyUB4o|X z71~fBSCvDY3X+wrRNG&PXq}QJB91d~#LEf1m-5=E;ulBtx%Fz^lX%S7kZQB5ihy8n z5NHyBk(zs-W?RV)i+n1Dz-0jujINj(7XWjp73GL%*m%RNY4kT^+U~2q&SZXHn%_+K&t3eB>^hcov|c?if+}&UtqQ6 z<|S)vEllS9fpGogDbw3#C^D~9@TS(8DJpmY)yvcsmU1su)NjSChNN6ytqyukJFNFj z+%7~l2-OOUm?=hijid@x7H@;cU+b6s-VkimSg?v<#L$ZUCmBi<95ZH3uuR9i(bwV) zH2Bqi-TnS++<`#lHU9gm zA;TPNj{0&qR*hB)v|5dlfksutYL=rg(P*g~EKfOkib6RqjhKhhh+HSIxYSMQ5IhO1 z>uv31M`{N!<7E;J52&h^h+2^CxXBDoT`Qf)qyFbSvv#69hw8P(zHO9H)Xwt7{wZxf z3KnM-uRf`sVkKuDyR@HcRxN5ncgF z(O8!zUAI6yeGpu#imW@E5jTjc72rLr1R-&Ts=6WPTusUV$zHgV`H{|Jp>pUv7EBe$ zqSw*q3UHv_H2Z)&u=SM7<*|SVfxdoP)Y@IuL9AO@a8taWrcPm$@ZxS&aJWZ&-JnQ>7p>)`gX*~H?sKT^8f@_k zVLwwCygzXn1N|T@kUW$i8067F#LJoF(yX;}t|qg6oxT}W;>)I*axl#Syl^;g|PBz^KB{6_$ z{vCvdWj=Up`hDBf;hR)~E&r;3_qv2~`%r>Zogo4}ElfaK(L7}d*H0rmZL(S1sy~;SR61$$v8!Kq3SezN_#iG!1>=$9+%^wME3|oha z6xovaetjj^)Ac!~Td0kt zc_B@srkn~P-HaikjA=4#vxOU=Tmn$jni+(-F1BQYt~hD>A$S4i*(7r|bWZ&X0K7Gx z@WbI>FlYDje~O*JANl%-rgLrNc%E;oc#!CNmMRLLF84meOiN$3eV;k?xq420)6`Za zpMS25dKF%jF(#Is+bIPQROZ}-mt!sEAS45_ROuoSvOoQwg>0vmzHH4tp`D{cd-4>; zVLunJ6}_7at=3>?PEcyDBy6t1o>UtrDW5kJ-Wu!?+(EI&%+SrA zP@M|cEH2elvwKDjL1z=0 z$xrv>TT9rpR9I$smg4zaSv^ZoSSi&H)GPwI(oZBXn`*`qG5OL+Bo48MRIy)nY-I2$ zF_`mB9j&yS)mo*|lZplbv9?|p5p^ZjsImYiO`Zw17JeHYNj-}Yyam`E~ zVHjq|cPp97TEduk|4@}sGLWjPqN>obfX%&|fhe_9o;~|1BNWS8UZ~5Ufx@J~l_2I<%Bk*5Us$bcctXUQ)j z!{g)7hLquvOZYi#PO5LE?CEXr)*JpeI^Pu7oSCqs{h{L@+$v2+pQ;Mlz+?1N8 zX*Kfns9b{^=Osu#RE6V}aiky11gmhE^bMG$7!E^iBCGt2Q5CmS?K*Re1`Xe}qnT2)hAmol^{nysWiv>4AND^08|+2T49 zFLEQ@q_fkS0q4o@CSk|Tgd3R`4O2NeyjURRD;}W*(}Yp25VObXDkxLd+*~*# ziJs8PuywpX_g2i^T3p*AxEOLyv04`|6jq`x*OSD0mRt^*)(xs8b7X7sx(Rv_Kz-=| zT@Yhci^W`h4TbYbbC3OoMp$1-;ddzZp0b#N&n%@*3vDBQje}XoJD>Xn8(n;CjMJ%WHhh6>TCpwhvTtAnL36ju6H1BV;b);B88{$~dhEmRJV z_V|F3TvKsku##T0>U=yGz#}LI-Hu#<`~q92Ln3~3l1CZh;!#eBbw?0aYCZs~1pEzK zyd26xXU!=qhp0sBB(sR>(wP!lBrOF+hBpkR$n-P;Qh`W`1HOESgQ?YF@0LTlV_j7Gm z*bS}+mhDGxHKn11#RM`ezPJUEY_KpS7#>-!V`HN(lqgyvHu1ajIa1H8BMiHu3J%Ef zgH{Au0LpepK0(=7@lpR#Cp^t&VR_w?q96G8m(hGvjnJD?K-9^4WXcR`1>ZP8ED(#t z(QxW_NvtlFP;VVy>an(#x<&{l^$<+Z>{<~fLSi}MXk0szgq05QB{IB#xR`eQ?a*6- zd|6fX$O|xL5XQXXbQJbcD8mJ?SN*fs0vMcyyTc;kHf0Gh!r}X=5pS_i;h})!igs>J9&ARlH++~%LvG{FcS>drDYxj00VOf zeROsbQq<0HYo$u{hFc3qscf6oNe7)|8v2wn_3Bx9KUFL$?A_!I-0Mf-TR!SafS1VV z{;Uu1=_h~nZSvtitd{C{ygGhTL^l%sfRD_=+%A@XPr$p$;ehZ|IwPdut4S2tKnij!iv_{LAWH209zJSfMPBYRB2t~;c2|$Qv^CRmAB}$c+3RO zZIJ6#0%v;AQKuD=VocU5)=7AVr3%V~~eC^U#mbRe>|w2bU1=`tN>@RTY+o%C6duP6yu zES0aMW*J(GcBvtJxA06+74q}-)>f$1wz!?D(L5s(qDCj!S{Jnz>t=7aL*6Tc2u`z`qT-6lS&wUl?5xiW z`A#de4oprY0+v;%$(hBs&qIRj+kDbf5~gLgKALlIwb{qhc%G&A@asIkGGS5ndiV)~ zzgsuneNHUW1JRE$n_ED*pWfP*B;Q#oCu0jimP)$g)n=WLFDFY`R(9#9xgS55<3`OW z!v>_v%W-L*jNx3&v6P8BDMcbv4P3>pvUqjdIAShaCF1|5@XH{2el7@_b9|yeG$hZ7 z!;#5?E_bH-$1f!s{2A~t&3~8$=eQJbu3iebwxLm(U?vQ)q)NaOLpHra2yBfBekk${ zrd9!-&SX9#Tv`OJ5cU5YF8Kyr>KdC`RIK1Sz!Vf-qfnhuC7s|r@DjJ+_4YzR)RtyjtJrp}qMr~?*ZF4eP$l;X*e#kf-K z7_Y9wFA*FIU$#GTNbHk{96{KiUfSVpf9xklX$J(B$pa%1E*UT-5)lTk`8NcuKBc&S z4hSaNk6M+7F`K1-ocz%AfS*oems3~(W1tb8n}Hc|wS|1O2&PIIRrIxq(2t4%G`CD` zRpM!OlAB}_H2q*4Kw+5uU=K&`KnBW^XL#C^JdazF@4 zM66svR;8nmFB?X88|eq}YAqZSROoQRr8KG1?Ii`gR?Y23p4)*?Q**-HcCbEP%x-S3 z*rG=;Q%pDXvZU#qRKy}hDM#g&@#|Qaih0LAYFNZ6<-ei%35TAT)7@Rg6mwR<`x&5_ zJm)!^^?!cObDB66%T}{qA?Bx=^+{>s39~+)Cawohea2azr23>pM~!iCzCP>!wUIvm z>e@yB*QQAaO@!|QnV zaGi4M@-DHWyC=GGRd3&EtNYgs46Z$WXn16F-5F<|b@rFfIrqHtFZjxZU%lw!OD?_a zYnNZK{>rPa-thHnuD$O18@_SlH*dQ6mRoQ8kK6CK^R92*eb2r3ZM^^6mQCOJ?gN{@ z_uxYhfB%smZ294%|M}RD9{=$ZKY8-0tv`MGnQhyD_Uv;%|Hbn!{PI`7e(^Ui{r2To zcI@2s>h9O}2&;7^;PI%q0J86Fah@2H4p}U{vPw>qv*kf@p*%*OB%|_lL`GbrJ*qvU zZP#{LuC?4~xyy2oWuxVLmhW4huxzzF9V`oaf`MR7FdS?R&JNBAo*%p`cyD!0_4U>F z)o3;Ln!=irn(`V?O;t@}O>@n{ny#8?tyWu9TOAT1EtD533YCQ_L%vX5s3kNbG$+&_ zx*&8>=(5oI(6yo4Lz_Ymh8_()7TOwmHuOq(PPj8XFT6b59bOq;{ed<%hJg!;+odM+ zP}3_QTjeadzdS@Pk;ltZEX5qv$TDQ+4c=dZU0&5d@doJ4Z{GKcK9KC1dYo`hE+Q{x3 zcHg=Ciru?*-$S?T{@d=;cb|%5>u#~TXt&(8YS+qLC+|9O*Kxa+?mBYUVY}wKDt?2;>F zx9kyr5O0c?#U8Ok>=e7iYvQ-kA|8}E;``ze@sxN-JS?_~3&l^QT~=VuN$Hjz=@n0k zyTvuqFRqqVz>PZbOYvjz1Y-(-ewi&a|J1@ce-kdtTdAWmHZS&^^+?$0DT`6+PY?w@ zF!r3d!P+}E5438w@h0PGdA0njI;SI__aancD`H`v6qB%3z#yQ>3&vdHy$WHy8)Q03|5})UDZpS|ENq7gf zGw~e(<1_HdgY!xp>7JF?G;G&kqw5v&I)2X0$EERi;P*=epefJAvjmgm_p9Gh&sNBX z^>=+sfBr7>evb_5&*O-9EH&R_Je&MpYE$|~_oi&X77xa+2JfGQ&4ju6{^a+Xu)(}^ ziyL_iRi9`q!rbmcdRBWxZHy-hPU~^KQu|o%n;JWMmNvI$jOqK_?sEOPO8uyQchA^f z?E@V~G!}rT78H%z-Dt-yeov*=BkYJou0)<&gdB-0@9l;u(D&b(8;)ay45oF0PhF*&ffU>7+(ROwoug^?CW?R z=6xIQ+r^={{v|$N%=?#-j%*Px$KItq=05iPp5NhHm$2Y%*kewb=jsaX$#_Lw7hU|+ zjkH%+67Nqu$J+{pCH69k+fd)hqCk5pbyJJ;J9vLH?QthtWU-QW1HPS#)*{IV_k1K~ zLFyFPj=}zLzVmQ#9G|}os&qK&?c~rNzl%NkqRtnIqi_$!2#?@y6br+i?pelb7A@nq zEyw$N@y~+y^y1lf4|CsXFGT#jlh1jNcRtPc zV2`(%=XgWPx%w7kgzNallyB4T|Ce3q+XlU^psM9|O9+2>e2bD%=~y^VN7y4cb%lcOmLpg$RM3hL;Ob4~tR5 zV?s2dZOv#y^9w?>V4M7~5L58%R6N(ZM2Kl<>$JZLF})Q;y$D+b8~WCErw}vF6Qccc zA!g#<4&+rt@O@;D5VLczeIUes_ zx=x4%M__wVh=T#kgYlb(pzjMY)`y;n?GvyN^!@N-!5Yw)BhcT)w+OKW&mZ}g5J#^S zV(AM)9D{cqi|>v@`;JFHPS_>HNj2Es7Gl|xLY#b)5T~H;r{cK0659&;O&N^OgXQS_Dv6pD??PPNE5wG! zgt!K9yY>=nX!CV7*p^{K->-WV8{T*QW!Rn+;)ahQAfpX8qR+hHyKj~Wano!eZbrv% z>BNTTZuyH4x1J-!fBasEJJ5$a@yuOYg}6H`#67s@p7({g7w@?55+OFu5aRw3A-?^1 zeB1Pr5Z^)j9>ADBunya8@on=SAs$2v1AW_qKJbP< zZ~6E3Zy2QG05l4DHEiewyx|l4aPZb?oiYS|N1uxzN72#vQ|A&H4`H*N@lF9gy5lCEjXPUKf&+>0IJ1#<_;`^YrT$_{rAm=T=;Y zWXSj1AeXmqC>%T zZBwS9EeoI%91Pii0J_3a@J_6PZ=oMr&XAakZx@NB;sm4$E|cr@|wndt=C-BUi~@*(Xnvt7X4j1Fzzl*UIbU_3{S!4SA#d zro2hs3=iI|@;3P&@^*O#e0g`tZ^^smJ@Q`E)YvHRm*19~)R(@xV?YyH|9Z9p5;)@r9~L)x%5qK#_nv@^6bwX?Ld zwJ&SuXyatH4ffcE`@4pF zt!GDv1}%dFQOn2~gSL_0p=i{)a&UCWy0ULw)H2+6rfoR7E;?X~(o3xaeFIUvtAB97 zH5^^j$7k05=U2Fs~oraSTVh z2@C8iM*I7tBZQ~a{k6S0cw!B(ct!tk&QNq!A3YH5adi)_J&Qr^8X4;9iLU7yT5aPN zIE`O(4q%E9rfG8**cUTaIQs@x_6_unoaG`!U(+`*I_x5hju5c>a|efdRszil>+^8F2AD94jzw*Y z*F;x!XkG_JYBopv`}@`c@9cAVEbMdD04?T&ws?Uy2r@Fzg9&YquAxJo zK}`sw^NkM*y8Mah1)uRndr#lGzMiO~fAH++z^bV0ECb}O6O1$GO3V;~m9u+v2o$IL zEN(LsA$l9PnLqIxwUvF^%6^x^4-9pIB0Gd3G};CH+kE?quHmTJUiy%WTSs~aN14*i zjiX)eg7~?8E~AEPfzdqs0tK2w`Fif5@mpPon)e*4?pdtvSscH|h5_l1+83+uk5S(r z6aU_R41eS7q460W?#qdPWm99ZrmK5saKN@=2=vm0+qy7;2S%(kmmT_4&g&f=Sk*N& zx~9Ktbi_Wm3S@V+t-A}4*%vV)+56SuXmxQ|9Zpn-v-tozHMlxD02*akFw$#@j`Z43 z;MUsD;)88z@8Hk?C^_wUIyl#i_K)Z#uyt7xq-*7;gutbU%6J&#OPTuc&0%}1|gLXkAU3kWXHayuLr-MALj$WHwWpU8{~mBkI^QppN}3U3~-V zbn1&U^^E-}hQDKU?TY@v?$r*ok&ZU?seh$94vpxaM}~VrjBUJk^sMHi3xpQH0K-Io z)|nqH!=nRsP)zj5N;{HodcYL=M_1T-qd+A`PhZ!XL5MGFMu&C67%fOR$FSMwD!l6A zgJZ6mC5|q2v>&A7jyfE~DCAh6-xSqvTA;p-s>33MeEsUMNL}n#ha=R*0d+V+T^!(p zYcX2G*Ik3gnf)krBM2d}`yqAz(dyGMADl~#Nibqef~D%V5kA|r=%KSH?N(wplioLz-ZzupH0) , default= 10 +height - height of a block, default=10 pixels +width - width of a block, default=20 pixels +space - space between 2 blocks, default=2 pixels +angle_bar - this angle is used to draw a bar on a circular way (ok, this is no more a bar !) default=0 +radius - for cicular bars, internal radius, default=0 + with radius, parameter width has no more effect. + +Colours below are defined into braces {colour in hexadecimal, alpha} +fg_colour - colour of a block ON, default= {0x00FF00,1} +bg_colour - colour of a block OFF, default = {0x00FF00,0.5} +alarm - threshold, values after this threshold will use alarm_colour colour , default=max +alarm_colour - colour of a block greater than alarm, default=fg_colour +smooth - (true or false), create a gradient from fg_colour to bg_colour, default=false +mid_colour - colours to add to gradient, with this syntax {position into the gradient (0 to1), colour hexa, alpha} + for example, this table {{0.25,0xff0000,1},{0.5,0x00ff00,1},{0.75,0x0000ff,1}} will add + 3 colurs to gradient created by fg_colour and alarm_colour, default=no mid_colour +led_effect - add LED effects to each block, default=no led_effect + if smooth=true, led_effect is not used + possibles values : "r","a","e" for radial, parallelel, perdendicular to the bar (just try!) + led_effect has to be used with theses colours : +fg_led - middle colour of a block ON, default = fg_colour +bg_led - middle colour of a block OFF, default = bg_colour +alarm_led - middle colour of a block > ALARM, default = alarm_colour + +reflection parameters, not avaimable for circular bars +reflection_alpha - add a reflection effect (values from 0 to 1) default = 0 = no reflection + other values = starting opacity +reflection_scale - scale of the reflection (default = 1 = height of text) +reflection_length - length of reflection, define where the opacity will be set to zero + calues from 0 to 1, default =1 +reflection - position of reflection, relative to a vertical bar, default="b" + possibles values are : "b","t","l","r" for bottom, top, left, right + + +v1.0 (10 Feb. 2010) original release +v1.1 (13 Feb. 2010) numeric values can be passed instead conky stats with parameters name="", arg = numeric_value +v1.2 (28 Feb. 2010) just renamed the widget to bargraph +v1.3 (03 March 2010) added parameters radius & angle_bar to draw the bar in a circular way +v2.0 (12 Jul. 2010) rewrite script + add reflection effects and parameters are now set into tables +]] + +require 'cairo' + +----------------START OF PARAMETERS ---------- +function conky_main_bars() + local bars_settings={ + + { + name="fs_used", + arg="/", + max=conky_parse("${to_bytes ${fs_size /}}"), + --alarm=1,--no alarm with 1 smooth block, don't do extra work here + bg_colour={0x00ff00,0.25}, + fg_colour={0x00ff00,1}, + alarm_colour={0xff0000,1}, + x=5,y=112, + angle=90, + blocks=1, + height=210,width=18, + smooth=true, + mid_colour={{0.5,0xffff00,1}}, + }, + + { + name="fs_used", + arg="/home", + max=conky_parse("${to_bytes ${fs_size /home}}"), + --alarm=1,--no alarm with 1 smooth block, don't do extra work here + bg_colour={0x00ff00,0.25}, + fg_colour={0x00ff00,1}, + alarm_colour={0xff0000,1}, + x=5,y=132, + angle=90, + blocks=1, + height=210,width=18, + smooth=true, + mid_colour={{0.5,0xffff00,1}}, + }, + { + name="fs_used", + arg="/home/user/MyDocs", + max=conky_parse("${to_bytes ${fs_size /home/user/MyDocs}}"), + --alarm=1,--no alarm with 1 smooth block, don't do extra work here + bg_colour={0x00ff00,0.25}, + fg_colour={0x00ff00,1}, + alarm_colour={0xff0000,1}, + x=5,y=152, + angle=90, + blocks=1, + height=210,width=18, + smooth=true, + mid_colour={{0.5,0xffff00,1}}, + DrawMe=conky_parse("${if_mounted /home/user/MyDocs}1$endif") + }, + { + name="fs_used", + arg="/media/mmc1", + max=conky_parse("${to_bytes ${fs_size /media/mmc1}}"), + --alarm=1,--no alarm with 1 smooth block, don't do extra work here + bg_colour={0x00ff00,0.25}, + fg_colour={0x00ff00,1}, + alarm_colour={0xff0000,1}, + x=5,y=172, + angle=90, + blocks=1, + height=210,width=18, + smooth=true, + mid_colour={{0.5,0xffff00,1}}, + DrawMe=conky_parse("${if_mounted /media/mmc1}1$endif") + }, + { + name="mem", + arg="", + max=conky_parse("${to_bytes ${memmax}}"), + alarm=100, + bg_colour={0x00ff00,0.25}, + fg_colour={0x00ff00,1}, + alarm_colour={0xff0000,1}, + x=9,y=95, + angle=90, + blocks=18, + height=10,width=18, + smooth=true, + --mid_colour={{0.5,0xffff00,1}}, + }, + { + name="battery_percent", + arg="", + max=100, + angle=90, + alarm=25, + alarm_colour={0x00ffff,0.5}, + bg_colour={0x00ffff,0.5}, + fg_colour={0xff0000,0.5}, + led_effect="e", + bg_led ={0x0000ff,1}, + fg_led ={0xffff00,1}, + x=575,y=40, + skew_y=15, + }, + { + name="wireless_link_qual_perc", + arg="wlan0", + max=100, + angle=270, + bg_colour={0x00ff33,0}, + fg_colour={0x00ff33,1}, + blocks=10, + x=390,y=225, + height=3, + cap="b", + angle_bar=20, + radius=9, + mid_colour={{0,0xFF0000,1},{0.5,0xff0000,1},{0.7,0xffff00,1},{0.85,0x00ff33,1}}, + smooth = true, + DrawMe=conky_parse("${if_empty ${wireless_essid wlan0}}${else}1$endif"), + }, + { + name="wireless_link_qual_perc", + arg="wlan0", + max=100, + angle=90, + bg_colour={0x00ff33,0}, + fg_colour={0x00ff33,1}, + blocks=10, + x=410,y=225, + height=3, + cap="b", + angle_bar=20, + radius=9, + mid_colour={{0,0xFF0000,1},{0.5,0xff0000,1},{0.7,0xffff00,1},{0.85,0x00ff33,1}}, + smooth = true, + DrawMe=conky_parse("${if_empty ${wireless_essid wlan0}}${else}1$endif"), + }, + { + name="cell_radio_percent", + arg="", + max=100, + bg_colour={0x00ff33,0}, + fg_colour={0x00ff33,1}, + blocks=10, + x=445, + y=49, + height=3, + cap="b", + angle_bar=20, + angle=90, + radius=9, + mid_colour={{0,0xFF0000,1},{0.5,0xff0000,1},{0.7,0xffff00,1},{0.85,0x00ff33,1}}, + smooth = true, + --DrawMe=conky_parse("${if_up gprs0}1$endif") + }, + } + + if conky_window == nil then return end + local cs = cairo_xlib_surface_create(conky_window.display, conky_window.drawable, conky_window.visual, conky_window.width, conky_window.height) + cr = cairo_create(cs) + --prevent segmentation error when reading cpu state + if tonumber(conky_parse('${updates}'))>3 then + for i in pairs(bars_settings) do + draw_multi_bar_graph(bars_settings[i]) + end + end + cairo_destroy(cr) + cairo_surface_destroy(cs) + cr=nil +end + +function draw_multi_bar_graph(t) + cairo_save(cr) + --check values + if t.DrawMe~=nil and t.DrawMe ~= "1" then return end + if t.name==nil and t.arg==nil then + print ("No input values ... use parameters 'name' with 'arg' or only parameter 'arg' ") + return + end + if t.max==nil then + print ("No maximum value defined, use 'max'") + return + end + if t.name==nil then t.name="" end + if t.arg==nil then t.arg="" end + + --set default values + if t.x == nil then t.x = conky_window.width/2 end + if t.y == nil then t.y = conky_window.height/2 end + if t.blocks == nil then t.blocks=10 end + if t.height == nil then t.height=10 end + if t.angle == nil then t.angle=0 end + t.angle = t.angle*math.pi/180 + --line cap style + if t.cap==nil then t.cap = "b" end + local cap="b" + for i,v in ipairs({"s","r","b"}) do + if v==t.cap then cap=v end + end + local delta=0 + if t.cap=="r" or t.cap=="s" then delta = t.height end + if cap=="s" then cap = CAIRO_LINE_CAP_SQUARE + elseif cap=="r" then + cap = CAIRO_LINE_CAP_ROUND + elseif cap=="b" then + cap = CAIRO_LINE_CAP_BUTT + end + --end line cap style + --if t.led_effect == nil then t.led_effect="r" end + if t.width == nil then t.width=20 end + if t.space == nil then t.space=2 end + if t.radius == nil then t.radius=0 end + if t.angle_bar == nil then t.angle_bar=0 end + t.angle_bar = t.angle_bar*math.pi/360 --halt angle + --colours + if t.bg_colour == nil then t.bg_colour = {0x00FF00,0.5} end + if #t.bg_colour~=2 then t.bg_colour = {0x00FF00,0.5} end + if t.fg_colour == nil then t.fg_colour = {0x00FF00,1} end + if #t.fg_colour~=2 then t.fg_colour = {0x00FF00,1} end + if t.alarm_colour == nil then t.alarm_colour = t.fg_colour end + if #t.alarm_colour~=2 then t.alarm_colour = t.fg_colour end + if t.mid_colour ~= nil then + for i=1, #t.mid_colour do + if #t.mid_colour[i]~=3 then + print ("error in mid_color table") + t.mid_colour[i]={1,0xFFFFFF,1} + end + end + end + if t.bg_led ~= nil and #t.bg_led~=2 then t.bg_led = t.bg_colour end + if t.fg_led ~= nil and #t.fg_led~=2 then t.fg_led = t.fg_colour end + if t.alarm_led~= nil and #t.alarm_led~=2 then t.alarm_led = t.fg_led end + if t.led_effect~=nil then + if t.bg_led == nil then t.bg_led = t.bg_colour end + if t.fg_led == nil then t.fg_led = t.fg_colour end + if t.alarm_led == nil then t.alarm_led = t.fg_led end + end + if t.alarm==nil then t.alarm = t.max end --0.8*t.max end + if t.smooth == nil then t.smooth = false end + if t.skew_x == nil then + t.skew_x=0 + else + t.skew_x = math.pi*t.skew_x/180 + end + if t.skew_y == nil then + t.skew_y=0 + else + t.skew_y = math.pi*t.skew_y/180 + end + if t.reflection_alpha==nil then t.reflection_alpha=0 end + if t.reflection_length==nil then t.reflection_length=1 end + if t.reflection_scale==nil then t.reflection_scale=1 end + --end of default values + + local function rgb_to_r_g_b(col_a) + return ((col_a[1] / 0x10000) % 0x100) / 255., ((col_a[1] / 0x100) % 0x100) / 255., (col_a[1] % 0x100) / 255., col_a[2] + end + + --functions used to create patterns + local function create_smooth_linear_gradient(x0,y0,x1,y1) + local pat = cairo_pattern_create_linear (x0,y0,x1,y1) + cairo_pattern_add_color_stop_rgba (pat, 0, rgb_to_r_g_b(t.fg_colour)) + cairo_pattern_add_color_stop_rgba (pat, 1, rgb_to_r_g_b(t.alarm_colour)) + if t.mid_colour ~=nil then + for i=1, #t.mid_colour do + cairo_pattern_add_color_stop_rgba (pat, t.mid_colour[i][1], rgb_to_r_g_b({t.mid_colour[i][2],t.mid_colour[i][3]})) + end + end + return pat + end + + local function create_smooth_radial_gradient(x0,y0,r0,x1,y1,r1) + local pat = cairo_pattern_create_radial (x0,y0,r0,x1,y1,r1) + cairo_pattern_add_color_stop_rgba (pat, 0, rgb_to_r_g_b(t.fg_colour)) + cairo_pattern_add_color_stop_rgba (pat, 1, rgb_to_r_g_b(t.alarm_colour)) + if t.mid_colour ~=nil then + for i=1, #t.mid_colour do + cairo_pattern_add_color_stop_rgba (pat, t.mid_colour[i][1], rgb_to_r_g_b({t.mid_colour[i][2],t.mid_colour[i][3]})) + end + end + return pat + end + + local function create_led_linear_gradient(x0,y0,x1,y1,col_alp,col_led) + local pat = cairo_pattern_create_linear (x0,y0,x1,y1) ---delta, 0,delta+ t.width,0) + cairo_pattern_add_color_stop_rgba (pat, 0.0, rgb_to_r_g_b(col_alp)) + cairo_pattern_add_color_stop_rgba (pat, 0.5, rgb_to_r_g_b(col_led)) + cairo_pattern_add_color_stop_rgba (pat, 1.0, rgb_to_r_g_b(col_alp)) + return pat + end + + local function create_led_radial_gradient(x0,y0,r0,x1,y1,r1,col_alp,col_led,mode) + local pat = cairo_pattern_create_radial (x0,y0,r0,x1,y1,r1) + if mode==3 then + cairo_pattern_add_color_stop_rgba (pat, 0, rgb_to_r_g_b(col_alp)) + cairo_pattern_add_color_stop_rgba (pat, 0.5, rgb_to_r_g_b(col_led)) + cairo_pattern_add_color_stop_rgba (pat, 1, rgb_to_r_g_b(col_alp)) + else + cairo_pattern_add_color_stop_rgba (pat, 0, rgb_to_r_g_b(col_led)) + cairo_pattern_add_color_stop_rgba (pat, 1, rgb_to_r_g_b(col_alp)) + end + return pat + end + + local function draw_single_bar() + --this fucntion is used for bars with a single block (blocks=1) but + --the drawing is cut in 3 blocks : value/alarm/background + --not zvzimzblr for circular bar + local function create_pattern(col_alp,col_led,bg) + local pat + if not t.smooth then + if t.led_effect=="e" then + pat = create_led_linear_gradient (-delta, 0,delta+ t.width,0,col_alp,col_led) + elseif t.led_effect=="a" then + pat = create_led_linear_gradient (t.width/2, 0,t.width/2,-t.height,col_alp,col_led) + elseif t.led_effect=="r" then + pat = create_led_radial_gradient (t.width/2, -t.height/2, 0, t.width/2,-t.height/2,t.height/1.5,col_alp,col_led,2) + else + pat = cairo_pattern_create_rgba (rgb_to_r_g_b(col_alp)) + end + else + if bg then + pat = cairo_pattern_create_rgba (rgb_to_r_g_b(t.bg_colour)) + else + pat = create_smooth_linear_gradient(t.width/2, 0, t.width/2,-t.height) + end + end + return pat + end + + local y1=-t.height*pct/100 + local y2,y3=nil + if pct>(100*t.alarm/t.max) then + y1 = -t.height*t.alarm/100 + y2 = -t.height*pct/100 + if t.smooth then y1=y2 end + end + + if t.angle_bar==0 then + + --block for fg value + local pat = create_pattern(t.fg_colour,t.fg_led,false) + cairo_set_source(cr,pat) + cairo_rectangle(cr,0,0,t.width,y1) + cairo_fill(cr) + cairo_pattern_destroy(pat) + -- block for alarm value + if not t.smooth and y2 ~=nil then + pat = create_pattern(t.alarm_colour,t.alarm_led,false) + cairo_set_source(cr,pat) + cairo_rectangle(cr,0,y1,t.width,y2-y1) + cairo_fill(cr) + y3=y2 + cairo_pattern_destroy(pat) + else + y2,y3=y1,y1 + end + -- block for bg value + cairo_rectangle(cr,0,y2,t.width,-t.height-y3) + pat = create_pattern(t.bg_colour,t.bg_led,true) + cairo_set_source(cr,pat) + cairo_pattern_destroy(pat) + cairo_fill(cr) + end + end --end single bar + + local function draw_multi_bar() + --function used for bars with 2 or more blocks + for pt = 1,t.blocks do + --set block y + local y1 = -(pt-1)*(t.height+t.space) + local light_on=false + + --set colors + local col_alp = t.bg_colour + local col_led = t.bg_led + if pct>=(100/t.blocks) or pct>0 then --ligth on or not the block + if pct>=(pcb*(pt-1)) then + light_on = true + col_alp = t.fg_colour + col_led = t.fg_led + if pct>=(100*t.alarm/t.max) and (pcb*pt)>(100*t.alarm/t.max) then + col_alp = t.alarm_colour + col_led = t.alarm_led + end + end + end + + --set colors + --have to try to create gradients outside the loop ? + local pat + if not t.smooth then + if t.angle_bar==0 then + if t.led_effect=="e" then + pat = create_led_linear_gradient (-delta, 0,delta+ t.width,0,col_alp,col_led) + elseif t.led_effect=="a" then + pat = create_led_linear_gradient (t.width/2, -t.height/2+y1,t.width/2,0+t.height/2+y1,col_alp,col_led) + elseif t.led_effect=="r" then + pat = create_led_radial_gradient (t.width/2, y1, 0, t.width/2,y1,t.width/1.5,col_alp,col_led,2) + else + pat = cairo_pattern_create_rgba (rgb_to_r_g_b(col_alp)) + end + else + if t.led_effect=="a" then + pat = create_led_radial_gradient (0, 0, t.radius+(t.height+t.space)*(pt-1), + 0, 0, t.radius+(t.height+t.space)*(pt), + col_alp,col_led,3) + else + pat = cairo_pattern_create_rgba (rgb_to_r_g_b(col_alp)) + end + end + else + if light_on then + if t.angle_bar==0 then + pat = create_smooth_linear_gradient(t.width/2, t.height/2, t.width/2,-(t.blocks-0.5)*(t.height+t.space)) + else + pat = create_smooth_radial_gradient(0, 0, (t.height+t.space), 0,0,(t.blocks+1)*(t.height+t.space),2) + end + else + pat = cairo_pattern_create_rgba (rgb_to_r_g_b(t.bg_colour)) + end + end + cairo_set_source (cr, pat) + cairo_pattern_destroy(pat) + + --draw a block + if t.angle_bar==0 then + cairo_move_to(cr,0,y1) + cairo_line_to(cr,t.width,y1) + else + cairo_arc( cr,0,0, + t.radius+(t.height+t.space)*(pt)-t.height/2, + -t.angle_bar -math.pi/2 , + t.angle_bar -math.pi/2) + end + cairo_stroke(cr) + end + end + + local function setup_bar_graph() + --function used to retrieve the value to display and to set the cairo structure + if t.blocks ~=1 then t.y=t.y-t.height/2 end + local value = 0 + if t.name ~="" then + value = (conky_parse(string.format('${%s %s}', t.name, t.arg))) + if string.match(value,"%w") then + value = conky_parse(string.format('${to_bytes %s}',value)) + end + value=tonumber(value) + else + value = tonumber(t.arg) + end + if value==nil then value =0 end + pct = 100*value/t.max + pcb = 100/t.blocks + cairo_set_line_width (cr, t.height) + cairo_set_line_cap (cr, cap) + cairo_translate(cr,t.x,t.y) + cairo_rotate(cr,t.angle) + local matrix0 = cairo_matrix_t:create() + tolua.takeownership(matrix0) + cairo_matrix_init (matrix0, 1,t.skew_y,t.skew_x,1,0,0) + cairo_transform(cr,matrix0) + --call the drawing function for blocks + if t.blocks==1 and t.angle_bar==0 then + draw_single_bar() + if t.reflection=="t" or t.reflection=="b" then cairo_translate(cr,0,-t.height) end + else + draw_multi_bar() + end + --call the drawing function for reflection and prepare the mask used + if t.reflection_alpha>0 and t.angle_bar==0 then + local pat2 + local matrix1 = cairo_matrix_t:create() + tolua.takeownership(matrix1) + if t.angle_bar==0 then + pts={-delta/2,(t.height+t.space)/2,t.width+delta,-(t.height+t.space)*(t.blocks)} + if t.reflection=="t" then + cairo_matrix_init (matrix1,1,0,0,-t.reflection_scale,0,-(t.height+t.space)*(t.blocks-0.5)*2*(t.reflection_scale+1)/2) + pat2 = cairo_pattern_create_linear (t.width/2,-(t.height+t.space)*(t.blocks),t.width/2,(t.height+t.space)/2) + elseif t.reflection=="r" then + cairo_matrix_init (matrix1,-t.reflection_scale,0,0,1,delta+2*t.width,0) + pat2 = cairo_pattern_create_linear (delta/2+t.width,0,-delta/2,0) + elseif t.reflection=="l" then + cairo_matrix_init (matrix1,-t.reflection_scale,0,0,1,-delta,0) + pat2 = cairo_pattern_create_linear (-delta/2,0,delta/2+t.width,-0) + else --bottom + cairo_matrix_init (matrix1,1,0,0,-1*t.reflection_scale,0,(t.height+t.space)*(t.reflection_scale+1)/2) + pat2 = cairo_pattern_create_linear (t.width/2,(t.height+t.space)/2,t.width/2,-(t.height+t.space)*(t.blocks)) + end + end + cairo_transform(cr,matrix1) + if t.blocks==1 and t.angle_bar==0 then + draw_single_bar() + cairo_translate(cr,0,-t.height/2) + else + draw_multi_bar() + end + cairo_set_line_width(cr,0.01) + cairo_pattern_add_color_stop_rgba (pat2, 0,0,0,0,1-t.reflection_alpha) + cairo_pattern_add_color_stop_rgba (pat2, t.reflection_length,0,0,0,1) + if t.angle_bar==0 then + cairo_rectangle(cr,pts[1],pts[2],pts[3],pts[4]) + end + cairo_clip_preserve(cr) + cairo_set_operator(cr,CAIRO_OPERATOR_CLEAR) + cairo_stroke(cr) + cairo_mask(cr,pat2) + cairo_pattern_destroy(pat2) + cairo_set_operator(cr,CAIRO_OPERATOR_OVER) + end --reflection + pct,pcb=nil + end --setup_bar_graph() + + --start here ! + setup_bar_graph() + cairo_restore(cr) +end + diff --git a/lua_scripts/box.lua b/lua_scripts/box.lua new file mode 100644 index 0000000..4eda773 --- /dev/null +++ b/lua_scripts/box.lua @@ -0,0 +1,309 @@ +--[[BOX WIDGET v1.0 by Wlourf 19/12/2010 +This widget can drawn some boxes, even circles in your conky window +http://u-scripts.blogspot.com/ (HowTo coming soon) + +Inspired by Background by londonali1010 (2009) + +The parameters (all optionals) are : +x - x coordinate of top-left corner of the box, default = 0 = (top-left corner of conky window) +y - y coordinate of top-left corner of the box, default = 0 = (top-left corner of conky window) +w - width of the box, default = width of the conky window +h - height of the box, default = width of the conky window +radius - radius of the corner, default = 0 = no radius +mode - mode for drawing the radius, possible values are "circle" or "curve", default ="curve" +linear_gradient - table with the coordinates of two points to define a linear gradient, + points are relative to top-left corner of the box, (not the conky window) + {x1,y1,x2,y2} +radial_gradient - table with the coordinates of two circle to define a radial gradient, + colour={{0,0xCCCCCC,1},{1,0xCCCCCC,0}} points are relative to top-left corner of the box, (not the conky window) + {x1,y1,r1,x2,y2,r2} (r=radius) +colour - table of colours, default = plain white {{1,0xFFFFFF,1}} + this table contains one or more tables with format {P,C,A} + P=position of gradient (0 = start of the gradient, 1= end of the gradient) + C=hexadecimal colour + A=alpha (opacity) of color (0=invisible,1=opacity 100%) + Examples : + for a plain color {{1,0x00FF00,0.5}} + for a gradient with two colours {{0,0x00FF00,0.5},{1,0x000033,1}} + or {{0.5,0x00FF00,1},{1,0x000033,1}} -with this one, gradient will start in the middle + for a gradient with three colours {{0,0x00FF00,0.5},{0.5,0x000033,1},{1,0x440033,1}} + and so on ... + + + +To call this script in Conky, use (assuming you have saved this script to ~/scripts/): + lua_load ~/scripts/draw_bg.lua + lua_draw_hook_pre main_box + +And leave one line blank or not after TEXT + +Changelog: ++ v1.0 -- Original release (19.12.2010) +]] + +-- Change these settings to affect your background. + +table_settings={ + { + x=5, + y=57, + h=40, + w=650, + linear_gradient = {300,200,550,350}, + colour = {{0,0x000000,0.5},{1,0x000000,0.5}}, + radius=20, + }, + { + x=315, + y=100, + h=90, + w=485, + linear_gradient = {300,200,550,350}, + colour = {{0,0x000000,0.2},{1,0x000000,0.1}}, + radius=20, + }, + { + x=5, + y=192, + h=44, + w=795, + linear_gradient = {300,200,550,350}, + colour = {{0,0x000000,0.4},{1,0x000000,0.1}}, + radius=20, + }, + { + x=5, + y=355, + h=125, + w=795, + colour = {{0,0x000000,0.25}}, + radius=20, + }, + { + x=5, + y=240, + h=110, + w=795, + colour = {{0,0x000000,0.4}}, + radius=20, + }, + +--[[ + { --backgound with gradient + radius=25, + mode="circle", + linear_gradient = {300,200,550,350}, + colour={{0,0xCCCCCC,1},{1,0xCCCCCC,0}} + }, + + + + + { --pink rounded box + x=25, + y=150, + h=200, + w=100, + colour = {{O,0xff00ff,0.5}}, + radius=30, + mode="circle" + }, + { --border for pink rounded box + x=25, + y=150, + h=200, + w=100, + radius=30, + border=3, + mode="circle", + colour={ + {0,0x0000CC,1}, + }, + }, + + { --box with linear gradient + x=150, + y=150, + h=100, + w=100, + linear_gradient = {50,0,50,100 }, + colour={ + {0,0xffff00,1}, + {0.5,0xff0000,1}, + {1,0xff00ff,1}, + }, + }, + + { --box with radial gradient + x=150, + y=270, + h=100, + w=100, + radius=10, + radial_gradient = {20,20,0,20,20,100 }, + colour={ + {0,0xff0000,1}, + {1,0xffff00,1}, + }, + mode="circle", + border=0 + }, + { --border for above box --gradient are inversed + x=150, + y=270, + h=100, + w=100, + radius=10, + radial_gradient = {20,20,0,20,20,100 }, + colour={ + {1,0xff0000,1}, + {0,0xffff00,1}, + }, + mode="circle", + border=5 + }, + + + { --oh my god, a circle with radial gradient + x=300, y=30, + w=100,h=100, + mode="circle", + radius=50, + radial_gradient = {50,50,0,50,50,50 }, + colour={ + {0,0xff0000,1}, + {1,0xffff00,1}, + }, + }, + + { --no name for this one ! radius > w or h ! + x=300, y=250, + w=100,h=100, + mode="circle", + radius=100, + radial_gradient = {50,50,0,50,50,50 }, + colour={ + {0,0xff0000,1}, + {0.5,0x0000ff,1}, + {1,0xffff00,1}, + }, + }, +]] + + + } + +---------END OF PARAMETERS + +require 'cairo' + + + +function conky_main_box() + if conky_window==nil then return end + local cs=cairo_xlib_surface_create(conky_window.display, conky_window.drawable, conky_window.visual, conky_window.width, conky_window.height) + cr=cairo_create(cs) + + for i in pairs(table_settings) do + draw_bg (table_settings[i]) + end + + cairo_destroy(cr) + cairo_surface_destroy(cs) +end + +function draw_bg(t) + function rgba_to_r_g_b_a(tc) + --tc={position,colour,alpha} + local colour = tc[2] + local alpha = tc[3] + return ((colour / 0x10000) % 0x100) / 255., ((colour / 0x100) % 0x100) / 255., (colour % 0x100) / 255., alpha + end + + local PI = math.pi + + --check values and set default values + if t.x == nil then t.x = 0 end + if t.y == nil then t.y = 0 end + if t.w == nil then t.w = conky_window.width end + if t.h == nil then t.h = conky_window.height end + if t.radius == nil then t.radius = 0 end + if t.border == nil then t.border = 0 end + if t.colour==nil then t.colour={{1,0xFFFFFF,1}} end + if t.linear_gradient ~= nil then + if #t.linear_gradient ~= 4 then + t.linear_gradient = {t.x,t.y,t.width,t.height} + end + end + if t.radial_gradient ~= nil then + if #t.radial_gradient ~= 6 then + t.radial_gradient = {t.x,t.y,0, t.x,t.y, t.width} + end + end + + for i=1, #t.colour do + if #t.colour[i]~=3 then + print ("error in color table") + t.colour[i]={1,0xFFFFFF,1} + end + end + + --for better reading + t.linear = t.linear_gradient + t.radial = t.radial_gradient + t.no_gradient = (t.linear == nil ) and (t.radial == nil ) + + cairo_save(cr) + cairo_translate(cr, t.x, t.y) + + if t.radius>0 then + if t.mode=="circle" then + cairo_arc(cr, t.radius, t.radius, t.radius, -PI, -PI/2) + cairo_line_to(cr,t.w-t.radius,0) + cairo_arc(cr, t.w-t.radius, t.radius, t.radius, -PI/2,0) + cairo_line_to(cr,t.w,t.h-t.radius) + cairo_arc(cr, t.w-t.radius, t.h-t.radius, t.radius, 0,PI/2) + cairo_line_to(cr,t.radius,t.h) + cairo_arc(cr, t.radius, t.h-t.radius, t.radius, PI/2,-PI) + cairo_line_to(cr,0,t.radius) + else + cairo_move_to(cr, t.radius, 0) + cairo_line_to(cr, t.w-t.radius, 0) + cairo_curve_to(cr, t.w, 0, t.w, 0, t.w, t.radius) + cairo_line_to(cr, t.w, t.h-t.radius) + cairo_curve_to(cr, t.w, t.h, t.w, t.h, t.w - t.radius, t.h) + cairo_line_to(cr, t.radius, t.h) + cairo_curve_to(cr, 0, t.h, 0, t.h, 0, t.h-t.radius) + cairo_line_to(cr, 0, t.radius) + cairo_curve_to(cr, 0, 0, 0, 0, t.radius,0) + end + cairo_close_path(cr) + else + cairo_rectangle(cr,0,0,t.w,t.h) + end + + if t.no_gradient then + cairo_set_source_rgba(cr,rgba_to_r_g_b_a(t.colour[1])) + else + if t.linear ~= nil then + pat = cairo_pattern_create_linear (t.linear[1],t.linear[2],t.linear[3],t.linear[4]) + elseif t.radial ~= nil then + pat = cairo_pattern_create_radial (t.radial[1],t.radial[2],t.radial[3],t.radial[4],t.radial[5],t.radial[6]) + end + for i=1, #t.colour do + cairo_pattern_add_color_stop_rgba (pat, t.colour[i][1], rgba_to_r_g_b_a(t.colour[i])) + end + cairo_set_source (cr, pat) + cairo_pattern_destroy(pat) + end + + if t.border>0 then + cairo_set_line_width(cr,t.border) + cairo_stroke(cr) + else + cairo_fill(cr) + end + + cairo_restore(cr) +end + diff --git a/lua_scripts/graph.lua b/lua_scripts/graph.lua new file mode 100644 index 0000000..4ad46dd --- /dev/null +++ b/lua_scripts/graph.lua @@ -0,0 +1,529 @@ +--[[ GRAPH widget v1.0 by wlourf (31.10.2010) + this widget draws some graphs with some effects + http://u-scripts.blogspot.com/2010/10/graph-widget.html + +To call the script in a conky, use, before TEXT + lua_load /path/to/the/script/graph.lua + lua_draw_hook_pre main_graph +and add one line (blank or not) after TEXT + + +Parameters are : +3 parameters are mandatory +name - the name of the conky variable to display, + for example for {$cpu cpu0}, just write name="cpu" +arg - the argument of the above variable, + for example for {$cpu cpu1}, just write arg="cpu1" + arg can be a numerical value if name="" +max - the maximum value the above variable can reach, + for example for {$cpu cpu1}, just write max=100 or less or more + +Optional parameters: +x,y - coordinates of the bottom-left corner of the graph, + relative to the top-left corner of the conky window + default = bottom-left corner of the conky window +width - width of the graph, default = 100 pixels +height - height of the graph, default = 20 pixels +nb_values - number of values to display in the graph, default=width + i.e. 1 pixel for 1 value +autoscale - if set to true, calculate the max valeu of the y axis and + doesn't use the max parameter above, default=false +skew_x - skew graph around x axis, défaut = 0 +skew_y - skew graph around y axis, défaut = 0 +angle - angle of rotation of the graph in degress, default = 0 + i.e. a horizontal graph) +inverse - if set to true, graph are draw from right to left, default=false +background - if set to false, background is not drawn, default=true +foreground - if set to false, foreground is not drawn, default=true + foreground = plain graph +bg_bd_size - size of the border of the background, default=0=no border +fg_bd_size - size of the border of the foreground, default=0=no border + + +Colours tables below are defined into braces : +{position in the gradient (0 to 1), colour in hexadecimal, alpha (0 to 1)} +example for a single colour table : +{{0,0xFFAA00,1}} position parameter doesn't matter +example for a two-colours table : +{{0,0xFFAA00,1},{1,0x00AA00,1}} or {{0.5,0xFFAA00,1},{1,0x00AA00,1}} +example for a three-colours table : +{{0,0xFFAA00,1},{0.5,0xFF0000,1},{1,0x00AA00,1}} + +bg_colour - colour table for background, + default = {{0,0x000000,.5},{1,0xFFFFFF,.5}} +fg_colour - colour table for foreground, + default = {{0,0x00FFFF,1},{1,0x0000FF,1}} +bg_bd_colour- colour table for background border, + default = {{1,0xFFFFFF,1}} +fg_bd_colour- colour table for foreground border, + default = {{1,0xFFFF00,1}} + +bg_orientation, bg_bd_orientation, fg_orientation, fg_bd_orientation, + - "orientation" defines the starting point of the gradient, + default="nn" + there are 8 available starting points : + "nw","nn","ne","ee","se","ss","sw","ww" + (n for north, w for west ...) + theses 8 points are the 4 corners + the 4 middles of graph + so a gradient "nn" will go from "nn" to "ss" + a gradient "nw" will go from "nw" to "se" + + +v1.0 (31 Oct. 2010) original release + +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation version 3 (GPLv3) +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program; if not, write to the Free Software +-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +-- MA 02110-1301, USA. + +]] + +require 'cairo' + +function set_settings() + graph_settings={ + { + name="cpu", + arg="", + max=100, + y=85, + x=5, + autoscale=false, + width=215, + height=30, + nb_values=120, + fg_bd_size=2, + bg_colour = {{0,0x007AF6,0},{1,0x000000,0}}, + --fg_bd_colour = { {0,0xFF0000,1},{0.5,0xFFA209,1},{1,0xFFFF00,1}}, + fg_bd_colour = { {0,0xFF0000,1},{0.5,0xFF3300,1},{1,0xFFFFFF,1}}, + --fg_colour = { {0,0xFF0000,1},{0.5,0xFFA209,1},{1,0xFFFF00,1}}, + fg_colour = { {0,0x00CCFF,0.7},{0.5,0x0000FF,0.7},{1,0x000000,0.1}}, + foreground=true, + fg_orientation="ne", + bg_bd_orientation="nn", + bg_orientation="ne", + }, + { + name="upspeedf", + arg="wlan0", + max=9999, + y=233, + x=5, + autoscale=true, + width=275, + height=35, + nb_values=120, + fg_bd_size=1, + bg_colour = {{0,0x007AF6,0},{1,0x000000,0}}, + fg_bd_colour = { {0,0xFF0000,1},{0.5,0xFFA209,0.8},{1,0xFFFF00,0.6}}, + fg_colour = { {0,0xFF0000,0.65},{0.5,0xFFA209,0.5},{1,0xFFFF00,0.3}}, + foreground=true, + inverse=true, + DrawMe="${if_empty ${wireless_essid wlan0}}${else}1$endif", + bg_orientation="ww", + }, + { + name="downspeedf", + arg="wlan0", + max=9999, + y=233, + x=525, + autoscale=true, + width=275, + height=35, + nb_values=120, + fg_bd_size=1, + bg_colour = {{0,0x007AF6,0},{1,0x000000,0}}, + fg_bd_colour = { {0,0xFF0000,1},{0.5,0xFFA209,0.8},{1,0xFFFF00,0.6}}, + fg_colour = { {0,0xFF0000,0.65},{0.5,0xFFA209,0.5},{1,0xFFFF00,0.3}}, + foreground=true, + DrawMe="${if_empty ${wireless_essid wlan0}}${else}1$endif", + bg_orientation="ee", + }, + { + name="upspeedf", + arg="gprs0", + max=9999, + y=230, + x=5, + autoscale=true, + width=275, + height=35, + nb_values=120, + fg_bd_size=1, + bg_colour = {{0,0x007AF6,0},{1,0x000000,0}}, + fg_bd_colour = { {0,0xFF0000,1},{0.5,0xFFA209,1},{1,0xFFFF00,1}}, + fg_colour = { {0,0xFF0000,1},{0.5,0xFFA209,1},{1,0xFFFF00,1}}, + foreground=true, + inverse=true, + DrawMe="${if_up gprs0}1${else}0$endif", + bg_orientation="ww", + }, + { + name="downspeedf", + arg="gprs0", + max=9999, + y=230, + x=525, + autoscale=true, + width=275, + height=35, + nb_values=120, + fg_bd_size=1, + bg_colour = {{0,0x007AF6,0},{1,0x000000,0}}, + fg_bd_colour = { {0,0xFF0000,1},{0.5,0xFFA209,1},{1,0xFFFF00,1}}, + fg_colour = { {0,0xFF0000,1},{0.5,0xFFA209,1},{1,0xFFFF00,1}}, + foreground=true, + DrawMe="${if_up gprs0}1${else}0$endif", + bg_orientation="ee", + }, + { + name="loadavg", + arg="1", + max=20, + y=95, + x=372, + autoscale=true, + width=140, + height=36, + nb_values=100, + fg_bd_size=0, + bg_colour = {{0,0x667AF6,0},{1,0x000000,0}}, + fg_bd_colour = { {0,0xdd0000,0.7},{0.5,0xdddd00,0.7},{1,0xFFFF00,0.7}}, + fg_colour = { {0,0x000000,0.7},{0.5,0xdd0000,0.7},{1,0xff0000,0.7}}, + foreground=true, + }, + { + name="to_bytes ${diskio", + arg="mmcblk0}", + max=2500000, + y=187, + x=640, + autoscale=true, + width=160, + height=89, + nb_values=130, + fg_bd_size=0, + bg_colour = {{0,0x667AF6,0},{1,0x000000,0}}, + fg_bd_colour = { {0,0xdd0000,1},{0.5,0xdddd00,1},{1,0xFFFF00,1}}, + fg_colour = { {1,0x111111,0.3},{0.5,0x33cc00,0.6},{0,0x00FF00,0.8}}, + foreground=true, + bg_orientation="ne", + fg_orientation="ee", + }, + } +end + +function check_settings(t) + --tables are check only when conky start + if t.name==nil and t.arg==nil then + print ("No input values ... use parameters 'name'" .. + " with 'arg' or only parameter 'arg' ") + return 1 + end + if t.max==nil then + print ("No maximum value defined, use 'max'") + print ("for name=" .. t.name .. " with arg=" .. t.arg) + return 1 + end + if t.name==nil then t.name="" end + if t.arg==nil then t.arg="" end + return 0 +end + +function conky_main_graph() + if conky_window == nil then return end + local w=conky_window.width + local h=conky_window.height + local cs=cairo_xlib_surface_create(conky_window.display, + conky_window.drawable, conky_window.visual, w, h) + cr=cairo_create(cs) + updates=tonumber(conky_parse('${updates}')) + --start drawing after "updates_gap" updates + --prevent segmentation error for cpu + updates_gap=5 + if updates==1 then + set_settings() + flagOK=0 + for i in pairs(graph_settings) do + if graph_settings[i].width==nil then graph_settings[i].width=100 end + if graph_settings[i].nb_values==nil then + graph_settings[i].nb_values= graph_settings[i].width + end + --create an empty table to store values + graph_settings[i]["values"]={} + --beginning point + graph_settings[i].beg = graph_settings[i].nb_values + --graph_settings[i].beg = 0 + for j =1, graph_settings[i].nb_values do + graph_settings[i].values[j]=0 + end + graph_settings[i].flag_init=true + flagOK=flagOK + check_settings(graph_settings[i]) + end + end + if flagOK>0 then + --abort script if error in one of the tables + print ("ERROR : Check the graph_setting table") + return + end + --drawing process + if updates > updates_gap then + for i in pairs(graph_settings) do + if (graph_settings[i].DrawMe==nil or conky_parse(graph_settings[i].DrawMe) == "1") then + --print(graph_settings[i].DrawMe.."= '"..conky_parse(graph_settings[i].DrawMe).."'") + --return + --cancel fetch value from conky if interface down or whatever + local nb_values=graph_settings[i].nb_values + graph_settings[i].automax=0 + for j =1, nb_values do + if graph_settings[i].values[j+1]==nil then + graph_settings[i].values[j+1]=0 + end + graph_settings[i].values[j]=graph_settings[i].values[j+1] + if j==nb_values then + --store value + if graph_settings[i].name=="" then + value=graph_settings[i].arg + else + value=tonumber(conky_parse('${' .. + graph_settings[i].name .. " " .. + graph_settings[i].arg ..'}')) + end + graph_settings[i].values[nb_values]=value + end + graph_settings[i].automax=math.max(graph_settings[i].automax, + graph_settings[i].values[j]) + if graph_settings[i].automax == 0 then graph_settings[i].automax = 1 end --should stop weird glitches at beginning when no values reported yet for upspeed or diskio + end + draw_graph(graph_settings[i]) + end + end + end + cairo_destroy(cr) + cairo_surface_destroy(cs) + updates=nil + updates_gap=nil +end + +function draw_graph(t) + --drawing function + local function rgb_to_r_g_b(colour) + return ((colour[2] / 0x10000) % 0x100) / 255., ((colour[2] / 0x100) % 0x100) / 255., (colour[2] % 0x100) / 255., colour[3] + end + + local function linear_orientation(o,w,h) + --set gradient for bg and bg border + local p + if o=="nn" then + p={w/2,h,w/2,0} + elseif o=="ne" then + p={w,h,0,0} + elseif o=="ww" then + p={0,h/2,w,h/2} + elseif o=="se" then + p={w,0,0,h} + elseif o=="ss" then + p={w/2,0,w/2,h} + elseif o=="ee" then + p={w,h/2,0,h/2} + elseif o=="sw" then + p={0,0,w,h} + elseif o=="nw" then + p={0,h,w,0} + end + return p + end + + local function linear_orientation_inv(o,w,h) + --set gradient for fg and fg border + local p + if o=="ss" then + p={w/2,h,w/2,0} + elseif o=="sw" then + p={w,h,0,0} + elseif o=="ee" then + p={0,h/2,w,h/2} + elseif o=="nw" then + p={w,0,0,h} + elseif o=="nn" then + p={w/2,0,w/2,h} + elseif o=="ww" then + p={w,h/2,0,h/2} + elseif o=="ne" then + p={0,0,w,h} + elseif o=="se" then + p={0,h,w,0} + end + return p + end + if t.DrawMe~=nil and conky_parse(t.DrawMe) ~= "1" then + --print(t.DrawMe.."= '"..conky_parse(t.DrawMe).."'") + return + --else + -- print(t.name) + end --cancel drawing for same reason as earlier + --set default values + if t.height==nil then t.height=20 end + --checked in previous part : width and nb_values + if t.background==nil then t.background=true end + if t.bg_bd_size==nil then t.bg_bd_size=0 end + if t.x==nil then t.x=t.bg_bd_size end + if t.y==nil then t.y=conky_window.height -t.bg_bd_size end + if t.bg_colour==nil then t.bg_colour={{0,0x000000,.5},{1,0xFFFFFF,.5}} end + if t.bg_bd_colour==nil then t.bg_bd_colour={{1,0xFFFFFF,1}} end + if t.foreground==nil then t.foreground=true end + if t.fg_colour==nil then t.fg_colour={{0,0x00FFFF,1},{1,0x0000FF,1}} end + if t.fg_bd_size==nil then t.fg_bd_size=0 end + if t.fg_bd_colour==nil then t.fg_bd_colour={{1,0xFFFF00,1}} end + if t.autoscale==nil then t.autoscale=false end + if t.inverse==nil then t.inverse=false end + if t.angle==nil then t.angle=0 end + if t.bg_bd_orientation==nil then t.bg_bd_orientation="nn" end + if t.bg_orientation==nil then t.bg_orientation="nn" end + if t.fg_bd_orientation==nil then t.fg_bd_orientation="nn" end + if t.fg_orientation==nil then t.fg_orientation="nn" end + --check colours tables + for i=1, #t.fg_colour do + if #t.fg_colour[i]~=3 then + print ("error in fg_colour table") + t.fg_colour[i]={1,0x0000FF,1} + end + end + for i=1, #t.fg_bd_colour do + if #t.fg_bd_colour[i]~=3 then + print ("error in fg_bd_colour table") + t.fg_bd_colour[i]={1,0x00FF00,1} + end + end + for i=1, #t.bg_colour do + if #t.bg_colour[i]~=3 then + print ("error in background color table") + t.bg_colour[i]={1,0xFFFFFF,0.5} + end + end + for i=1, #t.bg_bd_colour do + if #t.bg_bd_colour[i]~=3 then + print ("error in background border color table") + t.bg_bd_colour[i]={1,0xFFFFFF,1} + end + end + --calculate skew parameters if needed + if t.flag_init then + if t.skew_x == nil then + t.skew_x=0 + else + t.skew_x = math.pi*t.skew_x/180 + end + if t.skew_y == nil then + t.skew_y=0 + else + t.skew_y = math.pi*t.skew_y/180 + end + t.flag_init=false + end + cairo_set_line_cap(cr,CAIRO_LINE_CAP_ROUND) + cairo_set_line_join(cr,CAIRO_LINE_JOIN_ROUND) + local matrix0 = cairo_matrix_t:create() + tolua.takeownership(matrix0) + cairo_save(cr) + cairo_matrix_init (matrix0, 1,t.skew_y,t.skew_x,1,0,0) + cairo_transform(cr,matrix0) + local ratio=t.width/t.nb_values + cairo_translate(cr,t.x,t.y) + cairo_rotate(cr,t.angle*math.pi/180) + cairo_scale(cr,1,-1) + --background + if t.background then + local pts=linear_orientation(t.bg_orientation,t.width,t.height) + local pat = cairo_pattern_create_linear (pts[1],pts[2],pts[3],pts[4]) + for i=1, #t.bg_colour do + --print ("i",i,t.colour[i][1], rgb_to_r_g_b(t.colour[i])) + cairo_pattern_add_color_stop_rgba (pat, t.bg_colour[i][1], rgb_to_r_g_b(t.bg_colour[i])) + end + cairo_set_source (cr, pat) + cairo_rectangle(cr,0,0,t.width,t.height) + cairo_fill(cr) + cairo_pattern_destroy(pat) + end + --autoscale + cairo_save(cr) + if t.autoscale then + t.max= t.automax*1.1 + end + local scale_x = t.width/(t.nb_values-1) + local scale_y = t.height/t.max + --define first point of the graph + if updates-updates_gap 0 then + local pts=linear_orientation_inv(t.fg_bd_orientation,t.width,t.height) + local pat = cairo_pattern_create_linear (pts[1],pts[2],pts[3],pts[4]) + for i=1,#t.fg_bd_colour,1 do + cairo_pattern_add_color_stop_rgba (pat, 1-t.fg_bd_colour[i][1], rgb_to_r_g_b(t.fg_bd_colour[i])) + end + cairo_set_source (cr, pat) + cairo_move_to(cr,t.beg*scale_x,t.values[t.beg+1]*scale_y) + for i=t.beg, t.nb_values-1 do + cairo_line_to(cr,i*scale_x,t.values[i+1]*scale_y) + end + cairo_set_line_width(cr,t.fg_bd_size) + cairo_stroke(cr) + cairo_pattern_destroy(pat) + end + cairo_restore(cr) + --background border + if t.bg_bd_size>0 then + local pts=linear_orientation(t.bg_bd_orientation,t.width,t.height) + local pat = cairo_pattern_create_linear (pts[1],pts[2],pts[3],pts[4]) + for i=1, #t.bg_bd_colour do + --print ("i",i,t.colour[i][1], rgb_to_r_g_b(t.colour[i])) + cairo_pattern_add_color_stop_rgba (pat, t.bg_bd_colour[i][1], rgb_to_r_g_b(t.bg_bd_colour[i])) + end + cairo_set_source (cr, pat) + cairo_rectangle(cr,0,0,t.width,t.height) + cairo_set_line_width(cr,t.bg_bd_size) + cairo_stroke(cr) + cairo_pattern_destroy(pat) + end + + cairo_restore(cr) + +end + diff --git a/lua_scripts/luatraverse.lua b/lua_scripts/luatraverse.lua new file mode 100644 index 0000000..65bd86e --- /dev/null +++ b/lua_scripts/luatraverse.lua @@ -0,0 +1,195 @@ +------------------------------------------------------------------------------- +-- This module implements a function that traverses all live objects. +-- You can implement your own function to pass as a parameter of traverse +-- and give you the information you want. As an example we have implemented +-- countreferences and findallpaths +-- +-- Alexandra Barros - 2006.03.15 +------------------------------------------------------------------------------- + +module("traverse", package.seeall) + +local List = {} + +function List.new () + return {first = 0, last = -1} +end + +function List.push (list, value) + local last = list.last + 1 + list.last = last + list[last] = value +end + +function List.pop (list) + local first = list.first + if first > list.last then error("list is empty") end + local value = list[first] + list[first] = nil + list.first = first + 1 + return value +end + +function List.isempty (list) + return list.first > list.last +end + +-- Counts all references for a given object +function countreferences(value) + local count = -1 + local f = function(from, to, how, v) + if to == value then + count = count + 1 + end + end + traverse({edge=f}, {count, f}) + return count +end + +-- Main function +-- 'funcs' is a table that contains a funcation for every lua type and also the +-- function edge edge (traverseedge). +function traverse(funcs, ignoreobjs) + + -- The keys of the marked table are the objetcts (for example, table: 00442330). + -- The value of each key is true if the object has been found and false + -- otherwise. + local env = {marked = {}, list=List.new(), funcs=funcs} + + if ignoreobjs then + for i=1, #ignoreobjs do + env.marked[ignoreobjs[i]] = true + end + end + + env.marked["traverse"] = true + env.marked[traverse] = true + + -- marks and inserts on the list + edge(env, nil, "_G", "isname", nil) + edge(env, nil, _G, "value", "_G") + + -- traverses the active thread + -- inserts the local variables + -- interates over the function on the stack, starting from the one that + -- called traverse + + for i=2, math.huge do + local info = debug.getinfo(i, "f") + if not info then break end + for j=1, math.huge do + local n, v = debug.getlocal(i, j) + if not n then break end + + edge(env, nil, n, "isname", nil) + edge(env, nil, v, "local", n) + end + end + + while not List.isempty(env.list) do + + local obj = List.pop(env.list) + local t = type(obj) + _M["traverse" .. t](env, obj) + + end + +end + +function traversetable(env, obj) + + local f = env.funcs.table + if f then f(obj) end + + for key, value in pairs(obj) do + edge(env, obj, key, "key", nil) + edge(env, obj, value, "value", key) + end + + local mtable = debug.getmetatable(obj) + if mtable then edge(env, obj, mtable, "ismetatable", nil) end + +end + +function traversestring(env, obj) + local f = env.funcs.string + if f then f(obj) end + +end + +function traverseuserdata(env, obj) + local f = env.funcs.userdata + if f then f(obj) end + + local mtable = debug.getmetatable(obj) + if mtable then edge(env, obj, mtable, "ismetatable", nil) end + + local fenv = debug.getfenv(obj) + if fenv then edge(env, obj, fenv, "environment", nil) end + +end + +function traversefunction(env, obj) + local f = env.funcs.func + if f then f(obj) end + + -- gets the upvalues + local i = 1 + while true do + local n, v = debug.getupvalue(obj, i) + if not n then break end -- when there is no upvalues + edge(env, obj, n, "isname", nil) + edge(env, obj, v, "upvalue", n) + i = i + 1 + end + + local fenv = debug.getfenv(obj) + edge(env, obj, fenv, "environment", nil) + +end + +function traversethread(env, t) + local f = env.funcs.thread + if f then f(t) end + + for i=1, math.huge do + local info = debug.getinfo(t, i, "f") + if not info then break end + for j=1, math.huge do + local n, v = debug.getlocal(t, i , j) + if not n then break end + print(n, v) + + edge(env, nil, n, "isname", nil) + edge(env, nil, v, "local", n) + end + end + + local fenv = debug.getfenv(t) + edge(env, t, fenv, "environment", nil) + +end + + +-- 'how' is a string that identifies the content of 'to' and 'value': +-- if 'how' is "key", then 'to' is a key and 'name' is nil. +-- if 'how' is "value", then 'to' is an object and 'name' is the name of the +-- key. +function edge(env, from, to, how, name) + + local t = type(to) + + if to and (t~="boolean") and (t~="number") and (t~="new") then + -- If the destination object has not been found yet + if not env.marked[to] then + env.marked[to] = true + List.push(env.list, to) -- puts on the list to be traversed + end + + local f = env.funcs.edge + if f then f(from, to, how, name) end + + end +end + +return _M; diff --git a/lua_scripts/misc.lua b/lua_scripts/misc.lua new file mode 100644 index 0000000..096b396 --- /dev/null +++ b/lua_scripts/misc.lua @@ -0,0 +1,204 @@ +-- +-- Conky Lua scripting example +-- +-- Copyright (c) 2009 Brenden Matthews, all rights reserved. +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- + +function components_to_colour(r, g, b) + -- Take the RGB components r, g, b, and return an RGB integer + return ((math.floor(r + 0.5) * 0x10000) + (math.floor(g + 0.5) * 0x100) + math.floor(b + 0.5)) % 0xffffff -- no bit shifting operator in Lua afaik +end + +function colour_to_components(colour) + -- Take the RGB components r, g, b, and return an RGB integer + return (colour / 0x10000) % 0x100, (colour / 0x100) % 0x100, colour % 0x100 +end + +function conky_top_colour(value, default_colour, lower_thresh, upper_thresh) + --[[ + This function returns a colour based on a threshold, by adding more of + the red component and reducing the other components. ``value'' is the + value we're checking the thresholds against, ``default_colour'' is the + original colour (before adjusting), and the ``lower_thresh'' and + ``upper_thresh'' parameters are the low and high values for which we + start applying redness. + ]] + local r, g, b = colour_to_components(default_colour) + local colour = 0 + if value ~= nil and (value - lower_thresh) > 0 then + if value > upper_thresh then value = upper_thresh end + local perc = (value - lower_thresh) / (upper_thresh - lower_thresh) + if perc > 1 then perc = 1 end + -- add some redness, depending on where ``value'' lies within the + -- threshhold range + r = r + perc * (0xff - r) + b = b - perc * b + g = g - perc * g + end + colour = components_to_colour(r, g, b) + return string.format("${color #%06x}", colour) +end + +-- parses the output from top and calls the colour function +function conky_top_cpu_colour(arg) + -- input is the top var number we want to use + local str = conky_parse(string.format('${top name %i}${top cpu %i}${top mem %i}', tonumber(arg), tonumber(arg), tonumber(arg))) + local cpu = tonumber(string.match(str, '(%d+%.%d+)')) + return conky_top_colour(cpu, 0xd3d3d3, 25, 70) .. str +end + +function conky_top_mem_colour(arg) + -- input is the top var number we want to use + local str = conky_parse(string.format('${top_mem name %i}${top_mem mem_res %i} ${top_mem mem_vsize %i}', tonumber(arg), tonumber(arg), tonumber(arg))) + local mem = tonumber(string.match(str, '%w+%s+(%d+%.%d+)%w%s%s')) + -- tweak the last 3 parameters to your liking + -- my machine has ~8GiB of ram, so an upper thresh of 15% seemed appropriate + return conky_top_colour(mem, 0xd3d3d3, 10, 24) .. str +end + +function conky_top_io_colour(arg) + -- input is the top var number we want to use + local str = conky_parse(string.format('${top_io name %i}${top_io io_read %i} ${top_io io_write %i} ${top_io io_perc %i}', tonumber(arg), tonumber(arg), tonumber(arg), tonumber(arg))) + local ioR,ioW = string.match(str, '%w+%s+(%d+%.*%d*%w)%s+(%d+%.*%d*%w)%s+') + local tot = conky_parse("${to_bytes "..ioR.."}") + conky_parse("${to_bytes "..ioW.."}") --these can be bytes or mb :( + -- tweak the last 3 parameters to your liking + -- my machine has ~8GiB of ram, so an upper thresh of 15% seemed appropriate + str = string.gsub(str," 0B", " 0.00B") + return conky_top_colour(tot, 0xd3d3d3, 100, 200) .. str +end + +function colour_transition(start, stop, position) + --[[ + Transition from one colour to another based on the value of + ``position'', which should be a number between 0 and 1. + ]] + local rs, gs, bs = colour_to_components(start) -- start components + local re, ge, be = colour_to_components(stop) -- end components + local function tr(s, e, p) + return e + (e - s) * p + end + local rr, gr, br = tr(rs, re, position), tr(gs, ge, position), tr(bs, be, position) -- result components + return components_to_colour(rr, gr, br) +end + +function get_timezone_offset() + -- returns the number of seconds of timezone offset + local tz = tonumber(os.date('%z')) + local tzh = math.floor(tz / 100 + 0.5) + local tzm = math.abs(tz) % 100 / 60. + if tzh < 0 then tzm = -tzm end + return (tzh + tzm) * 3600 +end + +function julian_to_unix(J) + -- converts a julian date into unit time + return (J - 2440588) * 86400 +end + +function get_julian_now() + -- returns the current time in julian date format + local now = os.time() + return now / 86400. + 2440588 +end + +function calculate_sunrise_sunset(latitude, longitude) + --[[ + This function returns the unix timestamps in the local time for sunrise and + sunset times, according to ``latitude'' and ``longitude''. For the + latitude, north is positive and south is negative. For the longitude, west + is negative, and east is positive. You can usually determine the lat/long + for your location from Wikipedia or using some mapping tool. + + In my case (Calgary, AB) the lat/long are 51.045 and -114.057222 + + Reference: http://en.wikipedia.org/wiki/Sunrise_equation + ]] + + -- Negate longitude, west is positive and east is negative + longitude = -longitude + + -- Calculate current Julian Cycle + local n = math.floor(get_julian_now() - 2451545 - 0.0009 - longitude / 360 + 0.5) + + -- Approximate Solar Noon + local Js = 2451545 + 0.0009 + longitude / 360 + n + + -- Solar Mean Anomaly + local M = (357.5291 + 0.98560028 * (Js - 2451545)) % 360 + + -- Equation of Center + local C = (1.9148 * math.deg(math.sin(math.rad(M)))) + (0.0200 * math.deg(math.sin(math.rad(2 * M)))) + (0.0003 * math.deg(math.sin(math.rad(3 * M)))) + + -- Ecliptic Longitude + local lam = (M + 102.9372 + C + 180) % 360 + + -- Solar Transit + local Jt = Js + (0.0053 * math.deg(math.sin(math.rad(M)))) - (0.0069 * math.deg(math.sin(math.rad(2 * lam)))) + + -- Declination of the Sun + local delta = math.deg(math.asin(math.sin(math.rad(lam)) * math.sin(math.rad(23.45)))) + + -- Hour Angle + local w = math.deg(math.acos((math.sin(math.rad(-0.83)) - math.sin(math.rad(delta)) * math.sin(math.rad(latitude))) / (math.cos(math.rad(latitude)) * math.cos(math.rad(delta))))) + + local J_set = 2451545 + 0.0009 + ((w + longitude)/360 + n + (0.0053 * math.deg(math.sin(math.rad(M)))) - (0.0069 * math.deg(math.sin(math.rad(2 * lam))))) + local J_rise = Jt - (J_set - Jt) + + + local rising_t, setting_t = julian_to_unix(J_rise), julian_to_unix(J_set) + + -- apply timezone offset + local tz_offset = get_timezone_offset() + rising_t = rising_t + tz_offset + setting_t = setting_t + tz_offset + + return rising_t, setting_t +end + +local last_sunrise_set_check = 0 +local sunrise, sunset = 0 + +function conky_datey(latitude, longitude, change) + --[[ + Returns a colour at or between day_sky and night_sky (see below) depending on the + time of day. You must provide the ``latitude'' and ``longitude'' + parameters for your location (see the comments for + calculate_sunrise_sunset() above for more info). The ``change'' parameter + is the number of hours we want to start and have a transition, so a value + of 1 will mean the transition starts 30 minutes before, and ends 30 minutes + after. + ]] + local function to_hours(t) + return tonumber(os.date('%k', t)) + (tonumber(os.date('%M', t)) / 60) + (tonumber(os.date('%S', t)) / 3600) + end + if last_sunrise_set_check < os.time() - 86400 then + sunrise, sunset = calculate_sunrise_sunset(tonumber(latitude), tonumber(longitude)) + -- convert unix times into hours + sunrise, sunset = to_hours(sunrise), to_hours(sunset) + end + local day_sky = 0x6698FF -- colour to use during daytime + local night_sky = 0x342D7E -- colour to use during nighttime + local hour = to_hours(os.time()) + if hour > sunrise + change / 2 and hour < sunset - change / 2 then + -- midday + sky = day_sky + elseif hour > sunset + change / 2 or hour < sunrise - change / 2 then + -- midnight + sky = night_sky + elseif hour > sunset - change / 2 then + -- sunset time + sky = colour_transition(day_sky, night_sky, (hour - sunset - change / 2) / change) + elseif hour < sunrise + change / 2 then + -- sunrise time + sky = colour_transition(night_sky, day_sky, (hour - sunrise - change / 2) / change) + end + return string.format('${color #%6x}', sky) +end + +require 'imlib2' + diff --git a/lua_scripts/n900-kobol.jpg b/lua_scripts/n900-kobol.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d9806691d7247a5d7c40ee0ebde50dbed7ab1211 GIT binary patch literal 98431 zcmeEucUV);x^6;Gq!*@lYeD!k{z=<=$8UcVn zAOJ)A0DjJ?v3mpr_@L$GFZ#v?k`Hn6kyn&ckOye#hWI!+pLY#_oO5+2 zU(^=gdh|>jLUz#>w^cP$F!MR#>OsbY`MFw!;fc;+=bce5;<`Futq^pGmyefgfD%v8UbcnY2U(V6A@~>)namZhgfb-ho`oBhn*qK>CPI&vdLR94xWSte%6d-Dfa*E0- z>gwt;5G4gg1$hM}c||2zMRl~Y5?Vn4@{c601E!U<{9N471Vf{L3`hH>E&h+~3JwmI z3s#o%_H&n4M4?c>+$br@(h#!#p%(+3LS!%cL;rU2AASs7{hj^DJ^^I!i;!P_oz8g& z255_m{~G9@>F@0dAiMo*q<>@ZSIb`%{?j+DtJbetw7DPIl{WG(|2i64^8c;wU*r6Z z$J3xeu7+fHSN{MVB~>*UB~^7=)}UpSjFOs?jFP$vEz{~WRAf|@6=+$JR;JZ!D9b3J z)MS(u6lIhZHE0aaRP(jJi;2*R8x0(H8+FJ6zIQvf={2BujLUs%NzjXgkp#Rsq!8L^Ze~|dEmj5pC zU$y9e6Na*yhMJ0uiULYa;V(-Qqq?Hf-&X0bn!l|wtzK2}Z;Xn}uU_hZS(E3i=xewX8*#VRB2^(rC;^xw2-1%THvWDqG&#U z*eozY;#HHO1*Z%xpk>r# z)MYeeP%<=X6cuF@m1Go^WfWCpXu(PYDXPoRB3p@urNuif+-WO;Ds54q#WXGaX;H0d zsG?}7al#O#VWgm7proL35~ZP_fI?}UJYl4vqNILOOa8y_vH#Z^a&i7=B>M#VUHEG; zc5#+>z2NFaTM7MXB2tw9w`g{8M!R|Yc{v5>kiDGTUFAJ}T-~+g|5f`xPVny)h;}rf z9f;)rc_jLeW$2$P`2Ux}zk>Jwi~GNw{u$)A$o)gtAG&^vf!_lEQP&^3ev5(M0{>Ch zAG&^vf!_lEQP&^3ev5(M0{>ChAG&^vf!_lEQP&^3ev5(M0{>ChAG&^vf!_lEQP&^3 zev5(M0{>ChAG&^vf!_lEQP&^3ev5(M0{>ChAG&^vf!_lEQP&^3ev5(M0{>ChAG&^v zf!_lEQP&^3ev5(M0{>ChAG&^vf!_lEQP&^3ev5(M0{>ChAG&^vf!_lEQP&^3ev5(M z0{>ChAG&^vf!_lEkLm*d>)kHbi?kQIf@yDV{hS7z0MPw2(bGx{j10dF6XUPM#LV

J;-n=mu73yqPv3sF0=QU! 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%0DcSAIopG5(uvefy3ZH$}4C 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 tXL3bttfgIUI5d line_length, default=true +nb_decimals -- number of decimals for numbers, default=1 +show_text -- display text (true/false), default=true +font_name -- font, default "Droid Sans Mono" +font_size -- font size, default=12 +font_color -- font color (for gradient) or nil (for constant color), default = nil +font_alpha -- font alpha, default=1 +txt_offset -- space between text and line, default=1 +txt_format -- string for formatting text, possibles values are : default = "&l : &v" + -- &l for label + -- &o for occupied percentage + -- &f for free percentage + -- &v for value + -- &n for free value (non-occupied) + -- &m for max value + -- &p for percentage value of full graph +tablebg -- table of tables of colours for background {colors,alpha} +tablefg -- table of tables of colours for foreground {colors,alpha} + + +v1.0 10/04/2010 original release +v1.1 15/05/2010 the parameters are in a table (pie_settings), only the values in pie_settings.tableV are mandatory + added an option to draw values like a ring (type_arc="l") +v1.2 26/05/2010 add inverse_l parameter (for type_arc="l") + bug fix : line_length problem + read_df function improved +v1.21 26/06/2010 rename some parameters and write more infos +]] + + +require 'cairo' + + +--main function +function conky_main_pie() + if conky_window==nil then return end + + +-- ------------------PARAMETERS TO SET----------------------- + --theses parameters are called many times so I put them into variables + local font_name,font_size="Droid Sans Mono",14 + local col0,col1,col2=0xFFFFCC,0xCCFF99,0x99FF00 + local colbg=0x99CCFF + + --for the clock + local temp = os.date("*t") + local hour=temp.hour + if hour>12 then hour=hour-12 end + local hpc,mpc,spc=hour/12,temp.min/60,temp.sec/60 + + + pie_settings= { + + {--CIRCLE 4 : DISK SPACE + tableV=read_df(true,true), + xc=500, + yc=150 , + int_radius=30, + radius=45, + type_arc="r", + proportional=true, + first_angle=-90, + last_angle=270, + gradient_effect=true, + show_text=true, + line_lgth=100, + line_space=19, + txt_format="&l free &n", + font_color=colbg, + tablebg={ + {colbg,0.5}, + }, + tablefg={ + {col0,1}, + {col1,1}, + {col2,1}, + }, + }, + + + {--CIRCLE 1 : ARCS 1 & 2 INTERNET SPEED + tableV={ + {"dl","downspeedf","eth1",1000,"kb/s"}, + {"ul","upspeedf","eth1",100,"kb/s"}, + }, + xc=300, + yc=200, + int_radius=30, + radius=45, + first_angle=-30, + last_angle=210, + type_arc="r", + --line_lgth=150, + line_width=0, + show_text=false, + font_color=colbg, + tablebg={ + {colbg,0.5}, + }, + tablefg={ + {col0,1}, + {col1,1}, + }, + }, + + + {--CIRCLE 2 : ARC 1 CPU 0 + tableV={ + {"cpu 0","cpu","cpu 0",100,"%"}, + --{"cpu 1","cpu","cpu 1",100,"%"}, + }, + xc=300, + yc=350, + int_radius=30, + radius=45, + first_angle=-30, + last_angle=210, + type_arc="l", + show_text=false, + tablebg={ + {colbg,0.5}, + }, + tablefg={ + {col0,1}, + }, + }, + +-- {--CIRCLE 2 : ARC 2 CPU 1 +-- tableV={ +-- --{"cpu 0","cpu","cpu 0",100,"%"}, +-- {"cpu 1","cpu","cpu 1",100,"%"}, +-- }, +-- xc=200, +-- yc=350, +-- int_radius=30, +-- radius=45, +-- first_angle=90, +-- last_angle=220, +-- type_arc="l", +-- inverse_l_arc=true, +-- show_text=false, +-- tablebg={ +-- {colbg,0.5}, +-- }, +-- tablefg={ +-- {col0,1}, +-- }, +-- }, + + + + + + {--CIRCLE 3 : MEMORY : ram + tableV={ + {"mem","memperc","",100,"%"}, + }, + xc=400, + yc=370, + int_radius=30, + radius=45, + first_angle=-30, + last_angle=220, + type_arc="l", + inverse_l_arc=false, + proportional=false, + gradient_effect=true, + nb_decimals=0, + show_text=false, + tablebg={ + {colbg,0.5}, + }, + tablefg={ + {col0,1}, + }, + }, + + + } +-------------------END OF PARAMETERS --------------- + + local w=conky_window.width + local h=conky_window.height + local cs=cairo_xlib_surface_create(conky_window.display, conky_window.drawable, conky_window.visual, w, h) + cr=cairo_create(cs) + + if tonumber(conky_parse('${updates}'))>5 then + for i in pairs(pie_settings) do + draw_pie(pie_settings[i]) + end + end + cairo_surface_destroy(cs) + cairo_destroy(cr) +end + + + +function string:split(delimiter) +--source for the split function : http://www.wellho.net/resources/ex.php4?item=u108/split + local result = { } + local from = 1 + local delim_from, delim_to = string.find( self, delimiter, from ) + while delim_from do + table.insert( result, string.sub( self, from , delim_from-1 ) ) + from = delim_to + 1 + delim_from, delim_to = string.find( self, delimiter, from ) + end + table.insert( result, string.sub( self, from ) ) + return result +end + + +function rgb_to_r_g_b(colour, alpha) + return ((colour / 0x10000) % 0x100) / 255., ((colour / 0x100) % 0x100) / 255., (colour % 0x100) / 255., alpha +end + +function round(num, idp) + local mult = 10^(idp or 0) + return math.floor(num * mult + 0.5) / mult +end + +function size_to_text(size,nb_dec) + local txt_v + if nb_dec<0 then nb_dec=0 end + size = tonumber(size) + if size>1024*1024*1024 then + txt_v=string.format("%."..nb_dec.."f G",size/1024/1024/1024) + elseif size>1024*1024 then + txt_v=string.format("%."..nb_dec.."f M",size/1024/1024) + elseif size>1024 then + txt_v=string.format("%."..nb_dec.."f K",size/1024) + else + txt_v=string.format("%."..nb_dec.."f B",size) + end + return txt_v +end + +function text_to_bytes(txt_in) + local txt_modifier + local num_bytes + txt_modifier = string.match(txt_in,"%d(%a)") + num_bytes = string.gsub(txt_in,"%d(%a)","") + if txt_modifier == "G" then + num_bytes = num_bytes*1024*1024*1024 + elseif txt_modifier == "M" then + num_bytes = num_bytes*1024*1024 + elseif txt_modifier == "K" then + num_bytes = num_bytes*1024 + elseif txt_modifier == "B" then + num_bytes = num_bytes + end + return num_bytes +end + + + +function read_df(show_media,sort_table) + --read output of command df and return arrays of value for files systems + --reurn array of table {file syst, "", occupied space , total space , convert to G, M, K ...} + + local f = io.popen("df") + + local results={} + table.insert(results,{"/home/user/MyDocs","",text_to_bytes(conky_parse("${fs_used /home/user/MyDocs}")),text_to_bytes(conky_parse("${fs_size /home/user/MyDocs}")),true}) + table.insert(results,{"/home","",text_to_bytes(conky_parse("${fs_used /home}")),text_to_bytes(conky_parse("${fs_size /home}")),true}) + table.insert(results,{"rootfs","",text_to_bytes(conky_parse("${fs_used /}")),text_to_bytes(conky_parse("${fs_size /}")),true}) + table.insert(results,{"SD","",text_to_bytes(conky_parse("${fs_used /media/mmc1}")),text_to_bytes(conky_parse("${fs_size /media/mmc1}")),true}) + --table.insert(results,{"/home/user/MyDocs2","","30","50",true}) + --table.insert(results,{text_to_bytes(conky_parse("${fs_used /home/user/MyDocs}")),"","10","50",true}) +-- while true do +-- local line = f:read("*l") +-- if line == nil then break end +-- while string.match(line," ") do +-- line=string.gsub(line," "," ") +-- end +-- local arr_l=string.split(line," ") +-- local match = string.match(arr_l[1],"/") +-- +-- if string.match(arr_l[1],"/") then +-- if not show_media then arr_l[6]=string.gsub(arr_l[6],"/media/","",1) end +-- if string.match(arr_l[1],"opt/") then break end +-- table.insert(results,{arr_l[6],"",(arr_l[2]-arr_l[4])*1024,arr_l[2]*1024,true}) +-- end +-- end +-- +-- f:close() +-- +-- if sort_table then +-- --how to sort table into table? +-- local flagS=true +-- while flagS do +-- for k=2, #results do +-- flagS=false +-- if tonumber(results[1][3])>tonumber(results[2][3]) then +-- local tmpV = results[1] +-- results[1] = results[2] +-- results[2] = tmpV +-- flagS=true +-- end +-- if tonumber(results[k][3])0 and x2-x11 then + local dY = math.abs(y2-lastPt2[2]) + if dY < line_space and lastPt2[1]*x1>0 then + if x0>0 then + y2 = line_space+lastPt2[2] + else + y2 = -line_space+lastPt2[2] + end + if (y2>y1 and x0>0) or (y20 then x3=x3+txt_offset end + else + Z=intercept({x0,y0},{x1,y1},{0,y2},{1,y2}) + x1,y1=Z[1],Z[2] + end + end + else + --remind x2,y2 of first value + x2first,y2first = x2,y2 + end + + if font_color==nil then + cairo_set_source_rgba(cr,rgb_to_r_g_b(table_colors[idx_color][1],table_colors[idx_color][2])) + else + local pat = cairo_pattern_create_linear (x2,y2, x0,y0) + cairo_pattern_add_color_stop_rgba (pat, 0, rgb_to_r_g_b(font_color,font_alpha)) + cairo_pattern_add_color_stop_rgba (pat, 1, rgb_to_r_g_b(table_colors[idx_color][1],table_colors[idx_color][2])) + cairo_set_source (cr, pat) + cairo_pattern_destroy(pat) + end + + + cairo_move_to(cr,x0,y0) + cairo_line_to(cr,x1,y1) + cairo_line_to(cr,x2,y2) + if x3~=nil then + cairo_line_to(cr,x3,y3) + x2,y2=x3,y3 + end + cairo_set_line_width(cr,line_width) + cairo_stroke(cr) + --lastAngle=lastAngle+angle + return {x2,y2} + end + + function intercept(p11,p12,p21,p22) + --calculate interscetion of two lines and return coordinates + a1=(p12[2]-p11[2])/(p12[1]-p11[1]) + + a2=(p22[2]-p21[2])/(p22[1]-p21[1]) + + b1=p11[2]-a1*p11[1] + + b2=p21[2]-a2*p21[1] + + X=(b2-b1)/(a1-a2) + + Y=a1*X+b1 + return {X,Y} + end + + --some checks + if t.first_angle>=t.last_angle then + local tmp_angle=t.last_angle + --t.last_angle=t.first_angle + --t.first_angle=tmp_angle + print ("inversed angles") + end + + if t.last_angle-t.first_angle>360 and t.first_angle>0 then + t.last_angle=360+t.first_angle + print ("reduce angles") + end + + if t.last_angle+t.first_angle>360 and t.first_angle<=0 then + t.last_angle=360+t.first_angle + print ("reduce angles") + end + + if t.int_radius<0 then t.int_radius =0 end + if t.int_radius>t.radius then + local tmp_radius=t.radius + t.radius=t.int_radius + t.int_radius=tmp_radius + print ("inversed angles") + end + if t.int_radius==t.radius then + t.int_radius=0 + print ("int radius set to 0") + end + --end of checks + + cairo_save(cr) + cairo_translate(cr,t.xc,t.yc) + cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND) + cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND) + + local nbArcs=#tableV + local anglefull= (t.last_angle-t.first_angle)*math.pi/180 + local fullsize = 0 + for i= 1,nbArcs do + fullsize=fullsize+tableV[i][4] + end + + local cb,cf,angle=0,0,anglefull/nbArcs + lastAngle=t.first_angle*math.pi/180 + lastPt2={nil,nil} + + for i =1, nbArcs do + if t.proportional then + angle=tableV[i][4]/fullsize*anglefull + end + --set colours + cb,cf=cb+1,cf+1 + if cb>#t.tablebg then cb=1 end + if cf>#t.tablefg then cf=1 end + + if tableV[i][2]~="" then + str=string.format('${%s %s}',tableV[i][2],tableV[i][3]) + else + str = tableV[i][3] + end + str=conky_parse(str) + value=tonumber(str) + if value==nil then value=0 end + + --draw sectors + draw_sector(t.tablebg,cb,1,lastAngle,angle,t.radius,t.int_radius,t.gradient_effect,t.type_arc,t.inverse_l_arc) + --print (t.tablefg,cf,tableV[i][2],tableV[i][3],lastAngle,angle,t.radius,t.int_radius) + --print (cf,tableV[i],tableV[i][2],tableV[i][3]) + draw_sector(t.tablefg,cf,value/tableV[i][4],lastAngle,angle,t.radius,t.int_radius,t.gradient_effect,t.type_arc,t.inverse_l_arc) + + if t.show_text then + --draw text + local txt_l = tableV[i][1] + local txt_opc = round(100*value/tableV[i][4],t.nb_decimals).."%%" + local txt_fpc = round(100*(tableV[i][4]-value/tableV[i][4]),t.nb_decimals).."%%" + local txt_ov,txt_fv,txt_max + if tableV[i][5]==true then + txt_ov = size_to_text(value,t.nb_decimals) + txt_fv = size_to_text(tableV[i][4]-value,t.nb_decimals) + txt_max = size_to_text(tableV[i][4],t.nb_decimals) + else + if tableV[i][5]=="%" then tableV[i][5]="%%" end + txt_ov=string.format("%."..t.nb_decimals.."f ",value)..tableV[i][5] + txt_fv=string.format("%."..t.nb_decimals.."f",tableV[i][4]-value)..tableV[i][5] + txt_max=string.format("%."..t.nb_decimals.."f",tableV[i][4])..tableV[i][5] + end + txt_pc = string.format("%."..t.nb_decimals.."f",100*tableV[i][4]/fullsize).."%%" + local txt_out = t.txt_format + txt_out = string.gsub(txt_out,"&l",txt_l) --label + txt_out = string.gsub(txt_out,"&o",txt_opc)--occ. % + txt_out = string.gsub(txt_out,"&f",txt_fpc)--free % + txt_out = string.gsub(txt_out,"&v",txt_ov) --occ. value + txt_out = string.gsub(txt_out,"&n",txt_fv) --free value + txt_out = string.gsub(txt_out,"&m",txt_max)--max + txt_out = string.gsub(txt_out,"&p",txt_pc)--percent + + local te=cairo_text_extents_t:create() + cairo_set_font_size(cr,t.font_size) + cairo_select_font_face(cr, t.txt_font, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL) + cairo_text_extents (cr,txt_out,te) + + --draw lines + lastPt2=draw_lines(i,nbArcs,angle,t.tablefg,cf,t.extend_line,t.line_lgth+t.radius, + te.width + te.x_bearing,t.txt_offset,t.radius,t.line_width,t.line_space,t.font_color,t.font_alpha) + + local xA=lastPt2[1] + local yA=lastPt2[2]-t.line_width-t.txt_offset + if xA>0 then xA = xA-(te.width + te.x_bearing) end + cairo_move_to(cr,xA,yA) + cairo_show_text(cr,txt_out) + end + + lastAngle=lastAngle+angle + end + cairo_restore(cr) +end + + +--[[END OF PIE CHART WIDGET]] diff --git a/lua_scripts/strict.lua b/lua_scripts/strict.lua new file mode 100644 index 0000000..f04505e --- /dev/null +++ b/lua_scripts/strict.lua @@ -0,0 +1,42 @@ +-- +-- strict.lua +-- checks uses of undeclared global variables +-- All global variables must be 'declared' through a regular assignment +-- (even assigning nil will do) in a main chunk before being used +-- anywhere or assigned to inside a function. +-- +-- From Lua distribution (etc/strict.lua) +-- + +local getinfo, error, rawset, rawget = debug.getinfo, error, rawset, rawget + +local mt = getmetatable(_G) +if mt == nil then + mt = {} + setmetatable(_G, mt) +end + +mt.__declared = {} + +local function what () + local d = getinfo(3, "S") + return d and d.what or "C" +end + +mt.__newindex = function (t, n, v) + if not mt.__declared[n] then + local w = what() + if w ~= "main" and w ~= "C" then + print("assign to undeclared variable '"..n.."'") + end + mt.__declared[n] = true + end + rawset(t, n, v) +end + +mt.__index = function (t, n) + if not mt.__declared[n] and what() ~= "C" then + print("variable '"..n.."' is not declared") + end + return rawget(t, n) +end diff --git a/lua_scripts/testCairo.lua b/lua_scripts/testCairo.lua new file mode 100644 index 0000000..ac75a59 --- /dev/null +++ b/lua_scripts/testCairo.lua @@ -0,0 +1,236 @@ +--[[ +Ring Meters by londonali1010 (2009) + +This script draws percentage meters as rings. It is fully customisable; all options are described in the script. + +IMPORTANT: if you are using the 'cpu' function, it will cause a segmentation fault if it tries to draw a ring straight away. The if statement on line 145 uses a delay to make sure that this doesn't happen. It calculates the length of the delay by the number of updates since Conky started. Generally, a value of 5s is long enough, so if you update Conky every 1s, use update_num > 5 in that if statement (the default). If you only update Conky every 2s, you should change it to update_num > 3; conversely if you update Conky every 0.5s, you should use update_num > 10. ALSO, if you change your Conky, is it best to use "killall conky; conky" to update it, otherwise the update_num will not be reset and you will get an error. + +To call this script in Conky, use the following (assuming that you save this script to ~/scripts/rings.lua): + lua_load ~/scripts/rings-v1.2.1.lua + lua_draw_hook_pre ring_stats + +Changelog: ++ v1.2.1 -- Fixed minor bug that caused script to crash if conky_parse() returns a nil value (20.10.2009) ++ v1.2 -- Added option for the ending angle of the rings (07.10.2009) ++ v1.1 -- Added options for the starting angle of the rings, and added the "max" variable, to allow for variables that output a numerical value rather than a percentage (29.09.2009) ++ v1.0 -- Original release (28.09.2009) +]] + +settings_table = { + { + -- Edit this table to customise your rings. + -- You can create more rings simply by adding more elements to settings_table. + -- "name" is the type of stat to display; you can choose from 'cpu', 'memperc', 'fs_used_perc', 'battery_used_perc'. + name='time', + -- "arg" is the argument to the stat type, e.g. if in Conky you would write ${cpu cpu0}, 'cpu0' would be the argument. If you would not use an argument in the Conky variable, use ''. + arg='%I.%M', + -- "max" is the maximum value of the ring. If the Conky variable outputs a percentage, use 100. + max=12, + -- "bg_colour" is the colour of the base ring. + bg_colour=0xffffff, + -- "bg_alpha" is the alpha value of the base ring. + bg_alpha=0.1, + -- "fg_colour" is the colour of the indicator part of the ring. + fg_colour=0xffffff, + -- "fg_alpha" is the alpha value of the indicator part of the ring. + fg_alpha=0.2, + -- "x" and "y" are the x and y coordinates of the centre of the ring, relative to the top left corner of the Conky window. + x=165, y=170, + -- "radius" is the radius of the ring. + radius=50, + -- "thickness" is the thickness of the ring, centred around the radius. + thickness=5, + -- "start_angle" is the starting angle of the ring, in degrees, clockwise from top. Value can be either positive or negative. + start_angle=0, + -- "end_angle" is the ending angle of the ring, in degrees, clockwise from top. Value can be either positive or negative, but must be larger (e.g. more clockwise) than start_angle. + end_angle=360 + }, + { + name='time', + arg='%M.%S', + max=60, + bg_colour=0xffffff, + bg_alpha=0.1, + fg_colour=0xffffff, + fg_alpha=0.4, + x=165, y=170, + radius=56, + thickness=5, + start_angle=0, + end_angle=360 + }, + { + name='time', + arg='%S', + max=60, + bg_colour=0xffffff, + bg_alpha=0.1, + fg_colour=0xffffff, + fg_alpha=0.6, + x=165, y=170, + radius=62, + thickness=5, + start_angle=0, + end_angle=360 + }, + { + name='cpu', + arg='cpu0', + max=100, + bg_colour=0xffffff, + bg_alpha=0.1, + fg_colour=0xffffff, + fg_alpha=0.4, + x=165, y=170, + radius=84.5, + thickness=8, + start_angle=60, + end_angle=120 + }, + { + name='battery_percent', + arg='BAT1', + max=100, + bg_colour=0xffffff, + bg_alpha=0.1, + fg_colour=0xffffff, + fg_alpha=0.6, + x=165, y=170, + radius=72, + thickness=11, + start_angle=122, + end_angle=210 + }, + { + name='memperc', + arg='', + max=100, + bg_colour=0xffffff, + bg_alpha=0.1, + fg_colour=0xffffff, + fg_alpha=0.8, + x=165, y=170, + radius=83.5, + thickness=8, + start_angle=122, + end_angle=210 + }, + { + name='time', + arg='%d', + max=31, + bg_colour=0xffffff, + bg_alpha=0.1, + fg_colour=0xffffff, + fg_alpha=0.8, + x=165, y=170, + radius=70, + thickness=5, + start_angle=212, + end_angle=360 + }, + { + name='time', + arg='%m', + max=12, + bg_colour=0xffffff, + bg_alpha=0.1, + fg_colour=0xffffff, + fg_alpha=0.8, + x=165, y=170, + radius=76, + thickness=5, + start_angle=212, + end_angle=360 + }, + { + name='fs_used_perc', + arg='/', + max=150, + bg_colour=0xffffff, + bg_alpha=0.2, + fg_colour=0xffffff, + fg_alpha=0.3, + x=165, y=170, + radius=108.5, + thickness=3, + start_angle=-120, + end_angle=240 + }, + { + name='fs_used_perc', + arg='/', + max=100, + bg_colour=0xffffff, + bg_alpha=0.2, + fg_colour=0xffffff, + fg_alpha=0.3, + x=165, y=170, + radius=135, + thickness=50, + start_angle=-120, + end_angle=120 + }, +} + +require 'cairo' + +function rgb_to_r_g_b(colour,alpha) + return ((colour / 0x10000) % 0x100) / 255., ((colour / 0x100) % 0x100) / 255., (colour % 0x100) / 255., alpha +end + +function draw_ring(cr,t,pt) + local w,h=conky_window.width,conky_window.height + + local xc,yc,ring_r,ring_w,sa,ea=pt['x'],pt['y'],pt['radius'],pt['thickness'],pt['start_angle'],pt['end_angle'] + local bgc, bga, fgc, fga=pt['bg_colour'], pt['bg_alpha'], pt['fg_colour'], pt['fg_alpha'] + + local angle_0=sa*(2*math.pi/360)-math.pi/2 + local angle_f=ea*(2*math.pi/360)-math.pi/2 + local t_arc=t*(angle_f-angle_0) + + -- Draw background ring + + cairo_arc(cr,xc,yc,ring_r,angle_0,angle_f) + cairo_set_source_rgba(cr,rgb_to_r_g_b(bgc,bga)) + cairo_set_line_width(cr,ring_w) + cairo_stroke(cr) + + -- Draw indicator ring + + cairo_arc(cr,xc,yc,ring_r,angle_0,angle_0+t_arc) + cairo_set_source_rgba(cr,rgb_to_r_g_b(fgc,fga)) + cairo_stroke(cr) +end + +function conky_ring_stats() + local function setup_rings(cr,pt) + local str='' + local value=0 + + str=string.format('${%s %s}',pt['name'],pt['arg']) + str=conky_parse(str) + + value=tonumber(str) + if value == nil then value = 0 end + pct=value/pt['max'] + + draw_ring(cr,pct,pt) + end + + if conky_window==nil then return end + local cs=cairo_xlib_surface_create(conky_window.display,conky_window.drawable,conky_window.visual, conky_window.width,conky_window.height) + + local cr=cairo_create(cs) + + local updates=conky_parse('${updates}') + update_num=tonumber(updates) + + if update_num>5 then + for i in pairs(settings_table) do + setup_rings(cr,settings_table[i]) + end + end + cairo_surface_destroy(cs) + cairo_destroy(cr) +end diff --git a/lua_scripts/text.lua b/lua_scripts/text.lua new file mode 100644 index 0000000..0f5fbfc --- /dev/null +++ b/lua_scripts/text.lua @@ -0,0 +1,557 @@ +--[[TEXT WIDGET v1.. by Wlourf 25/06/2010 +This widget can drawn texts set in the "text_settings" table with some parameters +http://u-scripts.blogspot.com/2010/06/text-widget.html + +The parameters (all optionals) are : +text - text to display, default = "Conky is good for you" + use conky_parse to display conky value ie text=conly_parse("${cpu cpu1}") + - coordinates below are relative to top left corner of the conky window +x - x coordinate of first letter (bottom-left), default = center of conky window +y - y coordinate of first letter (bottom-left), default = center of conky window +h_align - horizontal alignement of text relative to point (x,y), default="l" + available values are "l": left, "c" : center, "r" : right +v_align - vertical alignment of text relative to point (x,y), default="b" + available values "t" : top, "m" : middle, "b" : bottom +font_name - name of font to use, default = Free Sans +font_size - size of font to use, default = 14 +italic - display text in italic (true/false), default=false +oblique - display text in oblique (true/false), default=false (I don' see the difference with italic!) +bold - display text in bold (true/false), default=false +angle - rotation of text in degrees, default = 0 (horizontal) +colour - table of colours for text, default = plain white {{1,0xFFFFFF,1}} + this table contains one or more tables with format {P,C,A} + P=position of gradient (0 = beginning of text, 1= end of text) + C=hexadecimal colour + A=alpha (opacity) of color (0=invisible,1=opacity 100%) + Examples : + for a plain color {{1,0x00FF00,0.5}} + for a gradient with two colours {{0,0x00FF00,0.5},{1,0x000033,1}} + or {{0.5,0x00FF00,1},{1,0x000033,1}} -with this one, gradient will start in the middle of the text + for a gradient with three colours {{0,0x00FF00,0.5},{0.5,0x000033,1},{1,0x440033,1}} + and so on ... +orientation - in case of gradient, "orientation" defines the starting point of the gradient, default="ww" + there are 8 available starting points : "nw","nn","ne","ee","se","ss","sw","ww" + (n for north, w for west ...) + theses 8 points are the 4 corners + the 4 middles of text's outline + so a gradient "nn" will go from "nn" to "ss" (top to bottom, parallele to text) + a gradient "nw" will go from "nw" to "se" (left-top corner to right-bottom corner) +radial - define a radial gradient (if present at the same time as "orientation", "orientation" will have no effect) + this parameter is a table with 6 numbers : {xa,ya,ra,xb,yb,rb} + they define two circle for the gradient : + xa, ya, xb and yb are relative to x and y values above +reflection_alpha - add a reflection effect (values from 0 to 1) default = 0 = no reflection + other values = starting opacity +reflection_scale - scale of the reflection (default = 1 = height of text) +reflection_length - length of reflection, define where the opacity will be set to zero + calues from 0 to 1, default =1 +skew_x,skew_y - skew text around x or y axis + + +Needs conky 1.8.0 + +To call this script in the conkyrc, in before-TEXT section: + lua_load /path/to/the/lua/script/text.lua + lua_draw_hook_pre draw_text + +v1.0 07/06/2010, Original release +v1.1 10/06/2010 Add "orientation" parameter +v1.2 15/06/2010 Add "h_align", "v_align" and "radial" parameters +v1.3 25/06/2010 Add "reflection_alpha", "reflection_length", "reflection_scale", + "skew_x" et "skew_y" + + +]] + +require 'cairo' + +function conky_draw_text() + local col0,col1,col2=0xFFFFCC,0xCCFF99,0x99FF00 + local colbg=0x99CCFF + local text_settings={ + { + text=conky_parse("${time %I:%M%p %D}"), + font_size=24, + bold=true, + font_name="Droid Sans Mono", + h_align="l", + v_align="t", + x=5, + y=5, + reflection_alpha=0, + reflection_length=0, + colour={ + {0.98, 0xFF0000,1}, + {0.99, 0xFFCC00,1}, + {1.00, 0xFF0000,1}, + }, + radial={400,-700,0,100,-1000,1024} + }, + { + text=conky_parse("$sysname $kernel on $machine - $uptime"), + font_size=16, + bold=true, + font_name="Droid Sans Mono", + h_align="r", + x=800, + y=15, + reflection_alpha=0, + reflection_length=0, + colour={{0,col0,0.75},{1,colbg,0.75}}, + + }, + { + text=conky_parse("$freq MHz"), + font_name="Droid Sans Mono", + font_size=16, + h_align="l", + v_align="t", + bold=true, + x=20, + y=60, + reflection_alpha=0, + reflection_length=0, + colour={{0,col0,1},{0.5,colbg,1}}, + orientation="nn", + }, + { + text=conky_parse("${battery_temp}").."\194\176",--yes i had to do the degree symbol like that... + x=794, + y=69, + v_align="m", + h_align="r", + font_name="Droid Sans Mono", + font_size=14, + colour={{0,col0,1},{0.5,colbg,1}}, + orientation="nn", + reflection_alpha=0, + reflection_length=0, + }, + { + text=conky_parse("${battery_short} ${battery_volts}mV"), + x=794, + y=45, + v_align="m", + h_align="r", + font_name="Droid Sans Mono", + font_size=14, + colour={{0,col0,1},{0.5,colbg,1}}, + orientation="nn", + reflection_alpha=0, + reflection_length=0, + }, + { + text=conky_parse("${cell_radio_dbm}".."dBm"), + x=510, + y=50, + font_name="Droid Sans Mono", + font_size=14, + colour={{0,col0,1},{0.5,colbg,1}}, + orientation="nn", + reflection_alpha=0.0, + reflection_length=0.0, + }, + { + text=conky_parse('${cpu}').."%", + x=223, + y=65, + v_align="t", + h_align="l", + font_name="Droid Sans Mono", + font_size=18, + colour={{0,col0,1},{0.5,colbg,1}}, + orientation="ww", + reflection_alpha=0, + reflection_length=0, + }, + { + text=conky_parse('${memperc}').."%", + x=223, + y=91, + v_align="t", + font_name="Droid Sans Mono", + font_size=18, + colour={{0,col0,1},{0.5,colbg,1}}, + orientation="nn", + reflection_alpha=0, + reflection_length=0, + }, + { + text=conky_parse('${fs_used /} / ${fs_size /} (${fs_free /})'), + x=5, + y=115, + v_align="t", + font_name="Droid Sans Mono", + font_size=16, + colour={{conky_parse('${fs_used_perc /}')/100,0x000000,1},{1,0xFFFFFF,1}}, + orientation="ww", + reflection_alpha=0, + reflection_length=0, + }, + { + text="/", + x=220, + y=114, + v_align="t", + font_name="Droid Sans Mono", + font_size=18, + colour={{0,0x336633,1},{1,col0,1}}, + bold=true, + orientation="ww", + reflection_alpha=0, + reflection_length=0, + }, + { + text=conky_parse('${fs_used /home} / ${fs_size /home} (${fs_free /home})'), + x=5, + y=135, + v_align="t", + font_name="Droid Sans Mono", + font_size=16, + colour={{conky_parse('${fs_used_perc /home}')/100,0x000000,1},{1,0xFFFFFF,1}}, + orientation="ww", + reflection_alpha=0, + reflection_length=0, + }, + { + text="/home", + x=220, + y=134, + v_align="t", + font_name="Droid Sans Mono", + font_size=18, + colour={{0,0x336633,1},{1,col0,1}}, + bold=true, + orientation="ww", + reflection_alpha=0, + reflection_length=0, + }, + { + text=conky_parse('${fs_used /home/user/MyDocs} / ${fs_size /home/user/MyDocs} (${fs_free /home/user/MyDocs})'), + x=5, + y=155, + v_align="t", + font_name="Droid Sans Mono", + font_size=16, + colour={{conky_parse('${fs_used_perc /home/user/MyDocs}')/100-.1,0x000000,1},{1,0xFFFFFF,1}}, + orientation="ww", + reflection_alpha=0, + reflection_length=0, + DrawMe=conky_parse("${if_mounted /home/user/MyDocs}1$endif") + }, + { + text="MyDocs", + x=220, + y=154, + v_align="t", + font_name="Droid Sans Mono", + font_size=18, + colour={{0,0x336633,1},{1,col0,1}}, + bold=true, + orientation="ww", + reflection_alpha=0, + reflection_length=0, + DrawMe=conky_parse("${if_mounted /home/user/MyDocs}1$endif") + }, + { + text=conky_parse('${fs_used /media/mmc1} / ${fs_size /media/mmc1} (${fs_free /media/mmc1})'), + x=5, + y=175, + v_align="t", + font_name="Droid Sans Mono", + font_size=16, + colour={{conky_parse('${fs_used_perc /media/mmc1}')/100-.1,0x000000,1},{1,0xFFFFFF,1}}, + orientation="ww", + reflection_alpha=0, + reflection_length=0, + DrawMe=conky_parse("${if_mounted /media/mmc1}1$endif") + }, + { + text="SDCard", + x=220, + y=174, + v_align="t", + font_name="Droid Sans Mono", + font_size=18, + colour={{0,0x336633,1},{1,col0,1}}, + bold=true, + orientation="ww", + reflection_alpha=0, + reflection_length=0, + DrawMe=conky_parse("${if_mounted /media/mmc1}1$endif"), + }, + { + text=conky_parse('${wireless_essid wlan0}'), + x=400, + y=201, + h_align="c", + v_align="m", + font_name="Droid Sans Mono", + font_size=18, + colour={{0,col0,1},{0.5,colbg,1}}, + orientation="nn", + reflection_alpha=0, + reflection_length=0, + DrawMe=conky_parse("${if_empty ${wireless_essid wlan0}}${else}1$endif"), + }, + { + text="GPRS", + x=400, + y=201, + h_align="c", + v_align="m", + font_name="Droid Sans Mono", + font_size=18, + colour={{0,col0,1},{0.5,colbg,1}}, + orientation="nn", + reflection_alpha=0, + reflection_length=0, + DrawMe=conky_parse("${if_up gprs0}1${else}0$endif"), + }, + { + text=conky_parse('${wireless_link_qual_perc wlan0}')..'%', + x=400, + y=228, + h_align="c", + v_align="l", + font_name="Droid Sans Mono", + font_size=14, + colour={{0,col0,1},{0.5,colbg,1}}, + orientation="nn", + reflection_alpha=0, + reflection_length=0, + DrawMe=conky_parse("${if_empty ${wireless_essid wlan0}}${else}1$endif"), + }, + { + text='Up '..conky_parse('${upspeed wlan0}'), + x=225, + y=223, + h_align="l", + v_align="m", + font_name="LEDFont", + font_size=22, + bold=true, + colour={{0,0xcc0066,1}}, + orientation="ww", + reflection_alpha=0, + reflection_length=0, + DrawMe=conky_parse("${if_empty ${wireless_essid wlan0}}${else}1$endif"), + }, + { + text=conky_parse('${downspeed wlan0}')..' Down', + x=650, + y=223, + h_align="r", + v_align="m", + font_name="LEDFont", + font_size=22, + bold=true, + colour={{0,0xcc0066,1}}, + orientation="ww", + reflection_alpha=0, + reflection_length=0, + DrawMe=conky_parse("${if_empty ${wireless_essid wlan0}}${else}1$endif"), + }, + { + text='Up '..conky_parse('${upspeed gprs0}'), + x=225, + y=223, + h_align="l", + v_align="m", + font_name="LEDFont", + font_size=22, + bold=true, + colour={{0,0xcc0066,1}}, + orientation="ww", + reflection_alpha=0, + reflection_length=0, + DrawMe=conky_parse("${if_up gprs0}1${else}0$endif"), + }, + { + text=conky_parse('${downspeed gprs0}')..' Down', + x=650, + y=223, + h_align="r", + v_align="m", + font_name="LEDFont", + font_size=22, + bold=true, + colour={{0,0xcc0066,1}}, + orientation="ww", + reflection_alpha=0, + reflection_length=0, + DrawMe=conky_parse("${if_up gprs0}1${else}0$endif"), + }, + } + if conky_window == nil then return end + if tonumber(conky_parse("$updates"))<3 then return end + local cs = cairo_xlib_surface_create(conky_window.display, conky_window.drawable, conky_window.visual, conky_window.width, conky_window.height) + for i,v in pairs(text_settings) do + cr = cairo_create (cs) + display_text(v) + cairo_destroy(cr) + cr = nil + end + cairo_surface_destroy(cs) +end + +function rgb_to_r_g_b2(tcolour) + local colour,alpha=tcolour[2],tcolour[3] + return ((colour / 0x10000) % 0x100) / 255., ((colour / 0x100) % 0x100) / 255., (colour % 0x100) / 255., alpha +end + +function display_text(t) + if t.DrawMe~=nil and t.DrawMe ~= "1" then return end + local function set_pattern(te) + --this function set the pattern + if #t.colour==1 then + cairo_set_source_rgba(cr,rgb_to_r_g_b2(t.colour[1])) + else + local pat + if t.radial==nil then + local pts=linear_orientation(t,te) + pat = cairo_pattern_create_linear (pts[1],pts[2],pts[3],pts[4]) + else + pat = cairo_pattern_create_radial (t.radial[1],t.radial[2],t.radial[3],t.radial[4],t.radial[5],t.radial[6]) + end + for i=1, #t.colour do + cairo_pattern_add_color_stop_rgba (pat, t.colour[i][1], rgb_to_r_g_b2(t.colour[i])) + end + cairo_set_source (cr, pat) + cairo_pattern_destroy(pat) + end + end + + --set default values if needed + if t.text==nil then t.text="Conky is good for you !" end + if t.x==nil then t.x = conky_window.width/2 end + if t.y==nil then t.y = conky_window.height/2 end + if t.colour==nil then t.colour={{1,0xFFFFFF,1}} end + if t.font_name==nil then t.font_name="Free Sans" end + if t.font_size==nil then t.font_size=14 end + if t.angle==nil then t.angle=0 end + if t.italic==nil then t.italic=false end + if t.oblique==nil then t.oblique=false end + if t.bold==nil then t.bold=false end + if t.radial ~= nil then + if #t.radial~=6 then + print ("error in radial table") + t.radial=nil + end + end + if t.orientation==nil then t.orientation="ww" end + if t.h_align==nil then t.h_align="l" end + if t.v_align==nil then t.v_align="b" end + if t.reflection_alpha == nil then t.reflection_alpha=0 end + if t.reflection_length == nil then t.reflection_length=1 end + if t.reflection_scale == nil then t.reflection_scale=1 end + if t.rotx==nil then t.rotx=0 end + if t.roty==nil then t.roty=0 end + cairo_translate(cr,t.x,t.y) + cairo_rotate(cr,t.angle*math.pi/180) + cairo_save(cr) + local slant = CAIRO_FONT_SLANT_NORMAL + local weight = CAIRO_FONT_WEIGHT_NORMAL + if t.italic then slant = CAIRO_FONT_SLANT_ITALIC end + if t.oblique then slant = CAIRO_FONT_SLANT_OBLIQUE end + if t.bold then weight = CAIRO_FONT_WEIGHT_BOLD end + cairo_select_font_face(cr, t.font_name, slant,weight) + for i=1, #t.colour do + if #t.colour[i]~=3 then + print ("error in color table") + t.colour[i]={1,0xFFFFFF,1} + end + end + local matrix0 = cairo_matrix_t:create() + tolua.takeownership(matrix0) + local rotx,roty=t.rotx/t.font_size,t.roty/t.font_size + cairo_matrix_init (matrix0, 1,roty,rotx,1,0,0) + cairo_transform(cr,matrix0) + cairo_set_font_size(cr,t.font_size) + local te=cairo_text_extents_t:create() + tolua.takeownership(te) + cairo_text_extents (cr,t.text,te) + set_pattern(te) + local mx,my=0,0 + if t.h_align=="c" then + mx=-te.width/2 + elseif t.h_align=="r" then + mx=-te.width + end + if t.v_align=="m" then + my=-te.height/2-te.y_bearing + elseif t.v_align=="t" then + my=-te.y_bearing + end + cairo_move_to(cr,mx,my) + cairo_show_text(cr,t.text) + + if t.reflection_alpha ~= 0 then + local matrix1 = cairo_matrix_t:create() + tolua.takeownership(matrix1) + cairo_set_font_size(cr,t.font_size) + cairo_matrix_init (matrix1,1,0,0,-1*t.reflection_scale,0,(te.height+te.y_bearing+my)*(1+t.reflection_scale)) + cairo_set_font_size(cr,t.font_size) + te=nil + local te=cairo_text_extents_t:create() + tolua.takeownership(te) + cairo_text_extents (cr,t.text,te) + cairo_transform(cr,matrix1) + set_pattern(te) + cairo_move_to(cr,mx,my) + cairo_show_text(cr,t.text) + local pat2 = cairo_pattern_create_linear (0, + (te.y_bearing+te.height+my), + 0, + te.y_bearing+my) + cairo_pattern_add_color_stop_rgba (pat2, 0,1,0,0,1-t.reflection_alpha) + cairo_pattern_add_color_stop_rgba (pat2, t.reflection_length,0,0,0,1) + cairo_set_line_width(cr,0) + local dy=te.x_bearing + if dy<0 then dy=dy*(-1) end + cairo_rectangle(cr,mx+te.x_bearing,te.y_bearing+te.height+my,te.width+dy,-te.height*1.05) + cairo_clip_preserve(cr) + cairo_set_operator(cr,CAIRO_OPERATOR_CLEAR) + --cairo_stroke(cr) + cairo_mask(cr,pat2) + cairo_pattern_destroy(pat2) + cairo_set_operator(cr,CAIRO_OPERATOR_OVER) + te=nil + end +end + + + function linear_orientation(t,te) + local w,h=te.width,te.height + local xb,yb=te.x_bearing,te.y_bearing + + if t.h_align=="c" then + xb=xb-w/2 + elseif t.h_align=="r" then + xb=xb-w + end + if t.v_align=="m" then + yb=-h/2 + elseif t.v_align=="t" then + yb=0 + end + local p=0 + if t.orientation=="nn" then + p={xb+w/2,yb,xb+w/2,yb+h} + elseif t.orientation=="ne" then + p={xb+w,yb,xb,yb+h} + elseif t.orientation=="ww" then + p={xb,h/2,xb+w,h/2} + elseif vorientation=="se" then + p={xb+w,yb+h,xb,yb} + elseif t.orientation=="ss" then + p={xb+w/2,yb+h,xb+w/2,yb} + elseif vorientation=="ee" then + p={xb+w,h/2,xb,h/2} + elseif t.orientation=="sw" then + p={xb,yb+h,xb+w,yb} + elseif t.orientation=="nw" then + p={xb,yb,xb+w,yb+h} + end + return p +end + diff --git a/src/Makefile.in b/src/Makefile.in index ff319d1..128ca6c 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -109,22 +109,21 @@ PROGRAMS = $(bin_PROGRAMS) am__conky_SOURCES_DIST = defconfig.h conf_cookie.c conf_cookie.h \ audacious.c audacious.h bmpx.c bmpx.h ibm.c ibm.h smapi.c \ smapi.h mpd.c mpd.h libmpdclient.c libmpdclient.h moc.c moc.h \ - xmms2.c xmms2.h linux.c linux.h top.c top.h users.c sony.c \ - sony.h i8k.c i8k.h freebsd.c freebsd.h openbsd.c openbsd.h \ - libtcp-portmon.c libtcp-portmon.h tcp-portmon.c tcp-portmon.h \ - x11.c x11.h fonts.c fonts.h hddtemp.c hddtemp.h eve.c eve.h \ - ccurl_thread.c ccurl_thread.h rss.c rss.h prss.c prss.h \ - weather.c weather.h llua.c llua.h nvidia.c nvidia.h imlib2.c \ - imlib2.h apcupsd.c apcupsd.h iconv_tools.c iconv_tools.h \ - colours.c colours.h combine.c combine.h common.c common.h \ - conky.c conky.h core.c core.h diskio.c diskio.h entropy.c \ - entropy.h exec.c exec.h fs.c fs.h logging.h mail.c mail.h \ - mixer.c mixer.h net_stat.c net_stat.h template.c template.h \ - timed_thread.c timed_thread.h mboxscan.c mboxscan.h read_tcp.c \ - read_tcp.h scroll.c scroll.h specials.c specials.h tailhead.c \ - tailhead.h temphelper.c temphelper.h text_object.c \ - text_object.h timeinfo.c timeinfo.h algebra.c algebra.h proc.c \ - proc.h user.c user.h + xmms2.c xmms2.h linux.c linux.h users.c sony.c sony.h i8k.c \ + i8k.h freebsd.c freebsd.h openbsd.c openbsd.h libtcp-portmon.c \ + libtcp-portmon.h tcp-portmon.c tcp-portmon.h x11.c x11.h \ + fonts.c fonts.h hddtemp.c hddtemp.h eve.c eve.h ccurl_thread.c \ + ccurl_thread.h rss.c rss.h prss.c prss.h weather.c weather.h \ + llua.c llua.h nvidia.c nvidia.h imlib2.c imlib2.h apcupsd.c \ + apcupsd.h iconv_tools.c iconv_tools.h colours.c colours.h \ + combine.c combine.h common.c common.h conky.c conky.h core.c \ + core.h diskio.c diskio.h entropy.c entropy.h exec.c exec.h \ + fs.c fs.h logging.h mail.c mail.h mixer.c mixer.h net_stat.c \ + net_stat.h template.c template.h timed_thread.c timed_thread.h \ + mboxscan.c mboxscan.h read_tcp.c read_tcp.h scroll.c scroll.h \ + specials.c specials.h tailhead.c tailhead.h temphelper.c \ + temphelper.h text_object.c text_object.h timeinfo.c timeinfo.h \ + algebra.c algebra.h proc.c proc.h user.c user.h top.c top.h am__objects_1 = @BUILD_CONFIG_OUTPUT_TRUE@am__objects_2 = conky-conf_cookie.$(OBJEXT) am__objects_3 = conky-audacious.$(OBJEXT) @@ -139,8 +138,8 @@ am__objects_11 = conky-moc.$(OBJEXT) @BUILD_MOC_TRUE@am__objects_12 = $(am__objects_11) am__objects_13 = conky-xmms2.$(OBJEXT) @BUILD_XMMS2_TRUE@am__objects_14 = $(am__objects_13) -am__objects_15 = conky-linux.$(OBJEXT) conky-top.$(OBJEXT) \ - conky-users.$(OBJEXT) conky-sony.$(OBJEXT) conky-i8k.$(OBJEXT) +am__objects_15 = conky-linux.$(OBJEXT) conky-users.$(OBJEXT) \ + conky-sony.$(OBJEXT) conky-i8k.$(OBJEXT) @BUILD_LINUX_TRUE@am__objects_16 = $(am__objects_15) am__objects_17 = conky-freebsd.$(OBJEXT) @BUILD_FREEBSD_TRUE@am__objects_18 = $(am__objects_17) @@ -189,7 +188,7 @@ am__objects_46 = conky-colours.$(OBJEXT) conky-combine.$(OBJEXT) \ conky-specials.$(OBJEXT) conky-tailhead.$(OBJEXT) \ conky-temphelper.$(OBJEXT) conky-text_object.$(OBJEXT) \ conky-timeinfo.$(OBJEXT) conky-algebra.$(OBJEXT) \ - conky-proc.$(OBJEXT) conky-user.$(OBJEXT) + conky-proc.$(OBJEXT) conky-user.$(OBJEXT) conky-top.$(OBJEXT) am_conky_OBJECTS = $(am__objects_1) $(am__objects_2) $(am__objects_45) \ $(am__objects_46) conky_OBJECTS = $(am_conky_OBJECTS) @@ -488,7 +487,7 @@ mandatory_sources = colours.c colours.h combine.c combine.h common.c common.h \ mboxscan.h read_tcp.c read_tcp.h scroll.c scroll.h specials.c \ specials.h tailhead.c tailhead.h temphelper.c temphelper.h \ text_object.c text_object.h timeinfo.c timeinfo.h algebra.c \ - algebra.h proc.c proc.h user.c user.h + algebra.h proc.c proc.h user.c user.h top.c top.h # source files only needed when the apropriate option is enabled @@ -498,7 +497,7 @@ ibm = ibm.c ibm.h smapi.c smapi.h mpd = mpd.c mpd.h libmpdclient.c libmpdclient.h moc = moc.c moc.h xmms2 = xmms2.c xmms2.h -linux = linux.c linux.h top.c top.h users.c sony.c sony.h i8k.c i8k.h +linux = linux.c linux.h users.c sony.c sony.h i8k.c i8k.h solaris = solaris.c freebsd = freebsd.c freebsd.h netbsd = netbsd.c netbsd.h @@ -947,30 +946,6 @@ conky-linux.lo: linux.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(conky_CFLAGS) $(CFLAGS) -c -o conky-linux.lo `test -f 'linux.c' || echo '$(srcdir)/'`linux.c -conky-top.o: top.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(conky_CFLAGS) $(CFLAGS) -MT conky-top.o -MD -MP -MF "$(DEPDIR)/conky-top.Tpo" -c -o conky-top.o `test -f 'top.c' || echo '$(srcdir)/'`top.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/conky-top.Tpo" "$(DEPDIR)/conky-top.Po"; else rm -f "$(DEPDIR)/conky-top.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='top.c' object='conky-top.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/conky-top.Po' tmpdepfile='$(DEPDIR)/conky-top.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(conky_CFLAGS) $(CFLAGS) -c -o conky-top.o `test -f 'top.c' || echo '$(srcdir)/'`top.c - -conky-top.obj: top.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(conky_CFLAGS) $(CFLAGS) -MT conky-top.obj -MD -MP -MF "$(DEPDIR)/conky-top.Tpo" -c -o conky-top.obj `if test -f 'top.c'; then $(CYGPATH_W) 'top.c'; else $(CYGPATH_W) '$(srcdir)/top.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/conky-top.Tpo" "$(DEPDIR)/conky-top.Po"; else rm -f "$(DEPDIR)/conky-top.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='top.c' object='conky-top.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/conky-top.Po' tmpdepfile='$(DEPDIR)/conky-top.TPo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(conky_CFLAGS) $(CFLAGS) -c -o conky-top.obj `if test -f 'top.c'; then $(CYGPATH_W) 'top.c'; else $(CYGPATH_W) '$(srcdir)/top.c'; fi` - -conky-top.lo: top.c -@am__fastdepCC_TRUE@ if $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(conky_CFLAGS) $(CFLAGS) -MT conky-top.lo -MD -MP -MF "$(DEPDIR)/conky-top.Tpo" -c -o conky-top.lo `test -f 'top.c' || echo '$(srcdir)/'`top.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/conky-top.Tpo" "$(DEPDIR)/conky-top.Plo"; else rm -f "$(DEPDIR)/conky-top.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='top.c' object='conky-top.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/conky-top.Plo' tmpdepfile='$(DEPDIR)/conky-top.TPlo' @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(conky_CFLAGS) $(CFLAGS) -c -o conky-top.lo `test -f 'top.c' || echo '$(srcdir)/'`top.c - conky-users.o: users.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(conky_CFLAGS) $(CFLAGS) -MT conky-users.o -MD -MP -MF "$(DEPDIR)/conky-users.Tpo" -c -o conky-users.o `test -f 'users.c' || echo '$(srcdir)/'`users.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/conky-users.Tpo" "$(DEPDIR)/conky-users.Po"; else rm -f "$(DEPDIR)/conky-users.Tpo"; exit 1; fi @@ -2051,6 +2026,30 @@ conky-user.lo: user.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(conky_CFLAGS) $(CFLAGS) -c -o conky-user.lo `test -f 'user.c' || echo '$(srcdir)/'`user.c +conky-top.o: top.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(conky_CFLAGS) $(CFLAGS) -MT conky-top.o -MD -MP -MF "$(DEPDIR)/conky-top.Tpo" -c -o conky-top.o `test -f 'top.c' || echo '$(srcdir)/'`top.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/conky-top.Tpo" "$(DEPDIR)/conky-top.Po"; else rm -f "$(DEPDIR)/conky-top.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='top.c' object='conky-top.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/conky-top.Po' tmpdepfile='$(DEPDIR)/conky-top.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(conky_CFLAGS) $(CFLAGS) -c -o conky-top.o `test -f 'top.c' || echo '$(srcdir)/'`top.c + +conky-top.obj: top.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(conky_CFLAGS) $(CFLAGS) -MT conky-top.obj -MD -MP -MF "$(DEPDIR)/conky-top.Tpo" -c -o conky-top.obj `if test -f 'top.c'; then $(CYGPATH_W) 'top.c'; else $(CYGPATH_W) '$(srcdir)/top.c'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/conky-top.Tpo" "$(DEPDIR)/conky-top.Po"; else rm -f "$(DEPDIR)/conky-top.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='top.c' object='conky-top.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/conky-top.Po' tmpdepfile='$(DEPDIR)/conky-top.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(conky_CFLAGS) $(CFLAGS) -c -o conky-top.obj `if test -f 'top.c'; then $(CYGPATH_W) 'top.c'; else $(CYGPATH_W) '$(srcdir)/top.c'; fi` + +conky-top.lo: top.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(conky_CFLAGS) $(CFLAGS) -MT conky-top.lo -MD -MP -MF "$(DEPDIR)/conky-top.Tpo" -c -o conky-top.lo `test -f 'top.c' || echo '$(srcdir)/'`top.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/conky-top.Tpo" "$(DEPDIR)/conky-top.Plo"; else rm -f "$(DEPDIR)/conky-top.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='top.c' object='conky-top.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/conky-top.Plo' tmpdepfile='$(DEPDIR)/conky-top.TPlo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(conky_CFLAGS) $(CFLAGS) -c -o conky-top.lo `test -f 'top.c' || echo '$(srcdir)/'`top.c + mostlyclean-libtool: -rm -f *.lo diff --git a/src/config.h.in b/src/config.h.in index 5bf70ac..79077c3 100644 --- a/src/config.h.in +++ b/src/config.h.in @@ -253,9 +253,6 @@ /* Default maximum size of config TEXT buffer, i.e. below TEXT line. */ #undef MAX_USER_TEXT_DEFAULT -/* Define if the mixers use ALSA */ -#undef MIXER_IS_ALSA - /* Define if you want MOC support */ #undef MOC diff --git a/src/dbus/Makefile b/src/dbus/Makefile index 78b7993..d299c6c 100644 --- a/src/dbus/Makefile +++ b/src/dbus/Makefile @@ -189,7 +189,7 @@ BUILD_CONFIG_OUTPUT_FALSE = # BUILD_CONFIG_OUTPUT_TRUE = BUILD_CURL_FALSE = BUILD_CURL_TRUE = # -BUILD_DATE = Sat Dec 18 01:10:47 PST 2010 +BUILD_DATE = Sat Dec 18 15:29:05 PST 2010 BUILD_EVE_FALSE = BUILD_EVE_TRUE = # BUILD_FREEBSD_FALSE = @@ -287,9 +287,9 @@ OBJEXT = o PACKAGE = conky PACKAGE_BUGREPORT = brenden1@users.sourceforge.net PACKAGE_NAME = Conky -PACKAGE_STRING = Conky 1.8.5 +PACKAGE_STRING = Conky 1.8.5_pre2390 PACKAGE_TARNAME = conky -PACKAGE_VERSION = 1.8.5 +PACKAGE_VERSION = 1.8.5_pre2390 PATH_SEPARATOR = : PKG_CONFIG = /scratchbox/tools/bin/pkg-config RANLIB = ranlib @@ -297,7 +297,7 @@ SED = /scratchbox/tools/bin/sed SET_MAKE = SHELL = /bin/sh STRIP = strip -VERSION = 1.8.5 +VERSION = 1.8.5_pre2390 X11_CFLAGS = X11_LIBS = -lX11 XDamage_CFLAGS = -- 1.7.9.5