Advertisement
Guest User

Untitled

a guest
Oct 10th, 2011
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 6.91 KB | None | 0 0
  1. === modified file 'plugins/unityshell/src/PanelView.cpp'
  2. --- plugins/unityshell/src/PanelView.cpp    2011-09-29 23:26:20 +0000
  3. +++ plugins/unityshell/src/PanelView.cpp    2011-10-10 10:31:05 +0000
  4. @@ -669,9 +669,10 @@
  5.  PanelView::SyncGeometries()
  6.  {
  7.    indicator::EntryLocationMap locations;
  8. +  std::string panel_id = GetName() + boost::lexical_cast<std::string>(_monitor);
  9.    _menu_view->GetGeometryForSync(locations);
  10.    _indicators->GetGeometryForSync(locations);
  11. -  _remote->SyncGeometries(GetName(), locations);
  12. +  _remote->SyncGeometries(panel_id, locations);
  13.  }
  14.  
  15.  void
  16.  
  17. === modified file 'services/panel-service.c'
  18. --- services/panel-service.c    2011-09-29 23:26:20 +0000
  19. +++ services/panel-service.c    2011-10-10 12:43:16 +0000
  20. @@ -49,7 +49,8 @@
  21.  {
  22.    GSList     *indicators;
  23.    GHashTable *entry2indicator_hash;
  24. -  GHashTable *entry2geometry_hash;
  25. +  GHashTable *panel2entries_hash;
  26. +  //GHashTable *entry2geometry_hash;
  27.  
  28.    guint  initial_sync_id;
  29.    gint32 timeouts[N_TIMEOUT_SLOTS];
  30. @@ -134,7 +135,8 @@
  31.    gint i;
  32.  
  33.    g_hash_table_destroy (priv->entry2indicator_hash);
  34. -  g_hash_table_destroy (priv->entry2geometry_hash);
  35. +  g_hash_table_destroy (priv->panel2entries_hash);
  36. +  //g_hash_table_destroy (priv->entry2geometry_hash);
  37.  
  38.    gdk_window_remove_filter (NULL, (GdkFilterFunc)event_filter, object);
  39.  
  40. @@ -272,6 +274,7 @@
  41.              {
  42.                IndicatorObjectEntry *entry;
  43.                entry = get_entry_at (self, event->root_x, event->root_y);
  44. +              g_debug("Looking for entry at %fx%f, source: %d, device: %d => %p",event->root_x, event->root_y,event->sourceid,event->deviceid,entry);
  45.  
  46.                if (entry)
  47.                  {
  48. @@ -300,19 +303,25 @@
  49.  static IndicatorObjectEntry *
  50.  get_entry_at (PanelService *self, gint x, gint y)
  51.  {
  52. -  GHashTableIter iter;
  53. -  gpointer key, value;
  54. +  GHashTableIter panel_iter, entries_iter;
  55. +  gpointer key, value, k, v;
  56.  
  57. -  g_hash_table_iter_init (&iter, self->priv->entry2geometry_hash);
  58. -  while (g_hash_table_iter_next (&iter, &key, &value))
  59. +  g_hash_table_iter_init (&panel_iter, self->priv->panel2entries_hash);
  60. +  while (g_hash_table_iter_next (&panel_iter, &key, &value))
  61.      {
  62. -      IndicatorObjectEntry *entry = key;
  63. -      GdkRectangle *geo = value;
  64. +      GHashTable *entry2geometry_hash = value;
  65. +      g_hash_table_iter_init (&entries_iter, entry2geometry_hash);
  66.  
  67. -      if (x >= geo->x && x <= (geo->x + geo->width) &&
  68. -          y >= geo->y && y <= (geo->y + geo->height))
  69. +      while (g_hash_table_iter_next (&entries_iter, &k, &v))
  70.          {
  71. -          return entry;
  72. +          IndicatorObjectEntry *entry = k;
  73. +          GdkRectangle *geo = v;
  74. +
  75. +          if (x >= geo->x && x <= (geo->x + geo->width) &&
  76. +              y >= geo->y && y <= (geo->y + geo->height))
  77. +            {
  78. +              return entry;
  79. +            }
  80.          }
  81.      }
  82.  
  83. @@ -350,8 +359,11 @@
  84.    gdk_window_add_filter (NULL, (GdkFilterFunc)event_filter, self);
  85.  
  86.    priv->entry2indicator_hash = g_hash_table_new (g_direct_hash, g_direct_equal);
  87. -  priv->entry2geometry_hash = g_hash_table_new_full (g_direct_hash, g_direct_equal,
  88. -                                                     NULL, g_free);
  89. +  priv->panel2entries_hash = g_hash_table_new_full (g_str_hash, g_str_equal,
  90. +                                                    g_free,
  91. +                                                    (GDestroyNotify) g_hash_table_destroy);
  92. +  /*priv->entry2geometry_hash = g_hash_table_new_full (g_direct_hash, g_direct_equal,
  93. +                                                     NULL, g_free);*/
  94.  
  95.    suppress_signals = TRUE;
  96.    load_indicators (self);
  97. @@ -388,7 +400,16 @@
  98.        for (l = entries; l; l = l->next)
  99.          {
  100.            g_hash_table_remove (self->priv->entry2indicator_hash, l->data);
  101. -          g_hash_table_remove (self->priv->entry2geometry_hash, l->data);
  102. +          //g_hash_table_remove (self->priv->entry2geometry_hash, l->data);
  103. +          GHashTableIter iter;
  104. +          gpointer key, value;
  105. +
  106. +          g_hash_table_iter_init (&iter, self->priv->panel2entries_hash);
  107. +          while (g_hash_table_iter_next (&iter, &key, &value))
  108. +            {
  109. +              GHashTable *entry2geometry_hash = value;
  110. +              g_hash_table_remove (entry2geometry_hash, l->data);
  111. +            }
  112.          }
  113.  
  114.        g_list_free (entries);
  115. @@ -649,7 +670,7 @@
  116.    priv = self->priv;
  117.  
  118.    g_hash_table_remove (priv->entry2indicator_hash, entry);
  119. -  /* Don't remove here the value from priv->entry2geometry_hash, this should
  120. +  /* Don't remove here the value from priv->panel2entries_hash, this should
  121.     * be done in during the sync, to avoid false positive.
  122.     * FIXME this in libappmenu.so to avoid to send an "entry-removed" signal
  123.     * when switching the focus from a window to one of its dialog children */
  124. @@ -1105,31 +1126,48 @@
  125.  
  126.  void
  127.  panel_service_sync_geometry (PanelService *self,
  128. -           const gchar *indicator_id,
  129. -           const gchar *entry_id,
  130. -           gint x,
  131. -           gint y,
  132. -           gint width,
  133. -           gint height)
  134. +                             const gchar *panel_id,
  135. +                             const gchar *entry_id,
  136. +                             gint x,
  137. +                             gint y,
  138. +                             gint width,
  139. +                             gint height)
  140.  {
  141.    PanelServicePrivate *priv = self->priv;
  142.    IndicatorObjectEntry *entry = get_entry_by_id (entry_id);
  143.    IndicatorObject *object = g_hash_table_lookup (priv->entry2indicator_hash, entry);
  144. +g_debug("Syncing locations for entry: %s->%s [%d,%d]",panel_id,entry_id,x,y);
  145.  
  146.    if (entry)
  147.      {
  148. +      GHashTable *entry2geometry_hash = g_hash_table_lookup (priv->panel2entries_hash, panel_id);
  149. +
  150.        if (width < 0 || height < 0)
  151.          {
  152. -          g_hash_table_remove (priv->entry2geometry_hash, entry);
  153. +          g_hash_table_remove (entry2geometry_hash, entry);
  154. +
  155. +          if (g_hash_table_size (entry2geometry_hash) == 0)
  156. +            g_hash_table_remove (priv->panel2entries_hash, panel_id);
  157.          }
  158.        else
  159.          {
  160. -          GdkRectangle *geo = g_hash_table_lookup (priv->entry2geometry_hash, entry);
  161. +          GdkRectangle *geo = NULL;
  162. +
  163. +          if (entry2geometry_hash == NULL)
  164. +          {
  165. +            entry2geometry_hash = g_hash_table_new_full (g_direct_hash, g_direct_equal,
  166. +                                                         NULL, g_free);
  167. +            g_hash_table_insert (priv->panel2entries_hash, g_strdup(panel_id), entry2geometry_hash);
  168. +          }
  169. +          else
  170. +          {
  171. +            geo = g_hash_table_lookup (entry2geometry_hash, entry);
  172. +          }
  173.  
  174.            if (geo == NULL)
  175.              {
  176.                geo = g_new (GdkRectangle, 1);
  177. -              g_hash_table_insert (priv->entry2geometry_hash, entry, geo);
  178. +              g_hash_table_insert (entry2geometry_hash, entry, geo);
  179.              }
  180.  
  181.            geo->x = x;
  182.  
  183.  
  184.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement