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