Использование

Просмотр wxWidgets переменых в GDB Ubuntu

October 29th, 2011 Begemot

GDB к сожалению не самый удобный отладчик на свете, но что делать… А мой (7.2 под ubuntu 11.04) еще падал все-время, если в функции где я ставлю брейк, есть определение wxString, типа wxString str = “some string”; падал с таким сообщением

Breakpoint 2, BegUtils::GetImageFromZipResource (pathURL=…, fileName=…, type=wxBITMAP_TYPE_PNG) at /media/data/work/Flashnote/src/Utility/begutils.cpp:166
/media/data/work/Flashnote/src/Utility/begutils.cpp:166:4941:beg:0x82977e3
>>>>>>cb_gdb:
> info locals
warning: static field’s value depends on the current frame – bad debug info?
/build/buildd/gdb-7.2/gdb/findvar.c:427: internal-error: read_var_value: Assertion `frame’ failed.
A problem internal to GDB has been detected,
further debugging may prove unreliable.

Если определения строки нет, то заходил, но падал стоило провести курсором над параметром функции – строке. Вообщем дебажить было вообще невозможно.

Решение такое:

CodeBloks -> Settings -> Compiler and debugger settings -> Debugger settings -> И там в первый едит бокс добавляем строку source  /media/data/const/wxWidgets/misc/gdb/print.py

После чего падения прекращаются, и о чудо, отладчик начинает показывать значение wxString. Жизнь сразу становится много лучше:)

Еще почитать можно тут Pretty printing wxStuff in gdb и тут

Posted in Использование | Tags: ,
Comments Off on Просмотр wxWidgets переменых в GDB Ubuntu


Поиск в SQLite без учета регистра, для русского языка

August 14th, 2010 Begemot

Не смотрю на всю свою юникодность, SQLite все-таки юникодна не до конца:( При поиске типа WHERE description LIKE “%STRING%” поиск идет без учета регистра для латинских букв, но к сожалению, он регистрозависимый для всех остальных символов. Корни этого уходят в виндовую функцию tolower(), которая правильно обрабатывает символы только текущей локали. И это весьма плохо, для целого ряда задач, например для поиска ранее скопированного текста в истории буфера обмена (извините, не удержался:))

Но к счастию способ есть. Оригинал и файлы для загрузки тут – SQLite and native UNICODE LIKE support in C/C++ . А я раскажу о том как это интегрировать и скрестить с wxDatabaselayer’om.

  1. Берем файлы sqlite3_unicode.h/c с архива по ссылке выше и добавляем в проект.
  2. Вызываем свойства sqlite3_unicode.c  и добавляем SQLITE_ENABLE_UNICODE; SQLITE_CORE в определения препроцессора c++/preprocessor/preprocessor definitions
  3. Если используете precompiled header в проекте, надо в свойствах обоих файлов отключить его использование.
  4. в с файле есть строчка #include “sqlite3.h” заменить ее на свой путь к sqlite3.h, если он у вас отличается
  5. Включить sqlite3.h в sqlite3_unicode.h, без этого у меня не компилилось.
  6. Дальше вызываете sqlite3_unicode_load();  \  sqlite3_unicode_free();  –  в начале/конце программы
  7. После открытия базы данных вызываем для нее sqlite3_unicode_init(db);

Проблема тут в том что sqlite3_unicode_init(db); хочет db типа sqlite3 *, а у нас есть только указатель на обьект датабайслаера. Тут придется править код самого wxDatabaselayer’a и заново компилить. Идем в databaselayer\include\SqliteDatabaseLayer.h, пишем:

// Added by Begemot – for using with  sqlite3_unicode
void * GetSQLiteDatabase()  { return m_pDatabase; } 

компиляем, и в нашей программе вместо строчки sqlite3_unicode_init(db); используем вот такую вот страшную конструкцию

sqlite3_unicode_init(static_cast<sqlite3*>(static_cast<SqliteDatabaseLayer*>(db)->GetSQLiteDatabase()));

Все. Теперь Like % прекрасно ищет по русским или любым другим символам без учета регистра.


wxWidgets определение размера экрана

June 22nd, 2010 Begemot

В wxWidgets есть wxSystemSettings::GetMetric() который, кроме прочего, позволяет узнать разрешение экрана, но к сожалению не правильно 🙁

Проблемы появляются на мультимониторных конфигурациях. Вызов wxSystemSettings::GetMetric(wxSYS_SCREEN_X); дает нам ширину только первого монитора под Windows (сам проверял) и суммарную ширину обоих мониторов под Линуксом (сведенья из инета). Подозреваю что это баг, но разбиратся, формулировать и спорить некогда, поэтому просто написал воркараунд для себя

#ifdef __WIN32__  
    // wxSystemSettings::GetMetric does not support multy-monitor configuration at Windows, and return parameters only for first monitor, but it seems wots fine under Linux
    const int maxWidth = ::GetSystemMetrics(SM_CXVIRTUALSCREEN);
    const int maxHeight = ::GetSystemMetrics(SM_CYVIRTUALSCREEN);
#else
    const int maxWidth = wxSystemSettings::GetMetric(wxSYS_SCREEN_X);
    const int maxHeight = wxSystemSettings::GetMetric(wxSYS_SCREEN_Y);
#endif

Updated:
Эхх стало стыдно за плохой стиль:(

// wxSystemSettings::GetMetric does not support multy-monitor configuration at Windows and return parameters only for first monitor, but it seems works well under Linux
wxSize BegUtils::GetVirtualDisplayResolution()
{
#ifdef __WIN32__  
    return wxSize(::GetSystemMetrics(SM_CXVIRTUALSCREEN), ::GetSystemMetrics(SM_CYVIRTUALSCREEN));
#else
    return wxSize(wxSystemSettings::GetMetricwxSYS_SCREEN_X), wxSystemSettings::GetMetricwxSYS_SCREEN_Y));
#endif
}


...

    const wxSize resolution = BegUtils::GetVirtualDisplayResolution();

Бег по минному полю к Qt

May 16th, 2010 Begemot

Последнее время что-то все чаще и чаще при разработки с wxWidgets приходит в голову аналогия с бегом по минному полю – никогда не знаешь что рванет, но каждый шаг этого ожидаешь.

Обновился в транке то последней ревизии – бах. Взял компонент который раньше не юзал – бах, бах. , попробовал под мак компилять – бах, бах, бах. И это не образно, это реально то на что я попал за неделю. Каждая проблема это время, нервы, разочарование.

Сейчас повторяется недавняя история, когда я помучавшись с wxWidgets плюнул и написал программу на Objective-C\Cocoa. Потратив пару дней на написание прототипа гуи, вернее самых зачатков прототипа – для того что бы проверить архитеетуру\логику работы. GUI в принципе не самое простое, но и ничего сверх естественного.

Дальше начались проблемы, посидев полдня с напильником под виндой, перейдя с с wxNotebook на AUI версию – удалось добиться приемлемого поведения под виндой. Пошел под Mac OS – там все было достаточно печально, тот же wxAuiNoteebook ведет себя совсем не так как надо (и это я не использовал никаких продвинутых возможностей, типа открепления\перемещения вкладок, просто их показ).

Конечно, я уверен что не решаемых проблем особо нет – можно было опять же достать напильник (что в принципе нормально), изменить подход к построению гуи, вернутся на родной Noteebook, попробовать второй, третий вариант и так далее.

Но что-то я уже был злой и раздосадованный, человек (можно сказать апологет wxWidgets!) стал убеждать, что для моей задачи лучше все-таки использовать Qt, заказчик был изначально больше за Qt чем за wxWidgets…

В общем теперь я очень срочно учу Qt 🙂 Пока остановились на варианте – пишу прототип на нем и потом мы смотрим, сравниваем  и выбираем, но что-то мне подсказывает, что я знаю чем все закончится 🙂


wxPropertyGrid – довольно удобно

May 11th, 2010 Begemot

Есть у меня особенность, люблю когда поведение программы можно тонко настроить. Поэтому у меня в программах обычно куча настроек, причем часть из них скрытые и доступны только прямой правкой конфига, потому что добавлять в гуй кучу мелких опций – не всегда хорошо.

Теперь я нашел выход, делаем в опцию одну страницу Advanced, суем туда wxPropertyGrid, теперь отпадает проблема усложнения GUI кучей мелких опций. К тому же добавление новых настроек превращается в простой и быстрый процесс.

image


О тонкостях, точках и запятых

March 26th, 2010 Begemot

Есть у меня модуль для проверки наличия обновлений. Скачивает с сайта тхт файлик, парсит и радует юзверя наличием информации о новой версии.

Периодически народ жаловался что у него не работает, у меня все работало, я конечно бил себя в грудь и грешил на фаерволы, в принципе основания были. Пока однажды вдруг не сломалось у меня.

Начал ковыряться, оказалось фаерволы не причем, вернее не всегда причем. Оказалось что “2.8” это не всегда 2.8, банально правда?:) Вроде бы известно, банально, но пока гром не грянет…

В общем решение вот:

bool wxString::ToCDouble(double * val)  const
Variant of ToDouble() always working in "C" locale.
Works like ToDouble() but unlike it this function expects the floating point number to be formatted always with the rules dictated by the "C" locale (in particular, the decimal point must be a dot), independently from the current application-wide locale (see wxLocale).


Mac OS, CMake and wxWidgets

March 18th, 2010 Begemot

Привалило мне тут счастье в виде халтурки по клонированию одной утилиты с винды на мак. Поскольку  я давно мечтал портировать свой софт под мак (я же пишу на вхВиджетс!) не долго думая согласился. Поставил систему (установка MAC OS на хакинтош , первые впечатления) и потихоньку осваиваюсь. Даже завел новый блог – Dive Into Mac OS – микрозаметки новичка🙂

Почти день убил на то что бы скрестить исходники, wxWidgets, CMake и IDEs, с переменным успехом, Очень удачно получилось что пару недель назад я наконец решил освоить CMake  вместе с minGW под виндой, в рамках программы подготовки перехода на альтернативные оси, правда тогда я еще не знал что это будет так скоро:)

Теперь о плохом, модуль смейка FindWxWidgets под маком работает хреново (под виндой кстати тоже не идеально), это + почти полное не понимание того как это все работает под макосом\линуксом привели к тому что я провозился почти целый день,

Теперь кратко о проблемах с wxWidgets и CMake  под Mac OS и о том как удалось решить,

1. скомпилить вхВиджетс получилось но проинсталировать почему-то нет. то есть оно вроде инсталируется но wx-config –list возвращает только ту версию вхсов которая стояла в макое по умолчанию и не видит мою. решается указанием в CMake файле где брать нашу библиотеку

SET(wxWidgets_CONFIG_EXECUTABLE /…path…/build/my-mac/wx-config)

2. Для мака надо обязательно указывать архитектуру иначе ругается на либы

SET(CMAKE_OSX_ARCHITECTURES i386)

3. На всякий случай добавляем еще и (хотя точно не уверен что надо)

set(CMAKE_OSX_SYSROOT /Developer/SDKs/MacOSX10.6.sdk)

4. Теперь собственно поиск и подключения wxWidgets. (путь мы уже установили вверху)

После

find_package (wxWidgets COMPONENTS ${myWXWIDGETS_LIBS} REQUIRED)

include_directories(${wxWidgets_INCLUDE_DIRS})

Прошлось далать две ветви – одна под винду , вторая для APPLE, команда
add_definitions(${wxWidgets_DEFINITIONS})
у меня упорно не работает видимо что-то с форматом, думаю ошибка в модуле цмейка, под виндой, кстати так же не работает, но там  его можно было просто закоментировать – а тут не получается. под маком сделал так,
add_definitions(-I/volumes/shared/work/const/wxwidgets-trunk/build/my-mac/lib/wx/include/osx_carbon-unicode-static-2.9 -I/volumes/shared/work/const/wxwidgets-trunk/include -D_FILE_OFFSET_BITS=64 -D__WXMAC__ -D__WXOSX__ -D__WXOSX_CARBON__)
то есть указал то что мне выдает wx-config –cppflags…
5.  дальше имена библиотек, опять все через тернии – по нормальному. так :
target_link_libraries(${myPROJECT} ${wxWidgets_LIBRARIES})
не работает, только с ручным исправлением
STRING(REPLACE “wx_osx_carbonu_jpeg-2.9” “wxjpeg-2.9” wxWidgets_LIBRARIES “${wxWidgets_LIBRARIES}”)
STRING(REPLACE “wx_osx_carbonu_png-2.9” “wxpng-2.9” wxWidgets_LIBRARIES “${wxWidgets_LIBRARIES}”)
target_link_libraries(${myPROJECT} ${wxWidgets_LIBRARIES} -liconv)
Вот такие пироги.
P.S. Если вдруг есть кто знакомый с программированием под мак, и желающий провести небольшой экскурс\поотвечать в аське (#264684674) на глупые вопросы, буду признателен – а то тут так много непонятного :)))

wxWidgets utils

March 16th, 2010 Begemot

 

А вы знаете про набор вспомогательных функций в wxWidgets? загляните, есть много полезного.

Posted in Использование | Tags:
Comments Off on wxWidgets utils


Ода wxYield

March 11th, 2010 Begemot

Знаете ли вы о wxYield? Если нет, то радуйтесь, потому я что я даю вам в руки поистине мощнейший инструмент. Это маленькая функция, название и назначение которой, я все никак не могу запомнить (!), способна творить чудеса.

bool Yield(bool onlyIfNeeded = false)

Yields control to pending messages in the windowing system. This can be useful, for example, when a time-consuming process writes to a text window. Without an occasional yield, the text window will not be updated properly, and on systems with cooperative multitasking, such as Windows 3.1 other processes will not respond.

Caution should be exercised, however, since yielding may allow the user to perform actions which are not compatible with the current task. Disabling menu items or whole menus during processing can avoid unwanted reentrance of code: see ::wxSafeYield for a better function.

Note that Yield() will not flush the message logs. This is intentional as calling Yield() is usually done to quickly update the screen and popping up a message box dialog may be undesirable. If you do wish to flush the log messages immediately (otherwise it will be done during the next idle loop iteration), call wxLog::FlushActive.

Calling Yield() recursively is normally an error and an assert failure is raised in debug build if such situation is detected. However if the onlyIfNeeded parameter is true, the method will just silently return false instead.

Если вдруг у вас падает программа, при закрытии\выходе\в деструкторе и у вас есть окно. Обязательно попробуйте wxYield. Уже три раза я избавлялся от необъяснимых падений, просто добавив ее вызов, чудесно, не правда ли?:)

Последний раз был сегодня, программа падает при рестарте компьютера или выходе пользователя из системы, только на XP и только если у нас установлен PuntoSwitcher… я конечно всеми фибрами души грешил на последний, но все равно пытался найти и исправить ошибку. И что бы вы думали? wxYield  в деструкторе главного окна, спасла положение.

Странно падает программа?
Лишь ошибку видишь ты?
wxYeld расставь по коду,
и еще раз посмотри!

Экспромт родился:)


Компиляция wxWidgets с командной строки в Visual Studio

January 12th, 2010 Begemot

Наконец-то жизнь заставила научится компилить wxWidgets с командной строки используя Visual Studio. Связано это с тем что активно ковыряюсь в библиотеке на предмет выпрямления того что не выпрямлено (об этом в следующий раз, когда остыну:). Итак, у меня получилось что-то типа этого:

rem devenv  [файл_решения | файл_проекта | любой_файл.рсш]  [переключатели]

rem Clean
rem devenv "E:\Const\wxWidgets-trunk\build\msw\wx_vc9.sln" /clean "Debug"
rem devenv "E:\Const\wxWidgets-trunk\build\msw\wx_vc9.sln" /clean "Release"
rem devenv "E:\Const\third-party\databaselayer\build\databaselayer.sln" /Clean "3 Static Unicode Debug Multilib Static" /project databaselayer_databaselayer_sqlite.vcproj
rem devenv "E:\Const\third-party\databaselayer\build\databaselayer.sln" /Clean "3 Static Unicode Release Multilib Static" /project databaselayer_databaselayer_sqlite.vcproj


rem Build
rem devenv "E:\Const\wxWidgets-trunk\build\msw\wx_vc9.sln" /build "Debug"
rem devenv "E:\Const\wxWidgets-trunk\build\msw\wx_vc9.sln" /build "Release"

rem Rebuild
devenv "E:\Const\wxWidgets-trunk\build\msw\wx_vc9.sln" /rebuild "Debug"
rem devenv "E:\Const\wxWidgets-trunk\build\msw\wx_vc9.sln" /rebuild "Release"

rem databaselayer
devenv "E:\Const\third-party\databaselayer\build\databaselayer.sln" /rebuild "3 Static Unicode Debug Multilib Static" /project databaselayer_databaselayer_sqlite.vcproj
rem devenv "E:\Const\third-party\databaselayer\build\databaselayer.sln" /rebuild "3 Static Unicode Release Multilib Static" /project databaselayer_databaselayer_sqlite.vcproj

pause

Такой себе батничек, я его открываю, немного редактирую в зависимости от того что хочу сейчас и запускаю. Все у нас есть свободных пару минут, можно пойти покачать мышцы.