barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

пятница, 9 марта 2012 г.

Отключение функционала online-статусов на панели Gnome 3 в Fedora 16

Также как и Accesibility Icon, вывод имени пользователя в верхнем правом углу и меню для изменения доступности имхо - не самая необходимая вещь и я бы с радостью от неё избавился. Также как и в случае с Accesibility Icon, существует соответствующее расширение gnome-shell, однако оно требует некоторого допиливания.
1) Устанавливаем расширение:
yum install gnome-shell-extension-noim
2) Т.к. версия Gnome Shell в Fedora 16 отличается от 3.0, под которую настроено расширение, идем в /usr/share/gnome-shell/extensions/noim@fpmurphy.com/metadata.json и редактируем там версию Gnome Shell, устанавливая:
"shell-version": ["3.2"],
3) Однако после перезапуска gnome все равно не работает (перезапуск осуществляется с помощью Alt+F2 и ввода команды "r"). Идем в лог ошибок: Alt+F2 lg (откроется отладчик расширений LookingGlass), вкладка Errors (кстати, закрывается отладчик нажатием Esc), где видим:
Extension noim@... had error: Error: no JS module 'statusMenu' found
4) Придется правит исходники. Открываем /usr/share/gnome-shell/extensions/noim@fpmurphy.com/extension.js и вносим следующие изменения:
  • Комментируем импорт statusMenu:
// Gnome shell 3.2 has no statusMenu module
//const StatusMenu = imports.ui.statusMenu;
  • Добавляем функции init(), enable(), disable():
// fixes error "missing 'init' function"
function init()
{
changeUserMenu();
}
// fixes error "missing 'enable' function"
function enable(){}
// fixes error "missing 'disable' function"
function disable(){} 
  • Поправляем получение переменной statusMenu в начале функции changeUserMenu:
let statusMenu = Main.panel._statusArea.userMenu;

  • Поправляем скрытие ненужных пунктов меню, а именно, имени пользователя с иконкой, пункта "Уведомления" и "Учётные записи в сети". Для этого заменяем цикл по элементам массива children просто явным скрытием элементов по индексам:
// user name & icon
children[0].hide();
// "notification"
children[1].hide();
// delimiter
children[2].hide();
// "network accounts"
children[3].hide();


5) Перезапускаем Gnome Shell (Alt+F2 r)
6) Теперь расширение нужно разрешить: устанавливаем (если ещё не установили) gnome-tweak-tool, заходим в него, идем в "Расширения Shell", там включаем расширение. Снова перезапускаем гномшелл.
7) Всё, теперь вместо длинной надписи с имененем пользователя на панели видим только иконку "Fedora":


На всякий случай, полный полученный мной текст extension.js:

//
//  Copyright 2011 (c) Finnbarr P. Murphy.  All rights reserved.
//
const St = imports.gi.St;
const Main = imports.ui.main;
const PopupMenu = imports.ui.popupMenu;
const Shell = imports.gi.Shell;
const Lang = imports.lang;
// Gnome shell 3.2 has no statusMenu module
//const StatusMenu = imports.ui.statusMenu;
const Gettext = imports.gettext.domain('gnome-shell');
const _ = Gettext.gettext;
// change the icon_name if you want to display a different icon
// the icon must exist in the appropriate directory
const ICON_NAME = 'fedora-logo-icon';
// fixes error "missing 'init' function"
function init()
{
changeUserMenu();
}
// fixes error "missing 'enable' function"
function enable(){}
// fixes error "missing 'disable' function"
function disable(){}
function changeUserMenu()
{
    // future version -  let statusMenu = Main.panel._userMenu;
    //let statusMenu = Main.panel._statusmenu;
    let statusMenu = Main.panel._statusArea.userMenu;
    let noimlogo = new St.Icon({ icon_type: St.IconType.FULLCOLOR,
                                 style_class: 'popup-menu-icon',
                                 icon_name: ICON_NAME });
    let box = statusMenu._name.get_parent();  
    box.get_children().forEach(function (actor) { actor.destroy(); });
    let noimBox = new St.BoxLayout({ style_class: 'noim-icon'});
    noimBox.add_actor(noimlogo);
    box.add_actor(noimBox);
    let _name = new St.Label();
    box.add(_name, { y_align: St.Align.MIDDLE, y_fill: false });
    statusMenu._updateUserName = function() {};
    statusMenu._updatePresenceIcon = function(presence, status) { };
    statusMenu._presence = null;
    let children = statusMenu.menu.box.get_children();
// user name & icon
children[0].hide();
// "notification"
children[1].hide();
// delimiter
children[2].hide();
// "network accounts"
children[3].hide();
}

function main() {
    changeUserMenu();
}


1 комментарий:

  1. Здравствуйте. Не могли бы вы подсказать, где нужно копаться, чтобы добавить пару кнопок на панель и вместо кнопки "обзор" поставить иконку без использования дополнительных расширений? Буду очень признателен!

    ОтветитьУдалить