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/.
27 #include <string.h> /* For memset() */
30 #include "gdkinternals.h"
32 typedef struct _GdkIOClosure GdkIOClosure;
36 GdkInputFunction function;
37 GdkInputCondition condition;
38 GdkDestroyNotify notify;
42 /* Private variable declarations
45 GdkEventFunc _gdk_event_func = NULL; /* Callback for events */
46 gpointer _gdk_event_data = NULL;
47 GDestroyNotify _gdk_event_notify = NULL;
49 /*********************************************
50 * Functions for maintaining the event queue *
51 *********************************************/
54 * _gdk_event_queue_find_first:
55 * @display: a #GdkDisplay
57 * Find the first event on the queue that is not still
60 * Return value: Pointer to the list node for that event, or NULL.
63 _gdk_event_queue_find_first (GdkDisplay *display)
65 GList *tmp_list = display->queued_events;
69 GdkEventPrivate *event = tmp_list->data;
70 if (!(event->flags & GDK_EVENT_PENDING))
73 tmp_list = g_list_next (tmp_list);
80 * _gdk_event_queue_append:
81 * @display: a #GdkDisplay
82 * @event: Event to append.
84 * Appends an event onto the tail of the event queue.
86 * Returns: the newly appended list node.
89 _gdk_event_queue_append (GdkDisplay *display,
92 display->queued_tail = g_list_append (display->queued_tail, event);
94 if (!display->queued_events)
95 display->queued_events = display->queued_tail;
97 display->queued_tail = display->queued_tail->next;
99 return display->queued_tail;
103 * _gdk_event_queue_remove_link:
104 * @display: a #GdkDisplay
105 * @node: node to remove
107 * Removes a specified list node from the event queue.
110 _gdk_event_queue_remove_link (GdkDisplay *display,
114 node->prev->next = node->next;
116 display->queued_events = node->next;
119 node->next->prev = node->prev;
121 display->queued_tail = node->prev;
125 * _gdk_event_unqueue:
126 * @display: a #GdkDisplay
128 * Removes and returns the first event from the event
129 * queue that is not still being filled in.
131 * Return value: the event, or %NULL. Ownership is transferred
135 _gdk_event_unqueue (GdkDisplay *display)
137 GdkEvent *event = NULL;
140 tmp_list = _gdk_event_queue_find_first (display);
144 event = tmp_list->data;
145 _gdk_event_queue_remove_link (display, tmp_list);
146 g_list_free_1 (tmp_list);
153 * gdk_event_handler_set:
154 * @func: the function to call to handle events from GDK.
155 * @data: user data to pass to the function.
156 * @notify: the function to call when the handler function is removed, i.e. when
157 * gdk_event_handler_set() is called with another event handler.
159 * Sets the function to call to handle all events from GDK.
161 * Note that GTK+ uses this to install its own event handler, so it is
162 * usually not useful for GTK+ applications. (Although an application
163 * can call this function then call gtk_main_do_event() to pass
167 gdk_event_handler_set (GdkEventFunc func,
169 GDestroyNotify notify)
171 if (_gdk_event_notify)
172 (*_gdk_event_notify) (_gdk_event_data);
174 _gdk_event_func = func;
175 _gdk_event_data = data;
176 _gdk_event_notify = notify;
182 * Checks all open displays for a #GdkEvent to process,to be processed
183 * on, fetching events from the windowing system if necessary.
184 * See gdk_display_get_event().
186 * Return value: the next #GdkEvent to be processed, or %NULL if no events
187 * are pending. The returned #GdkEvent should be freed with gdk_event_free().
194 for (tmp_list = _gdk_displays; tmp_list; tmp_list = tmp_list->next)
196 GdkEvent *event = gdk_display_get_event (tmp_list->data);
207 * If there is an event waiting in the event queue of some open
208 * display, returns a copy of it. See gdk_display_peek_event().
210 * Return value: a copy of the first #GdkEvent on some event queue, or %NULL if no
211 * events are in any queues. The returned #GdkEvent should be freed with
215 gdk_event_peek (void)
219 for (tmp_list = _gdk_displays; tmp_list; tmp_list = tmp_list->next)
221 GdkEvent *event = gdk_display_peek_event (tmp_list->data);
231 * @event: a #GdkEvent.
233 * Appends a copy of the given event onto the front of the event
234 * queue for event->any.window's display, or the default event
235 * queue if event->any.window is %NULL. See gdk_display_put_event().
238 gdk_event_put (GdkEvent *event)
242 g_return_if_fail (event != NULL);
244 if (event->any.window)
245 display = gdk_drawable_get_display (event->any.window);
249 g_message ("Falling back to default display for gdk_event_put()"));
250 display = gdk_display_get_default ();
253 gdk_display_put_event (display, event);
256 static GMemChunk *event_chunk = NULL;
257 static GHashTable *event_hash = NULL;
261 * @type: a #GdkEventType
263 * Creates a new event of the given type. All fields are set to 0.
265 * Return value: a newly-allocated #GdkEvent. The returned #GdkEvent
266 * should be freed with gdk_event_free().
271 gdk_event_new (GdkEventType type)
273 GdkEventPrivate *new_private;
276 if (event_chunk == NULL)
278 event_chunk = g_mem_chunk_new ("events",
279 sizeof (GdkEventPrivate),
282 event_hash = g_hash_table_new (g_direct_hash, NULL);
285 new_private = g_chunk_new (GdkEventPrivate, event_chunk);
286 memset (new_private, 0, sizeof (GdkEventPrivate));
288 new_private->flags = 0;
289 new_private->screen = NULL;
291 g_hash_table_insert (event_hash, new_private, GUINT_TO_POINTER (1));
293 new_event = (GdkEvent *) new_private;
295 new_event->any.type = type;
298 * Bytewise 0 initialization is reasonable for most of the
299 * current event types. Explicitely initialize double fields
300 * since I trust bytewise 0 == 0. less than for integers
305 case GDK_MOTION_NOTIFY:
306 new_event->motion.x = 0.;
307 new_event->motion.y = 0.;
308 new_event->motion.x_root = 0.;
309 new_event->motion.y_root = 0.;
311 case GDK_BUTTON_PRESS:
312 case GDK_2BUTTON_PRESS:
313 case GDK_3BUTTON_PRESS:
314 case GDK_BUTTON_RELEASE:
315 new_event->button.x = 0.;
316 new_event->button.y = 0.;
317 new_event->button.x_root = 0.;
318 new_event->button.y_root = 0.;
321 new_event->scroll.x = 0.;
322 new_event->scroll.y = 0.;
323 new_event->scroll.x_root = 0.;
324 new_event->scroll.y_root = 0.;
326 case GDK_ENTER_NOTIFY:
327 case GDK_LEAVE_NOTIFY:
328 new_event->crossing.x = 0.;
329 new_event->crossing.y = 0.;
330 new_event->crossing.x_root = 0.;
331 new_event->crossing.y_root = 0.;
341 gdk_event_is_allocated (GdkEvent *event)
344 return g_hash_table_lookup (event_hash, event) != NULL;
351 * @event: a #GdkEvent
353 * Copies a #GdkEvent, copying or incrementing the reference count of the
354 * resources associated with it (e.g. #GdkWindow's and strings).
356 * Return value: a copy of @event. The returned #GdkEvent should be freed with
360 gdk_event_copy (GdkEvent *event)
362 GdkEventPrivate *new_private;
365 g_return_val_if_fail (event != NULL, NULL);
367 new_event = gdk_event_new (GDK_NOTHING);
368 new_private = (GdkEventPrivate *)new_event;
371 if (new_event->any.window)
372 g_object_ref (new_event->any.window);
374 if (gdk_event_is_allocated (event))
376 GdkEventPrivate *private = (GdkEventPrivate *)event;
378 new_private->screen = private->screen;
381 switch (event->any.type)
384 case GDK_KEY_RELEASE:
385 new_event->key.string = g_strdup (event->key.string);
388 case GDK_ENTER_NOTIFY:
389 case GDK_LEAVE_NOTIFY:
390 if (event->crossing.subwindow != NULL)
391 g_object_ref (event->crossing.subwindow);
396 case GDK_DRAG_MOTION:
397 case GDK_DRAG_STATUS:
399 case GDK_DROP_FINISHED:
400 g_object_ref (event->dnd.context);
404 if (event->expose.region)
405 new_event->expose.region = gdk_region_copy (event->expose.region);
409 new_event->setting.name = g_strdup (new_event->setting.name);
412 case GDK_BUTTON_PRESS:
413 case GDK_BUTTON_RELEASE:
414 if (event->button.axes)
415 new_event->button.axes = g_memdup (event->button.axes,
416 sizeof (gdouble) * event->button.device->num_axes);
419 case GDK_MOTION_NOTIFY:
420 if (event->motion.axes)
421 new_event->motion.axes = g_memdup (event->motion.axes,
422 sizeof (gdouble) * event->motion.device->num_axes);
435 * @event: a #GdkEvent.
437 * Frees a #GdkEvent, freeing or decrementing any resources associated with it.
438 * Note that this function should only be called with events returned from
439 * functions such as gdk_event_peek(), gdk_event_get(),
440 * gdk_event_get_graphics_expose() and gdk_event_copy().
443 gdk_event_free (GdkEvent *event)
445 g_return_if_fail (event != NULL);
447 g_assert (event_chunk != NULL); /* paranoid */
449 if (event->any.window)
450 g_object_unref (event->any.window);
452 switch (event->any.type)
455 case GDK_KEY_RELEASE:
456 g_free (event->key.string);
459 case GDK_ENTER_NOTIFY:
460 case GDK_LEAVE_NOTIFY:
461 if (event->crossing.subwindow != NULL)
462 g_object_unref (event->crossing.subwindow);
467 case GDK_DRAG_MOTION:
468 case GDK_DRAG_STATUS:
470 case GDK_DROP_FINISHED:
471 g_object_unref (event->dnd.context);
474 case GDK_BUTTON_PRESS:
475 case GDK_BUTTON_RELEASE:
476 if (event->button.axes)
477 g_free (event->button.axes);
481 if (event->expose.region)
482 gdk_region_destroy (event->expose.region);
485 case GDK_MOTION_NOTIFY:
486 if (event->motion.axes)
487 g_free (event->motion.axes);
491 g_free (event->setting.name);
498 g_hash_table_remove (event_hash, event);
499 g_mem_chunk_free (event_chunk, event);
503 * gdk_event_get_time:
504 * @event: a #GdkEvent
506 * Returns the time stamp from @event, if there is one; otherwise
507 * returns #GDK_CURRENT_TIME. If @event is %NULL, returns #GDK_CURRENT_TIME.
509 * Return value: time stamp field from @event
512 gdk_event_get_time (GdkEvent *event)
517 case GDK_MOTION_NOTIFY:
518 return event->motion.time;
519 case GDK_BUTTON_PRESS:
520 case GDK_2BUTTON_PRESS:
521 case GDK_3BUTTON_PRESS:
522 case GDK_BUTTON_RELEASE:
523 return event->button.time;
525 return event->scroll.time;
527 case GDK_KEY_RELEASE:
528 return event->key.time;
529 case GDK_ENTER_NOTIFY:
530 case GDK_LEAVE_NOTIFY:
531 return event->crossing.time;
532 case GDK_PROPERTY_NOTIFY:
533 return event->property.time;
534 case GDK_SELECTION_CLEAR:
535 case GDK_SELECTION_REQUEST:
536 case GDK_SELECTION_NOTIFY:
537 return event->selection.time;
538 case GDK_PROXIMITY_IN:
539 case GDK_PROXIMITY_OUT:
540 return event->proximity.time;
543 case GDK_DRAG_MOTION:
544 case GDK_DRAG_STATUS:
546 case GDK_DROP_FINISHED:
547 return event->dnd.time;
548 case GDK_CLIENT_EVENT:
549 case GDK_VISIBILITY_NOTIFY:
552 case GDK_FOCUS_CHANGE:
559 case GDK_WINDOW_STATE:
561 /* return current time */
565 return GDK_CURRENT_TIME;
569 * gdk_event_get_state:
570 * @event: a #GdkEvent or NULL
571 * @state: return location for state
573 * If the event contains a "state" field, puts that field in @state. Otherwise
574 * stores an empty state (0). Returns %TRUE if there was a state field
575 * in the event. @event may be %NULL, in which case it's treated
576 * as if the event had no state field.
578 * Return value: %TRUE if there was a state field in the event
581 gdk_event_get_state (GdkEvent *event,
582 GdkModifierType *state)
584 g_return_val_if_fail (state != NULL, FALSE);
589 case GDK_MOTION_NOTIFY:
590 *state = event->motion.state;
592 case GDK_BUTTON_PRESS:
593 case GDK_2BUTTON_PRESS:
594 case GDK_3BUTTON_PRESS:
595 case GDK_BUTTON_RELEASE:
596 *state = event->button.state;
599 *state = event->scroll.state;
602 case GDK_KEY_RELEASE:
603 *state = event->key.state;
605 case GDK_ENTER_NOTIFY:
606 case GDK_LEAVE_NOTIFY:
607 *state = event->crossing.state;
609 case GDK_PROPERTY_NOTIFY:
610 *state = event->property.state;
612 case GDK_VISIBILITY_NOTIFY:
613 case GDK_CLIENT_EVENT:
616 case GDK_FOCUS_CHANGE:
617 case GDK_SELECTION_CLEAR:
618 case GDK_SELECTION_REQUEST:
619 case GDK_SELECTION_NOTIFY:
620 case GDK_PROXIMITY_IN:
621 case GDK_PROXIMITY_OUT:
624 case GDK_DRAG_MOTION:
625 case GDK_DRAG_STATUS:
627 case GDK_DROP_FINISHED:
634 case GDK_WINDOW_STATE:
645 * gdk_event_get_coords:
646 * @event: a #GdkEvent
647 * @x_win: location to put event window x coordinate
648 * @y_win: location to put event window y coordinate
650 * Extract the event window relative x/y coordinates from an event.
652 * Return value: %TRUE if the event delivered event window coordinates
655 gdk_event_get_coords (GdkEvent *event,
659 gdouble x = 0, y = 0;
660 gboolean fetched = TRUE;
662 g_return_val_if_fail (event != NULL, FALSE);
667 x = event->configure.x;
668 y = event->configure.y;
670 case GDK_ENTER_NOTIFY:
671 case GDK_LEAVE_NOTIFY:
672 x = event->crossing.x;
673 y = event->crossing.y;
679 case GDK_BUTTON_PRESS:
680 case GDK_2BUTTON_PRESS:
681 case GDK_3BUTTON_PRESS:
682 case GDK_BUTTON_RELEASE:
686 case GDK_MOTION_NOTIFY:
704 * gdk_event_get_root_coords:
705 * @event: a #GdkEvent
706 * @x_root: location to put root window x coordinate
707 * @y_root: location to put root window y coordinate
709 * Extract the root window relative x/y coordinates from an event.
711 * Return value: %TRUE if the event delivered root window coordinates
714 gdk_event_get_root_coords (GdkEvent *event,
718 gdouble x = 0, y = 0;
719 gboolean fetched = TRUE;
721 g_return_val_if_fail (event != NULL, FALSE);
725 case GDK_MOTION_NOTIFY:
726 x = event->motion.x_root;
727 y = event->motion.y_root;
729 case GDK_BUTTON_PRESS:
730 case GDK_2BUTTON_PRESS:
731 case GDK_3BUTTON_PRESS:
732 case GDK_BUTTON_RELEASE:
733 x = event->button.x_root;
734 y = event->button.y_root;
736 case GDK_ENTER_NOTIFY:
737 case GDK_LEAVE_NOTIFY:
738 x = event->crossing.x_root;
739 y = event->crossing.y_root;
743 case GDK_DRAG_MOTION:
744 case GDK_DRAG_STATUS:
746 case GDK_DROP_FINISHED:
747 x = event->dnd.x_root;
748 y = event->dnd.y_root;
764 * gdk_event_get_axis:
765 * @event: a #GdkEvent
766 * @axis_use: the axis use to look for
767 * @value: location to store the value found
769 * Extract the axis value for a particular axis use from
770 * an event structure.
772 * Return value: %TRUE if the specified axis was found, otherwise %FALSE
775 gdk_event_get_axis (GdkEvent *event,
782 g_return_val_if_fail (event != NULL, FALSE);
784 if (axis_use == GDK_AXIS_X || axis_use == GDK_AXIS_Y)
790 case GDK_MOTION_NOTIFY:
798 case GDK_BUTTON_PRESS:
799 case GDK_BUTTON_RELEASE:
803 case GDK_ENTER_NOTIFY:
804 case GDK_LEAVE_NOTIFY:
805 x = event->crossing.x;
806 y = event->crossing.y;
813 if (axis_use == GDK_AXIS_X && value)
815 if (axis_use == GDK_AXIS_Y && value)
820 else if (event->type == GDK_BUTTON_PRESS ||
821 event->type == GDK_BUTTON_RELEASE)
823 device = event->button.device;
824 axes = event->button.axes;
826 else if (event->type == GDK_MOTION_NOTIFY)
828 device = event->motion.device;
829 axes = event->motion.axes;
834 return gdk_device_get_axis (device, axes, axis_use, value);
838 * gdk_event_set_screen:
839 * @event: a #GdkEvent
840 * @screen: a #GdkScreen
842 * Sets the screen for @event to @screen. The event must
843 * have been allocated by GTK+, for instance, by
849 gdk_event_set_screen (GdkEvent *event,
852 GdkEventPrivate *private;
854 g_return_if_fail (gdk_event_is_allocated (event));
856 private = (GdkEventPrivate *)event;
858 private->screen = screen;
862 * gdk_event_get_screen:
863 * @event: a #GdkEvent
865 * Returns the screen for the event. The screen is
866 * typically the screen for <literal>event->any.window</literal>, but
867 * for events such as mouse events, it is the screen
868 * where the the pointer was when the event occurs -
869 * that is, the screen which has the root window
870 * to which <literal>event->motion.x_root</literal> and
871 * <literal>event->motion.y_root</literal> are relative.
873 * Return value: the screen for the event
878 gdk_event_get_screen (GdkEvent *event)
880 if (gdk_event_is_allocated (event))
882 GdkEventPrivate *private = (GdkEventPrivate *)event;
885 return private->screen;
888 if (event->any.window)
889 return gdk_drawable_get_screen (event->any.window);
895 * gdk_set_show_events:
896 * @show_events: %TRUE to output event debugging information.
898 * Sets whether a trace of received events is output.
899 * Note that GTK+ must be compiled with debugging (that is,
900 * configured using the <option>--enable-debug</option> option)
901 * to use this option.
904 gdk_set_show_events (gboolean show_events)
907 _gdk_debug_flags |= GDK_DEBUG_EVENTS;
909 _gdk_debug_flags &= ~GDK_DEBUG_EVENTS;
913 * gdk_get_show_events:
915 * Gets whether event debugging output is enabled.
917 * Return value: %TRUE if event debugging output is enabled.
920 gdk_get_show_events (void)
922 return (_gdk_debug_flags & GDK_DEBUG_EVENTS) != 0;
926 gdk_io_destroy (gpointer data)
928 GdkIOClosure *closure = data;
931 closure->notify (closure->data);
936 /* What do we do with G_IO_NVAL?
938 #define READ_CONDITION (G_IO_IN | G_IO_HUP | G_IO_ERR)
939 #define WRITE_CONDITION (G_IO_OUT | G_IO_ERR)
940 #define EXCEPTION_CONDITION (G_IO_PRI)
943 gdk_io_invoke (GIOChannel *source,
944 GIOCondition condition,
947 GdkIOClosure *closure = data;
948 GdkInputCondition gdk_cond = 0;
950 if (condition & READ_CONDITION)
951 gdk_cond |= GDK_INPUT_READ;
952 if (condition & WRITE_CONDITION)
953 gdk_cond |= GDK_INPUT_WRITE;
954 if (condition & EXCEPTION_CONDITION)
955 gdk_cond |= GDK_INPUT_EXCEPTION;
957 if (closure->condition & gdk_cond)
958 closure->function (closure->data, g_io_channel_unix_get_fd (source), gdk_cond);
964 gdk_input_add_full (gint source,
965 GdkInputCondition condition,
966 GdkInputFunction function,
968 GdkDestroyNotify destroy)
971 GdkIOClosure *closure = g_new (GdkIOClosure, 1);
973 GIOCondition cond = 0;
975 closure->function = function;
976 closure->condition = condition;
977 closure->notify = destroy;
978 closure->data = data;
980 if (condition & GDK_INPUT_READ)
981 cond |= READ_CONDITION;
982 if (condition & GDK_INPUT_WRITE)
983 cond |= WRITE_CONDITION;
984 if (condition & GDK_INPUT_EXCEPTION)
985 cond |= EXCEPTION_CONDITION;
987 channel = g_io_channel_unix_new (source);
988 result = g_io_add_watch_full (channel, G_PRIORITY_DEFAULT, cond,
990 closure, gdk_io_destroy);
991 g_io_channel_unref (channel);
997 gdk_input_add (gint source,
998 GdkInputCondition condition,
999 GdkInputFunction function,
1002 return gdk_input_add_full (source, condition, function, data, NULL);
1006 gdk_input_remove (gint tag)
1008 g_source_remove (tag);
1012 gdk_synthesize_click (GdkDisplay *display,
1016 GdkEvent temp_event;
1018 g_return_if_fail (event != NULL);
1020 temp_event = *event;
1021 temp_event.type = (nclicks == 2) ? GDK_2BUTTON_PRESS : GDK_3BUTTON_PRESS;
1023 gdk_display_put_event (display, &temp_event);
1027 _gdk_event_button_generate (GdkDisplay *display,
1030 if ((event->button.time < (display->button_click_time[1] + 2*display->double_click_time)) &&
1031 (event->button.window == display->button_window[1]) &&
1032 (event->button.button == display->button_number[1]) &&
1033 (ABS (event->button.x - display->button_x[1]) <= display->double_click_distance) &&
1034 (ABS (event->button.y - display->button_y[1]) <= display->double_click_distance))
1036 gdk_synthesize_click (display, event, 3);
1038 display->button_click_time[1] = 0;
1039 display->button_click_time[0] = 0;
1040 display->button_window[1] = NULL;
1041 display->button_window[0] = 0;
1042 display->button_number[1] = -1;
1043 display->button_number[0] = -1;
1044 display->button_x[0] = display->button_x[1] = 0;
1045 display->button_y[0] = display->button_y[1] = 0;
1047 else if ((event->button.time < (display->button_click_time[0] + display->double_click_time)) &&
1048 (event->button.window == display->button_window[0]) &&
1049 (event->button.button == display->button_number[0]) &&
1050 (ABS (event->button.x - display->button_x[0]) <= display->double_click_distance) &&
1051 (ABS (event->button.y - display->button_y[0]) <= display->double_click_distance))
1053 gdk_synthesize_click (display, event, 2);
1055 display->button_click_time[1] = display->button_click_time[0];
1056 display->button_click_time[0] = event->button.time;
1057 display->button_window[1] = display->button_window[0];
1058 display->button_window[0] = event->button.window;
1059 display->button_number[1] = display->button_number[0];
1060 display->button_number[0] = event->button.button;
1061 display->button_x[1] = display->button_x[0];
1062 display->button_x[0] = event->button.x;
1063 display->button_y[1] = display->button_y[0];
1064 display->button_y[0] = event->button.y;
1068 display->button_click_time[1] = 0;
1069 display->button_click_time[0] = event->button.time;
1070 display->button_window[1] = NULL;
1071 display->button_window[0] = event->button.window;
1072 display->button_number[1] = -1;
1073 display->button_number[0] = event->button.button;
1074 display->button_x[1] = 0;
1075 display->button_x[0] = event->button.x;
1076 display->button_y[1] = 0;
1077 display->button_y[0] = event->button.y;
1082 gdk_synthesize_window_state (GdkWindow *window,
1083 GdkWindowState unset_flags,
1084 GdkWindowState set_flags)
1086 GdkEvent temp_event;
1089 g_return_if_fail (window != NULL);
1091 temp_event.window_state.window = window;
1092 temp_event.window_state.type = GDK_WINDOW_STATE;
1093 temp_event.window_state.send_event = FALSE;
1095 old = ((GdkWindowObject*) temp_event.window_state.window)->state;
1097 temp_event.window_state.new_window_state = old;
1098 temp_event.window_state.new_window_state |= set_flags;
1099 temp_event.window_state.new_window_state &= ~unset_flags;
1100 temp_event.window_state.changed_mask = temp_event.window_state.new_window_state ^ old;
1102 if (temp_event.window_state.new_window_state == old)
1103 return; /* No actual work to do, nothing changed. */
1105 /* Actually update the field in GdkWindow, this is sort of an odd
1106 * place to do it, but seems like the safest since it ensures we expose no
1107 * inconsistent state to the user.
1110 ((GdkWindowObject*) window)->state = temp_event.window_state.new_window_state;
1112 /* We only really send the event to toplevels, since
1113 * all the window states don't apply to non-toplevels.
1114 * Non-toplevels do use the GDK_WINDOW_STATE_WITHDRAWN flag
1115 * internally so we needed to update window->state.
1117 switch (((GdkWindowObject*) window)->window_type)
1119 case GDK_WINDOW_TOPLEVEL:
1120 case GDK_WINDOW_DIALOG:
1121 case GDK_WINDOW_TEMP: /* ? */
1122 gdk_display_put_event (gdk_drawable_get_display (window), &temp_event);
1125 case GDK_WINDOW_FOREIGN:
1126 case GDK_WINDOW_ROOT:
1127 case GDK_WINDOW_CHILD:
1133 * gdk_display_set_double_click_time:
1134 * @display: a #GdkDisplay
1135 * @msec: double click time in milliseconds (thousandths of a second)
1137 * Sets the double click time (two clicks within this time interval
1138 * count as a double click and result in a #GDK_2BUTTON_PRESS event).
1139 * Applications should <emphasis>not</emphasis> set this, it is a global
1140 * user-configured setting.
1145 gdk_display_set_double_click_time (GdkDisplay *display,
1148 display->double_click_time = msec;
1152 * gdk_set_double_click_time:
1153 * @msec: double click time in milliseconds (thousandths of a second)
1155 * Set the double click time for the default display. See
1156 * gdk_display_set_double_click_time().
1157 * See also gdk_display_set_double_click_distance().
1158 * Applications should <emphasis>not</emphasis> set this, it is a
1159 * global user-configured setting.
1162 gdk_set_double_click_time (guint msec)
1164 gdk_display_set_double_click_time (gdk_display_get_default (), msec);
1168 * gdk_display_set_double_click_distance:
1169 * @display: a #GdkDisplay
1170 * @distance: distance in pixels
1172 * Sets the double click distance (two clicks within this distance
1173 * count as a double click and result in a #GDK_2BUTTON_PRESS event).
1174 * See also gdk_display_set_double_click_time().
1175 * Applications should <emphasis>not</emphasis> set this, it is a global
1176 * user-configured setting.
1181 gdk_display_set_double_click_distance (GdkDisplay *display,
1184 display->double_click_distance = distance;
1188 gdk_event_get_type (void)
1190 static GType our_type = 0;
1193 our_type = g_boxed_type_register_static ("GdkEvent",
1194 (GBoxedCopyFunc)gdk_event_copy,
1195 (GBoxedFreeFunc)gdk_event_free);
1201 * @name: the name of the setting.
1202 * @value: location to store the value of the setting.
1204 * Obtains a desktop-wide setting, such as the double-click time,
1205 * for the default screen. See gdk_screen_get_setting().
1207 * Returns : %TRUE if the setting existed and a value was stored
1208 * in @value, %FALSE otherwise.
1211 gdk_setting_get (const gchar *name,
1214 return gdk_screen_get_setting (gdk_screen_get_default (), name, value);