Created attachment 111318 [details] (Video) (krita-4.1.0-pre-alpha-21a86cd-x86_64.appimage - Ubuntu 14.04 Unity) Steps to reproduce (see video): 1) start Krita (no open documents) 2) "Window" > "New window" + close it 3) "File" + "New" Actual Results: crash
I tested with krita-nightly-x64-v4.0.0.51-611-g45709b74de on Windows and I can reliably produce a crash on creating a new document after having opened and closed a new window. Backtrace: Qt5Core.dll!0x238bb0 QObject::objectName+0x0 libkritaui.dll!0x128c1e KisActionManager::actionByName(QString const&) const at kis_action_manager.cpp:166 libkritaui.dll!0x181a94 KisToolPaint::KisToolPaint(KoCanvasBase*, QCursor const&) at kis_tool_paint.cc:114 libkritaui.dll!0x17223e KisToolFreehand::KisToolFreehand(KoCanvasBase*, QCursor const&, KUndo2MagicString const&) at kis_tool_freehand.cc:69 kritatooldyna.dll!0x271a KisToolDyna::KisToolDyna(KoCanvasBase*) at kis_tool_dyna.cpp:49 kritatooldyna.dll!0x5f01 KisToolDynaFactory::createTool(KoCanvasBase*) at kis_tool_dyna.h:173 libkritaflake.dll!0x46ce4 ToolHelper::createTool(KoCanvasBase*) const at KoToolManager_p.cpp:121 libkritaflake.dll!0x4953a KoToolManager::createTools(KoCanvasController*, ToolHelper*) at KoToolManager.cpp:410 libkritaflake.dll!0x49a94 KoToolManager::Private::createCanvasData(KoCanvasController*, KoInputDevice const&) at KoToolManager.cpp:486 libkritaflake.dll!0x4c801 KoToolManager::Private::attachCanvas(KoCanvasController*) at KoToolManager.cpp:784 libkritaflake.dll!0x4cda7 KoToolManager::addController(KoCanvasController*) at KoToolManager.cpp:276 libkritaui.dll!0x2cac88 KisView::setViewManager(KisViewManager*) at KisView.cpp:324 libkritaui.dll!0x2a8410 KisMainWindow::showView(KisView*) at KisMainWindow.cpp:564 libkritaui.dll!0x2a5cfd KisMainWindow::addView(KisView*) at KisMainWindow.cpp:541 libkritaui.dll!0x2a5e75 KisMainWindow::addViewAndNotifyLoadingCompleted(KisDocument*) at KisMainWindow.cpp:860 libkritaui.dll!0x341ccc KisPart::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) at moc_KisPart.cpp:142 Qt5Core.dll!0x23b41a QMetaObject::activate+0x7fa libkritaui.dll!0x32f491 KisOpenPane::documentSelected(KisDocument*) at moc_KisOpenPane.cpp:237 Qt5Core.dll!0x23b41a QMetaObject::activate+0x7fa Qt5Widgets.dll!0x100402 QAbstractButton::toggled+0x212 Qt5Widgets.dll!0x1006d3 QAbstractButton::toggled+0x4e3 Qt5Widgets.dll!0x44ddb QWidget::event+0xc4b Qt5Widgets.dll!0x7b5c QApplicationPrivate::notify_helper+0x9c Qt5Widgets.dll!0x104f3 QApplication::notify+0x1a13 libkritaui.dll!0x27cc76 KisApplication::notify(QObject*, QEvent*) at KisApplication.cpp:601 Qt5Core.dll!0x210768 QCoreApplication::notifyInternal2+0x198 Qt5Widgets.dll!0x5b2df QDesktopWidget::qt_metacall+0x4fff Qt5Widgets.dll!0x7b5c QApplicationPrivate::notify_helper+0x9c Qt5Widgets.dll!0xedd0 QApplication::notify+0x2f0 libkritaui.dll!0x27cc76 KisApplication::notify(QObject*, QEvent*) at KisApplication.cpp:601 Qt5Core.dll!0x210768 QCoreApplication::notifyInternal2+0x198 Qt5Gui.dll!0x35d93 QGuiApplicationPrivate::processKeyEvent+0x1b3 Qt5Gui.dll!0x3ad65 QGuiApplicationPrivate::processWindowSystemEvent+0xe5 Qt5Gui.dll!0x11ca0 QWindowSystemInterface::sendWindowSystemEvents+0x370 Qt5Core.dll!0x268006 QEventDispatcherWin32Private::sendTimerEvent+0x666 USER32.dll!0xb85d UserCallWinProcCheckWow+0x2ad USER32.dll!0xb1ef DispatchMessageWorker+0x19f Qt5Core.dll!0x2672fb QEventDispatcherWin32::processEvents+0x5cb qwindows.dll!0x5ef35 qt_plugin_instance+0x28e5 Qt5Core.dll!0x20ee4f QEventLoop::exec+0x13f Qt5Widgets.dll!0x1dfaf9 QDialog::exec+0x1d9 libkritaui.dll!0x2a4a0f KisMainWindow::slotFileNew() at KisMainWindow.cpp:1417 libkritaui.dll!0x2b34fd KisMainWindow::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) at moc_KisMainWindow.cpp:295 Qt5Core.dll!0x23b41a QMetaObject::activate+0x7fa Qt5Widgets.dll!0x3e7e QAction::activate+0xfe Qt5Widgets.dll!0x48b3 QAction::event+0x23 Qt5Widgets.dll!0x7b5c QApplicationPrivate::notify_helper+0x9c Qt5Widgets.dll!0xedd0 QApplication::notify+0x2f0 libkritaui.dll!0x27cc76 KisApplication::notify(QObject*, QEvent*) at KisApplication.cpp:601 Qt5Core.dll!0x210768 QCoreApplication::notifyInternal2+0x198 Qt5Gui.dll!0x6c70e QShortcutMap::dispatchEvent+0xee Qt5Gui.dll!0x6c922 QShortcutMap::tryShortcut+0x1b2 Qt5Gui.dll!0x17950 QWindowSystemInterface::handleShortcutEvent+0x170 Qt5Gui.dll!0x35c75 QGuiApplicationPrivate::processKeyEvent+0x95 Qt5Gui.dll!0x3ad65 QGuiApplicationPrivate::processWindowSystemEvent+0xe5 Qt5Gui.dll!0x11ca0 QWindowSystemInterface::sendWindowSystemEvents+0x370 Qt5Core.dll!0x268006 QEventDispatcherWin32Private::sendTimerEvent+0x666 USER32.dll!0xb85d UserCallWinProcCheckWow+0x2ad USER32.dll!0xb1ef DispatchMessageWorker+0x19f Qt5Core.dll!0x2672fb QEventDispatcherWin32::processEvents+0x5cb qwindows.dll!0x5ef35 qt_plugin_instance+0x28e5 Qt5Core.dll!0x20ee4f QEventLoop::exec+0x13f Qt5Core.dll!0x2177a7 QCoreApplication::exec+0x77 krita.exe!0x613b main at main.cc:349 krita.exe!0x13f7 __tmainCRTStartup+0x247 krita.exe!0x14fb WinMainCRTStartup+0x1b KERNEL32.DLL!0x11fe4 BaseThreadInitThunk+0x14 ntdll.dll!0x6efc1 RtlUserThreadStart+0x21
I can reproduce it as well. I'll build the intel-3 branch and test in that too,since that has some fixes for handling multiple windows. Application: Krita (krita), signal: Segmentation fault Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". [Current thread is 1 (Thread 0x7f1381022900 (LWP 7831))] Thread 13 (Thread 0x7f1328ff9700 (LWP 7851)): #0 pthread_cond_timedwait@@GLIBC_2.3.2 () at ../sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S:225 #1 0x00007f137e3ec5b6 in QWaitCondition::wait(QMutex*, unsigned long) () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #2 0x00007f137e3e7dfa in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #3 0x00007f137e3eb6eb in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #4 0x00007f137755a6ba in start_thread (arg=0x7f1328ff9700) at pthread_create.c:333 #5 0x00007f137dae241d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109 Thread 12 (Thread 0x7f13297fa700 (LWP 7850)): #0 pthread_cond_timedwait@@GLIBC_2.3.2 () at ../sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S:225 #1 0x00007f137e3ec5b6 in QWaitCondition::wait(QMutex*, unsigned long) () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #2 0x00007f137e3e7dfa in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #3 0x00007f137e3eb6eb in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #4 0x00007f137755a6ba in start_thread (arg=0x7f13297fa700) at pthread_create.c:333 #5 0x00007f137dae241d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109 Thread 11 (Thread 0x7f1329ffb700 (LWP 7849)): #0 pthread_cond_timedwait@@GLIBC_2.3.2 () at ../sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S:225 #1 0x00007f137e3ec5b6 in QWaitCondition::wait(QMutex*, unsigned long) () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #2 0x00007f137e3e7dfa in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #3 0x00007f137e3eb6eb in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #4 0x00007f137755a6ba in start_thread (arg=0x7f1329ffb700) at pthread_create.c:333 #5 0x00007f137dae241d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109 Thread 10 (Thread 0x7f132a7fc700 (LWP 7848)): #0 pthread_cond_timedwait@@GLIBC_2.3.2 () at ../sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S:225 #1 0x00007f137e3ec5b6 in QWaitCondition::wait(QMutex*, unsigned long) () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #2 0x00007f137e3e7dfa in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #3 0x00007f137e3eb6eb in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #4 0x00007f137755a6ba in start_thread (arg=0x7f132a7fc700) at pthread_create.c:333 #5 0x00007f137dae241d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109 Thread 9 (Thread 0x7f132affd700 (LWP 7847)): #0 pthread_cond_timedwait@@GLIBC_2.3.2 () at ../sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S:225 #1 0x00007f137e3ec5b6 in QWaitCondition::wait(QMutex*, unsigned long) () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #2 0x00007f137e3e7dfa in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #3 0x00007f137e3eb6eb in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #4 0x00007f137755a6ba in start_thread (arg=0x7f132affd700) at pthread_create.c:333 #5 0x00007f137dae241d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109 Thread 8 (Thread 0x7f132b7fe700 (LWP 7846)): #0 pthread_cond_timedwait@@GLIBC_2.3.2 () at ../sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S:225 #1 0x00007f137e3ec5b6 in QWaitCondition::wait(QMutex*, unsigned long) () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #2 0x00007f137e3e7dfa in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #3 0x00007f137e3eb6eb in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #4 0x00007f137755a6ba in start_thread (arg=0x7f132b7fe700) at pthread_create.c:333 #5 0x00007f137dae241d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109 Thread 7 (Thread 0x7f132bfff700 (LWP 7845)): #0 pthread_cond_timedwait@@GLIBC_2.3.2 () at ../sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S:225 #1 0x00007f137e3ec5b6 in QWaitCondition::wait(QMutex*, unsigned long) () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #2 0x00007f137e3e7dfa in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #3 0x00007f137e3eb6eb in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #4 0x00007f137755a6ba in start_thread (arg=0x7f132bfff700) at pthread_create.c:333 #5 0x00007f137dae241d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109 Thread 6 (Thread 0x7f1330b7a700 (LWP 7844)): #0 pthread_cond_timedwait@@GLIBC_2.3.2 () at ../sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S:225 #1 0x00007f137e3ec5b6 in QWaitCondition::wait(QMutex*, unsigned long) () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #2 0x00007f137e3e7dfa in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #3 0x00007f137e3eb6eb in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #4 0x00007f137755a6ba in start_thread (arg=0x7f1330b7a700) at pthread_create.c:333 #5 0x00007f137dae241d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109 Thread 5 (Thread 0x7f1332cd6700 (LWP 7843)): #0 0x00007f137dad674d in poll () at ../sysdeps/unix/syscall-template.S:84 #1 0x00007f1375cf238c in ?? () from /lib/x86_64-linux-gnu/libglib-2.0.so.0 #2 0x00007f1375cf249c in g_main_context_iteration () from /lib/x86_64-linux-gnu/libglib-2.0.so.0 #3 0x00007f137e61f5cb in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #4 0x00007f137e5c664a in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #5 0x00007f137e3e6554 in QThread::exec() () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #6 0x00007f135ec04a35 in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Qml.so.5 #7 0x00007f137e3eb6eb in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #8 0x00007f137755a6ba in start_thread (arg=0x7f1332cd6700) at pthread_create.c:333 #9 0x00007f137dae241d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109 Thread 4 (Thread 0x7f134265d700 (LWP 7841)): #0 pthread_cond_wait@@GLIBC_2.3.2 () at ../sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S:185 #1 0x00007f137e3ec67b in QWaitCondition::wait(QMutex*, unsigned long) () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #2 0x00007f137f51f52a in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #3 0x00007f137e3eb6eb in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #4 0x00007f137755a6ba in start_thread (arg=0x7f134265d700) at pthread_create.c:333 #5 0x00007f137dae241d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109 Thread 3 (Thread 0x7f1341e5c700 (LWP 7835)): #0 pthread_cond_wait@@GLIBC_2.3.2 () at ../sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S:185 #1 0x00007f137e3ec67b in QWaitCondition::wait(QMutex*, unsigned long) () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #2 0x00007f137e3e51ef in QSemaphore::tryAcquire(int, int) () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #3 0x00007f137b67aff3 in KisTileDataSwapper::waitForWork (this=<optimized out>) at /home/boud/dev/krita/libs/image/tiles3/swap/kis_tile_data_swapper.cpp:86 #4 0x00007f137b67b1ea in KisTileDataSwapper::run (this=0x7f137bb76f80 <(anonymous namespace)::Q_QGS_s_instance::innerFunction()::holder+64>) at /home/boud/dev/krita/libs/image/tiles3/swap/kis_tile_data_swapper.cpp:92 #5 0x00007f137e3eb6eb in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #6 0x00007f137755a6ba in start_thread (arg=0x7f1341e5c700) at pthread_create.c:333 #7 0x00007f137dae241d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109 Thread 2 (Thread 0x7f1359923700 (LWP 7833)): #0 0x00007f1375cef3b0 in ?? () from /lib/x86_64-linux-gnu/libglib-2.0.so.0 #1 0x00007f1375cf18bb in g_main_context_prepare () from /lib/x86_64-linux-gnu/libglib-2.0.so.0 #2 0x00007f1375cf22bb in ?? () from /lib/x86_64-linux-gnu/libglib-2.0.so.0 #3 0x00007f1375cf249c in g_main_context_iteration () from /lib/x86_64-linux-gnu/libglib-2.0.so.0 #4 0x00007f137e61f5cb in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #5 0x00007f137e5c664a in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #6 0x00007f137e3e6554 in QThread::exec() () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #7 0x00007f13777862c5 in ?? () from /usr/lib/x86_64-linux-gnu/libQt5DBus.so.5 #8 0x00007f137e3eb6eb in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #9 0x00007f137755a6ba in start_thread (arg=0x7f1359923700) at pthread_create.c:333 #10 0x00007f137dae241d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109 Thread 1 (Thread 0x7f1381022900 (LWP 7831)): [KCrash Handler] #6 0x00007f137e5f2477 in QObject::objectName() const () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #7 0x00007f13807dcf4f in KisActionManager::actionByName (this=this@entry=0x7ae6850, name=...) at /home/boud/dev/krita/libs/ui/kis_action_manager.cpp:166 #8 0x00007f138084b3dc in KisToolPaint::KisToolPaint (this=0xafab320, canvas=0xb5a1390, cursor=...) at /home/boud/dev/krita/libs/ui/tool/kis_tool_paint.cc:114 #9 0x00007f138084d6fe in KisToolShape::KisToolShape (this=0xafab320, canvas=<optimized out>, cursor=...) at /home/boud/dev/krita/libs/ui/tool/kis_tool_shape.cc:58 #10 0x00007f13808517c5 in KisToolPolylineBase::KisToolPolylineBase (this=0xafab320, canvas=<optimized out>, type=KisToolPolylineBase::PAINT, cursor=...) at /home/boud/dev/krita/libs/ui/tool/kis_tool_polyline_base.cpp:45 #11 0x00007f1346a55cc3 in KisToolPolyline::KisToolPolyline (this=0xafab320, canvas=0xb5a1390) at /home/boud/dev/krita/plugins/tools/tool_polyline/kis_tool_polyline.cc:40 #12 0x00007f1346a55681 in KisToolPolylineFactory::createTool (this=<optimized out>, canvas=0xb5a1390) at /home/boud/dev/krita/plugins/tools/tool_polyline/kis_tool_polyline.h:64 #13 0x00007f137ac51065 in ToolHelper::createTool (this=this@entry=0x8574270, canvas=<optimized out>) at /home/boud/dev/krita/libs/flake/KoToolManager_p.cpp:121 #14 0x00007f137ac53bf9 in KoToolManager::createTools (this=0x7f137afbf860 <_ZZN12_GLOBAL__N_116Q_QGS_s_instance13innerFunctionEvE6holder>, controller=controller@entry=0xb5a1360, tool=0x8574270) at /home/boud/dev/krita/libs/flake/KoToolManager.cpp:410 #15 0x00007f137ac5404f in KoToolManager::Private::createCanvasData (this=this@entry=0x7b9cf90, controller=0xb5a1360, device=...) at /home/boud/dev/krita/libs/flake/KoToolManager.cpp:486 #16 0x00007f137ac57c75 in KoToolManager::Private::attachCanvas (this=0x7b9cf90, controller=0xb5a1360) at /home/boud/dev/krita/libs/flake/KoToolManager.cpp:784 #17 0x00007f137ac581a7 in KoToolManager::addController (this=0x7f137afbf860 <_ZZN12_GLOBAL__N_116Q_QGS_s_instance13innerFunctionEvE6holder>, controller=controller@entry=0xb5a1360) at /home/boud/dev/krita/libs/flake/KoToolManager.cpp:276 #18 0x00007f13809db79a in KisView::setViewManager (this=this@entry=0x9bcfd00, view=<optimized out>) at /home/boud/dev/krita/libs/ui/KisView.cpp:324 #19 0x00007f13809b1a2b in KisMainWindow::showView (this=0x650b130, imageView=0x9bcfd00) at /home/boud/dev/krita/libs/ui/KisMainWindow.cpp:564 #20 0x00007f13809ae95a in KisMainWindow::addView (this=this@entry=0x650b130, view=view@entry=0x9bcfd00) at /home/boud/dev/krita/libs/ui/KisMainWindow.cpp:541 #21 0x00007f13809aea82 in KisMainWindow::addViewAndNotifyLoadingCompleted (this=0x650b130, document=<optimized out>) at /home/boud/dev/krita/libs/ui/KisMainWindow.cpp:860 #22 0x00007f13809c7a88 in KisPart::startCustomDocument (this=<optimized out>, doc=<optimized out>) at /home/boud/dev/krita/libs/ui/KisPart.cpp:469 #23 0x00007f1380a58fcc in KisPart::qt_static_metacall (_o=<optimized out>, _c=<optimized out>, _id=<optimized out>, _a=<optimized out>) at /home/boud/dev/build/libs/ui/moc_KisPart.cpp:142 #24 0x00007f137e5f5489 in QMetaObject::activate(QObject*, int, int, void**) () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #25 0x00007f1380a480ef in KisOpenPane::documentSelected (this=<optimized out>, _t1=0xab78f10) at /home/boud/dev/build/libs/ui/moc_KisOpenPane.cpp:237 #26 0x00007f137e5f5489 in QMetaObject::activate(QObject*, int, int, void**) () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #27 0x00007f137f3ff9e2 in QAbstractButton::clicked(bool) () from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #28 0x00007f137f3ffc14 in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #29 0x00007f137f400895 in QAbstractButton::click() () from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #30 0x00007f137f348727 in QWidget::event(QEvent*) () from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #31 0x00007f137f308acc in QApplicationPrivate::notify_helper(QObject*, QEvent*) () from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #32 0x00007f137f311d46 in QApplication::notify(QObject*, QEvent*) () from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #33 0x00007f138097c4a7 in KisApplication::notify (this=<optimized out>, receiver=0xa62d900, event=0x7ffdba5fd3d0) at /home/boud/dev/krita/libs/ui/KisApplication.cpp:602 #34 0x00007f137e5c83c8 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #35 0x00007f137f364993 in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #36 0x00007f137f308acc in QApplicationPrivate::notify_helper(QObject*, QEvent*) () from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #37 0x00007f137f310417 in QApplication::notify(QObject*, QEvent*) () from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #38 0x00007f138097c4a7 in KisApplication::notify (this=<optimized out>, receiver=0xadf8040, event=0x7ffdba5fd3d0) at /home/boud/dev/krita/libs/ui/KisApplication.cpp:602 #39 0x00007f137e5c83c8 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #40 0x00007f137eb5da48 in QGuiApplicationPrivate::processKeyEvent(QWindowSystemInterfacePrivate::KeyEvent*) () from /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5 #41 0x00007f137eb62e25 in QGuiApplicationPrivate::processWindowSystemEvent(QWindowSystemInterfacePrivate::WindowSystemEvent*) () from /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5 #42 0x00007f137eb3c8fb in QWindowSystemInterface::sendWindowSystemEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5 #43 0x00007f13681311ab in ?? () from /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5 #44 0x00007f137e5c664a in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #45 0x00007f137f4f7627 in QDialog::exec() () from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #46 0x00007f13809ad326 in KisMainWindow::slotFileNew (this=<optimized out>) at /home/boud/dev/krita/libs/ui/KisMainWindow.cpp:1417 #47 0x00007f13809bd7c8 in KisMainWindow::qt_static_metacall (_o=0x650b130, _c=<optimized out>, _id=<optimized out>, _a=0x7ffdba5fd8d0) at /home/boud/dev/build/libs/ui/moc_KisMainWindow.cpp:295 #48 0x00007f137e5f5489 in QMetaObject::activate(QObject*, int, int, void**) () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #49 0x00007f137f3024a2 in QAction::triggered(bool) () from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #50 0x00007f137f304c10 in QAction::activate(QAction::ActionEvent) () from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #51 0x00007f137f305634 in QAction::event(QEvent*) () from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #52 0x00007f137f308acc in QApplicationPrivate::notify_helper(QObject*, QEvent*) () from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #53 0x00007f137f310417 in QApplication::notify(QObject*, QEvent*) () from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #54 0x00007f138097c4a7 in KisApplication::notify (this=<optimized out>, receiver=0x9b70a40, event=0x7ffdba5fdc10) at /home/boud/dev/krita/libs/ui/KisApplication.cpp:602 #55 0x00007f137e5c83c8 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #56 0x00007f137eb8efb6 in QShortcutMap::dispatchEvent(QKeyEvent*) () from /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5 #57 0x00007f137eb8f069 in QShortcutMap::tryShortcut(QKeyEvent*) () from /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5 #58 0x00007f137eb40956 in QWindowSystemInterface::handleShortcutEvent(QWindow*, unsigned long, int, QFlags<Qt::KeyboardModifier>, unsigned int, unsigned int, unsigned int, QString const&, bool, unsigned short) () from /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5 #59 0x00007f137eb5da94 in QGuiApplicationPrivate::processKeyEvent(QWindowSystemInterfacePrivate::KeyEvent*) () from /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5 #60 0x00007f137eb62e25 in QGuiApplicationPrivate::processWindowSystemEvent(QWindowSystemInterfacePrivate::WindowSystemEvent*) () from /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5 #61 0x00007f137eb3c8fb in QWindowSystemInterface::sendWindowSystemEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5 #62 0x00007f13681311ab in ?? () from /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5 #63 0x00007f137e5c664a in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #64 0x00007f137e5cf854 in QCoreApplication::exec() () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #65 0x0000000000405473 in main (argc=1, argv=0x7ffdba5fe5e8) at /home/boud/dev/krita/krita/main.cc:349
I got a different crash if I closed the first window instead of the new window: python36.dll!0x3f7df PyInterpreterState_Clear+0x257 python36.dll!0x182cef PyGILState_Ensure+0x33 QtCore.pyd!0x1b98dc PyInit_QtCore+0x1113f krita.pyd!0x3f575 sipDockWidget::qt_metacast(char const*) at sipkritapart0.cpp:28049 libkritaui.dll!0x2a4e43 QObject::inherits(char const*) const at qobject.h:416 libkritaui.dll!0x2a4e43 (inlined by) KisMainWindow::forceDockTabFonts() at KisMainWindow.cpp:1924 libkritaui.dll!0x2b3667 KisMainWindow::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) at moc_KisMainWindow.cpp:315 Qt5Core.dll!0x23b41a QMetaObject::activate+0x7fa libkritaui.dll!0x2a5d1e KisMainWindow::restoringDone() at moc_KisMainWindow.cpp:484 libkritaui.dll!0x2a5d1e (inlined by) KisMainWindow::addView(KisView*) at KisMainWindow.cpp:543 libkritaui.dll!0x2a5e75 KisMainWindow::addViewAndNotifyLoadingCompleted(KisDocument*) at KisMainWindow.cpp:860 libkritaui.dll!0x341ccc KisPart::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) at moc_KisPart.cpp:142 Qt5Core.dll!0x23b41a QMetaObject::activate+0x7fa libkritaui.dll!0x32f491 KisOpenPane::documentSelected(KisDocument*) at moc_KisOpenPane.cpp:237 Qt5Core.dll!0x23b41a QMetaObject::activate+0x7fa Qt5Widgets.dll!0x100402 QAbstractButton::toggled+0x212 Qt5Widgets.dll!0x1006d3 QAbstractButton::toggled+0x4e3 Qt5Widgets.dll!0x44ddb QWidget::event+0xc4b Qt5Widgets.dll!0x7b5c QApplicationPrivate::notify_helper+0x9c Qt5Widgets.dll!0x104f3 QApplication::notify+0x1a13 libkritaui.dll!0x27cc76 KisApplication::notify(QObject*, QEvent*) at KisApplication.cpp:601 Qt5Core.dll!0x210768 QCoreApplication::notifyInternal2+0x198 Qt5Widgets.dll!0x5b2df QDesktopWidget::qt_metacall+0x4fff Qt5Widgets.dll!0x7b5c QApplicationPrivate::notify_helper+0x9c Qt5Widgets.dll!0xedd0 QApplication::notify+0x2f0 libkritaui.dll!0x27cc76 KisApplication::notify(QObject*, QEvent*) at KisApplication.cpp:601 Qt5Core.dll!0x210768 QCoreApplication::notifyInternal2+0x198 Qt5Gui.dll!0x35d93 QGuiApplicationPrivate::processKeyEvent+0x1b3 Qt5Gui.dll!0x3ad65 QGuiApplicationPrivate::processWindowSystemEvent+0xe5 Qt5Gui.dll!0x11ca0 QWindowSystemInterface::sendWindowSystemEvents+0x370 Qt5Core.dll!0x268006 QEventDispatcherWin32Private::sendTimerEvent+0x666 USER32.dll!0xb85d UserCallWinProcCheckWow+0x2ad USER32.dll!0xb1ef DispatchMessageWorker+0x19f Qt5Core.dll!0x2672fb QEventDispatcherWin32::processEvents+0x5cb qwindows.dll!0x5ef35 qt_plugin_instance+0x28e5 Qt5Core.dll!0x20ee4f QEventLoop::exec+0x13f Qt5Widgets.dll!0x1dfaf9 QDialog::exec+0x1d9 libkritaui.dll!0x2a4a0f KisMainWindow::slotFileNew() at KisMainWindow.cpp:1417 libkritaui.dll!0x2b34fd KisMainWindow::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) at moc_KisMainWindow.cpp:295 Qt5Core.dll!0x23b41a QMetaObject::activate+0x7fa Qt5Widgets.dll!0x3e7e QAction::activate+0xfe Qt5Widgets.dll!0x48b3 QAction::event+0x23 Qt5Widgets.dll!0x7b5c QApplicationPrivate::notify_helper+0x9c Qt5Widgets.dll!0xedd0 QApplication::notify+0x2f0 libkritaui.dll!0x27cc76 KisApplication::notify(QObject*, QEvent*) at KisApplication.cpp:601 Qt5Core.dll!0x210768 QCoreApplication::notifyInternal2+0x198 Qt5Gui.dll!0x6c70e QShortcutMap::dispatchEvent+0xee Qt5Gui.dll!0x6c922 QShortcutMap::tryShortcut+0x1b2 Qt5Gui.dll!0x17950 QWindowSystemInterface::handleShortcutEvent+0x170 Qt5Gui.dll!0x35c75 QGuiApplicationPrivate::processKeyEvent+0x95 Qt5Gui.dll!0x3ad65 QGuiApplicationPrivate::processWindowSystemEvent+0xe5 Qt5Gui.dll!0x11ca0 QWindowSystemInterface::sendWindowSystemEvents+0x370 Qt5Core.dll!0x268006 QEventDispatcherWin32Private::sendTimerEvent+0x666 USER32.dll!0xb85d UserCallWinProcCheckWow+0x2ad USER32.dll!0xb1ef DispatchMessageWorker+0x19f Qt5Core.dll!0x2672fb QEventDispatcherWin32::processEvents+0x5cb qwindows.dll!0x5ef35 qt_plugin_instance+0x28e5 Qt5Core.dll!0x20ee4f QEventLoop::exec+0x13f Qt5Core.dll!0x2177a7 QCoreApplication::exec+0x77 krita.exe!0x613b main at main.cc:349 krita.exe!0x13f7 __tmainCRTStartup+0x247 krita.exe!0x14fb WinMainCRTStartup+0x1b KERNEL32.DLL!0x11fe4 BaseThreadInitThunk+0x14 ntdll.dll!0x6efc1 RtlUserThreadStart+0x21
No, this also happens in the rmept/intel-3 branch.
Hi, Boud! I still cannot see how the issue can happen. Could you check two things: 1) Clear the **installation** folder (not the build one) and try again? 2) Try applying this patch and see if pressing "Ignore" helps? https://phabricator.kde.org/P176 I tried the following ways to reproduce the issue: 1) Built master and 21a86cd locally, no crash 2) Built master and 21a86cd in the appimage docker, no crash 3) Ran the appimage for 21a86cd, crash happens :(
Okay, the issue is that scripts create actions, and those actions are added to each main window as the mainwindow is created. Then when a mainwindow is deleted, those actions are deleted (because they are reparented to the main window's action manager...), and the other main window now has a pointer to a deleted action.
Git commit e443dc644943b76ebc7f8d8060d626c435409ace by Boudewijn Rempt. Committed on 14/03/2018 at 09:55. Pushed by rempt into branch 'master'. Rename KisViewPlugin to KisActionPlugin These plugins are not created per-view, but per-mainwindow, and exist so every main window can have its own actions, so this makes the naming more clear. M +1 -1 libs/ui/CMakeLists.txt R +7 -7 libs/ui/KisActionPlugin.cpp [from: libs/ui/kis_view_plugin.cpp - 078% similarity] R +4 -4 libs/ui/KisActionPlugin.h [from: libs/ui/kis_view_plugin.h - 087% similarity] M +1 -1 plugins/dockers/throttle/ThrottlePlugin.h M +1 -1 plugins/extensions/animationrenderer/AnimationRenderer.cpp M +2 -2 plugins/extensions/animationrenderer/AnimationRenderer.h M +1 -1 plugins/extensions/bigbrother/bigbrother.cc M +2 -2 plugins/extensions/bigbrother/bigbrother.h M +1 -1 plugins/extensions/buginfo/buginfo.cpp M +2 -2 plugins/extensions/buginfo/buginfo.h M +1 -1 plugins/extensions/clonesarray/clonesarray.cpp M +2 -2 plugins/extensions/clonesarray/clonesarray.h M +1 -1 plugins/extensions/colorrange/colorrange.cc M +2 -2 plugins/extensions/colorrange/colorrange.h M +1 -1 plugins/extensions/colorspaceconversion/colorspaceconversion.cc M +2 -2 plugins/extensions/colorspaceconversion/colorspaceconversion.h M +1 -1 plugins/extensions/histogram/histogram.cc M +2 -2 plugins/extensions/histogram/histogram.h M +1 -1 plugins/extensions/imagesize/imagesize.cc M +2 -2 plugins/extensions/imagesize/imagesize.h M +1 -1 plugins/extensions/imagesplit/imagesplit.cpp M +2 -2 plugins/extensions/imagesplit/imagesplit.h M +1 -1 plugins/extensions/layergroupswitcher/layergroupswitcher.cpp M +2 -2 plugins/extensions/layergroupswitcher/layergroupswitcher.h M +1 -1 plugins/extensions/layersplit/layersplit.cpp M +2 -2 plugins/extensions/layersplit/layersplit.h M +1 -1 plugins/extensions/metadataeditor/metadataeditor.cc M +2 -2 plugins/extensions/metadataeditor/metadataeditor.h M +1 -1 plugins/extensions/modify_selection/modify_selection.cc M +2 -2 plugins/extensions/modify_selection/modify_selection.h M +1 -1 plugins/extensions/offsetimage/offsetimage.cpp M +2 -2 plugins/extensions/offsetimage/offsetimage.h M +1 -1 plugins/extensions/pykrita/plugin/plugin.cpp M +2 -2 plugins/extensions/pykrita/plugin/plugin.h M +1 -1 plugins/extensions/qmic/QMic.cpp M +2 -2 plugins/extensions/qmic/QMic.h M +1 -1 plugins/extensions/resourcemanager/resourcemanager.cpp M +2 -2 plugins/extensions/resourcemanager/resourcemanager.h M +1 -1 plugins/extensions/rotateimage/rotateimage.cc M +2 -2 plugins/extensions/rotateimage/rotateimage.h M +1 -1 plugins/extensions/separate_channels/kis_separate_channels_plugin.cc M +2 -2 plugins/extensions/separate_channels/kis_separate_channels_plugin.h M +1 -1 plugins/extensions/shearimage/shearimage.cc M +2 -2 plugins/extensions/shearimage/shearimage.h M +1 -1 plugins/extensions/waveletdecompose/waveletdecompose.cpp M +2 -2 plugins/extensions/waveletdecompose/waveletdecompose.h https://commits.kde.org/krita/e443dc644943b76ebc7f8d8060d626c435409ace
Git commit a59e3f6b8fd93827cafdb455ee5fe2e08fef7516 by Boudewijn Rempt. Committed on 14/03/2018 at 09:56. Pushed by rempt into branch 'krita/4.0'. Rename KisViewPlugin to KisActionPlugin These plugins are not created per-view, but per-mainwindow, and exist so every main window can have its own actions, so this makes the naming more clear. (cherry picked from commit e443dc644943b76ebc7f8d8060d626c435409ace) M +1 -1 libs/ui/CMakeLists.txt R +7 -7 libs/ui/KisActionPlugin.cpp [from: libs/ui/kis_view_plugin.cpp - 078% similarity] R +4 -4 libs/ui/KisActionPlugin.h [from: libs/ui/kis_view_plugin.h - 087% similarity] M +1 -1 plugins/dockers/throttle/ThrottlePlugin.h M +1 -1 plugins/extensions/animationrenderer/AnimationRenderer.cpp M +2 -2 plugins/extensions/animationrenderer/AnimationRenderer.h M +1 -1 plugins/extensions/bigbrother/bigbrother.cc M +2 -2 plugins/extensions/bigbrother/bigbrother.h M +1 -1 plugins/extensions/buginfo/buginfo.cpp M +2 -2 plugins/extensions/buginfo/buginfo.h M +1 -1 plugins/extensions/clonesarray/clonesarray.cpp M +2 -2 plugins/extensions/clonesarray/clonesarray.h M +1 -1 plugins/extensions/colorrange/colorrange.cc M +2 -2 plugins/extensions/colorrange/colorrange.h M +1 -1 plugins/extensions/colorspaceconversion/colorspaceconversion.cc M +2 -2 plugins/extensions/colorspaceconversion/colorspaceconversion.h M +1 -1 plugins/extensions/histogram/histogram.cc M +2 -2 plugins/extensions/histogram/histogram.h M +1 -1 plugins/extensions/imagesize/imagesize.cc M +2 -2 plugins/extensions/imagesize/imagesize.h M +1 -1 plugins/extensions/imagesplit/imagesplit.cpp M +2 -2 plugins/extensions/imagesplit/imagesplit.h M +1 -1 plugins/extensions/layergroupswitcher/layergroupswitcher.cpp M +2 -2 plugins/extensions/layergroupswitcher/layergroupswitcher.h M +1 -1 plugins/extensions/layersplit/layersplit.cpp M +2 -2 plugins/extensions/layersplit/layersplit.h M +1 -1 plugins/extensions/metadataeditor/metadataeditor.cc M +2 -2 plugins/extensions/metadataeditor/metadataeditor.h M +1 -1 plugins/extensions/modify_selection/modify_selection.cc M +2 -2 plugins/extensions/modify_selection/modify_selection.h M +1 -1 plugins/extensions/offsetimage/offsetimage.cpp M +2 -2 plugins/extensions/offsetimage/offsetimage.h M +1 -1 plugins/extensions/pykrita/plugin/plugin.cpp M +2 -2 plugins/extensions/pykrita/plugin/plugin.h M +1 -1 plugins/extensions/qmic/QMic.cpp M +2 -2 plugins/extensions/qmic/QMic.h M +1 -1 plugins/extensions/resourcemanager/resourcemanager.cpp M +2 -2 plugins/extensions/resourcemanager/resourcemanager.h M +1 -1 plugins/extensions/rotateimage/rotateimage.cc M +2 -2 plugins/extensions/rotateimage/rotateimage.h M +1 -1 plugins/extensions/separate_channels/kis_separate_channels_plugin.cc M +2 -2 plugins/extensions/separate_channels/kis_separate_channels_plugin.h M +1 -1 plugins/extensions/shearimage/shearimage.cc M +2 -2 plugins/extensions/shearimage/shearimage.h M +1 -1 plugins/extensions/waveletdecompose/waveletdecompose.cpp M +2 -2 plugins/extensions/waveletdecompose/waveletdecompose.h https://commits.kde.org/krita/a59e3f6b8fd93827cafdb455ee5fe2e08fef7516
Git commit e9b0661657f67ac4d1186641a78357f695a9a717 by Boudewijn Rempt. Committed on 14/03/2018 at 13:24. Pushed by rempt into branch 'master'. Create actions per-window instead of per-application Note that this changes the libkis scripting api. The Extension class now has two methods: setup and createActions. Old code was like this: from PyQt5.QtGui import * from PyQt5.QtWidgets import * from krita import * def hello(): QMessageBox.information(QWidget(), "Test", "Hello World") class HelloExtension(Extension): def __init__(self, parent): super().__init__(parent) def setup(self): action = Krita.createAction("Hello") action.triggered.connect(hello) Krita.instance().addExtension(HelloExtension(Krita.instance())) New code is like this: from PyQt5.QtGui import * from PyQt5.QtWidgets import * from krita import * def hello(): QMessageBox.information(QWidget(), "Test", "Hello World") class HelloExtension(Extension): def __init__(self, parent): super().__init__(parent) def setup(self): pass def createActions(self, window): action = window.createAction("Hello") action.triggered.connect(hello) Krita.instance().addExtension(HelloExtension(Krita.instance())) This also adds a new parameter to createAction: the menu location. This is a path separated by /, for instance tools/scripts. Note that this path must exist, otherwise a crash will happen. The paths are defined in krita4.xmlgui... Note: we're still leaking Action objects created in Window::createAction; that's the next fix. CCMAIL:kimageshop@kde.org M +1 -1 krita/krita4.xmlgui M +0 -11 libs/libkis/Action.cpp M +0 -12 libs/libkis/Action.h M +22 -14 libs/libkis/Extension.h M +10 -20 libs/libkis/Krita.cpp M +4 -10 libs/libkis/Krita.h M +5 -2 libs/libkis/Mainpage.dox M +35 -1 libs/libkis/Window.cpp M +17 -0 libs/libkis/Window.h M +0 -1 libs/ui/CMakeLists.txt M +0 -11 libs/ui/KisPart.cpp M +0 -11 libs/ui/KisPart.h M +0 -10 libs/ui/KisViewManager.cpp M +0 -3 libs/ui/KisViewManager.h D +0 -90 libs/ui/kis_script_manager.cpp D +0 -52 libs/ui/kis_script_manager.h M +2 -2 plugins/extensions/pykrita/plugin/plugin.cpp M +1 -2 plugins/extensions/pykrita/sip/krita/Action.sip M +1 -0 plugins/extensions/pykrita/sip/krita/Extension.sip M +0 -1 plugins/extensions/pykrita/sip/krita/Krita.sip M +1 -0 plugins/extensions/pykrita/sip/krita/Window.sip M +4 -1 plugins/python/assignprofiledialog/assignprofiledialog.py M +4 -1 plugins/python/colorspace/colorspace.py M +4 -1 plugins/python/documenttools/documenttools.py M +4 -1 plugins/python/exportlayers/exportlayers.py M +4 -1 plugins/python/filtermanager/filtermanager.py M +4 -2 plugins/python/hello/hello.py M +4 -1 plugins/python/highpass/highpass.py M +4 -1 plugins/python/scripter/scripter.py M +7 -9 plugins/python/tenbrushes/tenbrushes.py M +7 -7 plugins/python/tenscripts/tenscripts.py https://commits.kde.org/krita/e9b0661657f67ac4d1186641a78357f695a9a717
Git commit 3de294bc464390acc33be19aa89a74ebfb18963e by Boudewijn Rempt. Committed on 14/03/2018 at 13:24. Pushed by rempt into branch 'krita/4.0'. Create actions per-window instead of per-application Note that this changes the libkis scripting api. The Extension class now has two methods: setup and createActions. Old code was like this: from PyQt5.QtGui import * from PyQt5.QtWidgets import * from krita import * def hello(): QMessageBox.information(QWidget(), "Test", "Hello World") class HelloExtension(Extension): def __init__(self, parent): super().__init__(parent) def setup(self): action = Krita.createAction("Hello") action.triggered.connect(hello) Krita.instance().addExtension(HelloExtension(Krita.instance())) New code is like this: from PyQt5.QtGui import * from PyQt5.QtWidgets import * from krita import * def hello(): QMessageBox.information(QWidget(), "Test", "Hello World") class HelloExtension(Extension): def __init__(self, parent): super().__init__(parent) def setup(self): pass def createActions(self, window): action = window.createAction("Hello") action.triggered.connect(hello) Krita.instance().addExtension(HelloExtension(Krita.instance())) This also adds a new parameter to createAction: the menu location. This is a path separated by /, for instance tools/scripts. Note that this path must exist, otherwise a crash will happen. The paths are defined in krita4.xmlgui... Note: we're still leaking Action objects created in Window::createAction; that's the next fix. CCMAIL:kimageshop@kde.org (cherry picked from commit e9b0661657f67ac4d1186641a78357f695a9a717) M +1 -1 krita/krita4.xmlgui M +0 -11 libs/libkis/Action.cpp M +0 -12 libs/libkis/Action.h M +22 -14 libs/libkis/Extension.h M +10 -20 libs/libkis/Krita.cpp M +4 -10 libs/libkis/Krita.h M +5 -2 libs/libkis/Mainpage.dox M +35 -1 libs/libkis/Window.cpp M +17 -0 libs/libkis/Window.h M +0 -1 libs/ui/CMakeLists.txt M +0 -11 libs/ui/KisPart.cpp M +0 -11 libs/ui/KisPart.h M +0 -10 libs/ui/KisViewManager.cpp M +0 -3 libs/ui/KisViewManager.h D +0 -90 libs/ui/kis_script_manager.cpp D +0 -52 libs/ui/kis_script_manager.h M +2 -2 plugins/extensions/pykrita/plugin/plugin.cpp M +1 -2 plugins/extensions/pykrita/sip/krita/Action.sip M +1 -0 plugins/extensions/pykrita/sip/krita/Extension.sip M +0 -1 plugins/extensions/pykrita/sip/krita/Krita.sip M +1 -0 plugins/extensions/pykrita/sip/krita/Window.sip M +4 -1 plugins/python/assignprofiledialog/assignprofiledialog.py M +4 -1 plugins/python/colorspace/colorspace.py M +4 -1 plugins/python/documenttools/documenttools.py M +4 -1 plugins/python/exportlayers/exportlayers.py M +4 -1 plugins/python/filtermanager/filtermanager.py M +4 -2 plugins/python/hello/hello.py M +4 -1 plugins/python/highpass/highpass.py M +4 -1 plugins/python/scripter/scripter.py M +7 -9 plugins/python/tenbrushes/tenbrushes.py M +7 -7 plugins/python/tenscripts/tenscripts.py https://commits.kde.org/krita/3de294bc464390acc33be19aa89a74ebfb18963e