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.
__________________________________________________________________
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
-- 
View this message in context: http://www.nabble.com/Catching-keyboard-meessages-input-to-a-GTK%28sharp%29-textview-widget-tp18436239p18436239.html
Sent from the Gtk+ - General mailing list archive at Nabble.com.



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]