Programming This forum is for all programming questions.
The question does not have to be directly related to Linux and any language is fair game.
Notices
Welcome to
LinuxQuestions.org , a friendly and active Linux Community.
You are currently viewing LQ as a guest. By joining our community you will have the ability to post topics, receive our newsletter, use the advanced search, subscribe to threads and access many other special features. Registration is quick, simple and absolutely free.
Join our community today!
Note that registered members see fewer ads, and ContentLink is completely disabled once you log in.
Are you new to LinuxQuestions.org? Visit the following links:
Site Howto |
Site FAQ |
Sitemap |
Register Now
If you have any problems with the registration process or your account login, please
contact us . If you need to reset your password,
click here .
Having a problem logging in? Please visit this page to clear all LQ-related cookies.
07-13-2008, 08:49 PM
#1
LQ Newbie
Registered: Jan 2007
Posts: 1
Rep:
Catching keyboard meessages/input to a GTK(sharp) textview widget
Hi
I am trying to create a custom widget based on gtk textview (the gtk# bindings for C#). The purpose is to enable writing my local language Urdu in textview instead of English. I am unable to find how can I hack the keyboard input before it appears on screen (so I change the key values like a to ا and b to ب etc). I am a beginner so plz suggest me it this regards. Obviously I want to do it in c# (mono has Gdk.Keyboard, Gdk.Keymap and some other such classes, but I am unable to figure out a way to get the pressed key's value and change it before it is passed to textview buffer). At last here is the example my friend done in system.windows.forms textbox.
Code:
using System;
using System.Drawing;
using System.Drawing.Design;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Windows.Forms.Design;
namespace UrduCtrl
{
enum KeyboardStates
{
kbNormal=0,
kbShift=1,
kbCtrl=2,
kbAltGr=3
}
public class UrduTextPropertyEditor: UITypeEditor
{
// public override object EditValue(
// System.ComponentModel.ITypeDescriptorContext context,
// System.IServiceProvider provider, object value)
// {
// IWindowsFormsEditorService frmsvr = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
// if(frmsvr == null)
// return null;
//
// UrduTextPropertyEditorDlg dlg= new UrduTextPropertyEditorDlg();
// dlg.EditedText = (string) value;
//
// //dlg.ShowDialog();
// frmsvr.ShowDialog(dlg);
//
// return (string) dlg.EditedText;
// }
// public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
// {
// if (context!=null && provider!=null)
// {
// IWindowsFormsEditorService edSrv= (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
// if (edSrv!=null)
// {
// UrduTextPropertyEditorDlg dialog= new UrduTextPropertyEditorDlg();
// if (value is String)
// dialog.EditedText= (string)value;
// if (edSrv.ShowDialog(dialog)==System.Windows.Forms.DialogResult.OK)
// value= dialog.EditedText;
// dialog.Dispose();
// dialog= null;
// }
// }
// return value;
// }
public override System.Drawing.Design.UITypeEditorEditStyle
GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
// We will use a window for property editing.
return UITypeEditorEditStyle.Modal;
}
public override bool GetPaintValueSupported(
System.ComponentModel.ITypeDescriptorContext context)
{
// No special thumbnail will be shown for the grid.
return false;
}
}
/// <summary>
/// Summary description for Class1.
/// </summary>
[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name="FullTrust")]
public class UrduTextBox: System.Windows.Forms.TextBox
{
private int WM_CHAR = 0x102;
private int WM_KEYDOWN = 0x100;
private int WM_KEYUP = 0x101;
private bool m_bIsUrdu;
private KeyboardStates kbState;
private Hashtable UrduPhonetic;
private char charSingleQuote= Convert.ToChar(39);
public UrduTextBox()
{
this.Font = new System.Drawing.Font("Urdu Naskh Asiatype", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(178)));
this.RightToLeft = System.Windows.Forms.RightToLeft.Yes;
//this.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
this.m_bIsUrdu= true;
kbState= KeyboardStates.kbNormal;
UrduPhonetic= new Hashtable();
UrduPhonetic['a']=new Key(0x0627, 0x0622, 0x0623);
UrduPhonetic['b']=new Key(0x0628, 0x0628);
UrduPhonetic['c']=new Key(0x0686, 0x062B);
UrduPhonetic['d']=new Key(0x062F, 0x0688);
UrduPhonetic['e']=new Key(0x0639, 0x0651);
UrduPhonetic['f']=new Key(0x0641, 0x64D);
UrduPhonetic['g']=new Key(0x06AF, 0x063A);
UrduPhonetic['h']=new Key(0x06BE, 0x062D);
UrduPhonetic['i']=new Key(0x06CC, 0x0670);
UrduPhonetic['j']=new Key(0x062C, 0x0636);
UrduPhonetic['k']=new Key(0x06A9, 0x062E);
UrduPhonetic['l']=new Key(0x0644, 0x0628);
UrduPhonetic['m']=new Key(0x0645, 0x64B);
UrduPhonetic['n']=new Key(0x0646, 0x06BA);
UrduPhonetic['o']=new Key(0x06C1, 0x06C3);
UrduPhonetic['p']=new Key(0x067E, 0x064F);
UrduPhonetic['q']=new Key(0x0642);
UrduPhonetic['r']=new Key(0x0631, 0x0691);
UrduPhonetic['s']=new Key(0x0633 , 0x0635);
UrduPhonetic['t']=new Key(0x062A , 0x0679);
UrduPhonetic['u']=new Key(0x0626 , 0x0621);
UrduPhonetic['v']=new Key(0x0637, 0x0638);
UrduPhonetic['w']=new Key(0x0648, 0x0624);
UrduPhonetic['x']=new Key(0x0634, 0x0698);
UrduPhonetic['y']=new Key(0x06D2, 0x06D2);
UrduPhonetic['z']=new Key(0x0632, 0x0630);
UrduPhonetic['0']=new Key(0x0030, Convert.ToInt16(')'));
UrduPhonetic['1']=new Key(0x0031, Convert.ToInt16('!'));
UrduPhonetic['2']=new Key(0x0032, Convert.ToInt16('@'));
UrduPhonetic['3']=new Key(0x0033, Convert.ToInt16('#'));
UrduPhonetic['4']=new Key(0x0034, Convert.ToInt16('$'));
UrduPhonetic['5']=new Key(0x0035, Convert.ToInt16('%'));
UrduPhonetic['6']=new Key(0x0036, Convert.ToInt16('^'));
UrduPhonetic['7']=new Key(0x0037, Convert.ToInt16('&'));
UrduPhonetic['8']=new Key(0x0038, Convert.ToInt16('*'));
UrduPhonetic['9']=new Key(0x0039, Convert.ToInt16('('));
UrduPhonetic['=']=new Key(0x03D, 0x02B);
UrduPhonetic['-']=new Key(0x002D, 0x0640);
UrduPhonetic[',']=new Key(0x060C, 0x064E);
UrduPhonetic['.']=new Key(0x06D4, 0x0650);
UrduPhonetic['/']=new Key(0x002F, 0x061F);
UrduPhonetic['\\']=new Key(0x0674);
UrduPhonetic[';']=new Key(0x061B, 58);
UrduPhonetic['[']=new Key(0x64C);
UrduPhonetic[']']=new Key(0x0652);
UrduPhonetic[charSingleQuote]=new Key(0x2018, 0x201C);
UrduPhonetic['~']=new Key(0x2019, 0x201D);
UrduPhonetic[' ']=new Key(32, 0x200C);
UrduPhonetic['<']=new Key(0x064E);
}
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_CHAR)
{
if(kbState== KeyboardStates.kbCtrl)
{
if(m.WParam == (IntPtr) 32)
{
this.m_bIsUrdu= !(this.m_bIsUrdu);
m.WParam= (IntPtr) 0;
base.WndProc(ref m);
return;
}
}
if(m_bIsUrdu)
{
//MessageBox.Show("Test");
char strChar= (char) m.WParam;
strChar= Char.ToLower(strChar);
if (kbState== KeyboardStates.kbShift)
{
if (UrduPhonetic.ContainsKey(strChar))
{
m.WParam= (IntPtr) ((UrduCtrl.Key) UrduPhonetic[strChar]).shift;
}
}
else if (kbState== KeyboardStates.kbAltGr)
{
if (UrduPhonetic.ContainsKey(strChar))
{
m.WParam= (IntPtr) ((UrduCtrl.Key) UrduPhonetic[strChar]).altgr;
}
}
else if (kbState== KeyboardStates.kbNormal)
{
if (UrduPhonetic.ContainsKey(strChar))
{
m.WParam= (IntPtr) ((UrduCtrl.Key) UrduPhonetic[strChar]).normal;
}
}
}
}
else if (m.Msg == WM_KEYDOWN)
{
if((Control.ModifierKeys & Keys.Shift) == Keys.Shift )
{
this.kbState= KeyboardStates.kbShift;
}
else if(((Control.ModifierKeys & Keys.Control) == Keys.Control) && (((Control.ModifierKeys & Keys.Alt) == Keys.Alt)))
{
this.kbState= KeyboardStates.kbAltGr;
char strChar= (char) m.WParam;
strChar= Char.ToLower(strChar);
}
else if((Control.ModifierKeys & Keys.Control) == Keys.Control )
{
this.kbState= KeyboardStates.kbCtrl;
}
}
else if (m.Msg == WM_KEYUP)
{
if(kbState == KeyboardStates.kbAltGr)
{
if(!(((Control.ModifierKeys & Keys.Control) == Keys.Control) && (((Control.ModifierKeys & Keys.Alt) == Keys.Alt))))
{
this.kbState= KeyboardStates.kbNormal;
}
}
else if(kbState == KeyboardStates.kbCtrl)
{
if((Control.ModifierKeys & Keys.Control) != Keys.Control )
{
this.kbState= KeyboardStates.kbNormal;
}
}
else if(kbState == KeyboardStates.kbShift)
{
if((Control.ModifierKeys & Keys.Shift) != Keys.Shift)
{
this.kbState= KeyboardStates.kbNormal;
}
}
}
base.WndProc(ref m);
}
[Category("Appearance"),
Description("Text property for Urdu edit control."),
Editor(typeof(UrduTextPropertyEditor), typeof(UITypeEditor))]
public override string Text
{
get
{
return(base.Text);
}
set
{
base.Text = value;
this.Invalidate();
}
}
}
}
Regards
Thread Tools
Search this Thread
Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
HTML code is Off
All times are GMT -5. The time now is 03:18 PM .
LinuxQuestions.org is looking for people interested in writing
Editorials, Articles, Reviews, and more. If you'd like to contribute
content, let us know .
Latest Threads
LQ News