Closed szobov closed 3 years ago
Thank you for your report.
I think this is fixed in 2ff60614678c3dc9acde7097610c5d1f4b097739 .
Thank you for your report.
I think this is fixed in 2ff6061 .
Thanks a lot, But there is a bug in the code, so I can't compile and test it unfortunatelly:
$ ./build_linux.sh
./build_linux.sh: /usr/share/bashdb/bashdb-main.inc: No such file or directory
./build_linux.sh: warning: cannot start debugger; debugging mode disabled
make: Nothing to be done for 'default'.
g++-9 -c -pipe -std=c++17 -O2 -std=gnu++1z -Wall -W -D_REENTRANT -fPIC -DQAPPLICATION_CLASS=QApplication -DQT_3DCORE_LIB -DQT_3DANIMATION_LIB -DQT_3DEXTRAS_LIB -DQT_3DINPUT_LIB -DQT_3DLOGIC_LIB -DQT_3DRENDER_LIB -DQT_OPENGL_LIB -DQT_OPENGLEXTENSIONS_LIB -DQT_QUICKWIDGETS_LIB -DQT_SQL_LIB -DQT_WIDGETS_LIB -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_QUICKWIDGETS_LIB -DQT_WIDGETS_LIB -DQT_QUICK_LIB -DQT_3DANIMATION_LIB -DQT_3DEXTRAS_LIB -DQT_3DRENDER_LIB -DQT_3DINPUT_LIB -DQT_3DLOGIC_LIB -DQT_3DCORE_LIB -DQT_OPENGLEXTENSIONS_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_SQL_LIB -DQT_CORE_LIB -I. -Ipdf_viewer/SingleApplication -Ipdf_viewer -Imupdf/include -Izlib -isystem /usr/include/x86_64-linux-gnu/qt5 -isystem /usr/include/x86_64-linux-gnu/qt5/QtOpenGL -isystem /usr/include/x86_64-linux-gnu/qt5/QtQuickWidgets -isystem /usr/include/x86_64-linux-gnu/qt5/QtWidgets -isystem /usr/include/x86_64-linux-gnu/qt5/QtQuick -isystem /usr/include/x86_64-linux-gnu/qt5/Qt3DAnimation -isystem /usr/include/x86_64-linux-gnu/qt5/Qt3DExtras -isystem /usr/include/x86_64-linux-gnu/qt5/Qt3DRender -isystem /usr/include/x86_64-linux-gnu/qt5/Qt3DInput -isystem /usr/include/x86_64-linux-gnu/qt5/Qt3DLogic -isystem /usr/include/x86_64-linux-gnu/qt5/Qt3DCore -isystem /usr/include/x86_64-linux-gnu/qt5/QtOpenGLExtensions -isystem /usr/include/x86_64-linux-gnu/qt5/QtGui -isystem /usr/include/x86_64-linux-gnu/qt5/QtQml -isystem /usr/include/x86_64-linux-gnu/qt5/QtNetwork -isystem /usr/include/x86_64-linux-gnu/qt5/QtSql -isystem /usr/include/x86_64-linux-gnu/qt5/QtCore -I. -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++ -o main_widget.o pdf_viewer/main_widget.cpp
In file included from mupdf/include/mupdf/fitz.h:11,
from pdf_viewer/utils.h:15,
from pdf_viewer/input.h:12,
from pdf_viewer/main_widget.cpp:33:
mupdf/include/mupdf/fitz/context.h: In function ‘void* fz_keep_imp_locked(fz_context*, void*, int*)’:
mupdf/include/mupdf/fitz/context.h:633:32: warning: unused parameter ‘ctx’ [-Wunused-parameter]
633 | fz_keep_imp_locked(fz_context *ctx, void *p, int *refs)
| ~~~~~~~~~~~~^~~
pdf_viewer/main_widget.cpp: In function ‘std::optional<std::__cxx11::basic_string<wchar_t> > get_last_opened_file_name()’:
pdf_viewer/main_widget.cpp:90:17: error: ‘MAX_PATH’ was not declared in this scope
90 | char file_path[MAX_PATH] = { 0 };
| ^~~~~~~~
pdf_viewer/main_widget.cpp: In member function ‘virtual void MainWidget::closeEvent(QCloseEvent*)’:
pdf_viewer/main_widget.cpp:142:42: warning: unused parameter ‘close_event’ [-Wunused-parameter]
142 | void MainWidget::closeEvent(QCloseEvent* close_event) {
| ~~~~~~~~~~~~~^~~~~~~~~~~
pdf_viewer/main_widget.cpp: In member function ‘virtual void MainWidget::on_config_file_changed(ConfigManager*)’:
pdf_viewer/main_widget.cpp:421:56: warning: unused parameter ‘new_config’ [-Wunused-parameter]
421 | void MainWidget::on_config_file_changed(ConfigManager* new_config)
| ~~~~~~~~~~~~~~~^~~~~~~~~~
pdf_viewer/main_widget.cpp: In member function ‘void MainWidget::do_synctex_forward_search(const Path&, const Path&, int)’:
pdf_viewer/main_widget.cpp:473:15: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
473 | while (node = synctex_next_result(scanner)) {
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
pdf_viewer/main_widget.cpp: In member function ‘void MainWidget::on_new_instance_message(qint32, QByteArray)’:
pdf_viewer/main_widget.cpp:515:49: warning: unused parameter ‘instance_id’ [-Wunused-parameter]
515 | void MainWidget::on_new_instance_message(qint32 instance_id, QByteArray arguments_str)
| ~~~~~~~^~~~~~~~~~~
pdf_viewer/main_widget.cpp: In member function ‘void MainWidget::key_event(bool, QKeyEvent*)’:
pdf_viewer/main_widget.cpp:857:43: warning: the address of ‘QTextStream& endl(QTextStream&)’ will never be NULL [-Waddress]
857 | std::cerr << "File select failed" << endl;
| ^~~~
pdf_viewer/main_widget.cpp: In member function ‘void MainWidget::handle_right_click(float, float, bool)’:
pdf_viewer/main_widget.cpp:913:18: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
913 | while (node = synctex_next_result(scanner)) {
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
pdf_viewer/main_widget.cpp: In member function ‘void MainWidget::next_state()’:
pdf_viewer/main_widget.cpp:1013:28: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<DocumentViewState>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
1013 | if (current_history_index < history.size()-1) {
| ~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
pdf_viewer/main_widget.cpp: In member function ‘virtual void MainWidget::mouseReleaseEvent(QMouseEvent*)’:
pdf_viewer/main_widget.cpp:1138:12: warning: unused variable ‘page_height’ [-Wunused-variable]
1138 | float page_height = main_document_view->get_document()->get_page_height(refdata.page);
| ^~~~~~~~~~~
pdf_viewer/main_widget.cpp:1154:12: warning: unused variable ‘page_height’ [-Wunused-variable]
1154 | float page_height = main_document_view->get_document()->get_page_height(refdata.page);
| ^~~~~~~~~~~
pdf_viewer/main_widget.cpp: In member function ‘void MainWidget::handle_command(const Command*, int)’:
pdf_viewer/main_widget.cpp:1475:21: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<BookMark>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
1475 | for (int i = 0; i < main_document_view->get_document()->get_bookmarks().size(); i++) {
| ~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
pdf_viewer/main_widget.cpp:1578:7: warning: unused variable ‘b’ [-Wunused-variable]
1578 | int b = 2;
| ^
In file included from pdf_viewer/main_widget.cpp:37:
pdf_viewer/ui.h: In instantiation of ‘FilteredSelectWindowClass<T>::FilteredSelectWindowClass(std::vector<std::__cxx11::basic_string<wchar_t> >, std::vector<T>, std::function<void(T*)>, ConfigManager*, QWidget*, std::function<void(T*)>) [with T = int]’:
/usr/include/c++/9/bits/unique_ptr.h:857:30: required from ‘typename std::_MakeUniq<_Tp>::__single_object std::make_unique(_Args&& ...) [with _Tp = FilteredSelectWindowClass<int>; _Args = {std::vector<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::allocator<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > > >&, std::vector<int, std::allocator<int> >&, MainWidget::handle_command(const Command*, int)::<lambda(int*)>, ConfigManager*&, MainWidget*}; typename std::_MakeUniq<_Tp>::__single_object = std::unique_ptr<FilteredSelectWindowClass<int>, std::default_delete<FilteredSelectWindowClass<int> > >]’
pdf_viewer/main_widget.cpp:1425:29: required from here
pdf_viewer/ui.h:186:17: warning: ‘FilteredSelectWindowClass<int>::config_manager’ will be initialized after [-Wreorder]
186 | ConfigManager* config_manager = nullptr;
| ^~~~~~~~~~~~~~
pdf_viewer/ui.h:184:26: warning: ‘std::function<void(int*)> FilteredSelectWindowClass<int>::on_done’ [-Wreorder]
184 | std::function<void(T*)> on_done = nullptr;
| ^~~~~~~
pdf_viewer/ui.h:216:2: warning: when initialized here [-Wreorder]
216 | FilteredSelectWindowClass(std::vector<std::wstring> std_string_list,
| ^~~~~~~~~~~~~~~~~~~~~~~~~
In file included from pdf_viewer/main_widget.cpp:37:
pdf_viewer/ui.h: In instantiation of ‘FilteredTreeSelect<T>::FilteredTreeSelect(QStandardItemModel*, std::function<void(const std::vector<int, std::allocator<int> >&)>, ConfigManager*, QWidget*) [with T = int]’:
/usr/include/c++/9/bits/unique_ptr.h:857:30: required from ‘typename std::_MakeUniq<_Tp>::__single_object std::make_unique(_Args&& ...) [with _Tp = FilteredTreeSelect<int>; _Args = {QStandardItemModel*, MainWidget::handle_command(const Command*, int)::<lambda(const std::vector<int, std::allocator<int> >&)>, ConfigManager*&, MainWidget*}; typename std::_MakeUniq<_Tp>::__single_object = std::unique_ptr<FilteredTreeSelect<int>, std::default_delete<FilteredTreeSelect<int> > >]’
pdf_viewer/main_widget.cpp:1440:29: required from here
pdf_viewer/ui.h:63:17: warning: ‘FilteredTreeSelect<int>::config_manager’ will be initialized after [-Wreorder]
63 | ConfigManager* config_manager = nullptr;
| ^~~~~~~~~~~~~~
pdf_viewer/ui.h:62:47: warning: ‘std::function<void(const std::vector<int, std::allocator<int> >&)> FilteredTreeSelect<int>::on_done’ [-Wreorder]
62 | std::function<void(const std::vector<int>&)> on_done;
| ^~~~~~~
pdf_viewer/ui.h:97:2: warning: when initialized here [-Wreorder]
97 | FilteredTreeSelect(QStandardItemModel* item_model, std::function<void(const std::vector<int>&)> on_done, ConfigManager* config_manager, QWidget* parent ) :
| ^~~~~~~~~~~~~~~~~~
In file included from pdf_viewer/main_widget.cpp:37:
pdf_viewer/ui.h: In instantiation of ‘FilteredSelectWindowClass<T>::FilteredSelectWindowClass(std::vector<std::__cxx11::basic_string<wchar_t> >, std::vector<T>, std::function<void(T*)>, ConfigManager*, QWidget*, std::function<void(T*)>) [with T = std::__cxx11::basic_string<wchar_t>]’:
/usr/include/c++/9/bits/unique_ptr.h:857:30: required from ‘typename std::_MakeUniq<_Tp>::__single_object std::make_unique(_Args&& ...) [with _Tp = FilteredSelectWindowClass<std::__cxx11::basic_string<wchar_t> >; _Args = {std::vector<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::allocator<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > > >&, std::vector<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::allocator<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > > >&, MainWidget::handle_command(const Command*, int)::<lambda(std::wstring*)>, ConfigManager*&, MainWidget*, MainWidget::handle_command(const Command*, int)::<lambda(std::wstring*)>}; typename std::_MakeUniq<_Tp>::__single_object = std::unique_ptr<FilteredSelectWindowClass<std::__cxx11::basic_string<wchar_t> >, std::default_delete<FilteredSelectWindowClass<std::__cxx11::basic_string<wchar_t> > > >]’
pdf_viewer/main_widget.cpp:1468:6: required from here
pdf_viewer/ui.h:186:17: warning: ‘FilteredSelectWindowClass<std::__cxx11::basic_string<wchar_t> >::config_manager’ will be initialized after [-Wreorder]
186 | ConfigManager* config_manager = nullptr;
| ^~~~~~~~~~~~~~
pdf_viewer/ui.h:184:26: warning: ‘std::function<void(std::__cxx11::basic_string<wchar_t>*)> FilteredSelectWindowClass<std::__cxx11::basic_string<wchar_t> >::on_done’ [-Wreorder]
184 | std::function<void(T*)> on_done = nullptr;
| ^~~~~~~
pdf_viewer/ui.h:216:2: warning: when initialized here [-Wreorder]
216 | FilteredSelectWindowClass(std::vector<std::wstring> std_string_list,
| ^~~~~~~~~~~~~~~~~~~~~~~~~
pdf_viewer/ui.h: In instantiation of ‘FilteredSelectWindowClass<T>::FilteredSelectWindowClass(std::vector<std::__cxx11::basic_string<wchar_t> >, std::vector<T>, std::function<void(T*)>, ConfigManager*, QWidget*, std::function<void(T*)>) [with T = float]’:
/usr/include/c++/9/bits/unique_ptr.h:857:30: required from ‘typename std::_MakeUniq<_Tp>::__single_object std::make_unique(_Args&& ...) [with _Tp = FilteredSelectWindowClass<float>; _Args = {std::vector<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::allocator<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > > >&, std::vector<float, std::allocator<float> >&, MainWidget::handle_command(const Command*, int)::<lambda(float*)>, ConfigManager*&, MainWidget*, MainWidget::handle_command(const Command*, int)::<lambda(float*)>}; typename std::_MakeUniq<_Tp>::__single_object = std::unique_ptr<FilteredSelectWindowClass<float>, std::default_delete<FilteredSelectWindowClass<float> > >]’
pdf_viewer/main_widget.cpp:1496:5: required from here
pdf_viewer/ui.h:186:17: warning: ‘FilteredSelectWindowClass<float>::config_manager’ will be initialized after [-Wreorder]
186 | ConfigManager* config_manager = nullptr;
| ^~~~~~~~~~~~~~
pdf_viewer/ui.h:184:26: warning: ‘std::function<void(float*)> FilteredSelectWindowClass<float>::on_done’ [-Wreorder]
184 | std::function<void(T*)> on_done = nullptr;
| ^~~~~~~
pdf_viewer/ui.h:216:2: warning: when initialized here [-Wreorder]
216 | FilteredSelectWindowClass(std::vector<std::wstring> std_string_list,
| ^~~~~~~~~~~~~~~~~~~~~~~~~
pdf_viewer/ui.h: In instantiation of ‘FilteredSelectWindowClass<T>::FilteredSelectWindowClass(std::vector<std::__cxx11::basic_string<wchar_t> >, std::vector<T>, std::function<void(T*)>, ConfigManager*, QWidget*, std::function<void(T*)>) [with T = BookState]’:
/usr/include/c++/9/bits/unique_ptr.h:857:30: required from ‘typename std::_MakeUniq<_Tp>::__single_object std::make_unique(_Args&& ...) [with _Tp = FilteredSelectWindowClass<BookState>; _Args = {std::vector<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::allocator<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > > >&, std::vector<BookState, std::allocator<BookState> >&, MainWidget::handle_command(const Command*, int)::<lambda(BookState*)>, ConfigManager*&, MainWidget*, MainWidget::handle_command(const Command*, int)::<lambda(BookState*)>}; typename std::_MakeUniq<_Tp>::__single_object = std::unique_ptr<FilteredSelectWindowClass<BookState>, std::default_delete<FilteredSelectWindowClass<BookState> > >]’
pdf_viewer/main_widget.cpp:1526:5: required from here
pdf_viewer/ui.h:186:17: warning: ‘FilteredSelectWindowClass<BookState>::config_manager’ will be initialized after [-Wreorder]
186 | ConfigManager* config_manager = nullptr;
| ^~~~~~~~~~~~~~
pdf_viewer/ui.h:184:26: warning: ‘std::function<void(BookState*)> FilteredSelectWindowClass<BookState>::on_done’ [-Wreorder]
184 | std::function<void(T*)> on_done = nullptr;
| ^~~~~~~
pdf_viewer/ui.h:216:2: warning: when initialized here [-Wreorder]
216 | FilteredSelectWindowClass(std::vector<std::wstring> std_string_list,
| ^~~~~~~~~~~~~~~~~~~~~~~~~
pdf_viewer/ui.h: In instantiation of ‘void FilteredTreeSelect<T>::on_select(const QModelIndex&) [with T = int]’:
pdf_viewer/ui.h:130:4: required from ‘FilteredTreeSelect<T>::FilteredTreeSelect(QStandardItemModel*, std::function<void(const std::vector<int, std::allocator<int> >&)>, ConfigManager*, QWidget*) [with T = int]’
/usr/include/c++/9/bits/unique_ptr.h:857:30: required from ‘typename std::_MakeUniq<_Tp>::__single_object std::make_unique(_Args&& ...) [with _Tp = FilteredTreeSelect<int>; _Args = {QStandardItemModel*, MainWidget::handle_command(const Command*, int)::<lambda(const std::vector<int, std::allocator<int> >&)>, ConfigManager*&, MainWidget*}; typename std::_MakeUniq<_Tp>::__single_object = std::unique_ptr<FilteredTreeSelect<int>, std::default_delete<FilteredTreeSelect<int> > >]’
pdf_viewer/main_widget.cpp:1440:29: required from here
pdf_viewer/ui.h:156:30: warning: the address of ‘QTextStream& endl(QTextStream&)’ will never be NULL [-Waddress]
156 | std::wcout << "activated " << endl;
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~
pdf_viewer/ui.h: In instantiation of ‘void FilteredSelectWindowClass<T>::keyReleaseEvent(QKeyEvent*) [with T = BookState]’:
pdf_viewer/ui.h:291:7: required from here
pdf_viewer/ui.h:301:10: warning: unused variable ‘delete_row’ [-Wunused-variable]
301 | int delete_row = selected_index.row();
| ^~~~~~~~~~
pdf_viewer/ui.h: In instantiation of ‘void FilteredSelectWindowClass<T>::on_config_file_changed(ConfigManager*) [with T = BookState]’:
pdf_viewer/ui.h:209:7: required from here
pdf_viewer/ui.h:209:45: warning: unused parameter ‘new_config_manager’ [-Wunused-parameter]
209 | void on_config_file_changed(ConfigManager* new_config_manager) {
| ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
pdf_viewer/ui.h: In instantiation of ‘void FilteredSelectWindowClass<T>::keyReleaseEvent(QKeyEvent*) [with T = float]’:
pdf_viewer/ui.h:291:7: required from here
pdf_viewer/ui.h:301:10: warning: unused variable ‘delete_row’ [-Wunused-variable]
301 | int delete_row = selected_index.row();
| ^~~~~~~~~~
pdf_viewer/ui.h: In instantiation of ‘void FilteredSelectWindowClass<T>::on_config_file_changed(ConfigManager*) [with T = float]’:
pdf_viewer/ui.h:209:7: required from here
pdf_viewer/ui.h:209:45: warning: unused parameter ‘new_config_manager’ [-Wunused-parameter]
209 | void on_config_file_changed(ConfigManager* new_config_manager) {
| ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
pdf_viewer/ui.h: In instantiation of ‘void FilteredSelectWindowClass<T>::keyReleaseEvent(QKeyEvent*) [with T = std::__cxx11::basic_string<wchar_t>]’:
pdf_viewer/ui.h:291:7: required from here
pdf_viewer/ui.h:301:10: warning: unused variable ‘delete_row’ [-Wunused-variable]
301 | int delete_row = selected_index.row();
| ^~~~~~~~~~
pdf_viewer/ui.h: In instantiation of ‘void FilteredSelectWindowClass<T>::on_config_file_changed(ConfigManager*) [with T = std::__cxx11::basic_string<wchar_t>]’:
pdf_viewer/ui.h:209:7: required from here
pdf_viewer/ui.h:209:45: warning: unused parameter ‘new_config_manager’ [-Wunused-parameter]
209 | void on_config_file_changed(ConfigManager* new_config_manager) {
| ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
In file included from pdf_viewer/main_widget.cpp:37:
pdf_viewer/ui.h: In instantiation of ‘void FilteredTreeSelect<T>::on_config_file_changed(ConfigManager*) [with T = int]’:
pdf_viewer/ui.h:91:7: required from here
pdf_viewer/ui.h:91:45: warning: unused parameter ‘new_config_manager’ [-Wunused-parameter]
91 | void on_config_file_changed(ConfigManager* new_config_manager) {
| ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
In file included from pdf_viewer/main_widget.cpp:37:
pdf_viewer/ui.h: In instantiation of ‘void FilteredSelectWindowClass<T>::keyReleaseEvent(QKeyEvent*) [with T = int]’:
pdf_viewer/ui.h:291:7: required from here
pdf_viewer/ui.h:301:10: warning: unused variable ‘delete_row’ [-Wunused-variable]
301 | int delete_row = selected_index.row();
| ^~~~~~~~~~
pdf_viewer/ui.h: In instantiation of ‘void FilteredSelectWindowClass<T>::on_config_file_changed(ConfigManager*) [with T = int]’:
pdf_viewer/ui.h:209:7: required from here
pdf_viewer/ui.h:209:45: warning: unused parameter ‘new_config_manager’ [-Wunused-parameter]
209 | void on_config_file_changed(ConfigManager* new_config_manager) {
| ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
make: *** [Makefile:1100: main_widget.o] Error 1
szobov@szobov-laptop:~/dev/sioyek$ ./build_linux.sh > compilation.txt
./build_linux.sh: /usr/share/bashdb/bashdb-main.inc: No such file or directory
./build_linux.sh: warning: cannot start debugger; debugging mode disabled
In file included from mupdf/include/mupdf/fitz.h:11,
from pdf_viewer/utils.h:15,
from pdf_viewer/input.h:12,
from pdf_viewer/main_widget.cpp:33:
mupdf/include/mupdf/fitz/context.h: In function ‘void* fz_keep_imp_locked(fz_context*, void*, int*)’:
mupdf/include/mupdf/fitz/context.h:633:32: warning: unused parameter ‘ctx’ [-Wunused-parameter]
633 | fz_keep_imp_locked(fz_context *ctx, void *p, int *refs)
| ~~~~~~~~~~~~^~~
pdf_viewer/main_widget.cpp: In function ‘std::optional<std::__cxx11::basic_string<wchar_t> > get_last_opened_file_name()’:
pdf_viewer/main_widget.cpp:90:17: error: ‘MAX_PATH’ was not declared in this scope
90 | char file_path[MAX_PATH] = { 0 };
| ^~~~~~~~
pdf_viewer/main_widget.cpp: In member function ‘virtual void MainWidget::closeEvent(QCloseEvent*)’:
pdf_viewer/main_widget.cpp:142:42: warning: unused parameter ‘close_event’ [-Wunused-parameter]
142 | void MainWidget::closeEvent(QCloseEvent* close_event) {
| ~~~~~~~~~~~~~^~~~~~~~~~~
pdf_viewer/main_widget.cpp: In member function ‘virtual void MainWidget::on_config_file_changed(ConfigManager*)’:
pdf_viewer/main_widget.cpp:421:56: warning: unused parameter ‘new_config’ [-Wunused-parameter]
421 | void MainWidget::on_config_file_changed(ConfigManager* new_config)
| ~~~~~~~~~~~~~~~^~~~~~~~~~
pdf_viewer/main_widget.cpp: In member function ‘void MainWidget::do_synctex_forward_search(const Path&, const Path&, int)’:
pdf_viewer/main_widget.cpp:473:15: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
473 | while (node = synctex_next_result(scanner)) {
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
pdf_viewer/main_widget.cpp: In member function ‘void MainWidget::on_new_instance_message(qint32, QByteArray)’:
pdf_viewer/main_widget.cpp:515:49: warning: unused parameter ‘instance_id’ [-Wunused-parameter]
515 | void MainWidget::on_new_instance_message(qint32 instance_id, QByteArray arguments_str)
| ~~~~~~~^~~~~~~~~~~
pdf_viewer/main_widget.cpp: In member function ‘void MainWidget::key_event(bool, QKeyEvent*)’:
pdf_viewer/main_widget.cpp:857:43: warning: the address of ‘QTextStream& endl(QTextStream&)’ will never be NULL [-Waddress]
857 | std::cerr << "File select failed" << endl;
| ^~~~
pdf_viewer/main_widget.cpp: In member function ‘void MainWidget::handle_right_click(float, float, bool)’:
pdf_viewer/main_widget.cpp:913:18: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
913 | while (node = synctex_next_result(scanner)) {
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
pdf_viewer/main_widget.cpp: In member function ‘void MainWidget::next_state()’:
pdf_viewer/main_widget.cpp:1013:28: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<DocumentViewState>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
1013 | if (current_history_index < history.size()-1) {
| ~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
pdf_viewer/main_widget.cpp: In member function ‘virtual void MainWidget::mouseReleaseEvent(QMouseEvent*)’:
pdf_viewer/main_widget.cpp:1138:12: warning: unused variable ‘page_height’ [-Wunused-variable]
1138 | float page_height = main_document_view->get_document()->get_page_height(refdata.page);
| ^~~~~~~~~~~
pdf_viewer/main_widget.cpp:1154:12: warning: unused variable ‘page_height’ [-Wunused-variable]
1154 | float page_height = main_document_view->get_document()->get_page_height(refdata.page);
| ^~~~~~~~~~~
pdf_viewer/main_widget.cpp: In member function ‘void MainWidget::handle_command(const Command*, int)’:
pdf_viewer/main_widget.cpp:1475:21: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<BookMark>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
1475 | for (int i = 0; i < main_document_view->get_document()->get_bookmarks().size(); i++) {
| ~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
pdf_viewer/main_widget.cpp:1578:7: warning: unused variable ‘b’ [-Wunused-variable]
1578 | int b = 2;
| ^
In file included from pdf_viewer/main_widget.cpp:37:
pdf_viewer/ui.h: In instantiation of ‘FilteredSelectWindowClass<T>::FilteredSelectWindowClass(std::vector<std::__cxx11::basic_string<wchar_t> >, std::vector<T>, std::function<void(T*)>, ConfigManager*, QWidget*, std::function<void(T*)>) [with T = int]’:
/usr/include/c++/9/bits/unique_ptr.h:857:30: required from ‘typename std::_MakeUniq<_Tp>::__single_object std::make_unique(_Args&& ...) [with _Tp = FilteredSelectWindowClass<int>; _Args = {std::vector<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::allocator<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > > >&, std::vector<int, std::allocator<int> >&, MainWidget::handle_command(const Command*, int)::<lambda(int*)>, ConfigManager*&, MainWidget*}; typename std::_MakeUniq<_Tp>::__single_object = std::unique_ptr<FilteredSelectWindowClass<int>, std::default_delete<FilteredSelectWindowClass<int> > >]’
pdf_viewer/main_widget.cpp:1425:29: required from here
pdf_viewer/ui.h:186:17: warning: ‘FilteredSelectWindowClass<int>::config_manager’ will be initialized after [-Wreorder]
186 | ConfigManager* config_manager = nullptr;
| ^~~~~~~~~~~~~~
pdf_viewer/ui.h:184:26: warning: ‘std::function<void(int*)> FilteredSelectWindowClass<int>::on_done’ [-Wreorder]
184 | std::function<void(T*)> on_done = nullptr;
| ^~~~~~~
pdf_viewer/ui.h:216:2: warning: when initialized here [-Wreorder]
216 | FilteredSelectWindowClass(std::vector<std::wstring> std_string_list,
| ^~~~~~~~~~~~~~~~~~~~~~~~~
In file included from pdf_viewer/main_widget.cpp:37:
pdf_viewer/ui.h: In instantiation of ‘FilteredTreeSelect<T>::FilteredTreeSelect(QStandardItemModel*, std::function<void(const std::vector<int, std::allocator<int> >&)>, ConfigManager*, QWidget*) [with T = int]’:
/usr/include/c++/9/bits/unique_ptr.h:857:30: required from ‘typename std::_MakeUniq<_Tp>::__single_object std::make_unique(_Args&& ...) [with _Tp = FilteredTreeSelect<int>; _Args = {QStandardItemModel*, MainWidget::handle_command(const Command*, int)::<lambda(const std::vector<int, std::allocator<int> >&)>, ConfigManager*&, MainWidget*}; typename std::_MakeUniq<_Tp>::__single_object = std::unique_ptr<FilteredTreeSelect<int>, std::default_delete<FilteredTreeSelect<int> > >]’
pdf_viewer/main_widget.cpp:1440:29: required from here
pdf_viewer/ui.h:63:17: warning: ‘FilteredTreeSelect<int>::config_manager’ will be initialized after [-Wreorder]
63 | ConfigManager* config_manager = nullptr;
| ^~~~~~~~~~~~~~
pdf_viewer/ui.h:62:47: warning: ‘std::function<void(const std::vector<int, std::allocator<int> >&)> FilteredTreeSelect<int>::on_done’ [-Wreorder]
62 | std::function<void(const std::vector<int>&)> on_done;
| ^~~~~~~
pdf_viewer/ui.h:97:2: warning: when initialized here [-Wreorder]
97 | FilteredTreeSelect(QStandardItemModel* item_model, std::function<void(const std::vector<int>&)> on_done, ConfigManager* config_manager, QWidget* parent ) :
| ^~~~~~~~~~~~~~~~~~
In file included from pdf_viewer/main_widget.cpp:37:
pdf_viewer/ui.h: In instantiation of ‘FilteredSelectWindowClass<T>::FilteredSelectWindowClass(std::vector<std::__cxx11::basic_string<wchar_t> >, std::vector<T>, std::function<void(T*)>, ConfigManager*, QWidget*, std::function<void(T*)>) [with T = std::__cxx11::basic_string<wchar_t>]’:
/usr/include/c++/9/bits/unique_ptr.h:857:30: required from ‘typename std::_MakeUniq<_Tp>::__single_object std::make_unique(_Args&& ...) [with _Tp = FilteredSelectWindowClass<std::__cxx11::basic_string<wchar_t> >; _Args = {std::vector<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::allocator<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > > >&, std::vector<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::allocator<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > > >&, MainWidget::handle_command(const Command*, int)::<lambda(std::wstring*)>, ConfigManager*&, MainWidget*, MainWidget::handle_command(const Command*, int)::<lambda(std::wstring*)>}; typename std::_MakeUniq<_Tp>::__single_object = std::unique_ptr<FilteredSelectWindowClass<std::__cxx11::basic_string<wchar_t> >, std::default_delete<FilteredSelectWindowClass<std::__cxx11::basic_string<wchar_t> > > >]’
pdf_viewer/main_widget.cpp:1468:6: required from here
pdf_viewer/ui.h:186:17: warning: ‘FilteredSelectWindowClass<std::__cxx11::basic_string<wchar_t> >::config_manager’ will be initialized after [-Wreorder]
186 | ConfigManager* config_manager = nullptr;
| ^~~~~~~~~~~~~~
pdf_viewer/ui.h:184:26: warning: ‘std::function<void(std::__cxx11::basic_string<wchar_t>*)> FilteredSelectWindowClass<std::__cxx11::basic_string<wchar_t> >::on_done’ [-Wreorder]
184 | std::function<void(T*)> on_done = nullptr;
| ^~~~~~~
pdf_viewer/ui.h:216:2: warning: when initialized here [-Wreorder]
216 | FilteredSelectWindowClass(std::vector<std::wstring> std_string_list,
| ^~~~~~~~~~~~~~~~~~~~~~~~~
pdf_viewer/ui.h: In instantiation of ‘FilteredSelectWindowClass<T>::FilteredSelectWindowClass(std::vector<std::__cxx11::basic_string<wchar_t> >, std::vector<T>, std::function<void(T*)>, ConfigManager*, QWidget*, std::function<void(T*)>) [with T = float]’:
/usr/include/c++/9/bits/unique_ptr.h:857:30: required from ‘typename std::_MakeUniq<_Tp>::__single_object std::make_unique(_Args&& ...) [with _Tp = FilteredSelectWindowClass<float>; _Args = {std::vector<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::allocator<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > > >&, std::vector<float, std::allocator<float> >&, MainWidget::handle_command(const Command*, int)::<lambda(float*)>, ConfigManager*&, MainWidget*, MainWidget::handle_command(const Command*, int)::<lambda(float*)>}; typename std::_MakeUniq<_Tp>::__single_object = std::unique_ptr<FilteredSelectWindowClass<float>, std::default_delete<FilteredSelectWindowClass<float> > >]’
pdf_viewer/main_widget.cpp:1496:5: required from here
pdf_viewer/ui.h:186:17: warning: ‘FilteredSelectWindowClass<float>::config_manager’ will be initialized after [-Wreorder]
186 | ConfigManager* config_manager = nullptr;
| ^~~~~~~~~~~~~~
pdf_viewer/ui.h:184:26: warning: ‘std::function<void(float*)> FilteredSelectWindowClass<float>::on_done’ [-Wreorder]
184 | std::function<void(T*)> on_done = nullptr;
| ^~~~~~~
pdf_viewer/ui.h:216:2: warning: when initialized here [-Wreorder]
216 | FilteredSelectWindowClass(std::vector<std::wstring> std_string_list,
| ^~~~~~~~~~~~~~~~~~~~~~~~~
pdf_viewer/ui.h: In instantiation of ‘FilteredSelectWindowClass<T>::FilteredSelectWindowClass(std::vector<std::__cxx11::basic_string<wchar_t> >, std::vector<T>, std::function<void(T*)>, ConfigManager*, QWidget*, std::function<void(T*)>) [with T = BookState]’:
/usr/include/c++/9/bits/unique_ptr.h:857:30: required from ‘typename std::_MakeUniq<_Tp>::__single_object std::make_unique(_Args&& ...) [with _Tp = FilteredSelectWindowClass<BookState>; _Args = {std::vector<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::allocator<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > > >&, std::vector<BookState, std::allocator<BookState> >&, MainWidget::handle_command(const Command*, int)::<lambda(BookState*)>, ConfigManager*&, MainWidget*, MainWidget::handle_command(const Command*, int)::<lambda(BookState*)>}; typename std::_MakeUniq<_Tp>::__single_object = std::unique_ptr<FilteredSelectWindowClass<BookState>, std::default_delete<FilteredSelectWindowClass<BookState> > >]’
pdf_viewer/main_widget.cpp:1526:5: required from here
pdf_viewer/ui.h:186:17: warning: ‘FilteredSelectWindowClass<BookState>::config_manager’ will be initialized after [-Wreorder]
186 | ConfigManager* config_manager = nullptr;
| ^~~~~~~~~~~~~~
pdf_viewer/ui.h:184:26: warning: ‘std::function<void(BookState*)> FilteredSelectWindowClass<BookState>::on_done’ [-Wreorder]
184 | std::function<void(T*)> on_done = nullptr;
| ^~~~~~~
pdf_viewer/ui.h:216:2: warning: when initialized here [-Wreorder]
216 | FilteredSelectWindowClass(std::vector<std::wstring> std_string_list,
| ^~~~~~~~~~~~~~~~~~~~~~~~~
pdf_viewer/ui.h: In instantiation of ‘void FilteredTreeSelect<T>::on_select(const QModelIndex&) [with T = int]’:
pdf_viewer/ui.h:130:4: required from ‘FilteredTreeSelect<T>::FilteredTreeSelect(QStandardItemModel*, std::function<void(const std::vector<int, std::allocator<int> >&)>, ConfigManager*, QWidget*) [with T = int]’
/usr/include/c++/9/bits/unique_ptr.h:857:30: required from ‘typename std::_MakeUniq<_Tp>::__single_object std::make_unique(_Args&& ...) [with _Tp = FilteredTreeSelect<int>; _Args = {QStandardItemModel*, MainWidget::handle_command(const Command*, int)::<lambda(const std::vector<int, std::allocator<int> >&)>, ConfigManager*&, MainWidget*}; typename std::_MakeUniq<_Tp>::__single_object = std::unique_ptr<FilteredTreeSelect<int>, std::default_delete<FilteredTreeSelect<int> > >]’
pdf_viewer/main_widget.cpp:1440:29: required from here
pdf_viewer/ui.h:156:30: warning: the address of ‘QTextStream& endl(QTextStream&)’ will never be NULL [-Waddress]
156 | std::wcout << "activated " << endl;
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~
pdf_viewer/ui.h: In instantiation of ‘void FilteredSelectWindowClass<T>::keyReleaseEvent(QKeyEvent*) [with T = BookState]’:
pdf_viewer/ui.h:291:7: required from here
pdf_viewer/ui.h:301:10: warning: unused variable ‘delete_row’ [-Wunused-variable]
301 | int delete_row = selected_index.row();
| ^~~~~~~~~~
pdf_viewer/ui.h: In instantiation of ‘void FilteredSelectWindowClass<T>::on_config_file_changed(ConfigManager*) [with T = BookState]’:
pdf_viewer/ui.h:209:7: required from here
pdf_viewer/ui.h:209:45: warning: unused parameter ‘new_config_manager’ [-Wunused-parameter]
209 | void on_config_file_changed(ConfigManager* new_config_manager) {
| ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
pdf_viewer/ui.h: In instantiation of ‘void FilteredSelectWindowClass<T>::keyReleaseEvent(QKeyEvent*) [with T = float]’:
pdf_viewer/ui.h:291:7: required from here
pdf_viewer/ui.h:301:10: warning: unused variable ‘delete_row’ [-Wunused-variable]
301 | int delete_row = selected_index.row();
| ^~~~~~~~~~
pdf_viewer/ui.h: In instantiation of ‘void FilteredSelectWindowClass<T>::on_config_file_changed(ConfigManager*) [with T = float]’:
pdf_viewer/ui.h:209:7: required from here
pdf_viewer/ui.h:209:45: warning: unused parameter ‘new_config_manager’ [-Wunused-parameter]
209 | void on_config_file_changed(ConfigManager* new_config_manager) {
| ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
pdf_viewer/ui.h: In instantiation of ‘void FilteredSelectWindowClass<T>::keyReleaseEvent(QKeyEvent*) [with T = std::__cxx11::basic_string<wchar_t>]’:
pdf_viewer/ui.h:291:7: required from here
pdf_viewer/ui.h:301:10: warning: unused variable ‘delete_row’ [-Wunused-variable]
301 | int delete_row = selected_index.row();
| ^~~~~~~~~~
pdf_viewer/ui.h: In instantiation of ‘void FilteredSelectWindowClass<T>::on_config_file_changed(ConfigManager*) [with T = std::__cxx11::basic_string<wchar_t>]’:
pdf_viewer/ui.h:209:7: required from here
pdf_viewer/ui.h:209:45: warning: unused parameter ‘new_config_manager’ [-Wunused-parameter]
209 | void on_config_file_changed(ConfigManager* new_config_manager) {
| ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
In file included from pdf_viewer/main_widget.cpp:37:
pdf_viewer/ui.h: In instantiation of ‘void FilteredTreeSelect<T>::on_config_file_changed(ConfigManager*) [with T = int]’:
pdf_viewer/ui.h:91:7: required from here
pdf_viewer/ui.h:91:45: warning: unused parameter ‘new_config_manager’ [-Wunused-parameter]
91 | void on_config_file_changed(ConfigManager* new_config_manager) {
| ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
In file included from pdf_viewer/main_widget.cpp:37:
pdf_viewer/ui.h: In instantiation of ‘void FilteredSelectWindowClass<T>::keyReleaseEvent(QKeyEvent*) [with T = int]’:
pdf_viewer/ui.h:291:7: required from here
pdf_viewer/ui.h:301:10: warning: unused variable ‘delete_row’ [-Wunused-variable]
301 | int delete_row = selected_index.row();
| ^~~~~~~~~~
pdf_viewer/ui.h: In instantiation of ‘void FilteredSelectWindowClass<T>::on_config_file_changed(ConfigManager*) [with T = int]’:
pdf_viewer/ui.h:209:7: required from here
pdf_viewer/ui.h:209:45: warning: unused parameter ‘new_config_manager’ [-Wunused-parameter]
209 | void on_config_file_changed(ConfigManager* new_config_manager) {
| ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
make: *** [Makefile:1100: main_widget.o] Error 1
Seems like some includes are missing.
Cheers, Sergei
btw, if you need any help, like establishing CI or other things, feel free to share it
Yeah sorry my bad. It should be fixed in f42c3bba7b933c62ef78a6ff4fb303cd825f1a09 now.
btw, if you need any help, like establishing CI or other things, feel free to share it
I don't have any tests though. I should really start writing some automated tests.
btw, if you need any help, like establishing CI or other things, feel free to share it
I don't have any tests though. I should really start writing some automated tests.
It can run a build on the different platforms for the beggining. It would filter the issues like we have rn when you're able to build under windows and not on Linux. But ofc it's up to you :)
btw, if you need any help, like establishing CI or other things, feel free to share it
I don't have any tests though. I should really start writing some automated tests.
It can run a build on the different platforms for the beggining. It would filter the issues like we have rn when you're able to build under windows and not on Linux. But ofc it's up to you :)
Yes I do have build on multiple platforms in github actions currently. The problem is that the build takes ~10 minutes (because it needs to build mupdf, download Qt, etc.) so it is faster to just build it myself in a virtual machine XD .
Yeah sorry my bad. It should be fixed in f42c3bb now.
ok, now it's building and the screen doesn't turn blank,
but how should this feature works actually? Now, when I press
Should it be so?
Yeah sorry my bad. It should be fixed in f42c3bb now.
ok, now it's building and the screen doesn't turn blank, but how should this feature works actually? Now, when I press while having 1 document opened -- it's doing nothing, but if I open another document and press it returns to a previously opened document.
Should it be so?
Yes this is working as intended. If you want to go back forward in history you can press ctrl+right arrow.
Yeah sorry my bad. It should be fixed in f42c3bb now.
ok, now it's building and the screen doesn't turn blank, but how should this feature works actually? Now, when I press while having 1 document opened -- it's doing nothing, but if I open another document and press it returns to a previously opened document. Should it be so?
Yes this is working as intended. If you want to go back forward in history you can press ctrl+right arrow.
got it, I liked it more when it was jumping even inside 1 document. :)
If you want to go back forward in history you can press ctrl+right arrow.
Unfortunately, it interferes with my keybinding on my GE, but I'll try to fix it with config. Thanks a lot and good luck with the development!
Yeah sorry my bad. It should be fixed in f42c3bb now.
ok, now it's building and the screen doesn't turn blank, but how should this feature works actually? Now, when I press while having 1 document opened -- it's doing nothing, but if I open another document and press it returns to a previously opened document. Should it be so?
Yes this is working as intended. If you want to go back forward in history you can press ctrl+right arrow.
got it, I liked it more when it was jumping even inside 1 document. :)
Well yes you can still jump inside the same document too. The history works both inside one document and accross documents. For example suppose you are in document 1 page 100 and now you jump to document 1 page 200 and then go to document two page 1, now your history is like this: D1[100], D1[200], D2[1]
Now if you press backspace you will go to document 1 page 200 and if you press it again you will go back to document 1 page 100.
Yeah sorry my bad. It should be fixed in f42c3bb now.
ok, now it's building and the screen doesn't turn blank, but how should this feature works actually? Now, when I press while having 1 document opened -- it's doing nothing, but if I open another document and press it returns to a previously opened document. Should it be so?
Yes this is working as intended. If you want to go back forward in history you can press ctrl+right arrow.
got it, I liked it more when it was jumping even inside 1 document. :)
Well yes you can still jump inside the same document too. The history works both inside one document and accross documents. For example suppose you are in document 1 page 100 and now you jump to document 1 page 200 and then go to document two page 1, now your history is like this: D1[100], D1[200], D2[1]
Now if you press basupposeckspace you will go to document 1 page 200 and if you press it again you will go back to document 1 page 100.
BEST THING EVER, Thank you a lot!
I'll try to incorporate this tool into my daily life and try to give you more feedback.
Cheers, Sergei
Hi there, Thanks for the amazing project!
I've tried to test it on Linux Xubuntu 20.04 by building from scratch using
./build_linux.sh
. After I started and play a bit with steps in the tutorial, I reached the line withbackspace
, pressed on it several times and the whole document turns into a white screen. So, I was not able to navigate it somehow, but I was still able to open a new document. When I tested the same behaviour on the newly opened documents the issue reproduced.The log for an example:
Ask me any questions to help you reproduce and fix it! I'm really excited to have such a nice thing in my toolbox.
Cheers, Sergei