Jak zapobiec tworzeniu ikon w zasobniku przez aplikacje Java?

16

W Ubuntu 13.04 zniknęła możliwość dodania do białej listy (a tym samym czarnej listy) niektórych aplikacji z ikony na pasku zadań. Od tego czasu ikony w aplikacjach Java i ikony Wine są zakodowane na stałe i zawsze widoczne.

Chociaż istnieją pewne ppas, które zapewniają łatkę jedności, zwracając białą listę systray.white (jeszcze nie dla 14.04) Chciałbym wiedzieć, czy istnieją inne sposoby ukrywania ikon na pasku aplikacji Java (np. JDownloader)

Wiem, że jest na to sposób w aplikacjach qt poprzez wdrożenie profili apparmor, które odmawiają dostępu do odczytu pakietu sni-qt (np. Skype lub Spotify)

Czy istnieje sposób na zaimplementowanie profili Apparmor lub coś podobnego dla aplikacji Java i / lub Wine?

dzięki

wa4557
źródło
1
Możesz uzyskać dostęp do ich ikon i zmienić je na przezroczyste i małe, więc nie zajmuje prawie miejsca i jest niewidoczny?
Tim
2
Dobry pomysł, ale nie. Miejsce 16 x 16 wydaje się być zarezerwowane dla aplikacji Java. Zmieniając się na niewidoczną svg 1px, nadal otrzymujemy nieprzejrzystą ikonę 16x16
wa4557
1
OK, szkoda ...
Tim

Odpowiedzi:

2

W przypadku aplikacji Java:

  • Właściwie w przypadku JDownloadera jest to konstrukcja modułowa. Ikona zasobnika jest wtyczką, którą można wyłączyć w:

    JDownloader → Dodatki → Menedżer dodatków → Rozszerzenia → Odznacz pole Aktywuj dla JD Light Tray

  • W przypadku ogólnych aplikacji Java Możliwe jest użycie menedżera bezpieczeństwa Java, pisząc niestandardowe reguły zasad.

    1. Utwórz java.policyplik ~/.jdownloaderzawiera:

      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. Zmodyfikuj jdownloaderskrypt uruchamiania, aby użyć niestandardowych zasad

      sudo nano /usr/bin/jdownloader

      Dodaj: -Djava.security.manager -Djava.security.policy=java.policydo komendy Java:

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

Są to minimalne reguły, które pozwoliły mi uruchomić program jdownloader. Być może trzeba będzie dodać więcej uprawnień. Ponieważ nie ma denyopcji, musisz napisać wszystkie potrzebne grantreguły.

Bibliografia:

BTW, spróbuj skomentować jedną z reguł, dodając //na początku linii; Możesz więc zobaczyć, jak wygląda błąd odmowy uprawnień. Mówi ci, które pozwolenie powinieneś dodać. Zauważ też, że użyłem wielu -i *próbuję rozszerzyć reguły, ponieważ szukam szybkiego rozwiązania (domyślnie AllPermissiontak było ) i nie chcę więzić aplikacji.

Oto szablon na początek, próbujący udzielić wszystkich możliwych uprawnień:

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 "*";
};

Uwaga :

Java Policy Tools to narzędzie GUI do edycji plików zasad. Ułatwia to znalezienie wszystkich dostępnych opcji z rozwijanej skrzynki. Powinien być już zainstalowany z pakietem Java.

wprowadź opis zdjęcia tutaj

user.dz
źródło
1

Chociaż odpowiedź Sneetsherów jest idealna, odkryłem prostsze (i oczywiste) rozwiązanie. To podejście działa z JDownloaderem, ale powinno również działać ze wszystkimi innymi programami Java.

Wystarczy usunąć logo, rm ~/.jdownloader/jd/img/logo/jd_logo_128_128.pnga następnie utworzyć nieprawidłową ikonę png za pomocątouch ~/.jdownloader/jd/img/logo/jd_logo_128_128.png

Korzystając z tego podejścia, nadal można używać wtyczki TrayIcon (przydatnej do minimalizacji do zasobnika) bez brzydkiej ikony Java

wa4557
źródło
0

Ponieważ nie widzę żadnych oczywistych lepszych rozwiązań, możliwe, że to pomoże:

Możesz pozbyć się tacy całkowicie!

  • wyłącz je, jeśli to możliwe
  • lub zastąp cały panel innym, który możesz skonfigurować ręcznie, po prostu nie dodając elementu zasobnika. (Lubię takie xfce4-panelrzeczy)

Jeśli teraz brakuje Ci funkcji opartych na zasobniku, większość z nich powinna być w jakiś sposób wymienna po kolei, na przykład fragment pokazujący powiadomienia na pulpicie o niektórych wydarzeniach.

Volker Siegel
źródło
1
Ok dzięki, ale oczywiście nie tego chciałem. Podoba mi się taca jedności, po prostu nie lubię niektórych ikon tacki
wa4557
1
Tak, to było bardziej strzał w ciemność, jeśli chodzi o znajomość podstawowej skrzynki użytkownika. W przypadku urządzenia w stylu „urządzenia”, uruchomienie jednej stałej aplikacji oraz paska pulpitu tylko dla podstawowych menu. metoda zadziałałaby nawet :) [Ale pamiętam, że kiedyś widziałem komunikat jakiegoś programu odmawiającego uruchomienia bez panelu ...]
Volker Siegel
0

Jeśli chcesz, aby wszystkie aplikacje, które używają ikony zasobnika, mogły z niego korzystać w Ubuntu 14.04, możesz skorzystać z PPA dostarczanego z poprawką Unity, aby ponownie włączyć białą listę systray. Aby to zrobić, otwórz terminal i uruchom następujące polecenia:

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

Następnie uruchom ponownie Unity, naciskając ALT + F2 i wprowadzając „jedność” lub wylogowując się. PPA teraz automatycznie dodaje do białej listy wszystkie aplikacje, więc nie trzeba ręcznie dodawać do białej listy poszczególnych aplikacji, aby móc korzystać z paska zadań.

Cofanie zmian

Jeśli chcesz przywrócić zmiany i wrócić do domyślnych pakietów Unity z repozytoriów Ubuntu, użyj poniższych poleceń, aby wyczyścić białą listę PPA systemu Sity:

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

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

anonamos
źródło
1
Witamy w Ask Ubuntu Stak Exchange! W odpowiedzi należy podać istotną część linku, aby zapobiec łamaniu posta po śmierci linku.
enedil
2
To globalna biała lista, co oznacza, że ​​wszystkie programy są na białej liście. Programy znajdujące się na czarnej liście (takie jak wina i programy Java) są kompletnym przeciwieństwem i nie działają z tą wersją jedności
wa4557