RawDigger 0.9.10 - версия для Mac

Продублирую анонс на radigger.ru тут, с небольшими комментариями.

Обещал Mac-версию в течение марта? получите.

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

Отличия от Windows-версии:

  • Функциональность соответствует версии 0.9.10 для Windows за исключением Drag-n-Drop на иконку приложения (Drag-n-drop в открытое окно программы - работает).
  • Все функциональные Ctrl-кнопка стали Command-кнопка, за исключением Ctrl-H (показ окна гистограммы всего изображения), которая стала Option-H. Патамучта Command-H уже занято.
  • Порядок следования кнопок в Preferences немножко отличается от Windows-версии (но все элементы находятся на своих табах). Это нормально, этот новый порядок будет и в очередной Windows-версии.
  • Текущая версия - только 64-bit. Universal-binary варианты (Intel 32/64, а может быть и PPC 32/64) будут позже. Все понятно что делать, но Qt пересобрать придется, а это серьезное такое (по времени) развлечение.
  • Тестировалось на Mac OS X 10.6 и 10.7. Работает.  На 10.5 протестировать не удалось т.к. она оказалась на 32-битном процессоре (точнее, та виртуальная машина, которую я готовую скачал - 32-битная по мнению Mac OS).
  • Английская версия будет через несколько дней. Анонсировать русскую версию в англоязычных форумах не надо. А то обидимся совсем. Тот шабаш, что был с анонсами русской 0.9.6 - не понравился вовсе.

Про разработку под Макос имею сказать отдельно:

  1. Qt - рулит невероятно. Все что Qt-шное - просто завелось и заработало. Включая Drag-n-Drop в окошко приложения.
  2. Изготовление "инсталляторов" - просто сказка. Легко, удобно, приятно, очевидно (наверное с .pkg не так, но мне не надо).
  3. То что .app - это каталог, тоже невероятно понравилось. Можно туда положить exiftool со всеми перловыми библиотеками - и работает.
  4. А вот Mac-специфичный development - это Адъ. Вместо argv[0] вот такое вот:
    CFURLRef appUrlRef = CFBundleCopyBundleURL(CFBundleGetMainBundle());
    CFStringRef macPath = CFURLCopyFileSystemPath(appUrlRef,kCFURLPOSIXPathStyle);
    const char *pathPtr = CFStringGetCStringPtr(macPath,CFStringGetSystemEncoding());
  5. Документация - тоже прикольная, да. Понять как поддержать тот самый Drag-n-Drop на иконку - пока не сумел. Сумел путем художественного заимствования сделать так, что дропается. Но дропается не в argv[1], а даже не знаю куда, завтра продолжу поиски.

Comments

Несколько разнородных комментариев:

1. CFStringGetCStringPtr не сработает, если первичный язык в системе стоит русский, надо всегда использовать CFStringGetCString. Вам удалось наткнуться на, по-моему, самое дурное место во всём API - функцию, которой никогда не следует пользоваться.

2. Если я правильно понял, что приведённый кусок кода нужен для обнаружения exiftool, то правильнее использовать что-то вроде CFBundleCopyResourceURL или CFBundleCopySupportFilesDirectoryURL, но никак не ручные манипуляции с CFBundleCopyBundleURL.

3. Чисто на всякий случай, результаты функций с CFCopy и CFCreate в имени надо освобождать CFRelease, а иначе будут утечки памяти.

Подсказать про интеграцию Qt, увы, не могу.

Я в этом деле вообще ничего не понимаю (и, если честно, хотел бы как можно меньше про это знать), поэтому приведенный кусок кода - просто найден в недрах Qt и использован as is
(CFRelease тоже есть).

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

(через 15 минут, почитав мануал), правильно ли я понимаю, что
1) Путь до файла exiftool надо конструировать CFBundleCopyResourceURL
2) Конвертировать это с C-style строку - через CFURLGetFileSystemRepresentation ?

Да. CFURLGetFileSystemRepresentation правильнее, хотя я не уверен, есть ли практической разница в современных версиях OS X.

Пока сделал так, покритикуйте если есть минута (продолжаю ничего в маках не понимать):

CFURLRef resurl = CFBundleCopyResourcesDirectoryURL(CFBundleGetMainBundle());
char buf[2048];
if(resurl && CFURLGetFileSystemRepresentation(resurl, true, (UInt8*)buf, 2048))
exifToolPath = QString("%1/exiftool").arg(buf);
if(resurl)
CFRelease(resurl);

Лёх - ты монстр!!! (в наилучшем смысле этого слова ;))

Сам себя уже боюсь!