Как запретить приложениям Java создавать иконки в трее?

16

В Ubuntu 13.04 отсутствует возможность внесения в белый список (и, следовательно, в черный список) определенных приложений от создания иконки в трее. С тех пор значки на панели задач Java-приложений и значки Wine жестко закодированы и всегда видны.

Хотя есть некоторые ppas, которые предоставляют патч единства, возвращая systray.whitelist (хотя и не для 14.04), я хотел бы знать, есть ли другие способы скрыть иконки в трее java-приложений (например, JDownloader)

Я знаю, что есть способ сделать это для qt-приложений, реализуя профили apparmor, которые запрещают доступ на чтение к пакету sni-qt (например, для Skype или Spotify).

Есть ли способ реализовать профили apparmor или нечто подобное для приложений Java и / или приложений Wine?

Благодарность

wa4557
источник
1
Вы можете получить доступ к их значкам и изменить их на прозрачные и маленькие, чтобы они почти не занимали места и были невидимыми?
Тим
2
Хорошая идея, но нет. Место 16x16, кажется, зарезервировано для Java-приложений. При переходе на невидимую 1px svg можно получить непрозрачный значок 16x16
wa4557
1
Хорошо, это позор ...
Тим

Ответы:

2

Для приложений Java:

  • На самом деле для случая JDownloader, это модульная конструкция. Значок в трее поставляется как плагин, который можно отключить из:

    JDownloader → Дополнения → Менеджер дополнений → Расширения → Снимите флажок Активировать для JD Light Tray

  • Для приложений Java в общем случае можно использовать диспетчер безопасности Java, написав собственные правила политики.

    1. Создать java.policyфайл, ~/.jdownloaderсодержащий:

      grant codeBase "file:/home/user/.jdownloader/-" {
      
      // full access
      //    permission java.security.AllPermission;
      
      // AWTPermission full or only selected elements from it
      //    permission java.awt.AWTPermission "*";
      
          permission java.awt.AWTPermission "accessClipboard";
          permission java.awt.AWTPermission "accessEventQueue";
      //    permission java.awt.AWTPermission "accessSystemTray";
          permission java.awt.AWTPermission "createRobot";
          permission java.awt.AWTPermission "fullScreenExclusive";
          permission java.awt.AWTPermission "listenToAllAWTEvents";
          permission java.awt.AWTPermission "readDisplayPixels";
          permission java.awt.AWTPermission "replaceKeyboardFocusManager";
          permission java.awt.AWTPermission "setAppletStub";
          permission java.awt.AWTPermission "setWindowAlwaysOnTop";
          permission java.awt.AWTPermission "showWindowWithoutWarningBanner";
          permission java.awt.AWTPermission "toolkitModality";
          permission java.awt.AWTPermission "watchMousePointer";
      
      // Added by try and learn
          permission java.io.FilePermission "/-", "read,write,delete";
          permission java.util.PropertyPermission "*", "read,write";
          permission java.util.logging.LoggingPermission "control";
          permission java.lang.RuntimePermission "*";
          permission java.net.NetPermission "*";
          permission java.security.SecurityPermission "*";
          permission javax.net.ssl.SSLPermission "*";
          permission java.net.SocketPermission "*", "connect,resolve";
          permission java.lang.reflect.ReflectPermission "*";
      };
    2. Измените jdownloaderсценарий запуска, чтобы использовать пользовательскую политику

      sudo nano /usr/bin/jdownloader

      Добавьте: -Djava.security.manager -Djava.security.policy=java.policyк вызову команды Java:

      exec java ${JAVA_OPTIONS}  -Djava.security.manager -Djava.security.policy=java.policy -jar JDownloader.jar $*

Это минимальные правила, которые позволили мне запустить jdownloader. Вам может понадобиться добавить больше разрешений. Потому что нет denyварианта, вы должны написать все необходимые grantправила.

Ссылки:

Кстати, попробуйте прокомментировать одно из правил, добавив //в начало строки; Таким образом, вы можете увидеть, как выглядит ошибка отказа в разрешениях. Он говорит вам, какое разрешение вы должны добавить. Также обратите внимание, что я использовал много -и *пытаюсь расширить правила, так как я ищу быстрое решение (по умолчанию было в AllPermissionлюбом случае), и я не собираюсь сажать приложение в тюрьму.

Вот шаблон для начала, пытающийся предоставить все возможные разрешения:

