0

Use "xset q" as fallback for detecting capslock status if hardware keyboard is missing

This commit is contained in:
Sergei Fedosov
2021-07-19 19:12:43 +03:00
committed by eleksir
parent fba1d3dc5d
commit c634ca1f40

View File

@@ -89,6 +89,8 @@ unless (-f $BATTERY_CHARGE_FULL_FILE) {
} }
my $CAPS_LED_PATH = find_caps_led (); my $CAPS_LED_PATH = find_caps_led ();
my $CAPS_LED_SKIPS = 0;
my $CAPS_LED_SKIPS_MAX = 180;
# opened windows info storage ref # opened windows info storage ref
my $win; my $win;
@@ -285,6 +287,7 @@ sub add_events () {
cb => sub { # the callback to invoke cb => sub { # the callback to invoke
my $caps_state = 0; my $caps_state = 0;
my $CAPSHANDLE; my $CAPSHANDLE;
my $xsetflag = 0;
if (defined $CAPS_LED_PATH) { if (defined $CAPS_LED_PATH) {
unless (open $CAPSHANDLE, '<', $CAPS_LED_PATH) { unless (open $CAPSHANDLE, '<', $CAPS_LED_PATH) {
@@ -292,13 +295,39 @@ sub add_events () {
$caps_state = 2 $caps_state = 2
} }
} else { } else {
$caps_state = 2; # we can use "$ xset q | grep Caps" as fallback, but it is notably more expensive check
my $xset = `xset q`;
$xsetflag = 1;
if ($?) {
# some kind of error, so we assume that we cannot update caps lock status
$caps_state = 2;
} else {
$xset =~ /Caps Lock\:\s+(o[n|f]f?)\s+/;
if ($1 eq 'off') {
$caps_state = 0;
} elsif ($1 eq 'on') {
$caps_state = 1;
} else {
$caps_state = 2;
}
}
if ($CAPS_LED_SKIPS == $CAPS_LED_SKIPS_MAX) {
$CAPS_LED_SKIPS = 0;
$CAPS_LED_PATH = find_caps_led ();
} else {
$CAPS_LED_SKIPS++;
}
} }
if ($caps_state ne '2') { if ($caps_state ne '2') {
$caps_state = readline $CAPSHANDLE; unless ($xsetflag) {
close $CAPSHANDLE; $caps_state = readline $CAPSHANDLE;
chomp $caps_state; close $CAPSHANDLE;
chomp $caps_state;
}
if (! defined $O->{capslock}->{state}) { if (! defined $O->{capslock}->{state}) {
$O->{capslock}->{border} = $CONF->{capslock}->{background}; $O->{capslock}->{border} = $CONF->{capslock}->{background};