?? sec-gdkevent.html
字號:
<tr> <td align="LEFT" valign="TOP"> <span class="STRUCTNAME"> GDK_KEY_RELEASE_MASK</span> </td> <td align="LEFT" valign="TOP"> <span class="STRUCTNAME">GDK_KEY_RELEASE</span> </td> </tr> <tr> <td align="LEFT" valign="TOP"> <span class="STRUCTNAME"> GDK_ENTER_NOTIFY_MASK</span> </td> <td align="LEFT" valign="TOP"> <span class="STRUCTNAME">GDK_ENTER_NOTIFY</span> </td> </tr> <tr> <td align="LEFT" valign="TOP"> <span class="STRUCTNAME"> GDK_LEAVE_NOTIFY_MASK</span> </td> <td align="LEFT" valign="TOP"> <span class="STRUCTNAME">GDK_LEAVE_NOTIFY</span> </td> </tr> <tr> <td align="LEFT" valign="TOP"> <span class="STRUCTNAME"> GDK_FOCUS_CHANGE_MASK</span> </td> <td align="LEFT" valign="TOP"> <span class="STRUCTNAME">GDK_FOCUS_IN</span>, <span class="STRUCTNAME">GDK_FOCUS_OUT</span> </td> </tr> <tr> <td align="LEFT" valign="TOP"> <span class="STRUCTNAME">GDK_STRUCTURE_MASK</span> </td> <td align="LEFT" valign="TOP"> <span class="STRUCTNAME">GDK_CONFIGURE</span>, <span class="STRUCTNAME">GDK_DESTROY</span>, <span class="STRUCTNAME">GDK_MAP</span>, <span class= "STRUCTNAME">GDK_UNMAP</span> </td> </tr> <tr> <td align="LEFT" valign="TOP"> <span class="STRUCTNAME"> GDK_PROPERTY_CHANGE_MASK</span> </td> <td align="LEFT" valign="TOP"> <span class="STRUCTNAME">GDK_PROPERTY_NOTIFY</span> </td> </tr> <tr> <td align="LEFT" valign="TOP"> <span class="STRUCTNAME"> GDK_VISIBILITY_NOTIFY_MASK</span> </td> <td align="LEFT" valign="TOP"> <span class="STRUCTNAME"> GDK_VISIBILITY_NOTIFY</span> </td> </tr> <tr> <td align="LEFT" valign="TOP"> <span class="STRUCTNAME"> GDK_PROXIMITY_IN_MASK</span> </td> <td align="LEFT" valign="TOP"> <span class="STRUCTNAME">GDK_PROXIMITY_IN</span> </td> </tr> <tr> <td align="LEFT" valign="TOP"> <span class="STRUCTNAME"> GDK_PROXIMITY_OUT_MASK</span> </td> <td align="LEFT" valign="TOP"> <span class="STRUCTNAME">GDK_PROXIMITY_OUT</span> </td> </tr> <tr> <td align="LEFT" valign="TOP"> <span class="STRUCTNAME"> GDK_SUBSTRUCTURE_MASK</span> </td> <td align="LEFT" valign="TOP"> Receive <span class="STRUCTNAME"> GDK_STRUCTURE_MASK</span> events for <i class= "EMPHASIS">child windows</i> </td> </tr> <tr> <td align="LEFT" valign="TOP"> <span class="STRUCTNAME">GDK_ALL_EVENTS_MASK</span> </td> <td align="LEFT" valign="TOP"> All events </td> </tr> </table> </div> </div> <div class="SECT2"> <h2 class="SECT2"> <a name="SEC-GTKEVENTS">Receiving GDK Events in GTK+</a> </h2> <p> In a GTK+ program, you will never receive GDK events directly. Instead, all events are passed to a <tt class= "CLASSNAME">GtkWidget</tt>, which emits a corresponding signal. You handle events by connecting handlers to <tt class="CLASSNAME">GtkWidget</tt> signals. </p> <p> The X server sends each X client a stream of events. Events are sent and received in the order of their occurrence. GDK converts each <span class="STRUCTNAME"> XEvent</span> it receives into a <span class= "STRUCTNAME">GdkEvent</span>, then places events in a queue. GTK+ monitors GDK's event queue; for each event received, it decides which widget (if any) should receive the event. The <tt class="CLASSNAME">GtkWidget</tt> base class defines signals for most event types (such as <span class="SYMBOL">"button_press_event"</span>); it also defines a generic <span class="SYMBOL">"event"</span> signal. The GTK+ main loop calls <tt class="FUNCTION"> gtk_widget_event()</tt> to deliver an event to a widget; this function first emits the <span class="SYMBOL"> "event"</span> signal, then emits a signal for the specific event type (if appropriate). Some events are handled in special ways; notably, drag-and-drop events do not directly correspond to drag-and-drop signals. </p> <p> In general, events go to the widget owning the <span class="STRUCTNAME">GdkWindow</span> the event occurred on. However, there are certain special cases. </p> <p> if a widget has the grab (i.e., if <tt class="FUNCTION"> gtk_grab_add()</tt> was called, see <a href= "z57.html#SEC-GRABS">the section called <i>Grabs</i> in the chapter called <i>GTK+ Basics</i></a>), certain events will only be forwarded to the widget with the grab, or the children of that widget. Events that occur on other widgets are ignored. Only certain user-initiated events such as button events and key events are affected by a grab. </p> <p> Widget sensitivity (see <a href= "z57.html#SEC-SENSITIVITY">the section called <i> Sensitivity</i> in the chapter called <i>GTK+ Basics</i></a>) also affects where events are sent. Events representing user interaction are not forwarded to insensitive widgets. </p> <p> As you might expect, widgets with no associated <span class="STRUCTNAME">GdkWindow</span> do not originate events; X only sends events to windows. There is one exception: containers synthesize expose events for their windowless children. </p> <p> The GTK+ main loop <i class="EMPHASIS">propagates</i> certain events from child widgets to their parent containers. That is, for each event, a signal is emitted first from a child widget, then from its immediate parent, then from the parent's parent, and so on. For example, if you click a <tt class="CLASSNAME"> GtkMenuItem</tt>, it ignores the button press and lets the menu it's a part of handle it. Some events are not propagated; <a href="sec-gdkevent.html#TAB-WIDGETEVENTS"> Table 4</a> gives details. </p> <p> Event propagation ends once a widget "handles" the event. This ensures that only one user-visible change results from any user action. Handlers for <tt class="CLASSNAME"> GtkWidget</tt>'s event signals must return a <span class= "STRUCTNAME">gint</span> value. Recall that the last signal handler to run determines the return value of a signal emission---see <a href="z109.html#SEC-EMITTING"> the section called <i>Emitting A Signal</i> in the chapter called <i>The GTK+ Object and Type System</i></a>. All event signals are <span class= "STRUCTNAME">GTK_RUN_LAST</span>, so the return value will come from: </p> <ul> <li> <p> The last handler connected with <tt class="FUNCTION"> gtk_signal_connect_after()</tt>, if any. </p> </li> <li> <p> Otherwise, the widget's default signal handler, if any. </p> </li> <li> <p> Otherwise, the last handler connected with <tt class= "FUNCTION">gtk_signal_connect()</tt>, if any. </p> </li> <li> <p> Otherwise, the default return value is <span class= "STRUCTNAME">FALSE</span>. </p> </li> </ul> <p> If the emission of an event signal returns <span class= "STRUCTNAME">TRUE</span>, the GTK+ main loop will stop propagating the current event. If it returns <span class= "STRUCTNAME">FALSE</span>, the main loop will propagate the event to the widget's parent. Recall that each event results in two signal emissions: a generic <span class= "SYMBOL">"event"</span> signal and a specific signal (such as <span class="SYMBOL">"button_press_event"</span> or <span class="SYMBOL">"key_press_event"</span>). If <i class="EMPHASIS">either</i> emission returns <span class= "STRUCTNAME">TRUE</span>, event propagation ends. The return value from the generic <span class="SYMBOL"> "event"</span> signal has one additional effect: if <span class="STRUCTNAME">TRUE</span>, the second, more specific signal will not be emitted. </p> <p> <a href="sec-gdkevent.html#TAB-WIDGETEVENTS">Table 4</a> summarizes how <tt class="CLASSNAME">GtkWidget</tt> signals correspond to event types, which events are affected by an active grab, and which events are propagated from parent to child. Signal handlers for all event signals should return a <span class="STRUCTNAME"> gint</span> and take three arguments: the widget emitting the signal, the event which triggered the signal, and a user data pointer. </p> <div class="TABLE"> <a name="TAB-WIDGETEVENTS"></a> <p> <b>Table 4. <tt class="CLASSNAME">GtkWidget</tt> Events</b> </p> <table border="1" bgcolor="#E0E0E0" cellspacing="0" cellpadding="4" class="CALSTABLE"> <tr> <th align="LEFT" valign="TOP"> Event Type </th> <th align="LEFT" valign="TOP"> <tt class="CLASSNAME">GtkWidget</tt> Signal </th> <th align="LEFT" valign="TOP"> Propagated? </th> <th align="LEFT" valign="TOP"> Grabbed? </th> </tr> <tr> <td align="LEFT" valign="TOP"> <span class="STRUCTNAME">GDK_DELETE</span> </td> <td align="LEFT" valign="TOP"> <span class="SYMBOL">"delete_event"</span> </td> <td align="LEFT" valign="TOP"> No </td> <td align="LEFT" valign="TOP"> No </td> </tr> <tr> <td align="LEFT" valign="TOP"> <span class="STRUCTNAME">GDK_DESTROY</span> </td> <td align="LEFT" valign="TOP"> <span class="SYMBOL">"destroy_event"</span> </td> <td align="LEFT" valign="TOP"> No </td> <td align="LEFT" valign="TOP"> No </td> </tr> <tr> <td align="LEFT" valign="TOP"> <span class="STRUCTNAME">GDK_EXPOSE</span> </td> <td align="LEFT" valign="TOP"> <span class="SYMBOL">"expose_event"</span> </td> <td align="LEFT" valign="TOP"> No </td> <td align="LEFT" valign="TOP"> No </td> </tr> <tr> <td align="LEFT" valign="TOP"> <span class="STRUCTNAME">GDK_MOTION_NOTIFY</span> </td> <td align="LEFT" valign="TOP"> <span class="SYMBOL">"motion_notify_event"</span> </td> <td align="LEFT" valign="TOP"> Yes </td> <td align="LEFT" valign="TOP"> Yes </td> </tr> <tr> <td align="LEFT" valign="TOP"> <span class="STRUCTNAME">GDK_BUTTON_PRESS</span> </td> <td align="LEFT" valign="TOP"> <span class="SYMBOL">"button_press_event"</span> </td> <td align="LEFT" valign="TOP"> Yes </td> <td align="LEFT" valign="TOP"> Yes </td> </tr> <tr> <td align="LEFT" valign="TOP"> <span class="STRUCTNAME">GDK_2BUTTON_PRESS</span> </td> <td align="LEFT" valign="TOP"> <span class="SYMBOL">"button_press_event"</span> </td> <td align="LEFT" valign="TOP"> Yes </td> <td align="LEFT" valign="TOP"> Yes </td> </tr> <tr> <td align="LEFT" valign="TOP"> <span class="STRUCTNAME">GDK_3BUTTON_PRESS</span>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -