From 6519af7f1281add52f054f279c4e31c0b7d233b7 Mon Sep 17 00:00:00 2001 From: eleksir Date: Mon, 5 Jun 2017 02:08:01 +0300 Subject: [PATCH] i3status-mt-json-a-optimized: added reader for mouse click events, code cleanup, ident fix --- i3status-mt-json-a-optimized | 152 +++++++++++++++++++++++++---------- 1 file changed, 109 insertions(+), 43 deletions(-) diff --git a/i3status-mt-json-a-optimized b/i3status-mt-json-a-optimized index d7c4b20..0bf337e 100755 --- a/i3status-mt-json-a-optimized +++ b/i3status-mt-json-a-optimized @@ -1,5 +1,5 @@ #!/usr/bin/perl -# vim: set ai et ts=8 sw=8 sts=8 ft=perl : + use Fcntl; use POSIX; @@ -19,6 +19,8 @@ sub getbatterychargestr2(); sub slow_thread(); sub onesec_thread(); +sub reader(); +sub launcher($); my @charge :shared; my $la :shared; @@ -26,43 +28,61 @@ my $uptime :shared; my $time :shared; my $shoot :shared = 1; -my $default_color = '#3e78fd'; +my $default_color = '#5c5b5a'; +my $blue_color = '#3e78fd'; -my $a->[0]->{'name'} = 'title'; -$a->[0]->{'full_text'} = ' '; -$a->[0]->{'color'} = $default_color; +my @name = qw / + ff vv ch con tel pid hc mp db kee + title username uptime la powersource time /; -$a->[1]->{'name'} = 'username'; -$a->[1]->{'full_text'} = $ENV{'USER'}; -$a->[1]->{'color'} = $default_color; +my @align = qw / + left left left left left left left left left left + center right right right right right /; -$a->[2]->{'name'} = 'uptime'; -$a->[2]->{'full_text'} = ' '; -$a->[2]->{'color'} = $default_color; +my $a; +my %name_index; -$a->[3]->{'name'} = 'la'; -$a->[3]->{'full_text'} = ' '; -$a->[3]->{'color'} = $default_color; +for (my $i = 0; $i < @name; $i++) { + $name_index{$name[$i]} = $i; + $a->[$i]->{'name'} = $name[$i]; -$a->[4]->{'name'} = 'powersource'; -$a->[4]->{'full_text'} = ' '; -$a->[4]->{'color'} = $default_color; + if ($name[$i] eq 'username') { + $a->[$i]->{'full_text'} = $ENV{'USER'}; + } elsif ($name[$i] eq 'title') { + $a->[$i]->{'min_width'} = ' '; + } else { + $a->[$i]->{'full_text'} = $name[$i]; + } + + $a->[$i]->{'color'} = $blue_color; + + if ($align[$i] eq 'left') { + $align[$i] = "center"; + $a->[$i]->{'color'} = $default_color; + $a->[$i]->{'separator_block_width'} = 1; + $a->[$i]->{'separator'} = JSON::PP::false; + $a->[$i]->{'border'} = '#3dbaf4'; + $a->[$i]->{'min_width'} = sprintf(' %s ', $name[$i]); + } + + $a->[$i]->{'align'} = $align[$i]; +} -$a->[5]->{'name'} = 'time'; -$a->[5]->{'full_text'} = ' '; -$a->[5]->{'color'} = $default_color; my $title; my $prev_title = ''; threads->create('slow_thread'); threads->create('onesec_thread'); +threads->create('reader'); sleep 1; syswrite STDOUT, "{\"version\":1, \"click_events\": true}\n"; syswrite STDOUT, "[\n[],\n"; -while(1) { +while (1) { + my $in = ''; + $title = getfocusedwidowtitlestr(); if ($title ne $prev_title) { @@ -71,24 +91,26 @@ while(1) { } if ($shoot == 1) { - $a->[0]->{'full_text'} = $title; - $a->[2]->{'full_text'} = $uptime; - $a->[3]->{'full_text'} = $la; - $a->[4]->{'full_text'} = $charge[0]; - $a->[4]->{'color'} = $charge[1]; - $a->[5]->{'full_text'} = $time; + $a->[$name_index{'title'}]->{'full_text'} = $title; + $a->[$name_index{'uptime'}]->{'full_text'} = $uptime; + $a->[$name_index{'la'}]->{'full_text'} = $la; + $a->[$name_index{'powersource'}]->{'full_text'} = $charge[0]; + $a->[$name_index{'powersource'}]->{'color'} = $charge[1]; + $a->[$name_index{'time'}]->{'full_text'} = $time; my $json = JSON::PP->new; $json = $json->ascii(0); $json = $json->utf8(0); - $json = $json->allow_unknown (1); + $json = $json->allow_unknown (0); $json = $json->canonical(1); $json = $json->space_before(0); $json = $json->space_after(0); - $json = $json->indent(0); + $json = $json->indent(1); my $str = $json->encode($a); undef $json; - syswrite STDOUT, $str . ",\n"; + if ((utf8::valid($str)) and utf8::decode($string)) { + syswrite STDOUT, $str . ",\n"; + } undef $str; $shoot = 0; @@ -98,14 +120,14 @@ while(1) { select(undef, undef, undef, 0.333); } -sub slow_thread(){ +sub slow_thread() { threads->detach(); my @prev_charge = ('',''); my @current_charge; my $prev_la = ''; my $current_la; - while(1){ + while (1) { @current_charge = getbatterychargestr2(); if ($current_charge[0] ne $prev_charge[0]) { @@ -129,7 +151,7 @@ sub slow_thread(){ sub onesec_thread() { threads->detach(); - while(1){ + while (1) { $uptime = getuptimestr(); $time = gettimestr(); # as we report time with precision of 1 minute, update 1/60 seconds @@ -157,9 +179,9 @@ sub gettimestr() { sub getfocusedwidowtitlestr() { my $str; - if (-x '/usr/bin/xdotool'){ + if (-x '/usr/bin/xdotool') { $str = `xdotool getactivewindow getwindowname`; - }elsif (-x '/usr/bin/xprop'){ + } elsif (-x '/usr/bin/xprop') { $str = (split( /=/, `xprop -id \$(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) _NET_WM_NAME`))[1]; chop $str; chop $str; $str = reverse $str; chop $str; chop $str; $str = reverse $str; } @@ -167,8 +189,10 @@ sub getfocusedwidowtitlestr() { chomp($str); $str =~ s/[\"|\{|\}|\'|,|\(|\)|\[|\]]/ /g; - if (int(length($str)) > 64){ - $str = substr($str, 0, 65); + if (int(length($str)) > 24) { + $str = substr($str, 0, 25); + } elsif (int(length($str)) < 1) { + $str = ' '; } return $str; @@ -211,7 +235,7 @@ sub getbatterychargestr1() { close A; chomp($P); - if($P eq '1'){ + if($P eq '1') { open A, "/sys/class/power_supply/BAT0/energy_full"; my $full_charge = ; chomp($full_charge); close A; open A, "/sys/class/power_supply/BAT0/energy_now"; @@ -243,23 +267,23 @@ sub getbatterychargestr2() { open AC, $file or return ('??', '??%'); - if( == 1){ + if ( == 1) { $str .= "AC"; - }else{ + } else { $str .= "DC"; } close AC; # display % charge only if possible - if (open DC,"/sys/class/power_supply/BAT0/capacity"){ + if (open DC,"/sys/class/power_supply/BAT0/capacity") { my $charge = ; close DC; chomp($charge); if ($charge < 10){ $color = '#800000'; - } elsif (($charge >= 10) and ($charge < 25)){ + } elsif (($charge >= 10) and ($charge < 25)) { $color = '#ffa500'; - } elsif (($charge >= 25) and ($charge < 80)){ + } elsif (($charge >= 25) and ($charge < 80)) { $color = '#008000'; } else { $color = '#0000a0'; @@ -272,3 +296,45 @@ sub getbatterychargestr2() { return @z; } + +sub reader() { + threads->detach(); + my $str = ''; + my $j; + + while () { + $str = $_; + + if (substr($str, 0, 1) ne '{') { + $str = substr($str, 1); + } + + chomp($str); + next if ((length($str) < 2) or (substr($str, -1, 1) ne '}')); + + $j = decode_json($str); + if ($j->{'button'} eq '1') { + if ($j->{'name'} eq 'ff') { threads->create('launcher', '/usr/bin/firefox'); } + if ($j->{'name'} eq 'vv') { threads->create('launcher', '/usr/local/bin/vivaldi'); } + if ($j->{'name'} eq 'ch') { threads->create('launcher', '/usr/bin/chromium'); } + if ($j->{'name'} eq 'con') { threads->create('launcher', '/usr/bin/urxvt'); } + if ($j->{'name'} eq 'tel') { threads->create('launcher', '/home/eleksir/.local/bin/Telegram'); } + if ($j->{'name'} eq 'pid') { threads->create('launcher', '/usr/bin/pidgin'); } + if ($j->{'name'} eq 'hc') { threads->create('launcher', '/usr/bin/hexchat'); } + if ($j->{'name'} eq 'mp') { threads->create('launcher', '/usr/bin/mousepad'); } + if ($j->{'name'} eq 'db') { threads->create('launcher', '/usr/bin/deadbeef'); } + if ($j->{'name'} eq 'kee') { threads->create('launcher', '/home/eleksir/.local/bin/kee'); } + } + } +} + +sub launcher($) { + my $prog = shift; + threads->detach(); + + if (fork() == 0) { + exec ($prog); + } +} + +# vim: set ai tabstop=8 softtabstop=8 shiftwidth=8 noexpandtab ft=perl : #