1
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
4
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
5
<title>Test for modifier keys correctly</title>
6
<meta name="generator" content="DocBook XSL Stylesheets V1.72.0">
7
<link rel="start" href="index.html" title="GTK+ Reference Manual">
8
<link rel="up" href="gtk-migrating-checklist.html" title="Migration Checklist">
9
<link rel="prev" href="checklist-gdkeventexpose-region.html" title="Use GdkEventExpose.region">
10
<link rel="next" href="checklist-named-icons.html" title="Use named icons">
11
<meta name="generator" content="GTK-Doc V1.7 (XML mode)">
12
<link rel="stylesheet" href="style.css" type="text/css">
13
<link rel="part" href="gtk.html" title="Part I. GTK+ Overview">
14
<link rel="part" href="gtkbase.html" title="Part II. GTK+ Core Reference">
15
<link rel="part" href="gtkobjects.html" title="Part III. GTK+ Widgets and Objects">
16
<link rel="chapter" href="ch01.html" title="Object Hierarchy">
17
<link rel="chapter" href="ch02.html" title="Widget Gallery">
18
<link rel="chapter" href="WindowWidgets.html" title="Windows">
19
<link rel="chapter" href="DisplayWidgets.html" title="Display Widgets">
20
<link rel="chapter" href="ButtonWidgets.html" title="Buttons and Toggles">
21
<link rel="chapter" href="NumericEntry.html" title="Numeric/Text Data Entry">
22
<link rel="chapter" href="TextWidgetObjects.html" title="Multiline Text Editor">
23
<link rel="chapter" href="TreeWidgetObjects.html" title="Tree, List and Icon Grid Widgets">
24
<link rel="chapter" href="MenusAndCombos.html" title="Menus, Combo Box, Toolbar">
25
<link rel="chapter" href="Actions.html" title="Action-based menus and toolbars">
26
<link rel="chapter" href="SelectorWidgets.html" title="Selectors (File/Font/Color/Input Devices)">
27
<link rel="chapter" href="LayoutContainers.html" title="Layout Containers">
28
<link rel="chapter" href="Ornaments.html" title="Ornaments">
29
<link rel="chapter" href="ScrollingWidgets.html" title="Scrolling">
30
<link rel="chapter" href="Printing.html" title="Printing">
31
<link rel="chapter" href="MiscObjects.html" title="Miscellaneous">
32
<link rel="chapter" href="AbstractObjects.html" title="Abstract Base Classes">
33
<link rel="chapter" href="PlugSocket.html" title="Cross-process Embedding">
34
<link rel="chapter" href="SpecialObjects.html" title="Special-purpose features">
35
<link rel="chapter" href="RecentDocuments.html" title="Recently Used Documents">
36
<link rel="chapter" href="DeprecatedObjects.html" title="Deprecated">
37
<link rel="part" href="migrating.html" title="Part IV. Migrating from Previous Versions of GTK+">
38
<link rel="chapter" href="gtk-migrating-checklist.html" title="Migration Checklist">
39
<link rel="chapter" href="gtk-migrating-GtkFileChooser.html" title="Migrating from GtkFileSelection to GtkFileChooser">
40
<link rel="chapter" href="gtk-migrating-GtkAction.html" title="Migrating from old menu and toolbar systems to GtkAction">
41
<link rel="chapter" href="gtk-migrating-GtkComboBox.html" title="Migrating from GtkOptionMenu and GtkCombo to GtkComboBox and GtkComboBoxEntry">
42
<link rel="chapter" href="gtk-migrating-GtkIconView.html" title="Migrating from GnomeIconList to GtkIconView">
43
<link rel="chapter" href="gtk-migrating-GtkAboutDialog.html" title="Migrating from GnomeAbout to GtkAboutDialog">
44
<link rel="chapter" href="gtk-migrating-GtkColorButton.html" title="Migrating from GnomeColorPicker to GtkColorButton">
45
<link rel="chapter" href="gtk-migrating-GtkAssistant.html" title="Migrating from GnomeDruid to GtkAssistant">
46
<link rel="chapter" href="gtk-migrating-GtkRecentChooser.html" title="Migrating from EggRecent to GtkRecentChooser">
47
<link rel="chapter" href="gtk-migrating-GtkLinkButton.html" title="Migrating from GnomeHRef to GtkLinkButton">
48
<link rel="part" href="pt05.html" title="Part V. GTK+ Tools">
49
<link rel="glossary" href="glossary.html" title="Glossary">
50
<link rel="index" href="ix01.html" title="Index">
51
<link rel="index" href="ix02.html" title="Index of deprecated symbols">
52
<link rel="index" href="ix03.html" title="Index of new symbols in 2.2">
53
<link rel="index" href="ix04.html" title="Index of new symbols in 2.4">
54
<link rel="index" href="ix05.html" title="Index of new symbols in 2.6">
55
<link rel="index" href="ix06.html" title="Index of new symbols in 2.8">
56
<link rel="index" href="ix07.html" title="Index of new symbols in 2.10">
58
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
59
<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
60
<td><a accesskey="p" href="checklist-gdkeventexpose-region.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
61
<td><a accesskey="u" href="gtk-migrating-checklist.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
62
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
63
<th width="100%" align="center">GTK+ Reference Manual</th>
64
<td><a accesskey="n" href="checklist-named-icons.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
66
<div class="section" lang="en">
67
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
68
<a name="checklist-modifiers"></a>Test for modifier keys correctly</h2></div></div></div>
71
<a href="gtk-Keyboard-Accelerators.html#gtk-accelerator-get-default-mod-mask"><code class="function">gtk_accelerator_get_default_mod_mask()</code></a>
72
you can test for modifier keys reliably; this way your key
73
event handlers will work correctly even if
74
<span><strong class="keycap">NumLock</strong></span> or <span><strong class="keycap">CapsLock</strong></span> are
78
In a <span class="structname">GdkEventKey</span>, the
79
<em class="structfield"><code>state</code></em> field is a bit mask which
80
indicates the modifier state at the time the key was pressed.
81
Modifiers are keys like <span><strong class="keycap">Control</strong></span> and
82
<span><strong class="keycap">NumLock</strong></span>. When implementing a <a href="GtkWidget.html#GtkWidget-key-press-event">GtkWidget::key_press_event</a>
83
handler, you should use <a href="gtk-Keyboard-Accelerators.html#gtk-accelerator-get-default-mod-mask"><code class="function">gtk_accelerator_get_default_mod_mask()</code></a> to
84
test against modifier keys. This function returns a bit mask
85
which encompasses all the modifiers which the user may be
86
actively pressing, such as <span><strong class="keycap">Control</strong></span>,
87
<span><strong class="keycap">Shift</strong></span>, and <span><strong class="keycap">Alt</strong></span>, but ignores
88
"inocuous" modifiers such as <span><strong class="keycap">NumLock</strong></span> and
89
<span><strong class="keycap">CapsLock</strong></span>.
92
Say you want to see if
93
<span><strong class="keycap">Control</strong></span>-<span><strong class="keycap">F10</strong></span>
94
was pressed. Doing a simple test like
95
<code class="literal">event->keysym == GDK_F10 &&
96
event->state == GDK_CONTROL_MASK</code> is not
97
enough. If <span><strong class="keycap">CapsLock</strong></span> is pressed, then
98
<em class="structfield"><code>event->state</code></em> will be equal to
99
<code class="literal">GDK_CONTROL_MASK | GDK_LOCK_MASK</code>, and the
100
simple test will fail. By taking the logical-and of
101
<em class="structfield"><code>event->state</code></em> and
102
<a href="gtk-Keyboard-Accelerators.html#gtk-accelerator-get-default-mod-mask"><code class="function">gtk_accelerator_get_default_mod_mask()</code></a>, you
103
can ignore the modifiers which are not actively pressed by the
104
user at the same time as the base key.
107
The following example correctly tests for
108
<span><strong class="keycap">Control</strong></span>-<span><strong class="keycap">F10</strong></span>
111
<a name="default-mod-mask"></a><pre class="programlisting">
113
my_widget_key_press_event_handler (GtkWidget *widget, GdkEventKey *event)
117
modifiers = gtk_accelerator_get_default_mod_mask ();
119
if (event->keysym == GDK_F10
120
&& (event->state & modifiers) == GDK_CONTROL_MASK)
122
g_print ("Control-F10 was pressed\n");