LinuxQuestions.org
Register a domain and help support LQ
Go Back   LinuxQuestions.org > Forums > Non-*NIX Forums > Programming
User Name
Password
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

Reply
 
LinkBack Search this Thread
Old 07-13-2008, 08:49 PM   #1
True_Friend
LQ Newbie
 
Registered: Jan 2007
Posts: 1

Rep: Reputation: 0
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
 
  


Reply

Tags
gtk


Thread Tools Search this Thread
Search this Thread:

Advanced Search

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off
Trackbacks are Off
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
GTK widget which to use? cranium2004 Programming 1 02-20-2006 01:29 PM
GTK & keyboard input joakim12 Programming 1 07-17-2005 07:13 AM
GTK TextView problem alltime Programming 1 06-04-2005 08:10 AM
how to get (makefile -f makefile )output into the textview widget in Pygtk sailu_mvn Programming 3 02-28-2005 03:57 AM
what is a gtk-widget ? gladeiator Programming 3 10-30-2003 05:34 PM


All times are GMT -5. The time now is 03:18 PM.

Main Menu
 
My LQ
Write for LQ
LinuxQuestions.org is looking for people interested in writing Editorials, Articles, Reviews, and more. If you'd like to contribute content, let us know.
Main Menu
Syndicate
RSS1  Latest Threads
RSS1  LQ News
Twitter: @linuxquestions
identi.ca: @linuxquestions
Facebook: @linuxquestions
Open Source Consulting | Domain Registration