Путь приложения

Applications development, KoOS API questions
  • Нет, маркер кодировки не является частью строки, это информация о ней, как ВОМ. Сначала маркер, потом строка: ☺/tmp0/1/222/файляYYYY866.ttt. Для cp866 как и раньше можно без маркера.
  • В результате с именами "♥мой_файл" будут проблемы.
    Префикс перед именем - скверная идея.
  • Лучше всего сделать отдельные функции для utf кодировки.
    Ещё в копилку
    gboolean
    g_path_is_absolute (const gchar *file_name)
    {
    g_return_val_if_fail (file_name != NULL, FALSE);

    if (G_IS_DIR_SEPARATOR (file_name[0]))
    return TRUE;

    #ifdef G_OS_WIN32
    /* Recognize drive letter on native Windows */
    if (g_ascii_isalpha (file_name[0]) &&
    file_name[1] == ':' && G_IS_DIR_SEPARATOR (file_name[2]))
    return TRUE;
    #endif

    return FALSE;
    }
    Это GLib Подобного кода написаны гигабайты. И весь этот код стал несовместим с Колибри.
  • Serge
    А зачем префикс перед именем? Откуда такие имена возьмутся?
  • Pathoswithin wrote:Serge
    А зачем префикс перед именем? Откуда такие имена возьмутся?
    Ну например, что должна возвращать команда чтения каталога при унификации.

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

    Можно еще подумать про сетевые диски и относительные пути ../, .../, итп

    Например, можно к 70.1, 70,2,... сделать их юникодные версии 70.31, 70.32
  • Pathoswithin wrote:Serge
    А зачем префикс перед именем? Откуда такие имена возьмутся?
    Т.е. я не могу прочитать "♥мой_файл" из текущего каталога ? Обязательно полный путь формировать надо ?
    Siemargl wrote:Заодно предлагаю решить проблему рабочего каталога, который ни к чему не привязан.
    Что значит не привязан ?
  • Serge wrote:
    Siemargl wrote:Заодно предлагаю решить проблему рабочего каталога, который ни к чему не привязан.
    Что значит не привязан ?
    А куда он указывает, на /rd/1 ???

    Было бы нормальным, если бы это был рабочий каталог запускаемой программы, указанный явно при запуске или неявно был каталогом запуска программы.

    Можно конечно, такую логику делать и руками, просто /rd/1 эквивалентно пустышке.
  • Pathoswithin
    Если интересует, как обрабатывается Unicode в сишных программах, посмотри GLib. Там все строки хранятся в utf8. Для вызовов WinAPI строки конвертируются из utf8 в utf16. Linux понимает utf8. При этом специальные байты для обозначения кодировки не применяются.
  • Siemargl
    Уже много раз обсуждалось. Наследуется от родительского процесса. Как и должно быть. Это не проблема ядра, там с текущим каталогом всё (почти) правильно.
  • Serge wrote:Siemargl
    Уже много раз обсуждалось. Наследуется от родительского процесса. Как и должно быть. Это не проблема ядра, там с текущим каталогом всё (почти) правильно.
    Ок. Я запускаю с рабочего стола еолайт. У него в иконке записан путь /sys/file managers/eolite

    Дальше, запускаю из еолайта shell.
    И что я вижу в pwd? /rd/1/

    Отлично отнаследовалось.
    Меняем каталог cwd, запускаем из шелл, например kfm или kfar - Они опять в /rd/1
    Получается, что рабочего каталога по умолчанию у программы нет.

    Кстати, шрифты действительно накрылись.
  • Siemargl
    Всё правильно. Shell расположен в /rd/1. Скопируй shell в /tmp0/1 и запусти оттуда.
    Attachments
    1.png
    1.png (19.44 KiB)
    Viewed 5269 times
  • Меняем каталог cwd, запускаем из шелл, например kfm или kfar - Они опять в /rd/1
    На что меняем ? Ты про это:
    Kfar и KFM после запуска показывают на левой панели /rd/1/ и /hd0/1/ на правой. Это by design.
    Оба кстати меняют текущий каталог при навигации.
  • Вообще-то, меня интересовало как сишные программы получают в юникоде путь запуска.

    Siemargl
    "../" в относительных путях поддерживается... но это нигде не документировано.
  • В никсах передаётся в вершине стека. Подробно расписано в System V Application Binary Interface страница 54 Process Stack and Registers Кодировка строк не определена, могут быть и в utf-8. Строки нуль терминированные.
    В Windows при помощи GetCommandLineW(). Сама строка скорее всего так же хранится в стеке. Потом рантайм разбирает строку на на аргументы. Примерно так LPWSTR* lpArgv = CommandLineToArgvW( GetCommandLineW(), &argc );
  • Who is online

    Users browsing this forum: No registered users and 2 guests