Score:2

การสลับระหว่างหน้าต่างของแอปพลิเคชันเดียวกันไม่ทำงานเสมอไป

ธง gb

เมื่อฉันสลับไปมาระหว่างหน้าต่างของแอปพลิเคชันเดียวกัน มันใช้งานไม่ได้ ทั้งหมด การใช้งาน:

  • เทอร์มินัลคำพังเพย: ตกลง
  • gedit: ตกลง
  • โครเมียม: เกาะ
  • อีแมค: เกาะ

โดยเฉพาะอย่างยิ่งสำหรับ Chrome และ emacs จะเห็นเพียงหน้าต่างเดียวในขณะที่สองหน้าต่างเปิดอยู่

ในขณะเดียวกัน คุณลักษณะการจัดกลุ่มหน้าต่างทำงานได้ดีมากในแถบด้านล่างที่แสดงหน้าต่างที่เปิดอยู่ทั้งหมด

ใน "การตั้งค่า" -> "แป้นพิมพ์ลัด" ฉันปรับแต่ง "สลับหน้าต่างของแอปพลิเคชัน" ด้วย "Super+Tab" และปิดใช้งาน "สลับแอปพลิเคชัน"

ข้อความ

นี่เป็นปัญหาที่ทราบหรือไม่

ฉันใช้ Ubuntu 20.04 ทำงานอยู่ Gnome 3.36.8 ย้อนหลัง (เมตาซิตี้).

ขอบคุณ!

ru flag
Comments are not for extended discussion; this conversation has been [moved to chat](https://chat.stackexchange.com/rooms/129129/discussion-on-question-by-ricky-robinson-switching-between-windows-of-the-same-a).
Score:1
ธง by

ฉันลองใช้ Ubuntu (Budgie) 20.04 ด้วยผลลัพธ์เดียวกัน ไม่ว่าจะเป็นทางลัด หากใช้งานได้ จะสลับ (เท่านั้น) ระหว่างสองหน้าต่างล่าสุดของแอปพลิเคชันที่ใช้งานอยู่ เช่นเดียวกับคุณกับ a.o. Chrome ไม่มีการสลับเกิดขึ้นเลย

เราสามารถนึกถึงสาเหตุหลายประการที่ทำให้บางแอปพลิเคชันไม่สลับหน้าต่าง แต่เราจำเป็นต้องตรวจสอบโค้ดเพื่อให้ทราบว่าเกิดอะไรขึ้น ถึงอย่างนั้น มันก็ไม่สามารถแก้ไขปัญหาของคุณได้

สคริปต์ด้านล่าง ทำงานเป็น daemon ร่วมกับทางลัดที่แก้ไขแล้ว ทำงานได้ มีการทดสอบบน 20.04 และ (อย่างน้อย) กับ Chrome โดยไม่มีปัญหา ฉันค่อนข้างแน่ใจว่ามันทำงานได้ดีกับทุกแอปพลิเคชันที่มีหน้าต่างประเภท NORMAL

มันทำอะไร

daemon ถูกเรียกใช้โดยไฟล์ทริกเกอร์ ซึ่งสร้างขึ้นใน /tmp โดย a/ทางลัด จากนั้นจะค้นหาหน้าต่างที่ถูกต้องทั้งหมดของแอปพลิเคชันที่ใช้งานอยู่ ในพื้นที่ทำงานปัจจุบัน ใน ซ้อนกันเราจึงทราบลำดับ z จากนั้น daemon จะเปิดใช้งานหน้าต่างแรกในสแต็ก ซึ่งจะหมุนเวียนผ่านหน้าต่าง

เป็นพิเศษ

...คุณสามารถตั้งค่าทางลัดเพื่อสลับระหว่างหน้าต่างแอปพลิเคชันล่าสุดสองหน้าต่าง ซึ่งเป็นลักษณะการทำงานเริ่มต้นในเวอร์ชัน 20.04 ของฉัน

วิธีการตั้งค่า

  • คัดลอกสคริปต์ด้านล่างลงในไฟล์ว่าง บันทึกเป็น วัฏจักร_ทางเลือก, (หรือชื่ออื่นที่คุณชอบ). ส่วนขยาย .py ไม่จำเป็น
  • ทำให้สคริปต์ทำงานได้
  • เรียกใช้ (ให้มันทำงานต่อไป) โดยคำสั่ง /path/to/cycle_alternative.
  • ตอนนี้ให้ทางลัดของคุณดำเนินการคำสั่ง แตะ /tmp/forward_trigger เพื่อให้วนรอบหน้าต่างทั้งหมดของแอปพลิเคชันที่ใช้งานอยู่ เพื่อสลับไปมาระหว่าง ทั้งสองล่าสุด windows ตั้งค่าทางลัดเพื่อดำเนินการ แตะ /tmp/switchactive_trigger

หากทุกอย่างทำงานได้ดี ให้เพิ่ม daemon ในแอปพลิเคชันเริ่มต้นของคุณ

ทำไมต้องเป็นภูต?

คุณสามารถเพิ่มฟังก์ชันเดียวกันนี้ให้กับสคริปต์ ซึ่งเรียกโดยทางลัด แต่การเริ่มเย็น + การโหลด libs ต่อครั้งจะทำให้การทำงานตอบสนองน้อยลง การเรียกใช้ daemon นั้นไม่มีอะไรเลยเมื่อพูดถึงภาระเพิ่มเติม

สคริปต์/ภูต

#!/usr/bin/env python3
นำเข้า GI
gi.require_version('Wnck', '3.0')
gi.require_version('Gtk', '3.0')
จาก gi.repository นำเข้า Wnck, Gtk, Gio, Gdk, GdkX11
นำเข้าระบบปฏิบัติการ

ระวังชั้นเรียน:
    def __init__(ตัวเอง):
        self.wnckscr = Wnck.Screen.get_default()
        # เราจะเปิดใช้งานฟังก์ชันของ daemon โดยทริกเกอร์ไฟล์
        ตัวทริกเกอร์ = [
            "/tmp/forward_trigger",
            "/tmp/switchactive_trigger"
        ]
        #งั้นเรามาจับตาดูสองไฟล์นี้กัน
        forward_mon = Gio.File.new_for_path(self.triggers[0]).monitor(
            Gio.FileMonitorFlags.NONE ไม่มี
        )
        switchactive_mon = Gio.File.new_for_path(self.triggers[1]).monitor(
            Gio.FileMonitorFlags.NONE ไม่มี
        )
        # ...และทำให้พวกเขากระตุ้นบางอย่าง
        สำหรับวันจันทร์ใน [
            forward_mon, switchactive_mon
        ]:
            mon.connect("เปลี่ยนแปลง", self.switchwindow)
        Gtk.main()

    def switchwindow (ตัวเอง, arg1, ไฟล์, arg3, เหตุการณ์):
        # มาดูกันว่าทริกเกอร์ใดเริ่มทำงาน รับชื่อกลุ่มของหน้าต่างที่ใช้งานอยู่
        fname = file.get_path()
        activewin = self.wnckscr.get_active_window()
        checkwinisnormal = เท็จ
        พยายาม:
            active_class = activewin.get_class_group_name()
            checkwinisnormal = activewin.get_window_type() == Wnck.WindowType.NORMAL
        ยกเว้น AttributeError:
            ผ่าน
        # ตรวจสอบว่ากิจกรรมถูกต้องหรือไม่และหน้าต่างถูกต้องหรือไม่
        ฉันตก([
            เหตุการณ์ == Gio.FileMonitorEvent.CREATED,
            ตรวจวินไม่ปกติ
        ]):
            # เราจะได้หน้าต่างของแอปพลิเคชันที่ใช้งานและพื้นที่ทำงานปัจจุบัน
            # มองหาหน้าต่างในพื้นที่ทำงานนี้เท่านั้น
            currclass_xids = []
            curr_ws = self.wnckscr.get_active_workspace().get_number()
            สำหรับ w ใน self.wnckscr.get_windows_stacked():
                พยายาม:
                    บนนี้ = w.get_workspace().get_number() == curr_ws
                ยกเว้น AttributeError:
                    ผ่าน
                อื่น:
                    ฉันตก([
                        w.get_window_type() == Wnck.WindowType.NORMAL,
                        active_class == w.get_class_group_name(),
                        บนนี้
                    ]):
                        currclass_xids.append(w.get_xid())
            target_xid = [0, -2][self.triggers.index(ชื่อ)]
            สำหรับ w ใน self.wnckscr.get_windows_stacked():
                พยายาม:
                    ถ้า w.get_xid() == currclass_xids[target_xid]:
                        ตอนนี้ = GdkX11.x11_get_server_time(
                            GdkX11.X11Window.lookup_for_display(
                                Gdk.Display.get_default(),
                                GdkX11.x11_get_default_root_xwindow()
                            )
                        )
                        w.activate (ตอนนี้)
                ยกเว้น IndexError:
                    ผ่าน
        พยายาม:
            os.remove (ชื่อ)
        ยกเว้น FileNotFoundError:
            ผ่าน

        
ระวัง()

NB

ป.ล. คุณอาจต้องติดตั้ง libs เพิ่มเติมหนึ่งหรือสองตัว แต่ลองมาดูกันว่ามีเอาต์พุตในเทอร์มินัลหรือไม่

gb flag
ขอบคุณมากสำหรับสคริปต์! ดูเหมือนว่าเกินความจำเป็นไปหน่อย :) คุณสมควรได้รับรางวัลอย่างแน่นอน ขอฉันคิดดูว่าจะแก้ไขได้หรือไม่โดยอัปเกรดการตั้งค่าของฉัน
Jacob Vlijm avatar
by flag
@RickyRobinson คุณหมายถึง overkill เพื่อสร้างสคริปต์สำหรับมันหรือ overkill เพื่อ -use- สคริปต์สำหรับมัน? หากเป็นอย่างแรก: ไม่ต้องกังวล มันเป็นเวอร์ชันที่แก้ไข/ทำให้ง่ายขึ้นของรหัสที่ใช้นอกสถานที่ที่ฉันใช้ที่อื่น การใช้งานไม่ซับซ้อนจริง ๆ และแก้ไขปัญหาได้ อีกทางเลือกหนึ่งคือการอัปเดตเป็น Ubuntu เวอร์ชันที่ใหม่กว่าซึ่งดูเหมือนจะได้รับการแก้ไขแล้ว (อย่างน้อยในเวอร์ชัน 21.10 dev.) นั่นเป็นงานที่มากขึ้น แต่ :)
Score:0
ธง cn

