Deletion of vcl::Window's inside ToolBar

Dennis Francis dennisfrancis.in at gmail.com
Wed Aug 26 05:29:34 PDT 2015


Hi

After entering ToolBarManager::RemoveControllers, I put a break point on
SvxFontNameBox_Impl::~SvxFontNameBox_Impl and then did mpWindow.clear() in
gdb (where mpWindow is the SvxFontNameBox_Impl object wrapped in VclPtr).
But gdb did not show a call on the dtor ~SvxFontNameBox_Impl. After further
digging, I found that the mnRefCnt of the mpWindow in question was *219*
just before the VclPtr was reset.
Now I wonder who else increased the ref count of this mpWindow object, why
the value is so high and how to proceed from here ?

Thanks,
Dennis

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

> 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/52c7f47a/attachment.html>


More information about the LibreOffice mailing list