понедельник, 15 апреля 2013 г.

GNOME Shell Extensions

GNOME Shell введенный вместе с GNOME3 крайне спорная штука. Если первые два поколения гнома копировали оконные интерфейс Windows, то третий в корне сменил интерфейс, но сделал это намного удачнее чем метрокафель. Да, он стал намного прожорлевее из-за красивостей и того, что написан на JavaScript, но зато он стал гибкой платформой для пользовательских виджетов. За счет того, что это JavaScript, писать их легко и приятно + легко интегрировать с другими с веб-страницами. За счет этого факта было реализовано хранилище расширений, которое позволяет устанавливать новые дополнения одним кликом в браузере: extensions.gnome.org.

Приведу небольшой список дополнений, которые использую сам.

  
1. Remove Accessibility
Удаляет из верхней панели кнопку специальных возможностей (внешне похожа на витрувианского человека).

2. Alternative Status Menu
Заменяет пункт правого меню "Завершить сеанс" на пункты сна, гибернации и выключения компьютера.

3. Weather
Погода. Небольшой удобный значок при необходимости раскрывающийся в большую информативную панель. Имеет некоторые проблемы со стабильностью: до обновления у меня вообще не запустился, после - повесил весь Shell. Перезапустил - теперь все ок.



4. Advanced Settings in UserMenu
Добавляет в правое меню пункт Gnome Tweak Tool. Кто не знает - это утилита для настройки самого GNOME Shell-a. В частности позволяет включать\выключать дополнения, устанавливать их в виде архивов, настраивать формат времени и даты и многое другое. Основные костыли для превращения третьего гнома во второй живут здесь. Сам сильно в нее не закапывался, если кому интересно - пишите, может напишу пост.

5. Applications Menu
Добавляет на верхнюю панель выпадающее каскадное меню приложений.

6. Sensors
Добавляет на верхнее меню индикатор температуры ЦП. Для не ноутбуков может показаться не актуальным, но, лично мне, так удобнее следить за нагрузкой ЦП. Если температура резко пошла вверх - это повод глянуть в диспетчер задач и посмотреть не ушло ли какое-нибудь ядро в стопроцентную загрузку.

7. Advanced Calculator
Встраивает в меню поиска по приложениям функции калькулятора.

8. Pidgin Conversation Integration
Добавляет в трее значок собеседника. Если по нему кликнуть, то появляется диалоговое окно в котором можно вести беседу не переключаясь в окно самого Pidgin-а и соответствующий рабочий стол, что позволяет не палится на работе) Оно, конечно, фигня, с другой - вдруг кого-то из коллег раздражает. Из замеченных недостатков:
1) начинать беседу все-равно нужно в Pidgin,
2) даже если сообщение прочитано в трее, то в значке Pidgin все-равно будет светится, что есть непрочитанные сообщения.


9. Todo list
Добавляет в верхнее меню значок списка дел. Несмотря на очень простой функционал: показ количества задач (в значке), добавление задачи (обычный текстовый инпут) и удаление задачи (клик по задаче) - дополнение крайне полезно. Не нужно никаких листиков и резкой смены контекста. Фиксил баг и понял на что нужно обратить внимание тестера? Закинь в список и потом вывали тестеру пачкой. В разговоре с коллегой всплыла новая фишка? Не беги писать TODO в код - закинь в список. Прочитал на Хабре новый головоломный трюк на JavaScript? Не нужно кидаться сразу переписывать половину своего кода - повесь тудушку...
Кроме удобства создания, еще, лично мне, чисто психологически приятно вычеркивать пункты и смотреть как тают цифры открытых задач))

10. Text Translator
Интегрирует он-лайн переводчик (Google либо Яндекс) в shell. Кроме быстрого запуска с помощью кнопки из верхней панели поддерживает ряд хоткеев: <Super>T - просто запуска, <Super><Shift>T - запуск с автоподставленным буфером и т.д.


11. Uptime Indicator
Для тех кто любит мерится аптаймом. Добавляет на верхнюю панель значение аптайма.

12. Dock
Добавляет слева список запущенных приложений, а также приложения добавленные в избранное. Наиболее удобный, на мой взгляд, способ быстрого запуска приложений и переключения между уже запущенными приложениями. Особенно в случае философии "одно приложение - один рабочий стол".

13. Jenkins CI Server Indicator
Виджет полного управления сервером Jenkins-а в вашем GNOME! Сам не пробовал, т.к. почти не общаюсь с Jenkins-ом (только когда мой коммит ломает билд и я пытаюсь быстро все починить пока никто не заметил :) ), но если эта штука работает, то это офигенно круто и важный повод тим-лиду посмотреть в сторону Linux ))
Более подробное описание:
http://www.philipphoffmann.de/gnome-3-shell-extension-jenkins-ci-server-indicator/



14. Brightness Control
Добавляет на верхнюю панель кнопку управления яркостью подсветки.

