Add a 'type' parameter, make public.

Thu Oct  3 14:13:33 2002  Owen Taylor  <otaylor@redhat.com>

        * gdk/gdkevents.c (gdk_event_new): Add a 'type'
        parameter, make public.

        * gdk/gdkevents.c (gdk_event_copy): Copy the screen.

        * gdk/gdkevents.c gdk/linux-fb/gdkmain-fb.c
        gdk/x11/gdkevents-x11.c gdk/win32/gdkevents-win32.c:
        _gdk_event_new() => gdk_event_new().

        * gdk/win32/gdkevents-win32.c (real_window_procedure):
        Fix event_private->screen breakage that results from evil
        encapsulation breakage here.

        * gtk/gtkclist.c gtk/gtkcombo.c gtk/gtkcontainer.c
        gtk/gtkdialog.c gtk/gtkdnd.c gtk/gtkdrawingarea.c
        gtk/gtkimcontextsimple.c gtk/gtklist.c gtk/gtkmenu.c
        gtk/gtknotebook.c gtk/gtkplug.c gtk/gtkselection.c
        gtk/gtktext.c gtk/gtktreeitem.c gtk/gtktreeview.c
        gtk/gtkviewport.c gtk/gtkwindow-decorate.c gtk/gtkwindow.c
        tests/testgtk.c: Remove most usage of stack-allocated
        GdkEvent structures.

        * gtk/gtktreeview.c: Use a cut-and-paste of the full
        send_focus_event() from gtkwindow.c that does the necessary
        notification of the ::has-focus property and setting of
        the HAS_FOCUS flag.x

        * gtk/gtkdnd.c: Clean up some mess/duplicated code; removing
        an extraneous use of a GdkEvent.
This commit is contained in:
Owen Taylor 2002-10-03 20:53:30 +00:00 • committed by Owen Taylor
commit ef33adff83
31 changed files with 534 additions and 266 deletions

View file

@ -1,3 +1,35 @@
Thu Oct 3 14:13:33 2002 Owen Taylor <otaylor@redhat.com>
* gdk/gdkevents.c (gdk_event_new): Add a 'type'
parameter, make public.
* gdk/gdkevents.c (gdk_event_copy): Copy the screen.
* gdk/gdkevents.c gdk/linux-fb/gdkmain-fb.c
gdk/x11/gdkevents-x11.c gdk/win32/gdkevents-win32.c:
_gdk_event_new() => gdk_event_new().
* gdk/win32/gdkevents-win32.c (real_window_procedure):
Fix event_private->screen breakage that results from evil
encapsulation breakage here.
* gtk/gtkclist.c gtk/gtkcombo.c gtk/gtkcontainer.c
gtk/gtkdialog.c gtk/gtkdnd.c gtk/gtkdrawingarea.c
gtk/gtkimcontextsimple.c gtk/gtklist.c gtk/gtkmenu.c
gtk/gtknotebook.c gtk/gtkplug.c gtk/gtkselection.c
gtk/gtktext.c gtk/gtktreeitem.c gtk/gtktreeview.c
gtk/gtkviewport.c gtk/gtkwindow-decorate.c gtk/gtkwindow.c
tests/testgtk.c: Remove most usage of stack-allocated
GdkEvent structures.
* gtk/gtktreeview.c: Use a cut-and-paste of the full
send_focus_event() from gtkwindow.c that does the necessary
notification of the ::has-focus property and setting of
the HAS_FOCUS flag.x
* gtk/gtkdnd.c: Clean up some mess/duplicated code; removing
an extraneous use of a GdkEvent.
Wed Oct 2 17:46:53 2002 Owen Taylor <otaylor@redhat.com>
* gdk/gdkdrawable.h gdk/gdkinternals.h gdk/gdkdraw.c

View file

@ -1,3 +1,35 @@
Thu Oct 3 14:13:33 2002 Owen Taylor <otaylor@redhat.com>
* gdk/gdkevents.c (gdk_event_new): Add a 'type'
parameter, make public.
* gdk/gdkevents.c (gdk_event_copy): Copy the screen.
* gdk/gdkevents.c gdk/linux-fb/gdkmain-fb.c
gdk/x11/gdkevents-x11.c gdk/win32/gdkevents-win32.c:
_gdk_event_new() => gdk_event_new().
* gdk/win32/gdkevents-win32.c (real_window_procedure):
Fix event_private->screen breakage that results from evil
encapsulation breakage here.
* gtk/gtkclist.c gtk/gtkcombo.c gtk/gtkcontainer.c
gtk/gtkdialog.c gtk/gtkdnd.c gtk/gtkdrawingarea.c
gtk/gtkimcontextsimple.c gtk/gtklist.c gtk/gtkmenu.c
gtk/gtknotebook.c gtk/gtkplug.c gtk/gtkselection.c
gtk/gtktext.c gtk/gtktreeitem.c gtk/gtktreeview.c
gtk/gtkviewport.c gtk/gtkwindow-decorate.c gtk/gtkwindow.c
tests/testgtk.c: Remove most usage of stack-allocated
GdkEvent structures.
* gtk/gtktreeview.c: Use a cut-and-paste of the full
send_focus_event() from gtkwindow.c that does the necessary
notification of the ::has-focus property and setting of
the HAS_FOCUS flag.x
* gtk/gtkdnd.c: Clean up some mess/duplicated code; removing
an extraneous use of a GdkEvent.
Wed Oct 2 17:46:53 2002 Owen Taylor <otaylor@redhat.com>
* gdk/gdkdrawable.h gdk/gdkinternals.h gdk/gdkdraw.c

View file