ลองเขียนทับค่า

  1. ตั้งค่าใหม่สำหรับ สลับการใช้งาน.
  2. เขียนทับค่าสำหรับ สลับหน้าต่าง.
gb flag
เข้าใจแล้ว. แต่ในอีกเครื่องหนึ่ง ฉันมี debian + xfce และการสลับไปมาระหว่างหน้าต่างของแอปพลิเคชันเดียวกันก็ทำงานได้ดีมาก อย่างน้อยในการตั้งค่านั้น ดูเหมือนจะไม่มีความแตกต่างในการทำงานจากแอปพลิเคชันหนึ่งไปยังอีกแอปพลิเคชันหนึ่ง
Unix avatar
cn flag
อาฉันกำลัง "อ่าน" (ผิด) 'แท็บ' แทนที่จะเป็น 'หน้าต่าง' ... ให้ฉันแก้ไขคำตอบของฉัน
gb flag
แน่นอน! แต่... "สลับแอปพลิเคชัน" ลงมาเป็น "สลับหน้าต่าง" ในการตั้งค่าของฉัน ดูเหมือนว่าจะทำสิ่งเดียวกันในพื้นที่ทำงานของฉันทั้งสองแห่ง ปัญหาของฉันคือการสลับระหว่างหน้าต่างของแอปพลิเคชันเดียวกันนั้นมีปัญหา...
Unix avatar
cn flag
หากการเขียนทับค่า (เพื่อทดสอบเท่านั้น) ไม่สามารถแก้ไขปัญหาได้ ขั้นตอนต่อไปคือตรวจสอบเครื่องมือ dconf ดูคำตอบนี้: https://superuser.com/a/860001/396041
gb flag
เอาล่ะ แต่นั่นไม่ได้นำไปสู่ทุกที่ โชคไม่ดี ปัญหาไม่ใช่ว่ามันไม่เคยทำงาน ปัญหาคือบางแอปพลิเคชันใช้งานได้ แต่สำหรับบางแอปพลิเคชันจะเห็นเพียงหน้าต่างเดียวในขณะที่มีหลายหน้าต่าง

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา