Unity Launcher의 사용자 정의 마우스 오른쪽 버튼 클릭 동작으로 20 초 동안 커서 사용 중


14

Unity 런처 (Ubuntu 14.04)에서 아이콘을 마우스 오른쪽 단추로 클릭하여 "창 최소화"옵션을 사용 하려면.desktop 파일 변경에 대한 자세한 지침을 따르고 폴더 Firefox에서 사용자 지정 런처를 만들었습니다 ~/.local/share/applications/. .desktop 파일의 관련 부분은 다음과 같습니다.

Actions=NewWindow;NewPrivateWindow;Minimize

[Desktop Action NewWindow]
Name=Open a New Window
Exec=firefox -new-window
OnlyShowIn=Unity;

[Desktop Action NewPrivateWindow]
Name=Open a New Private Window
Exec=firefox -private-window
OnlyShowIn=Unity;

[Desktop Action Minimize]
Name=Minimize Windows
Exec=sh /home/myusername/Documents/xdotool_sh/minimize.sh firefox
OnlyShowIn=Unity;

데스크탑 조치 "최소화"는 minimize.sh다음 컨텐츠를 갖는 간단한 쉘 스크립트를 호출합니다 .

#/bin/bash
name=$1
for i in $(xdotool search --class "$name"); do
    xdotool windowminimize $i
done

이 스크립트는 xdotool공식 저장소에서 설치할 수있는을 사용 하여 모든 firefox창 을 찾아서 반복하고 최소화합니다.

스크립트가 작동하고 실행기 오른쪽 메뉴 옵션 인 "최소화 창"도 작동하지만 창을 최소화하자마자 마우스 포인터가 "사용 중"모드에 있으며 약 20 초 동안 이와 같이 유지됩니다 (마우스 동작이 여전히 반응).

Unity의 올바른 메뉴 옵션에서 쉘 스크립트를 시작하면 왜이 동작이 발생할 수 있는지 아는 사람이 있습니까?

편집 : 분명히 Jacob Vlijm의 답변에 설명 된대로 대기 기간은 불가피합니다. 마우스가 반응을 유지하기 때문에 askubuntu에 설명 된 것처럼 회전 바퀴에서 포인터의 변형을 피하는 것은 부분적인 미학적 해결 방법 입니다.

EDIT2 : 시스템에 가짜 창을 제공하는 것이 아래 Jacob에 설명 된 것처럼 더 나은 솔루션입니다.


안녕하세요 Cosmin, 나는 생각하는 또 다른 매우 깨끗한 솔루션을 추가했습니다.
Jacob Vlijm

야곱 감사합니다. 나는 그런 종류의 해결책에 대해 생각하고 있었지만 어떻게 할 수 있는지 몰랐습니다. 해결책이 존재하는 것이 좋습니다.
Cosmin Saveanu

답변:


18

훌륭한 질문입니다.

원인

일반적으로 Unity Launcher에서 GUI 애플리케이션을 시작할 때 Launcher는 창이 나타날 때까지 기다립니다. 기다리는 동안 "방적 휠"이 표시됩니다. 그러나 영원히 기다리지는 않을 것입니다. 약 20 초 후에 런처는 창이 나타나지 않고 대기를 포기한다고 가정합니다.

1. 응용 프로그램 실행기의 주요 명령

A의 .desktop파일, 첫 번째와 직결 Exec=선을 (주 명령)을 할 수 있습니다 말해 줄에, 기다리거나하지 런처를 :

StartupNotify=true

기다리게하거나

StartupNotify=false

그것을 만들 수 없습니다 기다립니다.

2. 런처의 퀵리스트 항목

그러나 실행기의 빠른 목록 (오른쪽 클릭) 항목의 경우 기본값은 StartupNotify=true입니다. 불행히도이 값은 고정되어 있으며 어떤 것도 변경할 수 없습니다.

당신이 시작하면 그 말은 어떤 유니티 런처에서 실행 아이콘을 마우스 오른쪽 버튼으로 클릭에서 명령을 실행 프로그램은 물레를 보여, 그것을 위해 창을 대기를 기대하고있다.

결론은 설명 할 수 있지만 현재 문제에 대한 해결책은없는 것 같습니다. 다른 방법은 스크립트 전용 실행기를 작성 StartupNotify=false하고 파일에 줄 을 추가하는 것 입니다.

증거

직접 행동을 테스트 할 수 있습니다. 두 발사기를 만듭니다.

