Hi all!

First, thank you for your great awesome wm!
Coming straight from windowmaker many years ago, I like it very much.


For my date and time widget I'm using a vicious widget:
   mytextclock = widget({ type = "textbox" })
   vicious.register(mytextclock, vicious.widgets.date, "%d.%m  %H:%M", 60)

Now, if I start awesome e.g. at 18:00:50h, the displayed time will be
wrong after 10 seconds because the widget will be updated first after 60
seconds.
That means 50 seconds wrong time for each minute. Ok, I could reduce the
update interval, but that's not what I wanted to do. 


I had no idea how to fix it with the widget itself, so I wrote a simple
perl script, that will sync the time of the widget at a 'full minute'.

For that I added some lines to my rc.lua:

  svdw = os.getenv("HOME") .. "/bin/awesome_svdw.pl mytextclock"
  ...
  awful.util.spawn_with_shell(svdw)

mytextclock:     the date widget, the needed argument for the script
os.getenv("HOME") .. "/bin/awesome_svdw.pl:       path to the script

awesome_svdw.pl must be executable (chmod u+x)



If someone has the same problem, take a look at the attached script.

cu
Juergen



#!/usr/bin/perl -w
# ----------------------------------------------------------------------------
# awesome_svdw: Sync vicious Date Widget
# copyright 2012 Juergen Descher
# ----------------------------------------------------------------------------
# Restart vicious widget date at full minute.
#
# usage: awesome_scdw date_widget_name
#
# To sync the widget:
#  -  start this script e.g. from the rc.lua (autostart)
#     e.g.
#     svdw = os.getenv("HOME") .. "/bin/awesome_svdw.pl mytextclock"
#     ...
#     awful.util.spawn_with_shell(svdw)
#  -  use a cronjob
# ----------------------------------------------------------------------------

use 5.006;

#use Carp;	    # don't use die in modules
#use Carp::Clan;    # or better use this
use Time::HiRes qw ( setitimer ITIMER_VIRTUAL time gettimeofday);
use FileHandle;

use strict;
use warnings;

my $Version = 0.01;

sub version {
    $Version;
}

my $widget = shift;
die ( "usage: scdw date_widget_name" ) unless defined $widget;


my $script         = "awesome_svdw";
my $user           = $ENV{USER};
my $blkf           = $ENV{HOME} . "/.$script";
my $awesome_client = "/usr/bin/awesome-client";

# check for awesome
my $awes_inst      = readpipe("/usr/bin/pgrep -u $user -c -f '^awesome\$'");
chomp $awes_inst;

if ( $awes_inst != 1 ) {
    die "$script: Don't kown what to do with $awes_inst instances of awesome wm";
}

# don't run if an other instance of this script is running
if ( -f $blkf ) { die "$script: file $blkf exist"; }

# create a 'blocking' file
open( FH, ">$blkf" ) or die "$script: Can't create $blkf: $!";
close(FH);

$SIG{INT} = sub { unlink $blkf; print STDERR "got ctrl-c\n"; exit; };

my $sec = ( (localtime)[0] );

if ( $sec == 0 ) {
    sleep(1.0);
    $sec = ( (localtime)[0] );
}

# wait for next minute
sleep( 60 - $sec );

# restart widget
open( A, "|$awesome_client" );
A->autoflush(1);
print A "vicious.unregister($widget, true)\n";
print A "vicious.activate($widget)\n";
close A;

unlink($blkf);

Reply via email to