Отключаем нотификации в LXMusic

День программиста прошел на славу, съели тортик, напились чаю, понаписывали много кода… В общем гуляли до поздна! А после таких гуляний хотелось чего-то спокойного, умиротворенного, а так как была суббота то я решил немного привести в порядок свою домашнюю переносную рабочую станцию, т.е. ноутбук.

Любимым linux окружением по прежнему считаю LXDE, хоть он не настолько функционален как в всякие гномы или кеды, зато его преимуществом считается скорость. И вправду, запущенная lxde в wheezy ест ~100 мб памяти, родные программы запускаются с моментальной скоростью, можно даже зажать win+E для открытия проводника на несколько секунд, и файлменеджер будет просто быстро создавать массу окон и компьютер при этом не зависнет, а попробуйте сделать это в gnome или kde, и даже не пытайтесь проделать это в windows 😉

Так вот, из набора стандартных программ в lxde для музыки используется xmss2-client — LXMusic. Его прелесть с простоте и скорости работы. Но из минусов есть одна надоедливая мелочь — всплывающие сообщения при переключении песни. Они бы не так бесили если бы просто показывались и пропадали навсегда, так нет же, они все попадают в область оповещения и просто складываются пачкой, тем самым засоряя стек с более важными оповещениями… Но на то мы руки и растили ровными чтобы могли поправить в коде то что нам не нравится, не правда ли?

Люблю open-source, просто обожаю, делай что хочешь, никто тебе не помешает, а даже наоборот поможет. Исходники открыты, часто документированы, реже написаны руководста. Вот я и решил добавить в плеер новую фичу — галочку для отключения оповещений. Сперва скачал исходники через apt-get source lxmusic и прикинул что к чему. В папке с исходниками решил осмотреть lxmusic.c, и нашел удобный для себя путь решения проблемы.

Так как язык C++ я знаю так же как и английский, прочитать и понять могу, а нормально сказать с трудом, было решено написать код по аналогии с уже существующий: из готового функционала в настройках есть галочка для показа приложения в системном доке (т.е. tray), в коде переменная так и называется show_tray_icon. В начале исходника в разделе с определением переменных допишем свою, и укажем по умолчанию в значение true:

static gboolean show_notifications = TRUE

Далее в функции load_config(), которая отвечает за загрузку файла конфигурация, добавим определение и нашей конфигурации (пишем строку внутри условия if( g_key_file_load_from_file(kf, path, 0, NULL) ) самим последним):

kf_get_bool(kf, grp, "show_notifications", &show_notifications);

Смысл кода вполне понятен и не нуждается в объяснении, непонятным может быть только синтаксис и вызываемые функции. Теперь нужно реализовать сохранение нашей конфигурации в файл. Для этого внутри функции save_config() в кучу к остальным параметрам, но только до вызова fclose(f); добавим свой:

fprintf( f, "show_notifications=%d\n", show_notifications );

Отлично, теперь параметр нормально загружается и сохраняется в файл конфигураций, но переключить флажок пока негде, сейчас добавим переключатель в окно настроек, для этого в функцию on_preference в начале первого условия определим нашу кнопку-флажок:

GtkWidget* show_notifications_btn = (GtkWidget*)gtk_builder_get_object(builder, "show_notifications");

И после вызова функции, работа которой мне не известна, gtk_builder_connect_signals добавим наш флажок:

gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(show_notifications_btn), show_notifications);

…и в этой же функции внутри условия if( gtk_dialog_run(GTK_DIALOG(dlg)) == GTK_RESPONSE_OK ) в конец добавим еще строчку:

show_notifications = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(show_notifications_btn));

Теперь нашу надстройку можно сохранить и применить, осталось только сделать чтобы заработала. Для этого измени еще две функции, ищем внутри функции update_track условие if ( current_track_updated ) и добаляем в него еще одну проверку:

if ( current_track_updated && show_notifications )

Таким образом проверяем не только обновилая ли композиция но и включена ли настройка.
И вторую правку делаем внутри функции on_playback_track_loaded. Ищем в конце функции такой код:

LXMusicNotification lxn = lxmusic_do_notify_prepare ( track_properties.artist, track_properties.title, _("Now Playing:"), GTK_STATUS_ICON(tray_icon) );
if (!track_properties.picture_front) 
    send_notification( lxn );
else
{
    /* postpone notification: wait for album art */
    xmmsc_result_t* res = xmmsc_bindata_retrieve( con, track_properties.picture_front );
    xmmsc_result_notifier_set_and_unref (res, on_picture_front_received, lxn );
}

и заворачиваем его в нашел условие:

if ( show_notifications )
{
    LXMusicNotification lxn = lxmusic_do_notify_prepare ( track_properties.artist, track_properties.title, _("Now Playing:"), GTK_STATUS_ICON(tray_icon) );
    if (!track_properties.picture_front)
        send_notification( lxn );
    else
    {
        /* postpone notification: wait for album art */
        xmmsc_result_t* res = xmmsc_bindata_retrieve( con, track_properties.picture_front );
        xmmsc_result_notifier_set_and_unref (res, on_picture_front_received, lxn );
    }
}

Теперь код будет рабочим, но флажок в настройках мы пока не увидим, потому что нужно добавить его в glade файл, т.е. в файл по которому будет строиться интерфейс. Переходим из папки src на уровень выше и редактируем data/pref-dlg.ui.glade. Это xml файл, так что ничего сложного в нем нет. Теперь можем наш флажок поместить куда душе угодно, я для этого выбрал первую вкладку в настройках, для этого внутрь object.GtkVBox#vbox2 добавим пару строчек:

<child>
  <object id="show_notifications">
    <property name="visible">True</property>
    <property name="can_focus">True</property>
    <property name="label" translatable="yes">Show notifications</property>
    <property name="draw_indicator">True</property>
  </object>
  <packing>
    <property name="expand">False</property>
    <property name="position">3</property>
  </packing>
</child>

Вот и все, что нужно поправили, осталось собрать, установить и запустить. Надеюсь вы же выполнили установку зависимостей для сборки пакета? Если нет то сделайте же это:

# apt-get build-dep lxmusic

Теперь собираем ./configure, компилирурем make и делаем checkinstall. Последняя команда соберет за вас .deb пакет и установит программу, преимущества .deb пакета в том что при удалении он не забывает чистить за собой мусор. Для удалении # dpkg -r lxmusic.

Have fun 😉

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *