anthonyfieroni added inline comments.

INLINE COMMENTS

> kmaterka wrote in kstatusnotifieritem.cpp:790
> "associatedWidget" is a KSNI parent (line 780). It might be or might not be 
> set. If parent is not set, then "associatedWidget" is null and QMenu does not 
> have parent. This is fine, we will delete it. But if there is parent then 
> menu won't be deleted and we will have memory leak. Eventually this menu will 
> be deleted, when parent is destroyed, but current contract is different.
> To make things even worse, associatedWidget can change, so we can't compare 
> the parent of the menu with associatedWidget during the destruction...
> Let's say we will change it to:
> 
>   new QMenu()
> 
> Then it will be removed, because there is no parent. It should not have any 
> important side effects. So far so good.
> 
> What we want to achieve is have an ability to retake ownership after it is 
> passed to setContextMenu. With your approach, it could be done this way:
> QMenu *menu =new QMenu(); // null parent, doesn't matter here
> tray->setContextMenu(menu);
> menu->setParent(parent);
> This way menu won't be deleted. There are two problems with this approach:
> 
> - we don't know if no-one is doing that - most probably not and this can be 
> ignored
> - the parent needs to be a QWidget type. This is serious issue, because there 
> are cases when it is not possible.
> 
> The final goal is to fix KDEPlatformSystemTrayIcon and there is no QWidget to 
> use as a parent :( Exactly:
> kdeplatformsystemtrayicon.cpp:339
> 
>   m_sni->setContextMenu(ourMenu->menu());
> 
> ourMenu can live longer than KStatusNotifierItem *m_sni and can be reused for 
> another KStatusNotifierItem instance. The situation is described in BUG 
> 365105 <https://bugs.kde.org/show_bug.cgi?id=365105>. In other word, in QPA, 
> menu can and should live independently to system tray icon, which is not the 
> case in KStatusNotifierItem.
> 
> I really like your idea! Maybe I'm missing something obvious and is possible 
> to set parent in KDEPlatformSystemTrayIcon...

That's easy checkable

  if (!qApp->closingDown() && (!d->menu->parent() || d->menu->parent() == 
d->associatedWidget) {
      delete d->menu;
  }

We should not own the menu, that's not tight approach at least.

REPOSITORY
  R289 KNotifications

REVISION DETAIL
  https://phabricator.kde.org/D24755

To: kmaterka, #frameworks, davidedmundson, broulik, nicolasfella
Cc: anthonyfieroni, kde-frameworks-devel, LeGast00n, GB_2, michaelh, ngraham, 
bruns

Reply via email to