Deletion of vcl::Window's inside ToolBar

Dennis Francis dennisfrancis.in at gmail.com
Wed Aug 26 03:53:12 PDT 2015


Sorry, I understand now that pItem->mpWindow is a smart pointer (VclPtr).
So the issue may be elsewhere.

Thanks,
Dennis

On Wed, Aug 26, 2015 at 3:42 PM, Dennis Francis <dennisfrancis.in at gmail.com>
wrote:

> Hi Caolán and Maxim
>
> Thanks for your replies, My reply is inline.
>
> On Tue, Aug 25, 2015 at 7:38 PM, Caolán McNamara <caolanm at redhat.com>
> wrote:
>
>> Digging into the other examples, I guess that SetItemWindow was called
>> on the toolbar with the SvxFontNameBox_Impl window as an argument ?
>>
> yes.
>
>>
>> If that's the case then the pattern appears to be that what object
>> called SetItemWindow on the toolbar should call SetItemWindow(id, 0) to
>> remove the window from the toolbar and then call disposeAndClear on the
>> window.
>>
>> i.e. what entity put the item into the toolbar is the same entity that
>> has to remove it and dispose it.
>>
>> What's the reproducing scenario here, is it the fontname widget in the
>> standard toolbar, e.g. just start and exit writer to reproduce ?
>>
>
> I think it should work with writer too, I ran soffice --calc and opened a
> new spreadsheet and then closed it.
>
>
>> C.
>>
>
> Here is what I observe in gdb :
> ===========================================================================
> breakpoints were set on :
> SvxFontNameBox_Impl::SvxFontNameBox_Impl()
> SvxFontNameBox_Impl::FillList()
> SvxFontNameBox_Impl::~SvxFontNameBox_Impl()
>
> Order of calls observed from gdb each with address of SvxFontNameBox_Impl
> object :
> 1. (SvxFontNameBox_Impl * const) 0x1cd4290,
> SvxFontNameBox_Impl::SvxFontNameBox_Impl - from toolbar code
> 2. (SvxFontNameBox_Impl * const) 0x1cd4290, SvxFontNameBox_Impl::FillList
> 3. (SvxFontNameBox_Impl * const) 0x1e60cc0,
> SvxFontNameBox_Impl::SvxFontNameBox_Impl  - from sidebar::ControllerFactory
> 4. (SvxFontNameBox_Impl * const) 0x1e60cc0,
> SvxFontNameBox_Impl::~SvxFontNameBox_Impl - sidebar
> 5. (SvxFontNameBox_Impl * const) 0x1e60cc0,
> SvxFontNameBox_Impl::~SvxFontNameBox_Impl - sidebar
>
>
> No call of destructor SvxFontNameBox_Impl::~SvxFontNameBox_Impl() for the
> instance 0x1cd4290
>
> ==============================================================================
>
> I tried setting break point on
> framework::ToolBarManager::RemoveControllers and it calls SetItemWindow(id,
> 0) for all items :
> m_pToolBar->SetItemWindow(nItemId, 0);
>
> But in ToolBox::SetItemWindow() method, I think the pItem->mpWindow is
> just overwritten and not getting deleted. Is the deletion code missing here
> ?
> Is it ok to add
>
>  if (pItem->mpWindow)
>     delete pItem->mpWindow;
>
> before assigning pNewWindow to it ?
>
>
>    1296 void ToolBox::SetItemWindow( sal_uInt16 nItemId, vcl::Window*
> pNewWindow )
>    1297 {
>    1298     sal_uInt16 nPos = GetItemPos( nItemId );
>    1299
>    1300     if ( nPos != TOOLBOX_ITEM_NOTFOUND )
>    1301     {
>    1302         ImplToolItem* pItem = &mpData->m_aItems[nPos];
>    1303        * pItem->mpWindow = pNewWindow;*
>    1304         if ( pNewWindow )
>    1305             pNewWindow->Hide();
>    1306         ImplInvalidate( true );
>    1307         CallEventListeners( VCLEVENT_TOOLBOX_ITEMWINDOWCHANGED,
> reinterpret_cast< void* >( nPos ) );
>    1308     }
>    1309 }
>
> Thanks,
> Dennis
>
> http://www.ldcs.co.in
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/libreoffice/attachments/20150826/595ff970/attachment.html>


More information about the LibreOffice mailing list