15. Media player indicator
Встраивает управление музыкальным плеером в управление звуком.


Это лишь малая часть доступных дополнений, я отметил наиболее, на мой взгляд, интересные. Скриншотов по минимуму, т.к. большая часть дополнений вертикальные и неоправданно растянули бы пост по длине. Надеюсь, что мне удалось вас заинтересовать и скриншоты вы сможете сами посмотреть на страницах соответствующих дополнений.

Поведение дополнений описано в GNOME версии 3.4.2 openSUSE 12.2. Трешку с 3.6 ставить пока стремно.

Бонус


Почему-то в хранилище нет двух очень полезных расширений, которые перемещают значки pidgin и skype из трея на верхнюю панель.

Приведу их в виде исходников. Каждое дополнение состоит из двух файлов: extension.js и metadata.json. Для установки нужно завернуть в zip-архив и воспользоваться уже упомянутым Gnome Tweak Tool. Приведу код только для одного, второе делается аналогично:

metadata.json:
{
  "shell-version": ["3.4.1", "3.4"],
  "uuid": "pidgin-status",
  "name": "Pidgin Status Icon",
  "description": "Integrates Pidgin Client into the status bar"
}


extension.js:
const StatusIconDispatcher = imports.ui.statusIconDispatcher;
function enable() {
    StatusIconDispatcher.STANDARD_TRAY_ICON_IMPLEMENTATIONS['pidgin'] = 'pidgin';
}
function disable() {
    StatusIconDispatcher.STANDARD_TRAY_ICON_IMPLEMENTATIONS['pidgin'] = '';
}
function init() {
}


Как видите, писать дополнения для GNOME Shell очень просто. В будущем может быть расскажу об этом более подробно.

4 комментария:

  1. Пожалей людей с ридерами, пхай большие статьи под кат =)
    А по теме - забавная штука, надо будет как-нибудь поставить гномика, побаловаться. Всё равно юнити мне не то, чтобы очень нравится, просто лениво было заморачиваться.
    А как там с документацией по написанию этих виджетов дела обстоят?

    ОтветитьУдалить
  2. Так лучше? Что-то я такую штуку не заметил сразу, сорри)

    Видел Unity только со стороны, но внешне не сильно отличается вроде.

    Говёно. На офсайте дока только для GTK+. Была статья на Хабре, может в ней есть дельные ссылки.

    ОтветитьУдалить
  3. Да, лучше, спасибо =)

    А по поводу GTK+ - а его мало? Насколько я понимаю, сам гном на нём и написан. Так что тут всё логично)

    ОтветитьУдалить
    Ответы
    1. GTK+ изначально сишный. Вокруг него есть веб-обвязки, но как обычно в open source, куча форков и с налету я разобраться в их куче не смог, т.к. все обвязки какие-то странные.

      В описании проекта сказано "WebKitGTK+ позволяет легко добавлять возможности веб в ваши приложения, или использовать HTML5 и вспомогательные технологии для быстрого создания динамичных пользовательских интерфейсов." Открываю примеры:

      static void
      entry_activate_cb (GtkEntry *entry, WebKitWebView *view)
      {
      WebKitDOMDocument *document;
      WebKitDOMElement *body, *div;

      document = webkit_web_view_get_dom_document (view);
      body = webkit_dom_document_query_selector (document, "body", NULL);
      div = webkit_dom_document_create_element (document, "div", NULL);
      webkit_dom_node_set_text_content (WEBKIT_DOM_NODE (div),
      gtk_entry_get_text (entry),
      NULL);
      webkit_dom_node_append_child (WEBKIT_DOM_NODE (body),
      WEBKIT_DOM_NODE (div),
      NULL);
      gtk_entry_set_text (entry, "");
      }

      тут, конечно, CreateElement угадывается, но JS все-равно не особо пахнет.

      Есть проект GJS. Открываю один пример:

      const Gtk = imports.gi.Gtk;
      const GLib = imports.gi.GLib;

      // Initialize the gtk
      Gtk.init(null, 0);

      let mwindow = new Gtk.Window ({type : Gtk.WindowType.TOPLEVEL});
      let label = new Gtk.Label ({label : "Hello World"});

      вроде все хорошо, если не считать спайдерманковских особенностей из не утвержденного пока ECMAScript6. Но открываю другой пример:

      "Here is a quick example:

      GScriptEngine *engine;
      GScriptValue *res;
      engine = g_script_engine_new ();
      res = g_script_engine_evaluate_script (engine, "5+5");
      g_print ("script result: %s", g_script_value_to_string (res));
      g_object_unref (res); "
      и опять хрень какая-то.

      Но это все старые проекты, которые живут отдельно от GNOME Shell, и поэтому думаю что не то, что нужно. Хотя инфа в "about extension" тоже хороша: "The code in a GNOME Shell extension becomes part of the core operating system." Если я правильно понимаю эту фразу, то это полный WTF. В общем надо сесть покурить все нормально. Пока времени нет(

      Удалить