Uygulamalar her zaman belirli bir ekranda nasıl başlatılır?


11

Çift ekran yapılandırmasına sahibim ve tüm yeni ve eski uygulamaların sağdaki birincil ekranda başlamasını istiyorum. Ancak, odak / fare işaretçisinin nerede olduğuna bakılmaksızın bazı uygulamalar ikinci ekranda başlar. Bence bunun nedeni üst: sol köşe 0: 0 ikinci monitörde. Ve birincilden daha büyük, bu bir neden olabilir mi?

İkincil, ekran seçmek için bir ayarı olan kodi'yi çalıştırdığım bir TV.

Her uygulama konumu ve ekranı için hatırlayan bazı uygulamalar olabilir ve ayrıca ikinci kapatıldığında dikkatli olun - monitör tekrar açılana kadar hatırlama konumu anlamına gelir. Ubuntu compiz'in önceki sürümlerinde bunu yapın, ancak daha fazla değil.

Güncelleme: DE'yi tarçın olarak değiştirdi


Bunu da arıyorum, hiç şansın oldu mu?
Felipe

@Felipe Şanssız
LeonidMew

Tarçın uygulama listesinde, uygulamayı farklı monitöre taşımak için menü seçeneğim var, özellikle ikincil kapandığında kullanışlı. Ama bu bir sorunun çözümü değil.
LeonidMew

1
Bir çözüm, yeni pencerelere dikkat etmek, onları ana ekranınıza taşımak için biraz deamon benzeri bir süreç olabilir. Bu kabul edilebilir bir çözüm olabilir mi? Muhtemelen taşındığını bile göremezsiniz.
Jacob Vlijm

@JacobVlijm Evet, bu çözüm olabilir. Ama nasıl yazacağımı bilmiyorum, lütfen iki kod parçası verebilir misiniz - yeni pencere nasıl belirlenir ve nasıl taşınır
LeonidMew

Yanıtlar:


13

Ellerinizi kirletmeye hazır olun
Kullanıcılardan yapmalarını isteyebileceğimizi düşündüğümüz şeyin kenarındayken, diğer yandan talimatlar net olduğunda neden olmasın? İşte başlıyoruz ...


Hangi monitörlerin yeni pencerelerin görüneceğini ayarlamak için arka plan işlemi

Vala pasajı

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. Vala snippet'inin derlenmesi gerekir. Bunu yapmak için birkaç şey yüklemeniz gerekir:

    sudo apt install valac libwnck-3-dev libgtk-3-dev
    
  2. Aşağıdaki parçacığı kopyalayın, olarak kaydedin win_tomonitor.vala

  3. Parçacığı şu komutla derleyin:

    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' 
    

    (Biliyorum, wnck argümanı aptalca, ama gerekli), çalışma dizininde bir yürütülebilir dosya üretilecek.

  4. xrandrTerminalde komutu çalıştırarak birincil monitörünüzün adını bulun .
  5. Yürütülebilir dosyayı hedeflenen monitörle bağımsız değişken olarak çalıştırın, örn.

    /path/to/win_tomonitor HDMI-1
    

Yeni ("normal") pencereler, hedeflenen monitörün üst solundan 100 piksel (x + y) üzerinde görünür.

NB

Bunu başlangıç ​​öğesi olarak eklerken, çalıştırmadan önce birkaç saniye ara vermeniz gerekebilir. Giriş / başlangıçta sorunla karşılaşırsanız lütfen belirtin.


DÜZENLE

Düzenlenmiş bir sürümün altında (istek üzerine). farklılıklar:

  • Bu sürüm, zaten hedeflenen monitörde olan pencerelerde eylem atlar.
  • Bu sürüm hariç tutulan WM_CLASS-es ayarlarına izin verir . Bir veya daha fazla sınıfı hariç tutmak için: hedeflenen izleme bağımsız değişkeninden sonra ekstra bağımsız değişkenler ekleyin . Bir örnek:

    /path/to/win_tomonitor HDMI-1 Tilix Gedit
    

    hem Tilix hem de gedit pencerelerinin taşınmasını engellemek için.

Kurulum ilk sürümle tamamen aynıdır. İyi eğlenceler!

Bir pencerenin WM_CLASS'sını bulun

  • Bir terminal penceresi açın
  • Türü xprop, BasınReturn
  • hedeflenen pencereye tıklayın, WM_CLASSterminalde görünür

Kod

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();
    }
}

Valac komutu bulunamadı. Apt install valac ile yüklemeye çalıştığımda, komut dosyası bazı IP'ler bulamıyor
Rodolfo Velasco
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.