diff mbox

make the CtrlR and CtrlL modifier output different keys

Message ID 4AB316ED.80005@gmail.com (mailing list archive)
State Rejected, archived
Headers show

Commit Message

Xiangfu Liu Sept. 18, 2009, 5:13 a.m. UTC
Hi.

I want make the CtrlR and CtrlL output different keys.
like:

CtrlR + U = 7
CtrlR + U = Control + U.

so I modify the keyboard.c code. attach is the code.

give me some feedback about this patch.
thanks.

Comments

Dmitry Torokhov Sept. 18, 2009, 6:10 a.m. UTC | #1
On Fri, Sep 18, 2009 at 01:13:17PM +0800, Xiangfu Liu wrote:
> Hi.
> 
> I want make the CtrlR and CtrlL output different keys.
> like:
> 
> CtrlR + U = 7
> CtrlR + U = Control + U.
> 
> so I modify the keyboard.c code. attach is the code.
> 
> give me some feedback about this patch.
> thanks.

You should be able to do what you want by loading proper keymap; no need
to adjust the keyboard code (especially in a way that does not make
sense for other devices).
Xiangfu Liu Sept. 18, 2009, 6:46 a.m. UTC | #2
Dmitry Torokhov wrote:
> On Fri, Sep 18, 2009 at 01:13:17PM +0800, Xiangfu Liu wrote:
>> Hi.
>>
>> I want make the CtrlR and CtrlL output different keys.
>> like:
>>
>> CtrlR + U = 7
>> CtrlR + U = Control + U.
>>
>> so I modify the keyboard.c code. attach is the code.
>>
>> give me some feedback about this patch.
>> thanks.
> 
> You should be able to do what you want by loading proper keymap; no need
> to adjust the keyboard code (especially in a way that does not make
> sense for other devices).
> 
yes. I saw your last email. it's work on. I revert the code in our kernel
repos. thanks again.

Best Regards
diff mbox

Patch

diff --git a/arch/mips/jz4740/platform.c b/arch/mips/jz4740/platform.c
index 5859589..ddd7d3f 100644
--- a/arch/mips/jz4740/platform.c
+++ b/arch/mips/jz4740/platform.c
@@ -242,11 +242,11 @@  static struct platform_device jz_nand_device = {
  * don't define this. the keyboard and keyboard both work
  */
 
-#define KEY_QI_QI		KEY_F13
-#define KEY_QI_UPRED	KEY_RIGHTCTRL
+#define KEY_QI_QI	KEY_RIGHTCTRL
+#define KEY_QI_UPRED	KEY_RIGHTSHIFT
 #define KEY_QI_VOLUP	KEY_F15
 #define KEY_QI_VOLDOWN	KEY_F16
-#define KEY_QI_FN	KEY_F17
+#define KEY_QI_FN	KEY_RIGHTCTRL
 
 static const uint32_t qi_lb60_keymap[] = {
 	KEY(0, 0, KEY_F1),	/* S2 */
diff --git a/drivers/char/defkeymap.map b/drivers/char/defkeymap.map
index 25d05b4..497cfc2 100644
--- a/drivers/char/defkeymap.map
+++ b/drivers/char/defkeymap.map
@@ -113,9 +113,9 @@  keycode  43 = backslash        bar
 	control keycode  43 = Control_backslash
 	alt     keycode  43 = Meta_backslash  
 keycode  44 = z               
-	altgr   keycode  43 = nine
+	altgr   keycode  44 = nine
 keycode  45 = x               
-	altgr   keycode  43 = zero
+	altgr   keycode  45 = zero
 keycode  46 = c
 	altgr   keycode  46 = Hex_C   
 keycode  47 = v               
@@ -133,7 +133,7 @@  keycode  52 = period           greater
 keycode  53 = slash            question        
 	control keycode  53 = Delete          
 	alt     keycode  53 = Meta_slash      
-keycode  54 = Shift           
+keycode  54 = AltGr
 keycode  55 = KP_Multiply     
 keycode  56 = Alt             
 keycode  57 = space            space           
@@ -240,7 +240,7 @@  keycode  93 =
 keycode  94 =
 keycode  95 =
 keycode  96 = KP_Enter        
-keycode  97 = AltGr
+keycode  97 = Control
 keycode  98 = KP_Divide       
 keycode  99 = Control_backslash
 	control keycode  99 = Control_backslash
diff --git a/drivers/char/keyboard.c b/drivers/char/keyboard.c
index 737be95..4cdd9ac 100644
--- a/drivers/char/keyboard.c
+++ b/drivers/char/keyboard.c
@@ -121,6 +121,8 @@  struct vt_spawn_console vt_spawn_con = {
 	.sig  = 0,
 };
 
+static int ctrlr = 0;
+
 /*
  * Variables exported for vt.c
  */
@@ -1133,6 +1135,60 @@  static int emulate_raw(struct vc_data *vc, unsigned int keycode, unsigned char u
 }
 #endif
 
+static int qi_keymap(int keysym, int keycode, int up_flag)
+{
+	int ret;
+	ret = keysym;
+
+	if (up_flag && keycode == KEY_RIGHTCTRL) {
+		ctrlr = 0;
+		return ret;
+	}
+
+	if (ctrlr) {
+		switch (keycode) {
+		case KEY_SLASH:	/* 0 */
+			ret = 61488;
+			break;
+		case KEY_N:	/* 1 */
+			ret = 61489;
+			break;
+		case KEY_M:	/* 2 */
+			ret = 61490;
+			break;
+		case KEY_B:	/* 3 */
+			ret = 61491;
+			break;
+		case KEY_J:	/* 4 */
+			ret = 61492;
+			break;
+		case KEY_K:	/* 5 */
+			ret = 61493;
+			break;
+		case KEY_L:	/* 6 */
+			ret = 61494;
+			break;
+		case KEY_U:	/* 7 */
+			ret = 61495;
+			break;
+		case KEY_I:	/* 8 */
+			ret = 61496;
+			break;
+		case KEY_O:	/* 9 */
+			ret = 61497;
+			break;
+		default:
+			break;
+		}
+	}
+
+	if (keycode == KEY_RIGHTCTRL) {
+		ctrlr = 1;
+	}
+
+	return ret;
+}
+
 static void kbd_rawcode(unsigned char data)
 {
 	struct vc_data *vc = vc_cons[fg_console].d;
@@ -1284,6 +1340,8 @@  static void kbd_keycode(unsigned int keycode, int down, int hw_raw)
 	if (raw_mode && type != KT_SPEC && type != KT_SHIFT)
 		return;
 
+	keysym = qi_keymap(keysym, keycode, !down);
+
 	(*k_handler[type])(vc, keysym & 0xff, !down);
 
 	param.ledstate = kbd->ledflagstate;