Re: Questions on Key-Press Event



Luca Cappa wrote:

Hello,

I havent really exactly understood what the answer by Bob is suggesting
to do in that case. Could explain more? I am very interested in it.
Anyway, in my own application i just override the on_key_release_event in the main window, and i try to eat the "key released" event, and in that case i return true. otherwise i just call the standard handler of "event key released" of the main window, as shown below:


bool MyWindow::on_key_release_event (GdkEventKey* pEvent)
{
    if (......)//Try to eat it
    {
    //eat it!
        return true;
    }//if
    else
    {
        return Gtk::Window::on_key_release_event (pEvent);
    }//else

Luca

Bob Caryl wrote:

Hello,

I have several applications that use more than one window. I implemented context sensitive help by using the following in the constructor for the main application window:

// code snippet
Gtk::Main::signal_key_snooper().connect(sigc::mem_fun(*this,&<your window class name::your callback slot>));
///////////////////////

where "your window class name" is what it describes, as well as "your callback slot." In the callback slot connected to this signal, you can intercept any keystroke you like, then return 1 so the regular keystroke handlers will ignore the keystroke, or 0 to allow this event to be passed along to them.

The callback syntax is like this:

// code snippet
sigc::slot< int, Widget *, GdkEventKey * >
/////////////////////////////////////////////

or:

// code snippet
int <your widget class name>::<your callback slot name>(Gtk::Widget *,GdkEventKey *)
{
   ... your code goes here
}
///////////////////////////////////////////

The widget pointer passed to your function points to the widget that had focus when the key was pressed.
GdkEventKey is as follows:

// code snippet
typedef struct {
 GdkEventType type;
 GdkWindow *window;
 gint8 send_event;
 guint32 time;
 guint state;
 guint keyval;
 gint length;
 gchar *string;
 guint16 hardware_keycode;
 guint8 group;
} GdkEventKey;
///////////////////////////////////////////

Describes a key press or key release event.

GdkEventType <cid:part1.01000202.04020205@fis-cal.com> /type/; the type of the event (GDK_KEY_PRESS or GDK_KEY_RELEASE). GdkWindow <cid:part2.04000809.05080203@fis-cal.com> */window/; the window which received the event. gint8 <cid:part3.09050804.02010101@fis-cal.com> /send_event/; TRUE if the event was sent explicitly (e.g. using XSendEvent). guint32 <cid:part4.04020206.09030901@fis-cal.com> /time/; the time of the event in milliseconds. guint <cid:part5.06070804.09090804@fis-cal.com> /state/; a bit-mask representing the state of the modifier keys (e.g. Control, Shift and Alt) and the pointer buttons. See GdkModifierType <cid:part6.01030209.08030201@fis-cal.com>. guint <cid:part5.06070804.09090804@fis-cal.com> /keyval/; the key that was pressed or released. See the <gdk/gdkkeysyms.h> header file for a complete list of GDK key codes. gint <cid:part8.05050907.05060706@fis-cal.com> /length/; the length of /string/. gchar <cid:part9.07020608.06070005@fis-cal.com> */string/; a string containing the an approximation of the text that would result from this keypress. The only correct way to handle text input of text is using input methods (see GtkIMContext <cid:part10.05080800.07080200@fis-cal.com>), so this field is deprecated and should never be used. (gdk_unicode_to_keyval() <cid:part11.08050709.03050102@fis-cal.com> provides a non-deprecated way of getting an approximate translation for a key.) The string is encoded in the encoding of the current locale (Note: this for backwards compatibility: strings in GTK+ and GDK are typically in UTF-8.) and NUL-terminated. In some cases, the translation of the key code will be a single NUL byte, in which case looking at /length/ is necessary to distinguish it from the an empty translation. guint16 <cid:part12.00000809.07050707@fis-cal.com> /hardware_keycode/; the raw code of the key that was pressed or released. guint8 <cid:part13.01050009.09090503@fis-cal.com> /group/; the keyboard group.


I use the "keyval" field of this structure in my application. The above information tells you which include file has all the key values defined.

I hope this helps a little bit.

Bob

Efrat Regev wrote:

 Hello,

 I'm having some difficulty with key-press events,
and haven't been able to find answers in the mailing
list, docs, faqs, etc. I'd very much appreciate any
help.

 My main window has a menu-bar, tool-bar, and other
widget children. I'm trying to capture the events of
the keyboard's arrows being pressed (since the
application is a simple game). My main window
overrides
virtual bool
my_main_wnd::on_key_press_event(GdkEventKey *p_event).
This doesn't work (for me), due to two reasons:
A. When my main window overrides on_key_press_event, I
get notified of these events, but the keyboard has no
effect on the window's menu. When I erase the
override, however, the menu works fine with the
keyboard. Is there a way to both get the key-press
event and have the menu working properly?
B. In on_key_press_event, I switch(){} on
p_event->keyval. I'm checking for cases such as case
GDK_leftarrow:, but when I press the left key I get a
different value (65361), not the one I expect
(GDK_leftarrow). What should I write in the case _:,
therefore?

 Again, many thanks for you time. Additionally,
thanks to all those who contributed to this awesome
ass-kicking library!




__________________________________ Yahoo! Music Unlimited Access over 1 million songs. Try it free.
http://music.yahoo.com/unlimited/
_______________________________________________
gtkmm-list mailing list
gtkmm-list gnome org
http://mail.gnome.org/mailman/listinfo/gtkmm-list


_______________________________________________
gtkmm-list mailing list
gtkmm-list gnome org
http://mail.gnome.org/mailman/listinfo/gtkmm-list



_______________________________________________
gtkmm-list mailing list
gtkmm-list gnome org
http://mail.gnome.org/mailman/listinfo/gtkmm-list

The difference in what I did, and what you did is this: I am capturing key strokes at the *application* level rather than at the level of an individual window level; because I can have more than one window open at any given time in my application and I want a particular keystroke to invoke my on demand help regardless of what window had focus at the time. This method allows me to do this without overriding all those on_key_released() methods in all the windows I might have displayed. At you can see from the GdkEventKey structure definition, a pointer to the window receiving the keystroke is provided to me.

Bob



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