grant codeBase "file:/home/user/.jdownloader/-" {

//    permission java.security.AllPermission;

//    permission java.awt.AWTPermission "*";

    permission java.awt.AWTPermission "accessClipboard";
    permission java.awt.AWTPermission "accessEventQueue";
//    permission java.awt.AWTPermission "accessSystemTray";
    permission java.awt.AWTPermission "createRobot";
    permission java.awt.AWTPermission "fullScreenExclusive";
    permission java.awt.AWTPermission "listenToAllAWTEvents";
    permission java.awt.AWTPermission "readDisplayPixels";
    permission java.awt.AWTPermission "replaceKeyboardFocusManager";
    permission java.awt.AWTPermission "setAppletStub";
    permission java.awt.AWTPermission "setWindowAlwaysOnTop";
    permission java.awt.AWTPermission "showWindowWithoutWarningBanner";
    permission java.awt.AWTPermission "toolkitModality";
    permission java.awt.AWTPermission "watchMousePointer";


    permission javax.sound.sampled.AudioPermission "*";
    permission javax.security.auth.AuthPermission "*";
//    permission javax.security.auth.kerberos.DelegationPermission "";
    permission javax.xml.bind.JAXBPermission "*";
    permission java.nio.file.LinkPermission "hard";
    permission java.nio.file.LinkPermission "symbolic";
    permission java.util.logging.LoggingPermission "control";
//    permission java.lang.management.ManagementPermission "*";
    permission javax.management.MBeanServerPermission "*";
    permission javax.management.MBeanTrustPermission "*";
    permission java.net.NetPermission "*";
    permission java.util.PropertyPermission "*", "read,write";
    permission java.lang.reflect.ReflectPermission "*";
    permission java.lang.RuntimePermission "*";
    permission java.security.SecurityPermission "*";
    permission java.io.SerializablePermission "*";
    permission java.sql.SQLPermission "*";
    permission javax.net.ssl.SSLPermission "*";
    permission javax.management.remote.SubjectDelegationPermission "*";
    permission javax.xml.ws.WebServicePermission "*";
//    permission  "*";

    permission java.io.FilePermission "/-", "read,write,execute,delete,readlink";
    permission javax.management.MBeanPermission "*", "*";
//    permission javax.security.auth.PrivateCredentialPermission "", "read";
    permission javax.security.auth.kerberos.ServicePermission "*", "initiate,accept";
    permission java.net.SocketPermission "*", "accept,connect,listen,resolve";
    permission java.net.URLPermission "*";
};

Примечание :

Java Policy Tools - это инструмент с графическим интерфейсом для редактирования файлов политики. Это облегчает поиск всех доступных опций из выпадающего списка. Он должен быть уже установлен с пакетом Java.

введите описание изображения здесь

user.dz
источник
1

Хотя ответ Sneetshers идеален, я нашел более простое (и очевидное) решение. Этот подход работает с JDownloader, но также должен работать со всеми другими программами Java.

Просто удалите логотип, rm ~/.jdownloader/jd/img/logo/jd_logo_128_128.pngа затем создайте неверный значок PNG сtouch ~/.jdownloader/jd/img/logo/jd_logo_128_128.png

Используя этот подход, все еще можно использовать плагин TrayIcon (полезно для сворачивания в трей) без уродливой иконки Java.

wa4557
источник
0

Поскольку я не вижу очевидных лучших решений, возможно, это поможет:

Вы можете избавиться от лотка в целом!

  • либо отключите его, если это возможно
  • или замените всю панель на другую, которую вы можете настроить вручную, просто не добавляя элемент лотка. (Мне нравятся xfce4-panelтакие вещи)

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

Volker Siegel
источник
1
Хорошо, спасибо, но это явно не то, что я хотел. Мне нравится лоток для единства, мне просто не нравятся некоторые значки в трее
wa4557
1
Да, это был скорее выстрел в темноте, с точки зрения знания вашего основного варианта использования. Для машины в стиле «устройства» - запуск одного фиксированного приложения, а также панель рабочего стола только для основных меню. этот метод мог бы даже работать :) [Но я помню, что однажды видел сообщение какой-то программы, отказывающейся запускаться без панели ...]
Фолькер Зигель
0

Если вы хотите, чтобы все приложения, использующие значок в трее, могли использовать его в Ubuntu 14.04, вы можете использовать PPA, который поставляется с исправленным Unity, чтобы повторно включить белый список systray. Для этого откройте терминал и выполните следующие команды:

sudo add-apt-repository ppa:gurqn/systray-trusty
sudo apt-get update
sudo apt-get upgrade

Затем перезапустите Unity, нажав ALT + F2 и введя «Unity» или выйдя из системы. PPA теперь автоматически вносит в белый список все приложения, поэтому нет необходимости вручную вносить в белый список отдельные приложения, чтобы иметь возможность использовать systray.

Отмена изменений

Если вы хотите отменить изменения и вернуться к пакетам Unity по умолчанию из репозиториев Ubuntu, используйте приведенные ниже команды для очистки PPA-списка Unity systray:

sudo apt-get install ppa-purge
sudo ppa-purge ppa:gurqn/systray-trusty

С http://www.webupd8.org/2013/05/how-to-get-systray-whitelist-back-in.html

anonamos
источник
1
Добро пожаловать в Спросите Ubuntu Stak Exchange! Пожалуйста, включите основную часть ссылки в свой ответ, чтобы предотвратить разрыв сообщения после того, как ссылка умирает.
enedil
2
Это глобальный белый список, который означает, что все программы находятся в белом списке. Программы, занесенные в черный список (например, программы для Wine и Java), являются полной противоположностью и не работают с этой версией единства
wa4557