summaryrefslogtreecommitdiff
path: root/gdk
diff options
context:
space:
mode:
authorOwen Taylor <otaylor@redhat.com>2002-10-03 20:53:30 +0000
committerOwen Taylor <otaylor@src.gnome.org>2002-10-03 20:53:30 +0000
commitef33adff83617e2c937052316b9fb925d4972252 (patch)
treec6badff88c8dca205f9013043ab12c7f68db5903 /gdk
parent6cb79658c2a64d01f6e488f065eb2d265be97414 (diff)
downloadgtk+-ef33adff83617e2c937052316b9fb925d4972252.tar.gz
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.
Diffstat (limited to 'gdk')
-rw-r--r--gdk/gdkevents.c74
-rw-r--r--gdk/gdkevents.h2
-rw-r--r--gdk/gdkinternals.h3
-rw-r--r--gdk/linux-fb/gdkmain-fb.c3
-rw-r--r--gdk/win32/gdkevents-win32.c13
-rw-r--r--gdk/x11/gdkevents-x11.c5
6 files changed, 75 insertions, 25 deletions
diff --git a/gdk/gdkevents.c b/gdk/gdkevents.c
index ca3088cad2..bab5ad5d41 100644
--- a/gdk/gdkevents.c
+++ b/gdk/gdkevents.c
@@ -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;
+ new_private = g_chunk_new (GdkEventPrivate, event_chunk);
+ memset (new_private, 0, sizeof (GdkEventPrivate));
+
+ new_private->flags = 0;
+ new_private->screen = NULL;
+
+ g_hash_table_insert (event_hash, new_private, GUINT_TO_POINTER (1));
- g_hash_table_insert (event_hash, new_event, 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 (GdkEvent*) new_event;
+ 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)
{
diff --git a/gdk/gdkevents.h b/gdk/gdkevents.h
index d9f26167a0..818bb27465 100644
--- a/gdk/gdkevents.h
+++ b/gdk/gdkevents.h
@@ -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);
diff --git a/gdk/gdkinternals.h b/gdk/gdkinternals.h
index a0255ca07d..bc00798b06 100644
--- a/gdk/gdkinternals.h
+++ b/gdk/gdkinternals.h
@@ -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);
diff --git a/gdk/linux-fb/gdkmain-fb.c b/gdk/linux-fb/gdkmain-fb.c
index dd252470bc..4e3868ee58 100644
--- a/gdk/linux-fb/gdkmain-fb.c
+++ b/gdk/linux-fb/gdkmain-fb.c
@@ -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)
diff --git a/gdk/win32/gdkevents-win32.c b/gdk/win32/gdkevents-win32.c
index d7cd076f37..ab01d6d1dc 100644
--- a/gdk/win32/gdkevents-win32.c
+++ b/gdk/win32/gdkevents-win32.c
@@ -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);
diff --git a/gdk/x11/gdkevents-x11.c b/gdk/x11/gdkevents-x11.c
index 69a2ef4e67..cd9ec3ead9 100644
--- a/gdk/x11/gdkevents-x11.c
+++ b/gdk/x11/gdkevents-x11.c
@@ -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;