пятница, 28 августа 2009 г.
boost 1.40
Тихо и незаметно вчера вышла очередная версия библиотеки boost. Список изменений небольшой, в основном затронута библиотека Asio.
Posted by
Kirill V. Lyadvinsky
обновлено:
2013-09-09T11:58:17Z
Changing wallpaper on Linux programmatically
Для тех, кто хочет начать работать с GNOME, но не знает с чего начать, вот задачка — поменять обои рабочего стола. Это я так пытаюсь подойти к проблеме поддержки разных обоев для двух мониторов (точнее, монитора и HD телевизора в моем случае). В KDE с этим проблем нет, но в GNOME такой настройки нет. Оказалось, что сделать это несложно. Проблемой я собирался заняться давно, но преодолеть лень и написать код меня сподвигнул этот вопрос.
Нам понадобятся: Ubuntu, любимый текстовый редактор, пакет build-essentials, libglib-2.0-dev, libgconf2-dev и консоль. Думаю, что ставить пакеты все умеют (кто не умеет — читать тут).
В текстовом редакторе создаем файл следующего содержания:
Сборка указанного выше файла тоже не составляет труда. Достаточно в консоли ввести:
Далее, остается сделать GUI для удобного выбора картинок для каждого монитора с последующей склейкой в один файл. Пока не решил какой фреймворк для этого выбрать — основная идея, что хочется писать на С++, но Qt имеет слишком много зависимостей, которые в GNOME по умолчанию отсутствуют...
Нам понадобятся: Ubuntu, любимый текстовый редактор, пакет build-essentials, libglib-2.0-dev, libgconf2-dev и консоль. Думаю, что ставить пакеты все умеют (кто не умеет — читать тут).
В текстовом редакторе создаем файл следующего содержания:
// bkgmanage.c #include <glib.h> #include <gconf/gconf-client.h> #include <stdio.h> typedef enum { WALLPAPER_ALIGN_TILED = 0, WALLPAPER_ALIGN_CENTERED = 1, WALLPAPER_ALIGN_STRETCHED = 2, WALLPAPER_ALIGN_SCALED = 3, WALLPAPER_NONE = 4 } WallpaperAlign; gboolean set_as_wallpaper( const gchar *image_path, WallpaperAlign align ) { GConfClient *client; char *options = "none"; client = gconf_client_get_default(); // TODO: проверить, что image_path является файлом и вообще существует if ( image_path == NULL ) options = "none"; else { gconf_client_set_string( client, "/desktop/gnome/background/picture_filename", image_path, NULL ); switch ( align ) { case WALLPAPER_ALIGN_TILED: options = "wallpaper"; break; case WALLPAPER_ALIGN_CENTERED: options = "centered"; break; case WALLPAPER_ALIGN_STRETCHED: options = "stretched"; break; case WALLPAPER_ALIGN_SCALED: options = "scaled"; break; case WALLPAPER_NONE: options = "none"; break; } } gboolean result = gconf_client_set_string( client, "/desktop/gnome/background/picture_options", options, NULL); g_object_unref( G_OBJECT(client) ); return result; } int main(int argc, const char* argv[]) { if ( argc > 1 ) { printf( "Setting %s as wallpaper... ", argv[1] ); if ( set_as_wallpaper( argv[1], WALLPAPER_ALIGN_STRETCHED ) ) printf( "Ok\n" ); else printf( "Failed\n" ); } else printf( "Usage: ./bkgmanage <filename>\n" ); return 0; }gconf — это библиотека для управлением аналогом реестра в GNOME. С помощью неё и исправляется параметр /desktop/gnome/background/picture_filename для замены картинки, а также /desktop/gnome/background/picture_options для определения параметров отображения этой картинки. Изменения вступают в силу мгновенно.
Сборка указанного выше файла тоже не составляет труда. Достаточно в консоли ввести:
gcc -Wall -g `pkg-config --libs --cflags glib-2.0 gconf-2.0` bkgmanage.c -o bkgmanageТут pkg-config возвращает все необходимые пути к include-файлам и библиотеки, необходимые для линковки, что очень удобно. В результате получается исполняемый файл bkgmanage.
Далее, остается сделать GUI для удобного выбора картинок для каждого монитора с последующей склейкой в один файл. Пока не решил какой фреймворк для этого выбрать — основная идея, что хочется писать на С++, но Qt имеет слишком много зависимостей, которые в GNOME по умолчанию отсутствуют...
Posted by
Kirill V. Lyadvinsky
обновлено:
2016-04-16T17:58:45Z
четверг, 6 августа 2009 г.
Trigraph sequences in C++
C++ стандарт в части 2.3/1 утверждает, что перед началом любой обработки кода все вхождения трех символов, указанных в таблице, будут заменены на один соответствующий символ.
Для современных разработчиков пользы это этой фичи языка C++ толку никакого, но знать и помнить о ней нужно, чтобы понимать что происходит.
---------------------------------------------------------------------------- | trigraph | replacement | trigraph | replacement | trigraph | replacement | ---------------------------------------------------------------------------- | ??= | # | ??( | [ | ??< | { | | ??/ | \ | ??) | ] | ??> | } | | ??’ | ˆ | ??! | | | ??- | ˜ | ----------------------------------------------------------------------------На практике это означает, что если даже в строковой константе встретится такая последовательность, то последствия могут оказаться неожиданными. Например, такой код:
printf( "What??!\n" )
Выдаст пользователю такой текст:What|Помимо этого есть такая же таблица для пар символов, которая делает следующий код вполне корректной программой на С++:
%:include <stdio.h> %:ifndef BUFSIZE %:define BUFSIZE 512 %:endif void copy(char d<::>, const char s<::>, int len) <% while (len-- >= 0) <% d<:len:> = s<:len:>; %> %>Стандарт поддерживает эти символы для совместимости, т.к. на очень старом железе в Европе не было части символов. Интересно, что в будущем стандарте С+x0 было предложено отказаться от поддержки триграфов, однако, этого видимо не произойдет. Подробнее тут.
Для современных разработчиков пользы это этой фичи языка C++ толку никакого, но знать и помнить о ней нужно, чтобы понимать что происходит.
Posted by
Kirill V. Lyadvinsky
обновлено:
2016-04-16T17:54:54Z
Labels:
Cplusplus
Подписаться на:
Сообщения
(
Atom
)