@ -1,3 +1,35 @@
Thu Oct 3 14:13:33 2002 Owen Taylor <otaylor@redhat.com>
* gdk/gdkevents.c (gdk_event_new): Add a 'type'
parameter, make public.
* gdk/gdkevents.c (gdk_event_copy): Copy the screen.
* gdk/gdkevents.c gdk/linux-fb/gdkmain-fb.c
gdk/x11/gdkevents-x11.c gdk/win32/gdkevents-win32.c:
_gdk_event_new() => gdk_event_new().
* gdk/win32/gdkevents-win32.c (real_window_procedure):
Fix event_private->screen breakage that results from evil
encapsulation breakage here.
* gtk/gtkclist.c gtk/gtkcombo.c gtk/gtkcontainer.c
gtk/gtkdialog.c gtk/gtkdnd.c gtk/gtkdrawingarea.c
gtk/gtkimcontextsimple.c gtk/gtklist.c gtk/gtkmenu.c
gtk/gtknotebook.c gtk/gtkplug.c gtk/gtkselection.c
gtk/gtktext.c gtk/gtktreeitem.c gtk/gtktreeview.c
gtk/gtkviewport.c gtk/gtkwindow-decorate.c gtk/gtkwindow.c
tests/testgtk.c: Remove most usage of stack-allocated
GdkEvent structures.
* gtk/gtktreeview.c: Use a cut-and-paste of the full
send_focus_event() from gtkwindow.c that does the necessary
notification of the ::has-focus property and setting of
the HAS_FOCUS flag.x
* gtk/gtkdnd.c: Clean up some mess/duplicated code; removing
an extraneous use of a GdkEvent.
Wed Oct 2 17:46:53 2002 Owen Taylor <otaylor@redhat.com>
* gdk/gdkdrawable.h gdk/gdkinternals.h gdk/gdkdraw.c

View file

@ -1,3 +1,35 @@
Thu Oct 3 14:13:33 2002 Owen Taylor <otaylor@redhat.com>
* gdk/gdkevents.c (gdk_event_new): Add a 'type'
parameter, make public.
* gdk/gdkevents.c (gdk_event_copy): Copy the screen.
* gdk/gdkevents.c gdk/linux-fb/gdkmain-fb.c
gdk/x11/gdkevents-x11.c gdk/win32/gdkevents-win32.c:
_gdk_event_new() => gdk_event_new().
* gdk/win32/gdkevents-win32.c (real_window_procedure):
Fix event_private->screen breakage that results from evil
encapsulation breakage here.
* gtk/gtkclist.c gtk/gtkcombo.c gtk/gtkcontainer.c
gtk/gtkdialog.c gtk/gtkdnd.c gtk/gtkdrawingarea.c
gtk/gtkimcontextsimple.c gtk/gtklist.c gtk/gtkmenu.c
gtk/gtknotebook.c gtk/gtkplug.c gtk/gtkselection.c
gtk/gtktext.c gtk/gtktreeitem.c gtk/gtktreeview.c
gtk/gtkviewport.c gtk/gtkwindow-decorate.c gtk/gtkwindow.c
tests/testgtk.c: Remove most usage of stack-allocated
GdkEvent structures.
* gtk/gtktreeview.c: Use a cut-and-paste of the full
send_focus_event() from gtkwindow.c that does the necessary
notification of the ::has-focus property and setting of
the HAS_FOCUS flag.x
* gtk/gtkdnd.c: Clean up some mess/duplicated code; removing
an extraneous use of a GdkEvent.
Wed Oct 2 17:46:53 2002 Owen Taylor <otaylor@redhat.com>
* gdk/gdkdrawable.h gdk/gdkinternals.h gdk/gdkdraw.c

View file

@ -1,3 +1,35 @@
Thu Oct 3 14:13:33 2002 Owen Taylor <otaylor@redhat.com>
* gdk/gdkevents.c (gdk_event_new): Add a 'type'
parameter, make public.
* gdk/gdkevents.c (gdk_event_copy): Copy the screen.
* gdk/gdkevents.c gdk/linux-fb/gdkmain-fb.c
gdk/x11/gdkevents-x11.c gdk/win32/gdkevents-win32.c:
_gdk_event_new() => gdk_event_new().
* gdk/win32/gdkevents-win32.c (real_window_procedure):
Fix event_private->screen breakage that results from evil
encapsulation breakage here.
* gtk/gtkclist.c gtk/gtkcombo.c gtk/gtkcontainer.c
gtk/gtkdialog.c gtk/gtkdnd.c gtk/gtkdrawingarea.c
gtk/gtkimcontextsimple.c gtk/gtklist.c gtk/gtkmenu.c
gtk/gtknotebook.c gtk/gtkplug.c gtk/gtkselection.c
gtk/gtktext.c gtk/gtktreeitem.c gtk/gtktreeview.c
gtk/gtkviewport.c gtk/gtkwindow-decorate.c gtk/gtkwindow.c
tests/testgtk.c: Remove most usage of stack-allocated
GdkEvent structures.
* gtk/gtktreeview.c: Use a cut-and-paste of the full
send_focus_event() from gtkwindow.c that does the necessary
notification of the ::has-focus property and setting of
the HAS_FOCUS flag.x
* gtk/gtkdnd.c: Clean up some mess/duplicated code; removing
an extraneous use of a GdkEvent.
Wed Oct 2 17:46:53 2002 Owen Taylor <otaylor@redhat.com>
* gdk/gdkdrawable.h gdk/gdkinternals.h gdk/gdkdraw.c

View file

@ -1,3 +1,35 @@
Thu Oct 3 14:13:33 2002 Owen Taylor <otaylor@redhat.com>
* gdk/gdkevents.c (gdk_event_new): Add a 'type'
parameter, make public.
* gdk/gdkevents.c (gdk_event_copy): Copy the screen.
* gdk/gdkevents.c gdk/linux-fb/gdkmain-fb.c
gdk/x11/gdkevents-x11.c gdk/win32/gdkevents-win32.c:
_gdk_event_new() => gdk_event_new().
* gdk/win32/gdkevents-win32.c (real_window_procedure):
Fix event_private->screen breakage that results from evil
encapsulation breakage here.
* gtk/gtkclist.c gtk/gtkcombo.c gtk/gtkcontainer.c
gtk/gtkdialog.c gtk/gtkdnd.c gtk/gtkdrawingarea.c
gtk/gtkimcontextsimple.c gtk/gtklist.c gtk/gtkmenu.c
gtk/gtknotebook.c gtk/gtkplug.c gtk/gtkselection.c
gtk/gtktext.c gtk/gtktreeitem.c gtk/gtktreeview.c
gtk/gtkviewport.c gtk/gtkwindow-decorate.c gtk/gtkwindow.c
tests/testgtk.c: Remove most usage of stack-allocated
GdkEvent structures.
* gtk/gtktreeview.c: Use a cut-and-paste of the full
send_focus_event() from gtkwindow.c that does the necessary
notification of the ::has-focus property and setting of
the HAS_FOCUS flag.x
* gtk/gtkdnd.c: Clean up some mess/duplicated code; removing
an extraneous use of a GdkEvent.
Wed Oct 2 17:46:53 2002 Owen Taylor <otaylor@redhat.com>
* gdk/gdkdrawable.h gdk/gdkinternals.h gdk/gdkdraw.c

