RawDigger для Mac - вторая альфа

Прошу любить, жаловать и скачивать отсюда.

По традиции, расширенно комментирую Changelog:

  • 64/32 бита. Протестирована на 10.5 (32 bit),10.6 (64bit) и 10.7 (64bit), может быть работает и на интеловской 10.4

    Надо сказать, что для удержания дистрибутива в приемлемом размере пришлось пересобрать Qt в урезанном варианте (без Webkit, QDeclarative и много чего еще). Иначе размер .app моментально раздувало до 75M, а это уже перебор.

    macdeployqt можно попросить не копировать лишнего (-no-plugins), но тогда оно не копирует плагины (сюрприз!), а не только QWebKit и прочих. А без плагинов - кой-чего отваливается и программа крэшится, ага.

  • Поправлены размеры шрифтов и контролов в ряде мест (и где были слишком крупные, и где были слишком мелкие).

    Отдельное спасибо за совет с Qt::WA_MacMiniSize. Выглядит не очень, ну так QGroupBox на маке в любом случае выглядит так себе.

  • Добавлено место на правом краю гистограммы, где 5 цифр не влезало
  • Поправлены верхние информационные окошки, все цифры должны (бы) быть видны
  • Работает Drag-n-Drop на иконку приложения (за исключением дропа прямо на образ дистрибутивного диска, где работать и не должен).

    Про это напишу особо ниже.

  • Если About-диалог открыт сразу после запуска программы, то он не закрывается самопроизвольно через несколько секунд.
Так вот, теперь про маковский Drag-n-Drop.

Drop на открытое окно программы обрабатывается как-то стандартно, относительно виндовой версии ничего добавлять не пришлось.

А вот с дропом на не-запущенную программу дело обстоит весело:

  • Гугление ничего разумного не дало, то есть совсем.
  • Изучая Info.plist разных программ - понял что туда написать, чтобы операционка решила, что дроп поддерживается (CFBundleDocumentTypes). Программа стала запускаться, только дропнутый файл ей в командной строке не передается, тут вам не винды!
  • В маковской доке написано, дескать - (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames. И полученный приватно совет гласил то же самое.

    Но у меня, я извиняюсь, C++, а не Objective-C. Куда Objective-C намазывать я просто не представляю.

    Пошел читать Qt-шные примеры, благо там много про Drag-n-Drop. Экспериментально выяснил, что примеры - дроп на иконку не поддерживают. Но поддерживает Qt Designer. Но он, сука, здоровый, читать его умаешься. Вставляя в него отладочную печать (хорошо что там исходники разумные и имена функций называются человечески, grep Open нашел что мне надо) - выяснил искомое место.

  • Оказывается, надо засабклассить QApplication и в ейном event() обработать QEvent::FileOpen.

    После этого знания уже удается нагуглить правильных слов, хотя почему ни в Mac-specific-документации, ни в документации на Drag-n-Drop это место не упомянуто - до сих пор загадка.

  • И таки да. Это место в Qt обрабатывается куском, написанным на Objective-C.
  • И даже более-менее понятно, для чего оно так извращенно сделано, чтобы можно было дропать на иконку в доке (возможно, запущенной программы) и запускалась бы не новая копия, а старая могла бы воспринять. Хотя вот мне продолжает казаться, что это через анус.

Comments

Может это и полный ...., но как-же интересно получается.

> хотя почему ни в Mac-specific-документации, ни в документации на Drag-n-Drop это место не упомянуто - до сих пор загадка.

подозреваю, что потому что (для совсем родных программ) это место никто явно не зовет, а используют внутри всяких NSDocumentController

Теоретически, на каждый NSчто-то-там должен находиться CF-что-то-там-же

Ну и ты, конечно, знаешь о существовании Objective C++, то есть что тебе никто не мешает из плюсового кода звать кокао в любом месте?
(и превращать CFArrayRef в NSArray и обратно?)

Я, естественно, ни о чем таком (Objective C++, CFArrayRef и вообще всем этом) - не знаю, а главное - ведь и не хочу знать. Я абсолютно счастлив от того, что в Qt оно оказалось как-то само работает.

А про документацию - мое недоумение относится именно к Qt. Там есть раздел в документации про Drag-n-Drop (и про многие Mac-specific вещи есть отсылка куда следует (например к QMacPasteboardMime).
Там есть специфичный раздел про Mac. А вот про FileOpenEvent (которое одновременно и про DnD и Mac-specific) в этих доках не упомянуто внятно. Собственно, невнятно - тоже.

А

ну тады понятно

Меня, видимо, сбила с толку фраза "И таки да. Это место в Qt обрабатывается куском, написанным на Objective-C", как будто в этом есть что-то плохое.

Потому что в том, что касается маковского рантайма ObjC первичен. К нему бывают "необъектные" интерфейсы, но иногда и не бывают.

То же относится к предыдущему посту про (argc, argv)
они вполне себе есть, просто никакой функции связанной с файлами, которые тебя просит отрыть гуй не несут

Нет, ничего плохого в Obj-C нету. Но с учетом того, что в Qt ~250M исходников на C++ (оценил от фонаря, архив в 290M, но там иконки всякие тоже есть) и немножко (относительно этих 250M) кусочков на Obj-C на мой взгляд свидетельствует о том, что из C/C++ API макоси получить доступ (любой, удобный, эффективный - не знаю) не удалось.

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

(занудно) вопрос, конечно, еще в том, сколько в этих гигазах вареза платформонезависимого кода, а сколько про макос

ну, это же известный факт жизни. Есть макосный гуй, в котором все API - это взаимодействие ObjC'шных объектов внутри конкретного рантайма

К некоторым конкретным объектам этого рантайма сделан сишный апи, а к некоторым - нет

что в какой-то степени логично, ибо одно дело строки туда-сюда таскать, а другое дело проецировать на плоскость логику того же NSApplication - там страшненько будет и совсем не для людей

Самое смешно, что формально ты неправ

там вообще нет '.m' есть только '.mm', то бишь ObjC++, а не ObjC - то есть весь код плюсовый ж)

я не настоящий сварщик грепом, но да, похоже, что .cpp использующего CFString там сильно больше, чем любого .mm

Ну так я о том и толкую - все что смогли - таки написали на C++. С CFString.
А до Objective-ужаса дело дошло только от невозможности сделать на человечьем языке.

Случайно наткнулся на Ваш блог)
Скажите Алексей, а Вы случайно не сталкивались с проблемой дропа из Qt приложения в Mac OS, если сталкивались то как решали?

p.s. вот тут подробнее про проблему - http://www.prog.org.ru/topic_22179_0.html

Нет, не сталкивался. У меня наоборот, из FS в приложение.