[gtk+/gtk-3-14] statusicon: fix crash storing pointer in UINT



commit e17fb52cfcc279b4ab91ac1ddcb73abc14c2390e
Author: Arnav Singh <arnavion gmail com>
Date:   Sat Feb 21 15:04:18 2015 +0100

    statusicon: fix crash storing pointer in UINT
    
    https://bugzilla.gnome.org/show_bug.cgi?id=696505

 gtk/deprecated/gtkstatusicon.c |   24 +++++++++++++++++++++---
 1 files changed, 21 insertions(+), 3 deletions(-)
---
diff --git a/gtk/deprecated/gtkstatusicon.c b/gtk/deprecated/gtkstatusicon.c
index 2850679..64527c6 100644
--- a/gtk/deprecated/gtkstatusicon.c
+++ b/gtk/deprecated/gtkstatusicon.c
@@ -691,6 +691,24 @@ button_callback (gpointer data)
 
 static UINT taskbar_created_msg = 0;
 static GSList *status_icons = NULL;
+static UINT status_icon_id = 0;
+
+static GtkStatusIcon *
+find_status_icon (UINT id)
+{
+  GSList *rover;
+
+  for (rover = status_icons; rover != NULL; rover = rover->next)
+    {
+      GtkStatusIcon *status_icon = GTK_STATUS_ICON (rover->data);
+      GtkStatusIconPrivate *priv = status_icon->priv;
+
+      if (priv->nid.uID == id)
+        return status_icon;
+    }
+
+  return NULL;
+}
 
 static LRESULT CALLBACK
 wndproc (HWND   hwnd,
@@ -752,7 +770,7 @@ wndproc (HWND   hwnd,
        buttondown0:
          bc = g_new (ButtonCallbackData, 1);
          bc->event = (GdkEventButton *) gdk_event_new (GDK_BUTTON_PRESS);
-         bc->status_icon = GTK_STATUS_ICON (wparam);
+         bc->status_icon = find_status_icon (wparam);
          build_button_event (bc->status_icon->priv, bc->event, button);
          g_idle_add (button_callback, bc);
          break;
@@ -778,7 +796,7 @@ wndproc (HWND   hwnd,
        buttonup0:
          bc = g_new (ButtonCallbackData, 1);
          bc->event = (GdkEventButton *) gdk_event_new (GDK_BUTTON_RELEASE);
-         bc->status_icon = GTK_STATUS_ICON (wparam);
+         bc->status_icon = find_status_icon (wparam);
          build_button_event (bc->status_icon->priv, bc->event, button);
          g_idle_add (button_callback, bc);
          break;
@@ -925,7 +943,7 @@ gtk_status_icon_init (GtkStatusIcon *status_icon)
   memset (&priv->nid, 0, sizeof (priv->nid));
 
   priv->nid.hWnd = create_tray_observer ();
-  priv->nid.uID = GPOINTER_TO_UINT (status_icon);
+  priv->nid.uID = status_icon_id++;
   priv->nid.uCallbackMessage = WM_GTK_TRAY_NOTIFICATION;
   priv->nid.uFlags = NIF_MESSAGE;
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]