View file

@ -24,6 +24,8 @@
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
*/
#include <string.h> /* For memset() */
#include "gdk.h"
#include "gdkinternals.h"
@ -259,9 +261,10 @@ static GMemChunk *event_chunk = NULL;
static GHashTable *event_hash = NULL;
GdkEvent*
_gdk_event_new (void)
gdk_event_new (GdkEventType type)
{
GdkEventPrivate *new_event;
GdkEventPrivate *new_private;
GdkEvent *new_event;
if (event_chunk == NULL)
{
@ -272,13 +275,59 @@ _gdk_event_new (void)
event_hash = g_hash_table_new (g_direct_hash, NULL);
}
new_event = g_chunk_new (GdkEventPrivate, event_chunk);
new_event->flags = 0;
new_event->screen = NULL;
g_hash_table_insert (event_hash, new_event, GUINT_TO_POINTER (1));
new_private = g_chunk_new (GdkEventPrivate, event_chunk);
memset (new_private, 0, sizeof (GdkEventPrivate));
return (GdkEvent*) new_event;
new_private->flags = 0;
new_private->screen = NULL;
g_hash_table_insert (event_hash, new_private, GUINT_TO_POINTER (1));
new_event = (GdkEvent *) new_private;
new_event->any.type = type;
/*
* Bytewise 0 initialization is reasonable for most of the
* current event types. Explicitely initialize double fields
* since I trust bytewise 0 == 0. less than for integers
* or pointers.
*/
switch (type)
{
case GDK_MOTION_NOTIFY:
new_event->motion.x = 0.;
new_event->motion.y = 0.;
new_event->motion.x_root = 0.;
new_event->motion.y_root = 0.;
break;
case GDK_BUTTON_PRESS:
case GDK_2BUTTON_PRESS:
case GDK_3BUTTON_PRESS:
case GDK_BUTTON_RELEASE:
new_event->button.x = 0.;
new_event->button.y = 0.;
new_event->button.x_root = 0.;
new_event->button.y_root = 0.;
break;
case GDK_SCROLL:
new_event->scroll.x = 0.;
new_event->scroll.y = 0.;
new_event->scroll.x_root = 0.;
new_event->scroll.y_root = 0.;
break;
case GDK_ENTER_NOTIFY:
case GDK_LEAVE_NOTIFY:
new_event->crossing.x = 0.;
new_event->crossing.y = 0.;
new_event->crossing.x_root = 0.;
new_event->crossing.y_root = 0.;
break;
default:
break;
}
return new_event;
}
static gboolean
@ -303,15 +352,22 @@ gdk_event_is_allocated (GdkEvent *event)
GdkEvent*
gdk_event_copy (GdkEvent *event)
{
GdkEventPrivate *private;
GdkEventPrivate *new_private;
GdkEvent *new_event;
g_return_val_if_fail (event != NULL, NULL);
new_event = _gdk_event_new ();
new_event = gdk_event_new (GDK_NOTHING);
new_private = (GdkEventPrivate *)new_event;
private = (GdkEventPrivate *)event;
*new_event = *event;
if (new_event->any.window)
g_object_ref (new_event->any.window);
new_private->screen = private->screen;
switch (event->any.type)
{

View file

@ -237,7 +237,6 @@ struct _GdkEventNoExpose
GdkEventType type;
GdkWindow *window;
gint8 send_event;
/* XXX: does anyone need the X major_code or minor_code fields? */
};
struct _GdkEventVisibility
@ -451,6 +450,7 @@ GdkEvent* gdk_event_peek (void);
GdkEvent* gdk_event_get_graphics_expose (GdkWindow *window);
void gdk_event_put (GdkEvent *event);
GdkEvent* gdk_event_new (GdkEventType type);
GdkEvent* gdk_event_copy (GdkEvent *event);
void gdk_event_free (GdkEvent *event);

View file

@ -169,9 +169,6 @@ extern gchar *_gdk_display_name;
extern const GdkPointerHooks *_gdk_current_pointer_hooks;
GdkEvent* _gdk_event_new (void);
void _gdk_events_queue (GdkDisplay *display);
GdkEvent* _gdk_event_unqueue (GdkDisplay *display);

View file

@ -1456,12 +1456,11 @@ gdk_event_make (GdkWindow *window,
GdkEventType type,
gboolean append_to_queue)
{
GdkEvent *event = _gdk_event_new ();
GdkEvent *event = gdk_event_new (type);
guint32 the_time;
the_time = gdk_fb_get_time ();
event->any.type = type;
event->any.window = gdk_window_ref (window);
event->any.send_event = FALSE;
switch (type)

View file

@ -166,6 +166,7 @@ real_window_procedure (HWND hwnd,
msg.pt.y = HIWORD (pos);
event.flags = GDK_EVENT_PENDING;
event.screen = NULL;
if (gdk_event_translate (display, &event.event, &msg, &ret_val_flag, &ret_val, FALSE))
{
event.flags &= ~GDK_EVENT_PENDING;
@ -217,7 +218,7 @@ real_window_procedure (HWND hwnd,
}
}
#endif
eventp = _gdk_event_new ();
eventp = gdk_event_new (GDK_NOTHING);
*((GdkEventPrivate *) eventp) = event;
/* Philippe Colantoni <colanton@aris.ss.uci.edu> suggests this
@ -505,7 +506,7 @@ gdk_event_get_graphics_expose (GdkWindow *window)
#else
if (PeekMessage (&msg, GDK_WINDOW_HWND (window), WM_PAINT, WM_PAINT, PM_REMOVE))
{
event = _gdk_event_new ();
event = gdk_event_new (GDK_NOTHING);
if (gdk_event_translate (gdk_drawable_get_display (window),
event, &msg, NULL, NULL, TRUE))
@ -1246,8 +1247,7 @@ synthesize_enter_or_leave_event (GdkWindow *window,
{
GdkEvent *event;
event = _gdk_event_new ();
event->crossing.type = type;
event = gdk_event_new (type);
event->crossing.window = window;
event->crossing.send_event = FALSE;
gdk_window_ref (event->crossing.window);
@ -1468,8 +1468,7 @@ synthesize_expose_events (GdkWindow *window)
WIN32_GDI_FAILED ("GetClipBox");
else if (k != NULLREGION)
{
event = _gdk_event_new ();
event->expose.type = GDK_EXPOSE;
event = gdk_event_new (GDK_EXPOSE);
event->expose.window = window;
gdk_window_ref (window);
event->expose.area.x = r.left;
@ -2533,7 +2532,7 @@ gdk_event_translate (GdkDisplay *display,
* (from which it will be fetched before the release
* event).
*/
GdkEvent *event2 = _gdk_event_new ();
GdkEvent *event2 = gdk_event_new (GDK_KEY_PRESS);
build_keypress_event (event2, msg);
event2->key.window = window;
gdk_drawable_ref (window);

View file

@ -269,7 +269,7 @@ gdk_event_get_graphics_expose (GdkWindow *window)
if (xevent.xany.type == GraphicsExpose)
{
event = _gdk_event_new ();
event = gdk_event_new (GDK_NOTHING);
if (gdk_event_translate (GDK_WINDOW_DISPLAY (window), event,
&xevent, TRUE))
@ -1799,9 +1799,8 @@ _gdk_events_queue (GdkDisplay *display)
continue;
}
event = _gdk_event_new ();
event = gdk_event_new (GDK_NOTHING);
event->any.type = GDK_NOTHING;
event->any.window = NULL;
event->any.send_event = xevent.xany.send_event ? TRUE : FALSE;

View file

@ -7047,21 +7047,24 @@ move_vertical (GtkCList *clist,
gtk_adjustment_set_value (clist->vadjustment, value);
}
static void
do_fake_motion (GtkWidget *widget)
{
GdkEvent *event = gdk_event_new (GDK_MOTION_NOTIFY);
event->motion.send_event = TRUE;
gtk_clist_motion (widget, (GdkEventMotion *)event);
gdk_event_free (event);
}
static gint
horizontal_timeout (GtkCList *clist)
{
GdkEventMotion event;
memset (&event, 0, sizeof (event));
GDK_THREADS_ENTER ();
clist->htimer = 0;
event.type = GDK_MOTION_NOTIFY;
event.send_event = TRUE;
gtk_clist_motion (GTK_WIDGET (clist), &event);
do_fake_motion (GTK_WIDGET (clist));
GDK_THREADS_LEAVE ();
@ -7071,18 +7074,10 @@ horizontal_timeout (GtkCList *clist)
static gint
vertical_timeout (GtkCList *clist)
{
GdkEventMotion event;
memset (&event, 0, sizeof (event));
GDK_THREADS_ENTER ();
clist->vtimer = 0;
event.type = GDK_MOTION_NOTIFY;
event.send_event = TRUE;
gtk_clist_motion (GTK_WIDGET (clist), &event);
do_fake_motion (GTK_WIDGET (clist));
GDK_THREADS_LEAVE ();

View file

@ -710,7 +710,7 @@ gtk_combo_list_enter (GtkWidget *widget,
(combo->current_button != 0) &&
(!GTK_WIDGET_HAS_GRAB (combo->list)))
{
GdkEvent tmp_event;
GdkEvent *tmp_event = gdk_event_new (GDK_BUTTON_PRESS);
gint x, y;
GdkModifierType mask;
@ -721,19 +721,19 @@ gtk_combo_list_enter (GtkWidget *widget,
*/
gdk_window_get_pointer (combo->list->window, &x, &y, &mask);
tmp_event.button.type = GDK_BUTTON_PRESS;
tmp_event.button.window = combo->list->window;
tmp_event.button.send_event = TRUE;
tmp_event.button.time = GDK_CURRENT_TIME; /* bad */
tmp_event.button.x = x;
tmp_event.button.y = y;
tmp_event->button.window = g_object_ref (combo->list->window);
tmp_event->button.send_event = TRUE;
tmp_event->button.time = GDK_CURRENT_TIME; /* bad */
tmp_event->button.x = x;
tmp_event->button.y = y;
/* We leave all the XInput fields unfilled here, in the expectation
* that GtkList doesn't care.
*/
tmp_event.button.button = combo->current_button;
tmp_event.button.state = mask;
tmp_event->button.button = combo->current_button;
tmp_event->button.state = mask;
gtk_widget_event (combo->list, &tmp_event);
gtk_widget_event (combo->list, tmp_event);
gdk_event_free (tmp_event);
}
return FALSE;

View file

@ -2296,7 +2296,7 @@ gtk_container_propagate_expose (GtkContainer *container,
GtkWidget *child,
GdkEventExpose *event)
{
GdkEventExpose child_event;
GdkEvent *child_event;
g_return_if_fail (GTK_IS_CONTAINER (container));
g_return_if_fail (GTK_IS_WIDGET (child));
@ -2308,14 +2308,16 @@ gtk_container_propagate_expose (GtkContainer *container,
GTK_WIDGET_NO_WINDOW (child) &&
(child->window == event->window))
{
child_event = *event;
child_event = gdk_event_new (GDK_EXPOSE);
child_event->expose = *event;
g_object_ref (child_event->expose.window);
child_event.region = gtk_widget_region_intersect (child, event->region);
if (!gdk_region_empty (child_event.region))
child_event->expose.region = gtk_widget_region_intersect (child, event->region);
if (!gdk_region_empty (child_event->expose.region))
{
gdk_region_get_clipbox (child_event.region, &child_event.area);
gtk_widget_send_expose (child, (GdkEvent *)&child_event);
gdk_region_get_clipbox (child_event->expose.region, &child_event->expose.area);
gtk_widget_send_expose (child, child_event);
}
gdk_region_destroy (child_event.region);
gdk_event_free (child_event);
}
}

View file

@ -349,20 +349,16 @@ gtk_dialog_close (GtkDialog *dialog)
{
/* Synthesize delete_event to close dialog. */
GdkEventAny event;
GdkEvent *event = gdk_event_new (GDK_DELETE);
GtkWidget *widget;
widget = GTK_WIDGET (dialog);
event.type = GDK_DELETE;
event.window = widget->window;
event.send_event = TRUE;
event->any.window = g_object_ref (widget->window);
event->any.send_event = TRUE;
g_object_ref (G_OBJECT (event.window));
gtk_main_do_event ((GdkEvent*)&event);
g_object_unref (G_OBJECT (event.window));
gtk_main_do_event (event);
gdk_event_free (event);
}
GtkWidget*

View file

@ -234,6 +234,8 @@ static void gtk_drag_drop (GtkDragSourceInfo *info,
static void gtk_drag_drop_finished (GtkDragSourceInfo *info,
gboolean success,
guint time);
static void gtk_drag_cancel (GtkDragSourceInfo *info,
guint32 time);
static gint gtk_drag_source_event_cb (GtkWidget *widget,
GdkEvent *event,
@ -1886,15 +1888,7 @@ gtk_drag_begin (GtkWidget *widget,
{
if (gdk_keyboard_grab (info->ipc_widget->window, FALSE, time) != 0)
{
/* FIXME: This should be cleaned up... */
GdkEventButton ev;
ev.time = time;
ev.type = GDK_BUTTON_RELEASE;
ev.button = info->button;
gtk_drag_button_release_cb (widget, &ev, info);
gtk_drag_cancel (info, time);
return NULL;
}
}
@ -3015,15 +3009,15 @@ gtk_drag_update (GtkDragSourceInfo *info,
* Called when the user finishes to drag, either by
* releasing the mouse, or by pressing Esc.
* arguments:
* widget: GtkInvisible widget for this drag
* info:
* info: Source info for the drag
* time: Timestamp for ending the drag
* results:
*************************************************************/
static void
gtk_drag_end (GtkDragSourceInfo *info, guint32 time)
{
GdkEvent send_event;
GdkEvent *send_event;
GtkWidget *source_widget = info->widget;
GdkDisplay *display = gtk_widget_get_display (source_widget);
@ -3050,20 +3044,39 @@ gtk_drag_end (GtkDragSourceInfo *info, guint32 time)
* expect propagation.
*/
send_event.button.type = GDK_BUTTON_RELEASE;
send_event.button.window = gtk_widget_get_root_window (source_widget);
send_event.button.send_event = TRUE;
send_event.button.time = time;
send_event.button.x = 0;
send_event.button.y = 0;
send_event.button.axes = NULL;
send_event.button.state = 0;
send_event.button.button = info->button;
send_event.button.device = gdk_display_get_core_pointer (display);
send_event.button.x_root = 0;
send_event.button.y_root = 0;
send_event = gdk_event_new (GDK_BUTTON_RELEASE);
send_event->button.window = g_object_ref (gtk_widget_get_root_window (source_widget));
send_event->button.send_event = TRUE;
send_event->button.time = time;
send_event->button.x = 0;
send_event->button.y = 0;
send_event->button.axes = NULL;
send_event->button.state = 0;
send_event->button.button = info->button;
send_event->button.device = gdk_display_get_core_pointer (display);
send_event->button.x_root = 0;
send_event->button.y_root = 0;
gtk_propagate_event (source_widget, &send_event);
gtk_propagate_event (source_widget, send_event);
gdk_event_free (send_event);
}
/*************************************************************
* gtk_drag_cancel:
* Called on cancellation of a drag, either by the user
* or programmatically.
* arguments:
* info: Source info for the drag
* time: Timestamp for ending the drag
* results:
*************************************************************/
static void
gtk_drag_cancel (GtkDragSourceInfo *info, guint32 time)
{
gtk_drag_end (info, time);
gdk_drag_abort (info->context, time);
gtk_drag_drop_finished (info, FALSE, time);
}
/*************************************************************
@ -3117,9 +3130,7 @@ gtk_drag_key_cb (GtkWidget *widget,
{
if (event->keyval == GDK_Escape)
{
gtk_drag_end (info, event->time);
gdk_drag_abort (info->context, event->time);
gtk_drag_drop_finished (info, FALSE, event->time);
gtk_drag_cancel (info, event->time);
return TRUE;
}
@ -3158,16 +3169,14 @@ gtk_drag_button_release_cb (GtkWidget *widget,
if (event->button != info->button)
return FALSE;
gtk_drag_end (info, event->time);
if ((info->context->action != 0) && (info->context->dest_window != NULL))
{
gtk_drag_end (info, event->time);
gtk_drag_drop (info, event->time);
}
else
{
gdk_drag_abort (info->context, event->time);
gtk_drag_drop_finished (info, FALSE, event->time);
gtk_drag_cancel (info, event->time);
}
return TRUE;

View file

@ -151,17 +151,17 @@ static void
gtk_drawing_area_send_configure (GtkDrawingArea *darea)
{
GtkWidget *widget;
GdkEventConfigure event;
GdkEvent *event = gdk_event_new (GDK_CONFIGURE);
widget = GTK_WIDGET (darea);
event.type = GDK_CONFIGURE;
event.window = widget->window;
event.send_event = TRUE;
event.x = widget->allocation.x;
event.y = widget->allocation.y;
event.width = widget->allocation.width;
event.height = widget->allocation.height;
event->configure.window = g_object_ref (widget->window);
event->configure.send_event = TRUE;
event->configure.x = widget->allocation.x;
event->configure.y = widget->allocation.y;
event->configure.width = widget->allocation.width;
event->configure.height = widget->allocation.height;
gtk_widget_event (widget, (GdkEvent*) &event);
gtk_widget_event (widget, event);
gdk_event_free (event);
}

View file

@ -1132,10 +1132,11 @@ no_sequence_matches (GtkIMContextSimple *context_simple,
for (i=0; i < n_compose - len - 1; i++)
{
GdkEventKey tmp_event = *event;
tmp_event.keyval = context_simple->compose_buffer[len + i];
GdkEventKey *tmp_event = gdk_event_copy (event);
tmp_event->keyval = context_simple->compose_buffer[len + i];
gtk_im_context_filter_keypress (context, &tmp_event);
gtk_im_context_filter_keypress (context, tmp_event);
gdk_event_free (tmp_event);
}
return gtk_im_context_filter_keypress (context, event);

View file

@ -2317,22 +2317,25 @@ gtk_list_move_focus_child (GtkList *list,
}
}
static void
do_fake_motion (GtkWidget *list)
{
GdkEvent *event = gdk_event_new (GDK_MOTION_NOTIFY);
event->motion.send_event = TRUE;
gtk_list_motion_notify (list, (GdkEventMotion *)event);
gdk_event_free (event);
}
static gint
gtk_list_horizontal_timeout (GtkWidget *list)
{
GdkEventMotion event;
memset (&event, 0, sizeof (event));
GDK_THREADS_ENTER ();
GTK_LIST (list)->htimer = 0;
event.type = GDK_MOTION_NOTIFY;
event.send_event = TRUE;
gtk_list_motion_notify (list, &event);
do_fake_motion (list);
GDK_THREADS_LEAVE ();
return FALSE;
@ -2341,18 +2344,10 @@ gtk_list_horizontal_timeout (GtkWidget *list)
static gint
gtk_list_vertical_timeout (GtkWidget *list)
{
GdkEventMotion event;
memset (&event, 0, sizeof (event));
GDK_THREADS_ENTER ();
GTK_LIST (list)->vtimer = 0;
event.type = GDK_MOTION_NOTIFY;
event.send_event = TRUE;
gtk_list_motion_notify (list, &event);
do_fake_motion (list);
GDK_THREADS_LEAVE ();

View file

@ -1979,17 +1979,17 @@ gtk_menu_motion_notify (GtkWidget *widget,
if (event->x >= 0 && event->x < width &&
event->y >= 0 && event->y < height)
{
GdkEvent send_event;
GdkEvent *send_event = gdk_event_new (GDK_ENTER_NOTIFY);
gboolean result;
memset (&send_event, 0, sizeof (send_event));
send_event.crossing.type = GDK_ENTER_NOTIFY;
send_event.crossing.window = event->window;
send_event.crossing.time = event->time;
send_event.crossing.send_event = TRUE;
send_event.crossing.x_root = event->x_root;
send_event.crossing.y_root = event->y_root;
send_event.crossing.x = event->x;
send_event.crossing.y = event->y;
send_event->crossing.type = GDK_ENTER_NOTIFY;
send_event->crossing.window = g_object_ref (event->window);
send_event->crossing.time = event->time;
send_event->crossing.send_event = TRUE;
send_event->crossing.x_root = event->x_root;
send_event->crossing.y_root = event->y_root;
send_event->crossing.x = event->x;
send_event->crossing.y = event->y;
/* We send the event to 'widget', the currently active menu,
* instead of 'menu', the menu that the pointer is in. This
@ -1997,7 +1997,10 @@ gtk_menu_motion_notify (GtkWidget *widget,
* menuitem is a child of the active menu or some parent
* menu of the active menu.
*/
return gtk_widget_event (widget, &send_event);
result = gtk_widget_event (widget, &send_event);
gdk_event_free (send_event);
return result;
}
}
@ -2244,15 +2247,15 @@ gtk_menu_stop_navigating_submenu_cb (gpointer user_data)
if (child_window)
{
GdkEventCrossing send_event;
GdkEvent *send_event = gdk_event_new (GDK_ENTER_NOTIFY);
memset (&send_event, 0, sizeof (send_event));
send_event.window = child_window;
send_event.type = GDK_ENTER_NOTIFY;
send_event.time = GDK_CURRENT_TIME; /* Bogus */
send_event.send_event = TRUE;
send_event->crossing.window = g_object_ref (child_window);
send_event->crossing.time = GDK_CURRENT_TIME; /* Bogus */
send_event->crossing.send_event = TRUE;
GTK_WIDGET_CLASS (parent_class)->enter_notify_event (GTK_WIDGET (menu), &send_event);
GTK_WIDGET_CLASS (parent_class)->enter_notify_event (GTK_WIDGET (menu), (GdkEventCrossing *)send_event);
gdk_event_free (send_event);
}
}

View file

@ -2779,20 +2779,20 @@ gtk_notebook_draw_tab (GtkNotebook *notebook,
if (gtk_widget_intersect (page->tab_label, area, &child_area) &&
GTK_WIDGET_DRAWABLE (page->tab_label))
{
GdkEventExpose expose_event;
GdkEvent *expose_event = gdk_event_new (GDK_EXPOSE);
/* This is a lame hack since all this code needs rewriting anyhow */
expose_event.window = page->tab_label->window;
expose_event.area = child_area;
expose_event.region = gdk_region_rectangle (&child_area);
expose_event.send_event = TRUE;
expose_event.type = GDK_EXPOSE;
expose_event.count = 0;
expose_event->expose.window = g_object_ref (page->tab_label->window);
expose_event->expose.area = child_area;
expose_event->expose.region = gdk_region_rectangle (&child_area);
expose_event->expose.send_event = TRUE;
expose_event->expose.type = GDK_EXPOSE;
expose_event->expose.count = 0;
gtk_container_propagate_expose (GTK_CONTAINER (notebook), page->tab_label, &expose_event);
gtk_container_propagate_expose (GTK_CONTAINER (notebook), page->tab_label, (GdkEventExpose *)&expose_event);
gdk_region_destroy (expose_event.region);
gdk_event_free (expose_event);
}
}
}

View file

@ -247,6 +247,24 @@ _gtk_plug_add_to_socket (GtkPlug *plug,
g_signal_emit_by_name (G_OBJECT (socket), "plug_added", 0);
}
static void
send_delete_event (GtkWidget *widget)
{
GdkEvent *event = gdk_event_new (GDK_DELETE);
event->any.window = g_object_ref (widget->window);
event->any.send_event = FALSE;
gtk_widget_ref (widget);
if (!gtk_widget_event (widget, event))
gtk_widget_destroy (widget);
gtk_widget_unref (widget);
gdk_event_free (event);
}
/**
* _gtk_plug_remove_from_socket:
* @plug: a #GtkPlug
@ -259,7 +277,6 @@ _gtk_plug_remove_from_socket (GtkPlug *plug,
GtkSocket *socket)
{
GtkWidget *widget;
GdkEvent event;
gboolean result;
gboolean widget_was_visible;
@ -298,14 +315,8 @@ _gtk_plug_remove_from_socket (GtkPlug *plug,
if (!result)
gtk_widget_destroy (GTK_WIDGET (socket));
event.any.type = GDK_DELETE;
event.any.window = g_object_ref (widget->window);
event.any.send_event = FALSE;
if (!gtk_widget_event (widget, &event))
gtk_widget_destroy (widget);
g_object_unref (event.any.window);
send_delete_event (widget);
g_object_unref (plug);
if (widget_was_visible && GTK_WIDGET_VISIBLE (socket))
@ -1110,18 +1121,7 @@ gtk_plug_filter_func (GdkXEvent *gdk_xevent, GdkEvent *event, gpointer data)
*/
if (xre->parent == GDK_WINDOW_XWINDOW (gdk_screen_get_root_window (screen)))
{
GdkEvent event;
event.any.type = GDK_DELETE;
event.any.window = g_object_ref (widget->window);
event.any.send_event = FALSE;
if (!gtk_widget_event (widget, &event))
gtk_widget_destroy (widget);
g_object_unref (event.any.window);
}
send_delete_event (widget);
}
else
goto done;

View file

@ -380,14 +380,15 @@ gtk_selection_owner_set_for_display (GdkDisplay *display,
*/
if (old_owner && old_owner != widget)
{
GdkEventSelection event;
GdkEvent *event = gdk_event_new (GDK_SELECTION_CLEAR);
event.type = GDK_SELECTION_CLEAR;
event.window = old_owner->window;
event.selection = selection;
event.time = time;
event->selection.window = g_object_ref (old_owner->window);
event->selection.selection = selection;
event->selection.time = time;
gtk_widget_event (old_owner, (GdkEvent *) &event);
gtk_widget_event (old_owner, event);
gdk_event_free (event);
}
return TRUE;
}

View file

@ -1644,7 +1644,6 @@ static gint
gtk_text_scroll_timeout (gpointer data)
{
GtkText *text;
GdkEventMotion event;
gint x, y;
GdkModifierType mask;
@ -1657,12 +1656,16 @@ gtk_text_scroll_timeout (gpointer data)
if (mask & (GDK_BUTTON1_MASK | GDK_BUTTON3_MASK))
{
event.is_hint = 0;
event.x = x;
event.y = y;
event.state = mask;
GdkEvent *event = gdk_event_new (GDK_MOTION_NOTIFY);
gtk_text_motion_notify (GTK_WIDGET (text), &event);
event->motion.is_hint = 0;
event->motion.x = x;
event->motion.y = y;
event->motion.state = mask;
gtk_text_motion_notify (GTK_WIDGET (text), (GdkEventMotion *)event);
gdk_event_free (event);
}
GDK_THREADS_LEAVE ();

View file

@ -697,22 +697,23 @@ gtk_tree_item_expose_child (GtkWidget *child,
GtkWidget *container;
GdkEventExpose *event;
} *data = client_data;
GdkEventExpose child_event;
if (GTK_WIDGET_DRAWABLE (child) &&
GTK_WIDGET_NO_WINDOW (child) &&
(child->window == data->event->window))
{
child_event = *data->event;
GdkEvent *child_event = gdk_event_new (GDK_EXPOSE);
child_event->expose = *data->event;
g_object_ref (child_event->expose.window);
child_event.region = gtk_widget_region_intersect (child,
data->event->region);
if (!gdk_region_empty (child_event.region))
child_event->expose.region = gtk_widget_region_intersect (child,
data->event->region);
if (!gdk_region_empty (child_event->expose.region))
{
gdk_region_get_clipbox (child_event.region, &child_event.area);
gtk_widget_send_expose (child, (GdkEvent *) &child_event);
gdk_region_get_clipbox (child_event->expose.region, &child_event->expose.area);
gtk_widget_send_expose (child, child_event);
}
gdk_region_destroy (child_event.region);
gdk_event_free (child_event);
}
}

View file

@ -6802,7 +6802,7 @@ void
_gtk_tree_view_column_start_drag (GtkTreeView *tree_view,
GtkTreeViewColumn *column)
{
GdkEvent send_event;
GdkEvent *send_event;
GtkAllocation allocation;
gint x, y, width, height;
GdkScreen *screen = gtk_widget_get_screen (GTK_WIDGET (tree_view));
@ -6838,29 +6838,31 @@ _gtk_tree_view_column_start_drag (GtkTreeView *tree_view,
gtk_grab_remove (column->button);
send_event.crossing.type = GDK_LEAVE_NOTIFY;
send_event.crossing.send_event = TRUE;
send_event.crossing.window = column->button->window;
send_event.crossing.subwindow = NULL;
send_event.crossing.detail = GDK_NOTIFY_ANCESTOR;
send_event.crossing.time = GDK_CURRENT_TIME;
send_event = gdk_event_new (GDK_LEAVE_NOTIFY);
send_event->crossing.send_event = TRUE;
send_event->crossing.window = g_object_ref (column->button->window);
send_event->crossing.subwindow = NULL;
send_event->crossing.detail = GDK_NOTIFY_ANCESTOR;
send_event->crossing.time = GDK_CURRENT_TIME;
gtk_propagate_event (column->button, &send_event);
gtk_propagate_event (column->button, send_event);
gdk_event_free (send_event);
send_event.button.type = GDK_BUTTON_RELEASE;
send_event.button.window = gdk_screen_get_root_window (screen);
send_event.button.send_event = TRUE;
send_event.button.time = GDK_CURRENT_TIME;
send_event.button.x = -1;
send_event.button.y = -1;
send_event.button.axes = NULL;
send_event.button.state = 0;
send_event.button.button = 1;
send_event.button.device = gdk_display_get_core_pointer (display);
send_event.button.x_root = 0;
send_event.button.y_root = 0;
send_event = gdk_event_new (GDK_BUTTON_RELEASE);
send_event->button.window = g_object_ref (gdk_screen_get_root_window (screen));
send_event->button.send_event = TRUE;
send_event->button.time = GDK_CURRENT_TIME;
send_event->button.x = -1;
send_event->button.y = -1;
send_event->button.axes = NULL;
send_event->button.state = 0;
send_event->button.button = 1;
send_event->button.device = gdk_display_get_core_pointer (display);
send_event->button.x_root = 0;
send_event->button.y_root = 0;
gtk_propagate_event (column->button, &send_event);
gtk_propagate_event (column->button, send_event);
gdk_event_free (send_event);
gdk_window_move_resize (tree_view->priv->drag_window,
column->button->allocation.x,
@ -7515,13 +7517,38 @@ gtk_tree_view_real_select_cursor_parent (GtkTreeView *tree_view)
gtk_tree_path_free (cursor_path);
}
/* Cut and paste from gtkwindow.c */
static void
send_focus_change (GtkWidget *widget,
gboolean in)
{
GdkEvent *fevent = gdk_event_new (GDK_FOCUS_CHANGE);
g_object_ref (widget);
if (in)
GTK_WIDGET_SET_FLAGS (widget, GTK_HAS_FOCUS);
else
GTK_WIDGET_UNSET_FLAGS (widget, GTK_HAS_FOCUS);
fevent->focus_change.type = GDK_FOCUS_CHANGE;
fevent->focus_change.window = g_object_ref (widget->window);
fevent->focus_change.in = in;
gtk_widget_event (widget, fevent);
g_object_notify (G_OBJECT (widget), "has_focus");
g_object_unref (widget);
gdk_event_free (fevent);
}
static void
gtk_tree_view_real_start_interactive_search (GtkTreeView *tree_view)
{
GtkWidget *window;
GtkWidget *entry;
GtkWidget *search_dialog;
GdkEventFocus focus_event;
if (! GTK_WIDGET_HAS_FOCUS (tree_view))
return;
@ -7566,9 +7593,7 @@ gtk_tree_view_real_start_interactive_search (GtkTreeView *tree_view)
gtk_widget_grab_focus (entry);
/* send focus-in event */
focus_event.type = GDK_FOCUS_CHANGE;
focus_event.in = TRUE;
gtk_widget_event (entry, (GdkEvent *) &focus_event);
send_focus_change (entry, TRUE);
/* position window */
@ -10448,11 +10473,8 @@ gtk_tree_view_search_dialog_destroy (GtkWidget *search_dialog,
if (entry)
{
GdkEventFocus focus_event;
focus_event.type = GDK_FOCUS_CHANGE;
focus_event.in = FALSE;
gtk_widget_event (GTK_WIDGET (entry), (GdkEvent *) &focus_event);
/* send focus-in event */
send_focus_change (GTK_WIDGET (entry), FALSE);
}
/* remove data from tree_view */

View file

@ -582,7 +582,6 @@ gtk_viewport_expose (GtkWidget *widget,
{
GtkViewport *viewport;
GtkBin *bin;
GdkEventExpose child_event;
if (GTK_WIDGET_DRAWABLE (widget))
{
@ -593,8 +592,6 @@ gtk_viewport_expose (GtkWidget *widget,
gtk_viewport_paint (widget, &event->area);
else if (event->window == viewport->bin_window)
{
child_event = *event;
gtk_paint_flat_box(widget->style, viewport->bin_window,
GTK_STATE_NORMAL, GTK_SHADOW_NONE,
&event->area, widget, "viewportbin",

View file

@ -481,18 +481,14 @@ gtk_decorated_window_button_release (GtkWidget *widget,
type = gtk_decorated_window_region_type (window, event->x, event->y);
if (type == GTK_WINDOW_REGION_CLOSE)
{
GdkEventAny event;
GdkEvent *event = gdk_event_new (GDK_DELETE);
event.type = GDK_DELETE;
event.window = widget->window;
event.send_event = TRUE;
event->any.type = GDK_DELETE;
event->any.window = g_object_ref (widget->window);
event->any.send_event = TRUE;
/* Synthesize delete_event */
g_object_ref (event.window);
gtk_main_do_event ((GdkEvent *) &event);
g_object_unref (event.window);
gtk_main_do_event (event);
gdk_event_free (event);
}
}

View file

@ -4077,24 +4077,25 @@ static void
do_focus_change (GtkWidget *widget,
gboolean in)
{
GdkEventFocus fevent;
GdkEvent *fevent = gdk_event_new (GDK_FOCUS_CHANGE);
g_object_ref (widget);
if (in)
if (in)
GTK_WIDGET_SET_FLAGS (widget, GTK_HAS_FOCUS);
else
GTK_WIDGET_UNSET_FLAGS (widget, GTK_HAS_FOCUS);
fevent.type = GDK_FOCUS_CHANGE;
fevent.window = widget->window;
fevent.in = in;
gtk_widget_event (widget, (GdkEvent*) &fevent);
fevent->focus_change.type = GDK_FOCUS_CHANGE;
fevent->focus_change.window = g_object_ref (widget->window);
fevent->focus_change.in = in;
gtk_widget_event (widget, fevent);
g_object_notify (G_OBJECT (widget), "has_focus");
g_object_unref (widget);
gdk_event_free (fevent);
}
static gint
@ -4140,20 +4141,22 @@ gtk_window_read_rcfiles (GtkWidget *widget,
embedded_windows = g_object_get_data (G_OBJECT (widget), "gtk-embedded");
if (embedded_windows)
{
GdkEventClient sev;
GdkEvent *send_event = gdk_event_new (GDK_CLIENT_EVENT);
int i;
for (i = 0; i < 5; i++)
sev.data.l[i] = 0;
sev.data_format = 32;
sev.message_type = atom_rcfiles;
send_event->client.data.l[i] = 0;
send_event->client.data_format = 32;
send_event->client.message_type = atom_rcfiles;
while (embedded_windows)
{
guint xid = GPOINTER_TO_UINT (embedded_windows->data);
gdk_event_send_client_message_for_display (gtk_widget_get_display (widget), (GdkEvent *) &sev, xid);
gdk_event_send_client_message_for_display (gtk_widget_get_display (widget), send_event, xid);
embedded_windows = embedded_windows->next;
}
gdk_event_free (send_event);
}
gtk_rc_reparse_all_for_settings (gtk_widget_get_settings (widget), FALSE);

View file

@ -11631,17 +11631,19 @@ reload_all_rc_files (void)
{
static GdkAtom atom_rcfiles = GDK_NONE;
GdkEventClient sev;
GdkEvent *send_event = gdk_event_new (GDK_CLIENT_EVENT);
int i;
if (!atom_rcfiles)
atom_rcfiles = gdk_atom_intern("_GTK_READ_RCFILES", FALSE);
for(i = 0; i < 5; i++)
sev.data.l[i] = 0;
sev.data_format = 32;
sev.message_type = atom_rcfiles;
gdk_event_send_clientmessage_toall ((GdkEvent *) &sev);
send_event->client.data.l[i] = 0;
send_event->client.data_format = 32;
send_event->client.message_type = atom_rcfiles;
gdk_event_send_clientmessage_toall (send_event);
gdk_event_free (send_event);
}
void