GNU/Linux >> Znalost Linux >  >> Ubuntu

Jak spouštět aplikace vždy na konkrétním displeji?

Mám konfiguraci duálního displeje a chci, aby se všechny nové i staré aplikace spouštěly na primárním displeji, který je vpravo. Některé aplikace se však spouštějí na druhé obrazovce, bez ohledu na to, kde je kurzor/ukazatel myši. Myslím, že je to proto, že horní:levý roh 0:0 je na druhém monitoru. A je větší než primární, může to být příčina?

Sekundární je TV, kde spouštím kodi, které mají nastavení pro výběr zobrazení.

Možná existuje nějaká aplikace, která si pamatuje každou pozici a zobrazení každé aplikace, a také dá pozor, když je sekunda vypnutá – znamená zapamatovat si polohu, dokud se monitor znovu nezapne. V dřívějších verzích ubuntu compiz to dělejte, ale nic víc.

Aktualizace:Změněno DE na cinnamon

Přijatá odpověď:

Připravte se, že si ušpiníte ruce
Na okraj toho, co si myslím, že bychom mohli od uživatelů požadovat, aby udělali, ale na druhou stranu, když jsou pokyny jasné, proč ne? Tak jdeme na to…

Proces na pozadí pro nastavení, na kterém monitoru se mají nová okna zobrazovat

Úryvek Vala

using Wnck;
using Gdk;
using Gtk;

// compile:
// valac --pkg gtk+-3.0 --pkg gio-2.0 --pkg libwnck-3.0 -X "-D WNCK_I_KNOW_THIS_IS_UNSTABLE" 'file.vala'

namespace move_newwins {

    private int[] monitor_geo_x;
    private int[] monitor_geo_y;
    private int monitorindex;
    private string currmon;

    private void getwins() {
        var dsp = Gdk.Display.get_default();
        unowned Wnck.Screen scr = Wnck.Screen.get_default();
        scr.force_update();
        get_monitors(dsp);
        scr.window_opened.connect(newwin);
    }

    private void newwin (Wnck.Window newwin) {
        newwin.unmaximize();
        int winx;
        int winy;
        int winwidth;
        int winheight;
        newwin.get_geometry(out winx, out winy, out winwidth, out winheight);
        Wnck.WindowType type = newwin.get_window_type();
        if (type == Wnck.WindowType.NORMAL) {
            newwin.set_geometry(
                Wnck.WindowGravity.NORTHWEST,
                Wnck.WindowMoveResizeMask.X |
                Wnck.WindowMoveResizeMask.Y |
                Wnck.WindowMoveResizeMask.WIDTH |
                Wnck.WindowMoveResizeMask.HEIGHT,
                monitor_geo_x[monitorindex] + 100,
                monitor_geo_y[monitorindex] + 100,
                winwidth, winheight
            );
        }
    }

    private int get_stringindex (string s, string[] arr) {
        for (int i=0; i < arr.length; i++) {
            if(s == arr[i]) return i;
        } return -1;
    }

    private void get_monitors(Gdk.Display dsp) {
        int nmons = dsp.get_n_monitors();
        string[] monitornames = {};
        for (int i=0; i < nmons; i++) {
            Gdk.Monitor newmon = dsp.get_monitor(i);
            monitornames += newmon.get_model();
            Rectangle geo = newmon.get_geometry();
            monitor_geo_x += geo.x;
            monitor_geo_y += geo.y;
            monitorindex = get_stringindex(
                currmon, monitornames
            );
        }
    }

    public static void main (string[] args) {
        currmon = args[1];
        Gtk.init(ref args);
        getwins();
        Gtk.main();
    }
}
  1. Úryvek Vala je třeba zkompilovat. Chcete-li tak učinit, musíte nainstalovat několik věcí:

    sudo apt install valac libwnck-3-dev libgtk-3-dev
    
  2. Zkopírujte níže uvedený úryvek a uložte jej jako win_tomonitor.vala

  3. Zkompilujte úryvek pomocí příkazu:

    valac --pkg gtk+-3.0 --pkg gio-2.0 --pkg libwnck-3.0 -X "-D WNCK_I_KNOW_THIS_IS_UNSTABLE" '/path/to/win_tomonitor.vala' 
    

    (Vím, argument wnck je hloupý, ale potřebný), v pracovním adresáři bude vytvořen spustitelný soubor.

  4. Zjistěte název svého primárního monitoru spuštěním příkazu xrandr v terminálu.
  5. Spusťte spustitelný soubor s cílovým monitorem jako argumentem, např.

    /path/to/win_tomonitor HDMI-1
    

