forked from amazingfate/loongoffice
TableControl::commitCellEventIfAccessibleAlive sends an event
on the currently selected/active cell. So only call it in
SVTXGridControl::ProcessWindowEvent when there is one.
Use TableControl::GetCurrentRow and TableControl::GetCurrentColumn
to check that, which return a special value (of -2) for the case there
is no active cell.
For TableControl::GetCurrentRow:
/** retrieves the current row
The current row is the one which contains the active cell.
@return
the row index of the active cell, or ->ROW_INVALID
if there is no active cell, e.g. because the table does
not contain any rows or columns.
*/
sal_Int32 GetCurrentRow() const override;
The previous check whether the table has any rows was insufficient
and resulted in an invalid attempt to access vector elements at
negative indices.
For the tdf#164783 scenario:
/usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/debug/vector:508:
In function:
reference
std::vector<rtl::Reference<accessibility::AccessibleGridControlTableCell>>::operator[](size_type)
[_Tp = rtl::Reference<accessibility::AccessibleGridControlTableCell>,
_Allocator =
std::allocator<rtl::Reference<accessibility::AccessibleGridControlTableCell>>]
Error: attempt to subscript container with out-of-bounds index -6, but
container only holds 60 elements.
Objects involved in the operation:
sequence "this" @ 0x5638c74e2350 {
type = std::debug::vector<rtl::Reference<accessibility::AccessibleGridControlTableCell>, std::allocator<rtl::Reference<accessibility::AccessibleGridControlTableCell> > >;
}
/usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/debug/vector:508:
In function:
reference
std::vector<rtl::Reference<accessibility::AccessibleGridControlTableCell>>::operator[](size_type)
[_Tp = rtl::Reference<accessibility::AccessibleGridControlTableCell>,
_Allocator =
std::allocator<rtl::Reference<accessibility::AccessibleGridControlTableCell>>]
Error: attempt to subscript container with out-of-bounds index -6, but
container only holds 60 elements.
Objects involved in the operation:
sequence "this" @ 0x5638c74e2350 {
type = std::debug::vector<rtl::Reference<accessibility::AccessibleGridControlTableCell>, std::allocator<rtl::Reference<accessibility::AccessibleGridControlTableCell> > >;
}
sequence "this" @ 0x5638c74e2350 {
type = std::debug::vector<rtl::Reference<accessibility::AccessibleGridControlTableCell>, std::allocator<rtl::Reference<accessibility::AccessibleGridControlTableCell> > >;
}
Fatal exception: Signal 6
Stack:
#0 sal::backtrace_get(unsigned int) at .../libreoffice/sal/osl/unx/backtraceapi.cxx:42
#1 (anonymous namespace)::printStack(int) at .../libreoffice/sal/osl/unx/signal.cxx:289
#2 (anonymous namespace)::callSystemHandler(int, siginfo_t*, void*) at .../libreoffice/sal/osl/unx/signal.cxx:330
#3 (anonymous namespace)::signalHandlerFunction(int, siginfo_t*, void*) at .../libreoffice/sal/osl/unx/signal.cxx:427
#4 /lib/x86_64-linux-gnu/libc.so.6(+0x3fda0) [0x7f7544649da0]
#5 __pthread_kill_implementation at ./nptl/pthread_kill.c:44 (discriminator 1)
#6 raise at ./signal/../sysdeps/posix/raise.c:27
#7 abort at ./stdlib/abort.c:81
#8 std::__throw_bad_exception() in /lib/x86_64-linux-gnu/libstdc++.so.6
#9 std::__debug::vector<rtl::Reference<accessibility::AccessibleGridControlTableCell>, std::allocator<rtl::Reference<accessibility::AccessibleGridControlTableCell>>>::operator[](unsigned long) at /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/debug/vector:508
#10 accessibility::AccessibleGridControlTable::getAccessibleChild(long) at .../libreoffice/vcl/source/accessibility/AccessibleGridControlTable.cxx:66
#11 accessibility::AccessibleGridControlTable::getAccessibleCellAt(int, int) at .../libreoffice/vcl/source/accessibility/AccessibleGridControlTable.cxx:191
#12 accessibility::AccessibleGridControl::commitCellEvent(short, com::sun:⭐:uno::Any const&, com::sun:⭐:uno::Any const&) at .../libreoffice/vcl/source/accessibility/AccessibleGridControl.cxx:272
#13 accessibility::AccessibleGridControlAccess::commitCellEvent(short, com::sun:⭐:uno::Any const&, com::sun:⭐:uno::Any const&) at .../libreoffice/vcl/inc/accessibility/AccessibleGridControl.hxx:197
#14 svt::table::TableControl_Impl::commitCellEvent(short, com::sun:⭐:uno::Any const&, com::sun:⭐:uno::Any const&) at .../libreoffice/toolkit/source/controls/table/tablecontrol_impl.cxx:2304
#15 svt::table::TableControl::commitCellEventIfAccessibleAlive(short, com::sun:⭐:uno::Any const&, com::sun:⭐:uno::Any const&) at .../libreoffice/toolkit/source/controls/table/tablecontrol.cxx:470
#16 SVTXGridControl::ProcessWindowEvent(VclWindowEvent const&) at .../libreoffice/toolkit/source/controls/svtxgridcontrol.cxx:823
#17 VCLXWindow::WindowEventListener(VclWindowEvent&) at .../libreoffice/toolkit/source/awt/vclxwindow.cxx:390
#18 VCLXWindow::LinkStubWindowEventListener(void*, VclWindowEvent&) at .../libreoffice/toolkit/source/awt/vclxwindow.cxx:383
#19 Link<VclWindowEvent&, void>::Call(VclWindowEvent&) const at .../libreoffice/include/tools/link.hxx:101
#20 vcl::Window::CallEventListeners(VclEventId, void*) at .../libreoffice/vcl/source/window/event.cxx:262
#21 Control::CallEventListeners(VclEventId, void*) at .../libreoffice/vcl/source/control/ctrl.cxx:298
#22 Control::ImplCallEventListenersAndHandler(VclEventId, std::function<void ()> const&) at .../libreoffice/vcl/source/control/ctrl.cxx:305
#23 Control::EventNotify(NotifyEvent&) at .../libreoffice/vcl/source/control/ctrl.cxx:247
#24 vcl::Window::CompatNotify(NotifyEvent&) at .../libreoffice/vcl/source/window/window.cxx:3943
#25 vcl::Window::LoseFocus() at .../libreoffice/vcl/source/window/window.cxx:1861
#26 svt::table::TableControl::LoseFocus() at .../libreoffice/toolkit/source/controls/table/tablecontrol.cxx:94
#27 vcl::Window::CompatLoseFocus() at .../libreoffice/vcl/source/window/window.cxx:3912
#28 vcl::Window::ImplAsyncFocusHdl(void*) at .../libreoffice/vcl/source/window/winproc.cxx:2127
#29 vcl::Window::LinkStubImplAsyncFocusHdl(void*, void*) at .../libreoffice/vcl/source/window/winproc.cxx:2033
#30 Link<void*, void>::Call(void*) const at .../libreoffice/include/tools/link.hxx:101
#31 ImplHandleUserEvent(ImplSVEvent*) at .../libreoffice/vcl/source/window/winproc.cxx:2288
#32 ImplWindowFrameProc(vcl::Window*, SalEvent, void const*) at .../libreoffice/vcl/source/window/winproc.cxx:2849
#33 SalFrame::CallCallback(SalEvent, void const*) const at .../libreoffice/vcl/inc/salframe.hxx:311
#34 SalGenericDisplay::ProcessEvent(SalUserEventList::SalUserEvent) at .../libreoffice/vcl/unx/generic/app/gendisp.cxx:67
#35 SalUserEventList::DispatchUserEvents(bool)::$_0::operator()() const at .../libreoffice/vcl/source/app/salusereventlist.cxx:119
#36 SalUserEventList::DispatchUserEvents(bool) at .../libreoffice/vcl/source/app/salusereventlist.cxx:120
#37 SalGenericDisplay::DispatchInternalEvent(bool) at .../libreoffice/vcl/unx/generic/app/gendisp.cxx:51
#38 call_userEventFn(void*) at .../libreoffice/vcl/unx/gtk3/gtkdata.cxx:827
#39 /lib/x86_64-linux-gnu/libglib-2.0.so.0(+0x5a81f) [0x7f7536f0b81f]
#40 /lib/x86_64-linux-gnu/libglib-2.0.so.0(+0x5ca57) [0x7f7536f0da57]
#41 g_main_loop_run in /lib/x86_64-linux-gnu/libglib-2.0.so.0
...
Change-Id: Iafed90e6985cf2c05d65be5f74334f58b369d945
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/180661
Tested-by: Jenkins
Reviewed-by: Michael Weghorn <m.weghorn@posteo.de>
(cherry picked from commit 57906dde339a71eee87437ae2d11c7474c03befd)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/180680
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
Abstract Windowing Toolkit
"Abstract" windowing thing. UNO implementations of windowing stuff so that it can be used from Basic or Java. But also stuff that has no connection to Basic or Java.
Notes
The "awt" here has no relation to the Java AWT, as far as I know. It
might be inspired by it API-wise, perhaps. (If you know differently, feel free
to improve this README.md file.)
Also note that toolkit/ is itself not really a toolkit, it is at root a
reasonably simple wrapper of vcl/. If you came here looking for a
toolkit, please look at vcl/ instead.