हमेशा विशिष्ट प्रदर्शन पर एप्लिकेशन कैसे शुरू करें?


11

मेरे पास दोहरी डिस्प्ले कॉन्फ़िगरेशन है, और चाहते हैं कि सभी नए और पुराने एप्लिकेशन प्राथमिक डिस्प्ले पर शुरू हों, जो दाईं ओर है। लेकिन कुछ ऐप्स दूसरी स्क्रीन पर शुरू होते हैं, भले ही फ़ोकस / माउस पॉइंटर हो। मुझे लगता है कि यह इसलिए है क्योंकि शीर्ष: बाएं कोने 0: 0 दूसरे मॉनिटर पर है। और इसका बड़ा तब प्राथमिक, क्या यह एक कारण हो सकता है?

माध्यमिक एक टीवी है जहां मैं कोड़ी चलाता हूं, जिसमें डिस्प्ले चुनने की सेटिंग है।

हो सकता है कि कुछ ऐप ऐसे हों जो हर ऐप पोजीशन और डिस्प्ले के लिए याद रखें, और दूसरा बंद होने पर भी ध्यान रखें - जब तक मॉनिटर फिर से चालू न हो जाए, तब तक याद रखें। Ubuntu compiz के पुराने संस्करणों में ऐसा है, लेकिन अब और नहीं।

अद्यतन: डे को दालचीनी में बदल दिया


मैं भी इसी की तलाश में हूं, क्या आपको कोई किस्मत मिली है?
फेलिप

@ फेलिप नो लक
लियोनिडमेव

दालचीनी में एप्लिकेशन सूची में, मेरे पास अलग-अलग मॉनिटर के लिए एप्लिकेशन को स्थानांतरित करने के लिए मेनू विकल्प है, विशेष रूप से तब उपयोगी जब माध्यमिक बंद हो। लेकिन यह एक सवाल का हल नहीं है।
लियोनिडमेव

1
एक समाधान थोड़ा बहरा जैसी प्रक्रिया हो सकती है, नई खिड़कियों के लिए बाहर देखने के लिए, उन्हें अपनी प्राथमिक स्क्रीन पर ले जाएं। क्या यह एक स्वीकार्य समाधान होगा? आप शायद इसे स्थानांतरित होते हुए भी नहीं देख पाएंगे।
याकूब Vlijm

@JacobVlijm हां, यह समाधान हो सकता है। लेकिन मुझे नहीं पता कि इसे कैसे लिखना है, क्या आप कृपया दो कोड टुकड़े दे सकते हैं - नई विंडो कैसे निर्धारित करें और कैसे आगे बढ़ें
LeonidMew

जवाबों:


13

अपने हाथों को गंदे होने के लिए तैयार रहें
मुझे जो महसूस हो रहा है उसके किनारे पर हम उपयोगकर्ताओं को करने के लिए कह सकते हैं, लेकिन दूसरी तरफ, जब निर्देश स्पष्ट हैं, तो क्यों नहीं? तो अब हम शुरू करें...


पृष्ठभूमि प्रक्रिया जिस पर नई खिड़कियों की निगरानी होनी चाहिए

वला स्निपेट

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. वेला स्निपेट को संकलित करने की आवश्यकता है। ऐसा करने के लिए आपको कुछ चीजें स्थापित करने की आवश्यकता है:

    sudo apt install valac libwnck-3-dev libgtk-3-dev
    
  2. नीचे स्निपेट कॉपी करें, इसे इस रूप में सहेजें win_tomonitor.vala

  3. कमांड के साथ स्निपेट संकलित करें:

    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' 
    

    (मुझे पता है, wnck तर्क मूर्खतापूर्ण है, लेकिन जरूरत है), एक निष्पादन योग्य कार्यशील निर्देशिका में उत्पादित किया जाएगा।

  4. xrandrटर्मिनल में कमांड चलाकर अपने प्राथमिक मॉनिटर का नाम पता करें ।
  5. निष्पादित मॉनिटर को तर्क के रूप में लक्षित मॉनिटर के साथ चलाएं, जैसे

    /path/to/win_tomonitor HDMI-1
    

नई ("सामान्य") विंडो लक्षित मॉनीटर के शीर्ष पर 100px (x + y) पर दिखाई देगी।

एनबी

इसे स्टार्टअप आइटम के रूप में जोड़ते समय, आपको इसे चलाने से पहले कुछ सेकंड का ब्रेक जोड़ना पड़ सकता है। यदि आप लॉगिन / स्टार्टअप पर मुद्दों में भाग लेते हैं, तो कृपया उल्लेख करें।


संपादित करें

एक संपादित संस्करण के नीचे (अनुरोध पर)। अंतर:

  • यह संस्करण उन खिड़कियों पर कार्रवाई को रोक देता है जो पहले से ही लक्षित मॉनिटर पर हैं।
  • यह संस्करण बहिष्कृत WM_CLASS-es सेट करने की अनुमति देता है । एक या एक से अधिक कक्षाओं को बाहर करने के लिए: लक्षित मॉनिटर -तर्क के बाद अतिरिक्त तर्क जोड़ें । एक उदाहरण:

    /path/to/win_tomonitor HDMI-1 Tilix Gedit
    

    टिलिक्स और गेडिट दोनों खिड़कियों को हिलाने से रोकने के लिए।

सेटअप पहले संस्करण के समान ही है। मज़े करो!

एक खिड़की के WM_CLASS का पता लगाएं

  • एक टर्मिनल विंडो खोलें
  • टाइप करें xprop, दबाएँReturn
  • लक्षित विंडो पर क्लिक करें, WM_CLASSटर्मिनल में दिखाई देता है

कोड

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

कमांड वैलेक नहीं मिला। जब मैं इसे उपयुक्त इंस्टॉल वालैक के साथ स्थापित करने की कोशिश करता हूं, तो स्क्रिप्ट कुछ आईपी नहीं पा रही है
रोडोल्फो वेलास्को
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.