linux-input.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
To: "Samuel Thibault" <samuel.thibault@ens-lyon.org>,
	"Pavel Machek" <pavel@ucw.cz>,
	"Pali Rohár" <pali.rohar@gmail.com>
Cc: linux-input@vger.kernel.org, linux-kernel@vger.kernel.org,
	rpurdie@rpsys.net,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Subject: [PATCH 3/3] tty/vt/keyboard: define LED triggers for VT keyboard lock states
Date: Mon,  8 Jun 2015 14:43:10 -0700	[thread overview]
Message-ID: <1433799790-31873-4-git-send-email-dmitry.torokhov@gmail.com> (raw)
In-Reply-To: <1433799790-31873-1-git-send-email-dmitry.torokhov@gmail.com>

From: Samuel Thibault <samuel.thibault@ens-lyon.org>

In addition to defining triggers for VT LED states, let's define triggers
for VT keyboard lock states, such as "kbd-shiftlock", "kbd-altgrlock", etc.

This permits to fix #7063 from userland by using a modifier to implement
proper CapsLock behavior and have the keyboard caps lock led show that
modifier state.

Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
 drivers/tty/vt/keyboard.c | 27 +++++++++++++++++++--------
 1 file changed, 19 insertions(+), 8 deletions(-)

diff --git a/drivers/tty/vt/keyboard.c b/drivers/tty/vt/keyboard.c
index cff193e..1c420d9 100644
--- a/drivers/tty/vt/keyboard.c
+++ b/drivers/tty/vt/keyboard.c
@@ -130,7 +130,7 @@ static char rep;					/* flag telling character repeat */
 
 static int shift_state = 0;
 
-static unsigned char ledstate = 0xff;			/* undefined */
+static unsigned int ledstate = -1U;			/* undefined */
 static unsigned char ledioctl;
 
 /*
@@ -975,7 +975,7 @@ static void kbd_led_trigger_activate(struct led_classdev *cdev)
 		container_of(cdev->trigger, struct kbd_led_trigger, trigger);
 
 	tasklet_disable(&keyboard_tasklet);
-	if (ledstate != 0xff)
+	if (ledstate != -1U)
 		led_trigger_event(&trigger->trigger,
 				  ledstate & trigger->mask ?
 					LED_FULL : LED_OFF);
@@ -990,11 +990,23 @@ static void kbd_led_trigger_activate(struct led_classdev *cdev)
 		.mask	= BIT(_led_bit),			\
 	}
 
+#define KBD_LOCKSTATE_TRIGGER(_led_bit, _name)		\
+	KBD_LED_TRIGGER((_led_bit) + 8, _name)
+
 static struct kbd_led_trigger kbd_led_triggers[] = {
 	KBD_LED_TRIGGER(VC_SCROLLOCK, "kbd-scrollock"),
 	KBD_LED_TRIGGER(VC_NUMLOCK,   "kbd-numlock"),
 	KBD_LED_TRIGGER(VC_CAPSLOCK,  "kbd-capslock"),
 	KBD_LED_TRIGGER(VC_KANALOCK,  "kbd-kanalock"),
+
+	KBD_LOCKSTATE_TRIGGER(VC_SHIFTLOCK,  "kbd-shiftlock"),
+	KBD_LOCKSTATE_TRIGGER(VC_ALTGRLOCK,  "kbd-altgrlock"),
+	KBD_LOCKSTATE_TRIGGER(VC_CTRLLOCK,   "kbd-ctrllock"),
+	KBD_LOCKSTATE_TRIGGER(VC_ALTLOCK,    "kbd-altlock"),
+	KBD_LOCKSTATE_TRIGGER(VC_SHIFTLLOCK, "kbd-shiftllock"),
+	KBD_LOCKSTATE_TRIGGER(VC_SHIFTRLOCK, "kbd-shiftrlock"),
+	KBD_LOCKSTATE_TRIGGER(VC_CTRLLLOCK,  "kbd-ctrlllock"),
+	KBD_LOCKSTATE_TRIGGER(VC_CTRLRLOCK,  "kbd-ctrlrlock"),
 };
 
 static void kbd_propagate_led_state(unsigned int old_state,
@@ -1073,7 +1085,7 @@ static void kbd_init_leds(void)
  */
 static unsigned char getledstate(void)
 {
-	return ledstate;
+	return ledstate & 0xff;
 }
 
 void setledstate(struct kbd_struct *kb, unsigned int led)
@@ -1183,11 +1195,12 @@ void vt_kbd_con_stop(int console)
  */
 static void kbd_bh(unsigned long dummy)
 {
-	unsigned char leds;
+	unsigned int leds;
 	unsigned long flags;
 
 	spin_lock_irqsave(&led_lock, flags);
 	leds = getleds();
+	leds |= (unsigned int)kbd->lockstate << 8;
 	spin_unlock_irqrestore(&led_lock, flags);
 
 	if (leds != ledstate) {
@@ -1539,10 +1552,8 @@ static void kbd_start(struct input_handle *handle)
 {
 	tasklet_disable(&keyboard_tasklet);
 
-	if (ledstate != 0xff) {
-		unsigned int state = ledstate;
-		kbd_update_leds_helper(handle, &state);
-	}
+	if (ledstate != -1U)
+		kbd_update_leds_helper(handle, &ledstate);
 
 	tasklet_enable(&keyboard_tasklet);
 }
-- 
2.2.0.rc0.207.ga3a616c


  parent reply	other threads:[~2015-06-08 21:43 UTC|newest]

Thread overview: 56+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-06-08 21:43 [PATCH 0/3] Switch input leds over to standard LED class devices Dmitry Torokhov
2015-06-08 21:43 ` [PATCH 1/3] Input: export LEDs as class devices in sysfs Dmitry Torokhov
2015-06-09 13:19   ` Samuel Thibault
2015-06-09 13:27     ` Samuel Thibault
2015-06-09 16:50       ` Dmitry Torokhov
2015-06-09 17:16         ` Samuel Thibault
2015-06-09 16:49     ` Dmitry Torokhov
2015-06-09 17:22       ` Samuel Thibault
2015-06-09 17:32         ` Dmitry Torokhov
2015-06-10  6:34       ` Pavel Machek
2015-06-09 17:42   ` [PATCH v2 " Dmitry Torokhov
2015-06-10  0:32     ` Samuel Thibault
2015-06-10  1:24       ` Dmitry Torokhov
2015-06-11 17:51         ` Pavel Machek
2015-06-15 10:03         ` Pavel Machek
2015-06-15 10:51           ` Pali Rohár
2015-07-21 11:14     ` Vlastimil Babka
2015-07-21 17:01       ` Dmitry Torokhov
2015-07-21 21:08         ` Pavel Machek
2015-07-22 13:12           ` Vlastimil Babka
2015-07-22 18:55             ` Jiri Kosina
2015-07-23  5:19               ` Vlastimil Babka
2015-07-23  5:42                 ` Jiri Kosina
2015-07-22 14:41         ` Vlastimil Babka
2015-07-22 19:49           ` Jiri Kosina
2015-07-22 21:47             ` Pavel Machek
2015-07-22 21:50               ` Jiri Kosina
2015-07-22 21:49             ` Dmitry Torokhov
2015-07-22 22:01               ` Jiri Kosina
2015-06-08 21:43 ` [PATCH 2/3] tty/vt/keyboard: define LED triggers for VT LED states Dmitry Torokhov
2015-06-08 21:43 ` Dmitry Torokhov [this message]
2015-06-08 22:58 ` [PATCH 0/3] Switch input leds over to standard LED class devices Bastien Nocera
2015-06-08 23:16   ` Dmitry Torokhov
2015-06-09 10:54 ` Pavel Machek
2015-06-09 11:12   ` Pavel Machek
2015-06-09 11:22     ` Pali Rohár
2015-06-09 11:28       ` Pavel Machek
2015-06-09 12:22       ` Samuel Thibault
2015-06-09 11:26     ` Pavel Machek
2015-06-09 16:40       ` Dmitry Torokhov
2015-06-09 12:20   ` Samuel Thibault
2015-06-09 16:18   ` Pavel Machek
2015-06-09 16:32     ` Dmitry Torokhov
2015-06-09 16:37   ` Dmitry Torokhov
2015-06-09 13:42 ` Samuel Thibault
2015-06-09 13:50   ` Pali Rohár
2015-06-09 14:05     ` Samuel Thibault
     [not found] ` <20090205113908.GA14224@const.inria.fr>
2015-06-09 14:17   ` caps lock led does not show up Samuel Thibault
2015-06-09 16:03     ` Bug#514464: " Anton Zinoviev
2015-06-11  8:08       ` Samuel Thibault
2015-06-11 14:28         ` Samuel Thibault
2015-06-11 15:37           ` Samuel Thibault
2015-06-25 15:41             ` Samuel Thibault
2015-07-02 16:39               ` Anton Zinoviev
2015-07-02 16:50                 ` Samuel Thibault
2015-08-31  8:33                 ` Samuel Thibault

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1433799790-31873-4-git-send-email-dmitry.torokhov@gmail.com \
    --to=dmitry.torokhov@gmail.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-input@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=pali.rohar@gmail.com \
    --cc=pavel@ucw.cz \
    --cc=rpurdie@rpsys.net \
    --cc=samuel.thibault@ens-lyon.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).