Re: gtk_entry_new and accented chars
Luiz Rafael Culik Guimaraes-4 wrote: > > Dear Friends > > I have an small app with one gtk_entry_new with an handle to my user > defined key_press_event > > but i cannot get the accented char from latin 1 code page on entry > > here an part of my key handler > > here is the routine for key_press_event > > > #define WM_MOVE 3 > #define WM_SIZE 5 > #define WM_KEYDOWN 256// 0x0100 > #define WM_KEYUP257// 0x0101 > #define WM_MOUSEMOVE512// 0x0200 > #define WM_LBUTTONDOWN 513// 0x0201 > #define WM_LBUTTONUP514// 0x0202 > #define WM_LBUTTONDBLCLK515// 0x0203 > #define WM_RBUTTONDOWN 516// 0x0204 > #define WM_RBUTTONUP517// 0x0205 > > static gint cb_event( GtkWidget *widget, GdkEvent * event, gchar* data ) > { >gpointer gObject = g_object_get_data( (GObject*) widget, "obj" ); >LONG lRes; > >if( !pSym_onEvent ) > pSym_onEvent = hb_dynsymFindName( "ONEVENT" ); > >//if( !gObject ) >// gObject = g_object_get_data( (GObject*) (widget->parent->parent), > "obj" ); >if( pSym_onEvent && gObject ) >{ > LONG p1, p2, p3; > > if( event->type == GDK_KEY_PRESS || event->type == GDK_KEY_RELEASE ) > { > p1 = (event->type==GDK_KEY_PRESS)? WM_KEYDOWN : WM_KEYUP; > p2 = ((GdkEventKey*)event)->keyval; > p3 = ( ( ((GdkEventKey*)event)->state & GDK_SHIFT_MASK )? 1 : 0 ) | >( ( ((GdkEventKey*)event)->state & GDK_CONTROL_MASK )? 2 : 0 ) | >( ( ((GdkEventKey*)event)->state & GDK_MOD1_MASK )? 4 : 0 ); > } > else if( event->type == GDK_SCROLL ) > { > p1 = WM_KEYDOWN; > p2 = ( ( (GdkEventScroll*)event )->direction == GDK_SCROLL_DOWN > )? > 0xFF54 : 0xFF52; > p3 = 0; > } > else if( event->type == GDK_BUTTON_PRESS || >event->type == GDK_2BUTTON_PRESS || > event->type == GDK_BUTTON_RELEASE ) > { > p1 = (event->type==GDK_BUTTON_PRESS)? WM_LBUTTONDOWN : >( (event->type==GDK_BUTTON_RELEASE)? WM_LBUTTONUP : > WM_LBUTTONDBLCLK ); > p2 = 0; > p3 = ( ((ULONG)(((GdkEventButton*)event)->x)) & 0x ) | ( ( > ((ULONG)(((GdkEventButton*)event)->y)) << 16 ) & 0x ); > } > else if( event->type == GDK_MOTION_NOTIFY ) > { > p1 = WM_MOUSEMOVE; > p2 = ( ((GdkEventMotion*)event)->state & GDK_BUTTON1_MASK )? 1:0; > p3 = ( ((ULONG)(((GdkEventMotion*)event)->x)) & 0x ) | ( ( > ((ULONG)(((GdkEventMotion*)event)->y)) << 16 ) & 0x ); > } > else if( event->type == GDK_CONFIGURE ) > { > p2 = 0; > if( widget->allocation.width != > ((GdkEventConfigure*)event)->width > || > widget->allocation.height!= > ((GdkEventConfigure*)event)->height ) > { > return 0; > } > else > { > p1 = WM_MOVE; > p3 = ( ((GdkEventConfigure*)event)->x & 0x ) | > ( ( ((GdkEventConfigure*)event)->y << 16 ) & 0x > ); > } > } > else if( event->type == GDK_ENTER_NOTIFY || event->type == > GDK_LEAVE_NOTIFY ) > { > p1 = WM_MOUSEMOVE; > p2 = ( ((GdkEventCrossing*)event)->state & GDK_BUTTON1_MASK )? > 1:0 > | > ( event->type == GDK_ENTER_NOTIFY )? 0x10:0; > p3 = ( ((ULONG)(((GdkEventCrossing*)event)->x)) & 0x ) | ( ( > ((ULONG)(((GdkEventMotion*)event)->y)) << 16 ) & 0x ); > } > else > sscanf( (char*)data,"%ld %ld %ld",&p1,&p2,&p3 ); > >} >return 0; > } > > any ideia? > > Regards > Luiz > > ___ > gtk-app-devel-list mailing list > gtk-app-devel-list@gnome.org > http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list > > right,you should modify your codes again by virtue of to be in different level(GTK and GDK). if you were to focus on any widgets to get a piece of informations,then your ways to be wrong! -- View this message in context: http://www.nabble.com/gtk_entry_new-and-accented-chars-tp14884653p19118756.html Sent from the Gtk+ - Apps Dev mailing list archive at Nabble.com. ___ gtk-app-devel-list mailing list gtk-app-devel-list@gnome.org http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list
Re: gtk_entry_new and accented chars
Dear Friends I have an small app with one gtk_entry_new with an handle to my user defined key_press_event but i cannot get the accented char from latin 1 code page on entry here an part of my key handler here is the routine for key_press_event #define WM_MOVE 3 #define WM_SIZE 5 #define WM_KEYDOWN 256// 0x0100 #define WM_KEYUP257// 0x0101 #define WM_MOUSEMOVE512// 0x0200 #define WM_LBUTTONDOWN 513// 0x0201 #define WM_LBUTTONUP514// 0x0202 #define WM_LBUTTONDBLCLK515// 0x0203 #define WM_RBUTTONDOWN 516// 0x0204 #define WM_RBUTTONUP517// 0x0205 static gint cb_event( GtkWidget *widget, GdkEvent * event, gchar* data ) { gpointer gObject = g_object_get_data( (GObject*) widget, "obj" ); LONG lRes; if( !pSym_onEvent ) pSym_onEvent = hb_dynsymFindName( "ONEVENT" ); //if( !gObject ) // gObject = g_object_get_data( (GObject*) (widget-parent->parent), "obj" ); if( pSym_onEvent && gObject ) { LONG p1, p2, p3; if( event->type == GDK_KEY_PRESS || event->type == GDK_KEY_RELEASE ) { p1 = (event->type==GDK_KEY_PRESS)? WM_KEYDOWN : WM_KEYUP; p2 = ((GdkEventKey*)event)->keyval; p3 = ( ( ((GdkEventKey*)event)->state & GDK_SHIFT_MASK )? 1 : 0 ) | ( ( ((GdkEventKey*)event)->state & GDK_CONTROL_MASK )? 2 : 0 ) | ( ( ((GdkEventKey*)event)->state & GDK_MOD1_MASK )? 4 : 0 ); } else if( event->type == GDK_SCROLL ) { p1 = WM_KEYDOWN; p2 = ( ( (GdkEventScroll*)event )->direction == GDK_SCROLL_DOWN )? 0xFF54 : 0xFF52; p3 = 0; } else if( event->type == GDK_BUTTON_PRESS || event->type == GDK_2BUTTON_PRESS || event->type == GDK_BUTTON_RELEASE ) { p1 = (event->type==GDK_BUTTON_PRESS)? WM_LBUTTONDOWN : ( (event->type==GDK_BUTTON_RELEASE)? WM_LBUTTONUP : WM_LBUTTONDBLCLK ); p2 = 0; p3 = ( ((ULONG)(((GdkEventButton*)event)->x)) & 0x ) | ( ( ((ULONG)(((GdkEventButton*)event)->y)) << 16 ) & 0x ); } else if( event->type == GDK_MOTION_NOTIFY ) { p1 = WM_MOUSEMOVE; p2 = ( ((GdkEventMotion*)event)->state & GDK_BUTTON1_MASK )? 1:0; p3 = ( ((ULONG)(((GdkEventMotion*)event)->x)) & 0x ) | ( ( ((ULONG)(((GdkEventMotion*)event)->y)) << 16 ) & 0x ); } else if( event->type == GDK_CONFIGURE ) { p2 = 0; if( widget->allocation.width != ((GdkEventConfigure*)event)->width || widget->allocation.height!= ((GdkEventConfigure*)event)->height ) { return 0; } else { p1 = WM_MOVE; p3 = ( ((GdkEventConfigure*)event)->x & 0x ) | ( ( ((GdkEventConfigure*)event)->y << 16 ) & 0x ); } } else if( event->type == GDK_ENTER_NOTIFY || event->type == GDK_LEAVE_NOTIFY ) { p1 = WM_MOUSEMOVE; p2 = ( ((GdkEventCrossing*)event)->state & GDK_BUTTON1_MASK )? 1:0 | ( event->type == GDK_ENTER_NOTIFY )? 0x10:0; p3 = ( ((ULONG)(((GdkEventCrossing*)event)-x)) & 0x ) | ( ( ((ULONG)(((GdkEventMotion*)event)->y)) << 16 ) & 0x ); } else sscanf( (char*)data,"%ld %ld %ld",&p1,&p2,&p3 ); } return 0; } any ideia? Regards Luiz ___ gtk-app-devel-list mailing list gtk-app-devel-list@gnome.org http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list
Re: gtk_entry_new and accented chars
> I ll change the code to get the chars on two strokes by combining then You could also approach the problem at a higher level. Instead of looking at the GDK key events, I'm pretty sure there is some GTK+ signal that you can connect to to get information about the "complete" characters typed. (How well that then fits together with your need to generate emulated Windows messages I can't say.) --tml ___ gtk-app-devel-list mailing list gtk-app-devel-list@gnome.org http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list
Re: gtk_entry_new and accented chars
Tor > for char ä i get this values > (((GdkEventKey*)event)->keyval = 65506 > (((GdkEventKey*)event)->keyval = 65111 > (((GdkEventKey*)event)->keyval = 97 Well, apparently you don't have any 'ä' key on the keyboard, and are entering the 'ä' character using a dead accent sequence. I.e. using two keystrokes, first the (dead) diaeresis key, then 'a'. Each GdkEventKey event corresponds to a physical key press or release, so you don't have any key press that would correspond to the 'ä' character as you don't have any 'ä' key on the keyboard. If you print the keyvals in hex and look them up in gdkkeysyms.h, you will see that: 65506 = 0xFFE2 = GDK_Shift_R 65111 = 0xFE57 = GDK_dead_diaeresis 97 = 0x61 = 'a' >If you desperately need to get the 'ä' using a single keystroke, >switch to a keyboard layout that has a 'ä' key... Brasilian abnt2 dont have such keys, accents chars is get by using the accent key(~^´`¨) + one of the vogels so their an way to get the 'ä' key on two strokes, otherwise, ill change the code to get the chars on two strokes by combining then > >Also, your problem isn't exactly made easier by the fact that you >apparently try to turn GDK events into emulated Windows messages. yes, since is an binding from gtk to xharbour to me compatible with the windows version,i emulate the same windows message on gtk events thanks for the answer Regards Luiz ___ gtk-app-devel-list mailing list gtk-app-devel-list@gnome.org http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list
Re: gtk_entry_new and accented chars
> uchar= gdk_keyval_to_unicode(((GdkEventKey*)event)->keyval); > tmpbuf=g_new0(gchar,7); > g_unichar_to_utf8(uchar,tmpbuf); > res=g_locale_from_utf8(tmpbuf,-1,NULL,NULL,NULL); In your previous message you said you want the character in Latin-1. The code above will give it in the locale's encoding (if possible), which might be something else in general. If you *know* you for some reason explicitly want Latin-1, converting from Unicode to Latin-1 is simple, just verify that the Unicode character value is less than 256 and use it as such. (Please note that many key presses *don't* correspond to any Unicode (or Latin-1, or whatever) character at all, like the shift, alt and control keys, and dead accent keys.) > for char ä i get this values > (((GdkEventKey*)event)->keyval = 65506 > (((GdkEventKey*)event)->keyval = 65111 > (((GdkEventKey*)event)->keyval = 97 Well, apparently you don't have any 'ä' key on the keyboard, and are entering the 'ä' character using a dead accent sequence. I.e. using two keystrokes, first the (dead) diaeresis key, then 'a'. Each GdkEventKey event corresponds to a physical key press or release, so you don't have any key press that would correspond to the 'ä' character as you don't have any 'ä' key on the keyboard. If you print the keyvals in hex and look them up in gdkkeysyms.h, you will see that: 65506 = 0xFFE2 = GDK_Shift_R 65111 = 0xFE57 = GDK_dead_diaeresis 97 = 0x61 = 'a' If you desperately need to get the 'ä' using a single keystroke, switch to a keyboard layout that has a 'ä' key... Also, your problem isn't exactly made easier by the fact that you apparently try to turn GDK events into emulated Windows messages. --tml ___ gtk-app-devel-list mailing list gtk-app-devel-list@gnome.org http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list
Re: gtk_entry_new and accented chars
Hi I manage to get the latin1 with this code p1 = (event->type==GDK_KEY_PRESS)? WM_KEYDOWN : WM_KEYUP; p2 = ((GdkEventKey*)event)->keyval; uchar= gdk_keyval_to_unicode(((GdkEventKey*)event)->keyval); tmpbuf=g_new0(gchar,7); g_unichar_to_utf8(uchar,tmpbuf); res=g_locale_from_utf8(tmpbuf,-1,NULL,NULL,NULL); but for accented char i dont get the correct unicode value for example for char ä i get this values (((GdkEventKey*)event)->keyval = 65506 (((GdkEventKey*)event)->keyval = 65111 (((GdkEventKey*)event)->keyval = 97 some thing like my char is get in pieces, any ideia on how to do this work? Regards Luiz ___ gtk-app-devel-list mailing list gtk-app-devel-list@gnome.org http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list
Re: gtk_entry_new and accented chars
Hi >To get the corresponding Unicode character (if any), use gdk_keyval_to_unicode > (). I'll let you figure out by yourself how to convert from a Unicode > character to Latin1. thanks for answer i tryed to add the code to printf the unicode char but i always get 0 as unicode value for accented char my LANG envar is set to pt_BR on open suse 10.1 Any ideia? Regards Luiz ___ gtk-app-devel-list mailing list gtk-app-devel-list@gnome.org http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list
Re: gtk_entry_new and accented chars
> but i cannot get the accented char from latin 1 code page on entry In the GdkEventKey struct you have the keyval field. That is not a character code in any encoding, it's a GDK "keyval". To get the corresponding Unicode character (if any), use gdk_keyval_to_unicode (). I'll let you figure out by yourself how to convert from a Unicode character to Latin1. --tml ___ gtk-app-devel-list mailing list gtk-app-devel-list@gnome.org http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list