1 /* GDK - The GIMP Drawing Kit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
21 * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
22 * file for a list of people on the GTK+ Team. See the ChangeLog
23 * files for a list of changes. These files are distributed with
24 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
28 #include <string.h> /* For memset() */
31 #include "gdkinternals.h"
34 typedef struct _GdkIOClosure GdkIOClosure;
38 GdkInputFunction function;
39 GdkInputCondition condition;
40 GdkDestroyNotify notify;
44 /* Private variable declarations
47 GdkEventFunc _gdk_event_func = NULL; /* Callback for events */
48 gpointer _gdk_event_data = NULL;
49 GDestroyNotify _gdk_event_notify = NULL;
51 /*********************************************
52 * Functions for maintaining the event queue *
53 *********************************************/
56 * _gdk_event_queue_find_first:
57 * @display: a #GdkDisplay
59 * Find the first event on the queue that is not still
62 * Return value: Pointer to the list node for that event, or NULL.
65 _gdk_event_queue_find_first (GdkDisplay *display)
67 GList *tmp_list = display->queued_events;
71 GdkEventPrivate *event = tmp_list->data;
72 if (!(event->flags & GDK_EVENT_PENDING))
75 tmp_list = g_list_next (tmp_list);
82 * _gdk_event_queue_append:
83 * @display: a #GdkDisplay
84 * @event: Event to append.
86 * Appends an event onto the tail of the event queue.
88 * Returns: the newly appended list node.
91 _gdk_event_queue_append (GdkDisplay *display,
94 display->queued_tail = g_list_append (display->queued_tail, event);
96 if (!display->queued_events)
97 display->queued_events = display->queued_tail;
99 display->queued_tail = display->queued_tail->next;
101 return display->queued_tail;
105 * _gdk_event_queue_remove_link:
106 * @display: a #GdkDisplay
107 * @node: node to remove
109 * Removes a specified list node from the event queue.
112 _gdk_event_queue_remove_link (GdkDisplay *display,
116 node->prev->next = node->next;
118 display->queued_events = node->next;
121 node->next->prev = node->prev;
123 display->queued_tail = node->prev;
127 * _gdk_event_unqueue:
128 * @display: a #GdkDisplay
130 * Removes and returns the first event from the event
131 * queue that is not still being filled in.
133 * Return value: the event, or %NULL. Ownership is transferred
137 _gdk_event_unqueue (GdkDisplay *display)
139 GdkEvent *event = NULL;
142 tmp_list = _gdk_event_queue_find_first (display);
146 event = tmp_list->data;
147 _gdk_event_queue_remove_link (display, tmp_list);
148 g_list_free_1 (tmp_list);
155 * gdk_event_handler_set:
156 * @func: the function to call to handle events from GDK.
157 * @data: user data to pass to the function.
158 * @notify: the function to call when the handler function is removed, i.e. when
159 * gdk_event_handler_set() is called with another event handler.
161 * Sets the function to call to handle all events from GDK.
163 * Note that GTK+ uses this to install its own event handler, so it is
164 * usually not useful for GTK+ applications. (Although an application
165 * can call this function then call gtk_main_do_event() to pass
169 gdk_event_handler_set (GdkEventFunc func,
171 GDestroyNotify notify)
173 if (_gdk_event_notify)
174 (*_gdk_event_notify) (_gdk_event_data);
176 _gdk_event_func = func;
177 _gdk_event_data = data;
178 _gdk_event_notify = notify;
184 * Checks all open displays for a #GdkEvent to process,to be processed
185 * on, fetching events from the windowing system if necessary.
186 * See gdk_display_get_event().
188 * Return value: the next #GdkEvent to be processed, or %NULL if no events
189 * are pending. The returned #GdkEvent should be freed with gdk_event_free().
196 for (tmp_list = _gdk_displays; tmp_list; tmp_list = tmp_list->next)
198 GdkEvent *event = gdk_display_get_event (tmp_list->data);
209 * If there is an event waiting in the event queue of some open
210 * display, returns a copy of it. See gdk_display_peek_event().
212 * Return value: a copy of the first #GdkEvent on some event queue, or %NULL if no
213 * events are in any queues. The returned #GdkEvent should be freed with
217 gdk_event_peek (void)
221 for (tmp_list = _gdk_displays; tmp_list; tmp_list = tmp_list->next)
223 GdkEvent *event = gdk_display_peek_event (tmp_list->data);
233 * @event: a #GdkEvent.
235 * Appends a copy of the given event onto the front of the event
236 * queue for event->any.window's display, or the default event
237 * queue if event->any.window is %NULL. See gdk_display_put_event().
240 gdk_event_put (const GdkEvent *event)
244 g_return_if_fail (event != NULL);
246 if (event->any.window)
247 display = gdk_drawable_get_display (event->any.window);
251 g_message ("Falling back to default display for gdk_event_put()"));
252 display = gdk_display_get_default ();
255 gdk_display_put_event (display, event);
258 static GHashTable *event_hash = NULL;
262 * @type: a #GdkEventType
264 * Creates a new event of the given type. All fields are set to 0.
266 * Return value: a newly-allocated #GdkEvent. The returned #GdkEvent
267 * should be freed with gdk_event_free().
272 gdk_event_new (GdkEventType type)
274 GdkEventPrivate *new_private;
278 event_hash = g_hash_table_new (g_direct_hash, NULL);
280 new_private = g_slice_new0 (GdkEventPrivate);
282 new_private->flags = 0;
283 new_private->screen = NULL;
285 g_hash_table_insert (event_hash, new_private, GUINT_TO_POINTER (1));
287 new_event = (GdkEvent *) new_private;
289 new_event->any.type = type;
292 * Bytewise 0 initialization is reasonable for most of the
293 * current event types. Explicitely initialize double fields
294 * since I trust bytewise 0 == 0. less than for integers
299 case GDK_MOTION_NOTIFY:
300 new_event->motion.x = 0.;
301 new_event->motion.y = 0.;
302 new_event->motion.x_root = 0.;
303 new_event->motion.y_root = 0.;
305 case GDK_BUTTON_PRESS:
306 case GDK_2BUTTON_PRESS:
307 case GDK_3BUTTON_PRESS:
308 case GDK_BUTTON_RELEASE:
309 new_event->button.x = 0.;
310 new_event->button.y = 0.;
311 new_event->button.x_root = 0.;
312 new_event->button.y_root = 0.;
315 new_event->scroll.x = 0.;
316 new_event->scroll.y = 0.;
317 new_event->scroll.x_root = 0.;
318 new_event->scroll.y_root = 0.;
320 case GDK_ENTER_NOTIFY:
321 case GDK_LEAVE_NOTIFY:
322 new_event->crossing.x = 0.;
323 new_event->crossing.y = 0.;
324 new_event->crossing.x_root = 0.;
325 new_event->crossing.y_root = 0.;
335 gdk_event_is_allocated (const GdkEvent *event)
338 return g_hash_table_lookup (event_hash, event) != NULL;
345 * @event: a #GdkEvent
347 * Copies a #GdkEvent, copying or incrementing the reference count of the
348 * resources associated with it (e.g. #GdkWindow's and strings).
350 * Return value: a copy of @event. The returned #GdkEvent should be freed with
354 gdk_event_copy (const GdkEvent *event)
356 GdkEventPrivate *new_private;
359 g_return_val_if_fail (event != NULL, NULL);
361 new_event = gdk_event_new (GDK_NOTHING);
362 new_private = (GdkEventPrivate *)new_event;
365 if (new_event->any.window)
366 g_object_ref (new_event->any.window);
368 if (gdk_event_is_allocated (event))
370 GdkEventPrivate *private = (GdkEventPrivate *)event;
372 new_private->screen = private->screen;
375 switch (event->any.type)
378 case GDK_KEY_RELEASE:
379 new_event->key.string = g_strdup (event->key.string);
382 case GDK_ENTER_NOTIFY:
383 case GDK_LEAVE_NOTIFY:
384 if (event->crossing.subwindow != NULL)
385 g_object_ref (event->crossing.subwindow);
390 case GDK_DRAG_MOTION:
391 case GDK_DRAG_STATUS:
393 case GDK_DROP_FINISHED:
394 g_object_ref (event->dnd.context);
398 if (event->expose.region)
399 new_event->expose.region = gdk_region_copy (event->expose.region);
403 new_event->setting.name = g_strdup (new_event->setting.name);
406 case GDK_BUTTON_PRESS:
407 case GDK_BUTTON_RELEASE:
408 if (event->button.axes)
409 new_event->button.axes = g_memdup (event->button.axes,
410 sizeof (gdouble) * event->button.device->num_axes);
413 case GDK_MOTION_NOTIFY:
414 if (event->motion.axes)
415 new_event->motion.axes = g_memdup (event->motion.axes,
416 sizeof (gdouble) * event->motion.device->num_axes);
424 if (gdk_event_is_allocated (event))
425 _gdk_windowing_event_data_copy (new_event, event);
432 * @event: a #GdkEvent.
434 * Frees a #GdkEvent, freeing or decrementing any resources associated with it.
435 * Note that this function should only be called with events returned from
436 * functions such as gdk_event_peek(), gdk_event_get(),
437 * gdk_event_get_graphics_expose() and gdk_event_copy().
440 gdk_event_free (GdkEvent *event)
442 g_return_if_fail (event != NULL);
444 if (event->any.window)
445 g_object_unref (event->any.window);
447 switch (event->any.type)
450 case GDK_KEY_RELEASE:
451 g_free (event->key.string);
454 case GDK_ENTER_NOTIFY:
455 case GDK_LEAVE_NOTIFY:
456 if (event->crossing.subwindow != NULL)
457 g_object_unref (event->crossing.subwindow);
462 case GDK_DRAG_MOTION:
463 case GDK_DRAG_STATUS:
465 case GDK_DROP_FINISHED:
466 g_object_unref (event->dnd.context);
469 case GDK_BUTTON_PRESS:
470 case GDK_BUTTON_RELEASE:
471 g_free (event->button.axes);
475 if (event->expose.region)
476 gdk_region_destroy (event->expose.region);
479 case GDK_MOTION_NOTIFY:
480 g_free (event->motion.axes);
484 g_free (event->setting.name);
491 _gdk_windowing_event_data_free (event);
493 g_hash_table_remove (event_hash, event);
494 g_slice_free (GdkEventPrivate, (GdkEventPrivate*) event);
498 * gdk_event_get_time:
499 * @event: a #GdkEvent
501 * Returns the time stamp from @event, if there is one; otherwise
502 * returns #GDK_CURRENT_TIME. If @event is %NULL, returns #GDK_CURRENT_TIME.
504 * Return value: time stamp field from @event
507 gdk_event_get_time (const GdkEvent *event)
512 case GDK_MOTION_NOTIFY:
513 return event->motion.time;
514 case GDK_BUTTON_PRESS:
515 case GDK_2BUTTON_PRESS:
516 case GDK_3BUTTON_PRESS:
517 case GDK_BUTTON_RELEASE:
518 return event->button.time;
520 return event->scroll.time;
522 case GDK_KEY_RELEASE:
523 return event->key.time;
524 case GDK_ENTER_NOTIFY:
525 case GDK_LEAVE_NOTIFY:
526 return event->crossing.time;
527 case GDK_PROPERTY_NOTIFY:
528 return event->property.time;
529 case GDK_SELECTION_CLEAR:
530 case GDK_SELECTION_REQUEST:
531 case GDK_SELECTION_NOTIFY:
532 return event->selection.time;
533 case GDK_PROXIMITY_IN:
534 case GDK_PROXIMITY_OUT:
535 return event->proximity.time;
538 case GDK_DRAG_MOTION:
539 case GDK_DRAG_STATUS:
541 case GDK_DROP_FINISHED:
542 return event->dnd.time;
543 case GDK_CLIENT_EVENT:
544 case GDK_VISIBILITY_NOTIFY:
547 case GDK_FOCUS_CHANGE:
554 case GDK_WINDOW_STATE:
556 case GDK_OWNER_CHANGE:
557 case GDK_GRAB_BROKEN:
558 /* return current time */
562 return GDK_CURRENT_TIME;
566 * gdk_event_get_state:
567 * @event: a #GdkEvent or NULL
568 * @state: return location for state
570 * If the event contains a "state" field, puts that field in @state. Otherwise
571 * stores an empty state (0). Returns %TRUE if there was a state field
572 * in the event. @event may be %NULL, in which case it's treated
573 * as if the event had no state field.
575 * Return value: %TRUE if there was a state field in the event
578 gdk_event_get_state (const GdkEvent *event,
579 GdkModifierType *state)
581 g_return_val_if_fail (state != NULL, FALSE);
586 case GDK_MOTION_NOTIFY:
587 *state = event->motion.state;
589 case GDK_BUTTON_PRESS:
590 case GDK_2BUTTON_PRESS:
591 case GDK_3BUTTON_PRESS:
592 case GDK_BUTTON_RELEASE:
593 *state = event->button.state;
596 *state = event->scroll.state;
599 case GDK_KEY_RELEASE:
600 *state = event->key.state;
602 case GDK_ENTER_NOTIFY:
603 case GDK_LEAVE_NOTIFY:
604 *state = event->crossing.state;
606 case GDK_PROPERTY_NOTIFY:
607 *state = event->property.state;
609 case GDK_VISIBILITY_NOTIFY:
610 case GDK_CLIENT_EVENT:
613 case GDK_FOCUS_CHANGE:
614 case GDK_SELECTION_CLEAR:
615 case GDK_SELECTION_REQUEST:
616 case GDK_SELECTION_NOTIFY:
617 case GDK_PROXIMITY_IN:
618 case GDK_PROXIMITY_OUT:
621 case GDK_DRAG_MOTION:
622 case GDK_DRAG_STATUS:
624 case GDK_DROP_FINISHED:
631 case GDK_WINDOW_STATE:
633 case GDK_OWNER_CHANGE:
634 case GDK_GRAB_BROKEN:
644 * gdk_event_get_coords:
645 * @event: a #GdkEvent
646 * @x_win: location to put event window x coordinate
647 * @y_win: location to put event window y coordinate
649 * Extract the event window relative x/y coordinates from an event.
651 * Return value: %TRUE if the event delivered event window coordinates
654 gdk_event_get_coords (const GdkEvent *event,
658 gdouble x = 0, y = 0;
659 gboolean fetched = TRUE;
661 g_return_val_if_fail (event != NULL, FALSE);
666 x = event->configure.x;
667 y = event->configure.y;
669 case GDK_ENTER_NOTIFY:
670 case GDK_LEAVE_NOTIFY:
671 x = event->crossing.x;
672 y = event->crossing.y;
678 case GDK_BUTTON_PRESS:
679 case GDK_2BUTTON_PRESS:
680 case GDK_3BUTTON_PRESS:
681 case GDK_BUTTON_RELEASE:
685 case GDK_MOTION_NOTIFY:
703 * gdk_event_get_root_coords:
704 * @event: a #GdkEvent
705 * @x_root: location to put root window x coordinate
706 * @y_root: location to put root window y coordinate
708 * Extract the root window relative x/y coordinates from an event.
710 * Return value: %TRUE if the event delivered root window coordinates
713 gdk_event_get_root_coords (const GdkEvent *event,
717 gdouble x = 0, y = 0;
718 gboolean fetched = TRUE;
720 g_return_val_if_fail (event != NULL, FALSE);
724 case GDK_MOTION_NOTIFY:
725 x = event->motion.x_root;
726 y = event->motion.y_root;
729 x = event->scroll.x_root;
730 y = event->scroll.y_root;
732 case GDK_BUTTON_PRESS:
733 case GDK_2BUTTON_PRESS:
734 case GDK_3BUTTON_PRESS:
735 case GDK_BUTTON_RELEASE:
736 x = event->button.x_root;
737 y = event->button.y_root;
739 case GDK_ENTER_NOTIFY:
740 case GDK_LEAVE_NOTIFY:
741 x = event->crossing.x_root;
742 y = event->crossing.y_root;
746 case GDK_DRAG_MOTION:
747 case GDK_DRAG_STATUS:
749 case GDK_DROP_FINISHED:
750 x = event->dnd.x_root;
751 y = event->dnd.y_root;
767 * gdk_event_get_axis:
768 * @event: a #GdkEvent
769 * @axis_use: the axis use to look for
770 * @value: location to store the value found
772 * Extract the axis value for a particular axis use from
773 * an event structure.
775 * Return value: %TRUE if the specified axis was found, otherwise %FALSE
778 gdk_event_get_axis (const GdkEvent *event,
785 g_return_val_if_fail (event != NULL, FALSE);
787 if (axis_use == GDK_AXIS_X || axis_use == GDK_AXIS_Y)
793 case GDK_MOTION_NOTIFY:
801 case GDK_BUTTON_PRESS:
802 case GDK_BUTTON_RELEASE:
806 case GDK_ENTER_NOTIFY:
807 case GDK_LEAVE_NOTIFY:
808 x = event->crossing.x;
809 y = event->crossing.y;
816 if (axis_use == GDK_AXIS_X && value)
818 if (axis_use == GDK_AXIS_Y && value)
823 else if (event->type == GDK_BUTTON_PRESS ||
824 event->type == GDK_BUTTON_RELEASE)
826 device = event->button.device;
827 axes = event->button.axes;
829 else if (event->type == GDK_MOTION_NOTIFY)
831 device = event->motion.device;
832 axes = event->motion.axes;
837 return gdk_device_get_axis (device, axes, axis_use, value);
841 * gdk_event_request_motions:
842 * @event: a valid #GdkEvent
844 * Request more motion notifies if @event is a motion notify hint event.
845 * This function should be used instead of gdk_window_get_pointer() to
846 * request further motion notifies, because it also works for extension
847 * events where motion notifies are provided for devices other than the
848 * core pointer. Coordinate extraction, processing and requesting more
849 * motion events from a %GDK_MOTION_NOTIFY event usually works like this:
853 * /* motion_event handler */
854 * x = motion_event->x;
855 * y = motion_event->y;
856 * /* handle (x,y) motion */
857 * gdk_event_request_motions (motion_event); /* handles is_hint events */
864 gdk_event_request_motions (const GdkEventMotion *event)
866 g_return_if_fail (event != NULL);
867 if (event->type == GDK_MOTION_NOTIFY && event->is_hint)
868 gdk_device_get_state (event->device, event->window, NULL, NULL);
872 * gdk_event_set_screen:
873 * @event: a #GdkEvent
874 * @screen: a #GdkScreen
876 * Sets the screen for @event to @screen. The event must
877 * have been allocated by GTK+, for instance, by
883 gdk_event_set_screen (GdkEvent *event,
886 GdkEventPrivate *private;
888 g_return_if_fail (gdk_event_is_allocated (event));
890 private = (GdkEventPrivate *)event;
892 private->screen = screen;
896 * gdk_event_get_screen:
897 * @event: a #GdkEvent
899 * Returns the screen for the event. The screen is
900 * typically the screen for <literal>event->any.window</literal>, but
901 * for events such as mouse events, it is the screen
902 * where the pointer was when the event occurs -
903 * that is, the screen which has the root window
904 * to which <literal>event->motion.x_root</literal> and
905 * <literal>event->motion.y_root</literal> are relative.
907 * Return value: the screen for the event
912 gdk_event_get_screen (const GdkEvent *event)
914 if (gdk_event_is_allocated (event))
916 GdkEventPrivate *private = (GdkEventPrivate *)event;
919 return private->screen;
922 if (event->any.window)
923 return gdk_drawable_get_screen (event->any.window);
929 * gdk_set_show_events:
930 * @show_events: %TRUE to output event debugging information.
932 * Sets whether a trace of received events is output.
933 * Note that GTK+ must be compiled with debugging (that is,
934 * configured using the <option>--enable-debug</option> option)
935 * to use this option.
938 gdk_set_show_events (gboolean show_events)
941 _gdk_debug_flags |= GDK_DEBUG_EVENTS;
943 _gdk_debug_flags &= ~GDK_DEBUG_EVENTS;
947 * gdk_get_show_events:
949 * Gets whether event debugging output is enabled.
951 * Return value: %TRUE if event debugging output is enabled.
954 gdk_get_show_events (void)
956 return (_gdk_debug_flags & GDK_DEBUG_EVENTS) != 0;
960 gdk_io_destroy (gpointer data)
962 GdkIOClosure *closure = data;
965 closure->notify (closure->data);
970 /* What do we do with G_IO_NVAL?
972 #define READ_CONDITION (G_IO_IN | G_IO_HUP | G_IO_ERR)
973 #define WRITE_CONDITION (G_IO_OUT | G_IO_ERR)
974 #define EXCEPTION_CONDITION (G_IO_PRI)
977 gdk_io_invoke (GIOChannel *source,
978 GIOCondition condition,
981 GdkIOClosure *closure = data;
982 GdkInputCondition gdk_cond = 0;
984 if (condition & READ_CONDITION)
985 gdk_cond |= GDK_INPUT_READ;
986 if (condition & WRITE_CONDITION)
987 gdk_cond |= GDK_INPUT_WRITE;
988 if (condition & EXCEPTION_CONDITION)
989 gdk_cond |= GDK_INPUT_EXCEPTION;
991 if (closure->condition & gdk_cond)
992 closure->function (closure->data, g_io_channel_unix_get_fd (source), gdk_cond);
998 gdk_input_add_full (gint source,
999 GdkInputCondition condition,
1000 GdkInputFunction function,
1002 GdkDestroyNotify destroy)
1005 GdkIOClosure *closure = g_new (GdkIOClosure, 1);
1006 GIOChannel *channel;
1007 GIOCondition cond = 0;
1009 closure->function = function;
1010 closure->condition = condition;
1011 closure->notify = destroy;
1012 closure->data = data;
1014 if (condition & GDK_INPUT_READ)
1015 cond |= READ_CONDITION;
1016 if (condition & GDK_INPUT_WRITE)
1017 cond |= WRITE_CONDITION;
1018 if (condition & GDK_INPUT_EXCEPTION)
1019 cond |= EXCEPTION_CONDITION;
1021 channel = g_io_channel_unix_new (source);
1022 result = g_io_add_watch_full (channel, G_PRIORITY_DEFAULT, cond,
1024 closure, gdk_io_destroy);
1025 g_io_channel_unref (channel);
1031 gdk_input_add (gint source,
1032 GdkInputCondition condition,
1033 GdkInputFunction function,
1036 return gdk_input_add_full (source, condition, function, data, NULL);
1040 gdk_input_remove (gint tag)
1042 g_source_remove (tag);
1046 gdk_synthesize_click (GdkDisplay *display,
1050 GdkEvent temp_event;
1052 g_return_if_fail (event != NULL);
1054 temp_event = *event;
1055 temp_event.type = (nclicks == 2) ? GDK_2BUTTON_PRESS : GDK_3BUTTON_PRESS;
1057 gdk_display_put_event (display, &temp_event);
1061 _gdk_event_button_generate (GdkDisplay *display,
1064 if ((event->button.time < (display->button_click_time[1] + 2*display->double_click_time)) &&
1065 (event->button.window == display->button_window[1]) &&
1066 (event->button.button == display->button_number[1]) &&
1067 (ABS (event->button.x - display->button_x[1]) <= display->double_click_distance) &&
1068 (ABS (event->button.y - display->button_y[1]) <= display->double_click_distance))
1070 gdk_synthesize_click (display, event, 3);
1072 display->button_click_time[1] = 0;
1073 display->button_click_time[0] = 0;
1074 display->button_window[1] = NULL;
1075 display->button_window[0] = NULL;
1076 display->button_number[1] = -1;
1077 display->button_number[0] = -1;
1078 display->button_x[0] = display->button_x[1] = 0;
1079 display->button_y[0] = display->button_y[1] = 0;
1081 else if ((event->button.time < (display->button_click_time[0] + display->double_click_time)) &&
1082 (event->button.window == display->button_window[0]) &&
1083 (event->button.button == display->button_number[0]) &&
1084 (ABS (event->button.x - display->button_x[0]) <= display->double_click_distance) &&
1085 (ABS (event->button.y - display->button_y[0]) <= display->double_click_distance))
1087 gdk_synthesize_click (display, event, 2);
1089 display->button_click_time[1] = display->button_click_time[0];
1090 display->button_click_time[0] = event->button.time;
1091 display->button_window[1] = display->button_window[0];
1092 display->button_window[0] = event->button.window;
1093 display->button_number[1] = display->button_number[0];
1094 display->button_number[0] = event->button.button;
1095 display->button_x[1] = display->button_x[0];
1096 display->button_x[0] = event->button.x;
1097 display->button_y[1] = display->button_y[0];
1098 display->button_y[0] = event->button.y;
1102 display->button_click_time[1] = 0;
1103 display->button_click_time[0] = event->button.time;
1104 display->button_window[1] = NULL;
1105 display->button_window[0] = event->button.window;
1106 display->button_number[1] = -1;
1107 display->button_number[0] = event->button.button;
1108 display->button_x[1] = 0;
1109 display->button_x[0] = event->button.x;
1110 display->button_y[1] = 0;
1111 display->button_y[0] = event->button.y;
1116 gdk_synthesize_window_state (GdkWindow *window,
1117 GdkWindowState unset_flags,
1118 GdkWindowState set_flags)
1120 GdkEvent temp_event;
1123 g_return_if_fail (window != NULL);
1125 temp_event.window_state.window = window;
1126 temp_event.window_state.type = GDK_WINDOW_STATE;
1127 temp_event.window_state.send_event = FALSE;
1129 old = ((GdkWindowObject*) temp_event.window_state.window)->state;
1131 temp_event.window_state.new_window_state = old;
1132 temp_event.window_state.new_window_state |= set_flags;
1133 temp_event.window_state.new_window_state &= ~unset_flags;
1134 temp_event.window_state.changed_mask = temp_event.window_state.new_window_state ^ old;
1136 if (temp_event.window_state.new_window_state == old)
1137 return; /* No actual work to do, nothing changed. */
1139 /* Actually update the field in GdkWindow, this is sort of an odd
1140 * place to do it, but seems like the safest since it ensures we expose no
1141 * inconsistent state to the user.
1144 ((GdkWindowObject*) window)->state = temp_event.window_state.new_window_state;
1146 /* We only really send the event to toplevels, since
1147 * all the window states don't apply to non-toplevels.
1148 * Non-toplevels do use the GDK_WINDOW_STATE_WITHDRAWN flag
1149 * internally so we needed to update window->state.
1151 switch (((GdkWindowObject*) window)->window_type)
1153 case GDK_WINDOW_TOPLEVEL:
1154 case GDK_WINDOW_DIALOG:
1155 case GDK_WINDOW_TEMP: /* ? */
1156 gdk_display_put_event (gdk_drawable_get_display (window), &temp_event);
1159 case GDK_WINDOW_FOREIGN:
1160 case GDK_WINDOW_ROOT:
1161 case GDK_WINDOW_CHILD:
1167 * gdk_display_set_double_click_time:
1168 * @display: a #GdkDisplay
1169 * @msec: double click time in milliseconds (thousandths of a second)
1171 * Sets the double click time (two clicks within this time interval
1172 * count as a double click and result in a #GDK_2BUTTON_PRESS event).
1173 * Applications should <emphasis>not</emphasis> set this, it is a global
1174 * user-configured setting.
1179 gdk_display_set_double_click_time (GdkDisplay *display,
1182 display->double_click_time = msec;
1186 * gdk_set_double_click_time:
1187 * @msec: double click time in milliseconds (thousandths of a second)
1189 * Set the double click time for the default display. See
1190 * gdk_display_set_double_click_time().
1191 * See also gdk_display_set_double_click_distance().
1192 * Applications should <emphasis>not</emphasis> set this, it is a
1193 * global user-configured setting.
1196 gdk_set_double_click_time (guint msec)
1198 gdk_display_set_double_click_time (gdk_display_get_default (), msec);
1202 * gdk_display_set_double_click_distance:
1203 * @display: a #GdkDisplay
1204 * @distance: distance in pixels
1206 * Sets the double click distance (two clicks within this distance
1207 * count as a double click and result in a #GDK_2BUTTON_PRESS event).
1208 * See also gdk_display_set_double_click_time().
1209 * Applications should <emphasis>not</emphasis> set this, it is a global
1210 * user-configured setting.
1215 gdk_display_set_double_click_distance (GdkDisplay *display,
1218 display->double_click_distance = distance;
1222 gdk_event_get_type (void)
1224 static GType our_type = 0;
1227 our_type = g_boxed_type_register_static (g_intern_static_string ("GdkEvent"),
1228 (GBoxedCopyFunc)gdk_event_copy,
1229 (GBoxedFreeFunc)gdk_event_free);
1235 * @name: the name of the setting.
1236 * @value: location to store the value of the setting.
1238 * Obtains a desktop-wide setting, such as the double-click time,
1239 * for the default screen. See gdk_screen_get_setting().
1241 * Returns : %TRUE if the setting existed and a value was stored
1242 * in @value, %FALSE otherwise.
1245 gdk_setting_get (const gchar *name,
1248 return gdk_screen_get_setting (gdk_screen_get_default (), name, value);
1251 #define __GDK_EVENTS_C__
1252 #include "gdkaliasdef.c"