[Desktop Entry]
Name=Test
Exec=sh /home/myusername/Documents/xdotool_sh/minimize.sh firefox
Type=Application
StartupNotify=true

과:

[Desktop Entry]
Name=Test
Exec=sh /home/myusername/Documents/xdotool_sh/minimize.sh firefox
Type=Application
StartupNotify=false

그들을 저장 test1.desktop하고 test2.desktop, 유니티 런처에 모두에 발사기를 끕니다. 그들을 클릭하고 행동의 차이점을 참조하십시오.


편집하다; 그것이 정말로 당신을 귀찮게한다면, Unity에게 가짜 창을 먹이십시오.

당신이 경우 많은 퀵리스트에서 스크립트 및 / 또는 정말 당신을 귀찮게 다른 화장품 해결책이; 우리는 가짜 , 보이지 않는 (완전히 투명한) 창을 표시하여 스크립트에 포함시킬 수 있습니다. 그러면 스크립트는 (예)

#/bin/bash
name=$1
for i in $(xdotool search --class "$name"); do
    xdotool windowminimize $i
done
fake_window

여기서 명령 fake_window은 (가짜) 창을 호출하여 Unity가 물레를 종료시킵니다.

설정 방법

  1. 존재하지 않는 경우 디렉토리를 작성하십시오. ~/bin
  2. 아래 스크립트를 빈 파일로 복사하고 fake_window(확장자 없음) 으로 저장 한 ~/bin 후 실행 파일로 만드십시오

    #!/usr/bin/env python3
    from gi.repository import Gtk
    from threading import Thread
    import time
    import subprocess
    
    """
    This is a self-destroying window, to "feed" Unity a fake-window, preventing
    the launcher to show a spinning wheel, waiting for a window to appear.
    Include the command to run this script at the end of the (your) script.
    """
    
    class FakeWin(Gtk.Window):
    
        def __init__(self):
            Gtk.Window.__init__(self, title="1526closeme")
            Thread(target = self.close).start()
    
        def close(self):
            t = 0
            while t < 150:
                time.sleep(0.2)
                try:
                    pid = subprocess.check_output(["pgrep", "-f", "fake_window"])\
                          .decode("utf-8").strip()
                    subprocess.Popen(["kill", pid])
                    break
                except subprocess.CalledProcessError:
                    pass
                t += 1
    
    def fakewindow():
        window = FakeWin()
        # make our window transparent
        window.set_opacity(0)
        window.set_default_size(0,0)
        window.show_all()
        Gtk.main()
    
    fakewindow()
  3. 스크립트의 맨 끝에 다음 명령을 추가하십시오.

    fake_window
  4. 로그 아웃했다가 다시 (또는 실행source ~/.profile)

이제 스크립트가 실행되는 동안 휠이 회전합니다.

설명

스크립트 최소한의 창을 만듭니다. 그러나 창은 완전히 투명하며 크기는 0x0 픽셀이므로 보이지 않습니다. 일단 존재하면 즉시 파괴됩니다.

스크립트가 끝날 때 창을 호출하면 바퀴가 돌아 가지 않도록 창에 대한 Unity의 희망을 충족시킵니다.


질문에 대한 자세한 설명과 편집에 감사드립니다. 잠재적 해결 방법에 대한 아이디어를 제공합니다.
Cosmin Saveanu

좋은 생각-가짜 창을 제공합니다. 나는 그것을 좋아한다
Sergiy Kolodyazhnyy

@ Serg 속임수와 속임수, 그러나 작동합니다 :)
Jacob Vlijm

4

조금 더 간단하고 우분투 16.04 시스템에서 파이썬 경고를 유발하지 않는 대체 fake_window 구현을 추가하고 싶었습니다.

#!/usr/bin/env python3

import gi
gi.require_version('Gtk', '3.0')

from gi.repository import Gtk
from gi.repository import GLib

"""
This is a self-destroying window, to "feed" Unity a fake-window, preventing
the launcher to show a spinning wheel, waiting for a window to appear.
Include the command to run this script at the end of the (your) script.
"""

def timer_cb():
    Gtk.main_quit()
    return False

def show_cb(widget, data=None):
    GLib.timeout_add(500, timer_cb)

def fakewindow():
    window = Gtk.Window()
    # make our window transparent
    window.set_opacity(0)
    window.set_default_size(0,0)

    window.connect("show", show_cb)

    window.show_all()

    Gtk.main()

fakewindow()

좋은! :)
Jacob Vlijm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.