Nová („normální“) okna se objeví ve vzdálenosti 100 pixelů (x + y) od levého horního rohu cílového monitoru.

N.B.

Když to přidáváte jako spouštěcí položku, možná budete muset před spuštěním přidat přestávku na několik sekund. Pokud narazíte na problémy s přihlášením/spuštěním, uveďte prosím.

Související:Změnit zvuk oznámení (upozornění) v Ubuntu?

UPRAVIT

Níže upravená verze (na vyžádání). Rozdíly:

  • Tato verze přeskakuje akci u oken, která již jsou na cílovém monitoru.
  • Tato verze umožňuje nastavit vyloučené WM_CLASS -es. Chcete-li vyloučit jednu nebo více tříd:přidejte další argumenty za argument cíleného monitoru. Příklad:

    /path/to/win_tomonitor HDMI-1 Tilix Gedit
    

    k vyloučení přesunutí oken Tilix i gedit.

Nastavení je úplně stejné jako u první verze. Bavte se!

Zjistěte třídu WM_CLASS v okně

  • Otevřete okno terminálu
  • Zadejte xprop , Stiskněte Návrat
  • klikněte na cílové okno WM_CLASS zobrazí se v terminálu

Kód

using Wnck;
using Gdk;
using Gtk;

// compile:
// valac --pkg gtk+-3.0 --pkg gio-2.0 --pkg libwnck-3.0 -X "-D WNCK_I_KNOW_THIS_IS_UNSTABLE" 'file.vala'

namespace move_newwins {

    private int[] monitor_geo_x;
    private int[] monitor_geo_y;
    private int monitorindex;
    private string currmon;
    Gdk.Display dsp;
    string[] blacklist;

    private void getwins() {
        dsp = Gdk.Display.get_default();
        unowned Wnck.Screen scr = Wnck.Screen.get_default();
        scr.force_update();
        get_monitors(dsp);
        scr.window_opened.connect(newwin);
    }

    private void newwin (Wnck.Window newwin) {
        newwin.unmaximize();
        int winx;
        int winy;
        int winwidth;
        int winheight;
        newwin.get_geometry(out winx, out winy, out winwidth, out winheight);
        string wins_monitor = dsp.get_monitor_at_point(winx, winy).get_model();
        Wnck.WindowType type = newwin.get_window_type();
        string wm_class = newwin.get_class_group_name();
        bool blacklisted = get_stringindex(wm_class, blacklist) != -1;

        if (
            type == Wnck.WindowType.NORMAL &&
            wins_monitor != currmon &&
            !blacklisted
        ) {
            newwin.set_geometry(
                Wnck.WindowGravity.NORTHWEST,
                Wnck.WindowMoveResizeMask.X |
                Wnck.WindowMoveResizeMask.Y |
                Wnck.WindowMoveResizeMask.WIDTH |
                Wnck.WindowMoveResizeMask.HEIGHT,
                monitor_geo_x[monitorindex] + 100,
                monitor_geo_y[monitorindex] + 100,
                winwidth, winheight
            );
        }
    }

    private int get_stringindex (string s, string[] arr) {
        for (int i=0; i < arr.length; i++) {
            if(s == arr[i]) return i;
        } return -1;
    }

    private void get_monitors(Gdk.Display dsp) {
        int nmons = dsp.get_n_monitors();
        string[] monitornames = {};
        for (int i=0; i < nmons; i++) {
            Gdk.Monitor newmon = dsp.get_monitor(i);
            monitornames += newmon.get_model();
            Rectangle geo = newmon.get_geometry();
            monitor_geo_x += geo.x;
            monitor_geo_y += geo.y;
            monitorindex = get_stringindex(
                currmon, monitornames
            );
        }
    }

    public static void main (string[] args) {
        currmon = args[1];
        blacklist = args[1:args.length];
        Gtk.init(ref args);
        getwins();
        Gtk.main();
    }
}

Ubuntu
  1. Jak automaticky spouštět programy v konkrétních pracovních prostorech při spuštění?

  2. Jak spustit Vnc Server při spuštění?

  3. Jak začít potopu na pozadí?

  1. Jak spouštět aplikace Windows na počítači Ubuntu

  2. Jak zobrazit konkrétní řádky souboru v příkazovém řádku Linuxu

  3. Jak se PulseAudio spouští?

  1. Jak zobrazit procento baterie v systémové liště Ubuntu 22.04

  2. Jak předem načíst program pro rychlejší start?

  3. Jak spustím Ubuntu z Initramfs?