Điểm:2

chuyển đổi giữa các cửa sổ của cùng một ứng dụng không phải lúc nào cũng hoạt động

lá cờ gb

Khi tôi chuyển đổi giữa các cửa sổ của cùng một ứng dụng, nó không hoạt động với tất cả các các ứng dụng:

  • thiết bị đầu cuối gnome: OK
  • gedit: được rồi
  • trình duyệt Chrome: KO
  • emac: KO

Cụ thể hơn, đối với chrome và emacs, nó chỉ nhìn thấy một cửa sổ trong khi hai cửa sổ đang mở.

Đồng thời, tính năng nhóm cửa sổ hoạt động rất tốt ở thanh dưới cùng hiển thị tất cả các cửa sổ đang mở.

Trong "tùy chọn" -> "Phím tắt", tôi đã tùy chỉnh "Chuyển đổi cửa sổ của ứng dụng" bằng "Super+Tab" và tắt "Chuyển đổi ứng dụng".

Chữ

Đây có phải là một vấn đề được biết đến?

Tôi đang chạy Ubuntu 20.04 Hồi tưởng Gnome 3.36.8 (độ siêu nhanh).

Cảm ơn!

lá cờ ru
Nhận xét không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được [chuyển sang trò chuyện](https://chat.stackexchange.com/rooms/129129/discussion-on-question-by-ricky-robinson-switching-between-windows-of-the-same-a) .
Điểm:1
lá cờ by

Tôi đã thử trên Ubuntu (Budgie) 20.04 với kết quả tương tự, có thể là phím tắt, nếu hoạt động, sẽ chuyển (chỉ) giữa hai cửa sổ gần đây nhất của ứng dụng đang hoạt động. Giống như bạn, với a.o. Chrome, không có chuyển đổi nào diễn ra.

Chúng ta có thể nghĩ ra một số lý do tại sao các ứng dụng cụ thể không chuyển cửa sổ, nhưng chúng ta cần xem xét mã để biết chính xác điều gì đang xảy ra. Thậm chí sau đó, nó sẽ không khắc phục được vấn đề của bạn.

Tuy nhiên, tập lệnh bên dưới, chạy dưới dạng trình nền, kết hợp với lối tắt đã chỉnh sửa, sẽ thực hiện công việc. Nó đã được thử nghiệm vào ngày 20.04 và (ít nhất) với Chrome mà không gặp vấn đề gì. Tôi khá chắc chắn rằng nó hoạt động tốt với tất cả các ứng dụng có cửa sổ loại BÌNH THƯỜNG.

Những gì nó làm

Trình nền được kích hoạt bởi một tệp kích hoạt, được tạo trong /tmp bằng một/phím tắt. Sau đó, nó tra cứu tất cả các cửa sổ hợp lệ của ứng dụng đang hoạt động, trên không gian làm việc hiện tại, trong cây rơm, vì vậy chúng tôi biết thứ tự z. Trình nền sau đó kích hoạt cửa sổ đầu tiên trong ngăn xếp, do đó quay vòng qua các cửa sổ.

Như một phụ

...Bạn có thể đặt phím tắt để chuyển đổi giữa hai cửa sổ ứng dụng gần đây nhất, đây là hành vi mặc định trên 20.04 của tôi.

Làm thế nào để thiết lập

  • Sao chép tập lệnh bên dưới vào một tệp trống, lưu nó dưới dạng chu kỳ_thay thế, (hoặc bất kỳ tên nào khác mà bạn thích). Phần mở rộng .py là không cần thiết.
  • Làm cho tập lệnh có thể thực thi được
  • Chạy nó (giữ cho nó chạy) bằng lệnh /path/to/cycle_alternative.
  • Bây giờ làm cho phím tắt của bạn thực hiện lệnh chạm /tmp/forward_trigger để làm cho nó quay vòng qua tất cả các cửa sổ của ứng dụng đang hoạt động. Để chuyển đổi giữa hai cái gần đây nhất cửa sổ, đặt phím tắt để thực thi chạm /tmp/switchactive_trigger

Nếu tất cả đều hoạt động tốt, hãy thêm daemon vào các ứng dụng khởi động của bạn.

Tại sao lại là daemon?

Bạn có thể thêm chức năng tương tự vào tập lệnh, được gọi bằng phím tắt, nhưng khởi động nguội + tải lib mỗi lần sẽ khiến tập lệnh hoạt động kém phản hồi hơn. Chạy trình nền không là gì khi có thêm gánh nặng.

Tập lệnh/daemon

#!/usr/bin/env python3
nhập gi
gi.require_version('Wnck', '3.0')
gi.require_version('Gtk', '3.0')
từ gi.repository nhập Wnck, Gtk, Gio, Gdk, GdkX11
nhập hệ điều hành

lớp coi chừng:
    def __init__(bản thân):
        self.wnckscr = Wnck.Screen.get_default()
        # chúng tôi sẽ kích hoạt chức năng của daemon bằng các tệp kích hoạt
        self.triggers = [
            "/tmp/forward_trigger",
            "/tmp/switchactive_trigger"
        ]
        # vì vậy, hãy để mắt đến hai tệp này
        forward_mon = Gio.File.new_for_path(self.triggers[0]).monitor(
            Gio.FileMonitorFlags.NONE , Không có
        )
        switchactive_mon = Gio.File.new_for_path(self.triggers[1]).monitor(
            Gio.FileMonitorFlags.NONE , Không có
        )
        # ...và khiến chúng kích hoạt thứ gì đó
        cho mon trong [
            forward_mon, switchactive_mon
        ]:
            mon.connect("đã thay đổi", self.switchwindow)
        Gtk.main()

    def switchwindow(self, arg1, file, arg3, event):
        # hãy xem trình kích hoạt nào được kích hoạt, lấy tên nhóm của cửa sổ đang hoạt động
        fname = file.get_path()
        activewin = self.wnckscr.get_active_window()
        checkwinisnormal = Sai
        cố gắng:
            active_class = activewin.get_class_group_name()
            checkwinisnormal = activewin.get_window_type() == Wnck.WindowType.NORMAL
        ngoại trừ Thuộc tínhError:
            vượt qua
        # hãy kiểm tra xem sự kiện có đúng không và cửa sổ có hợp lệ không
        tôi ngã([
            sự kiện == Gio.FileMonitorEvent.CREATED,
            checkwinisnormal
        ]):
            # chúng ta sẽ nhận được các cửa sổ của ứng dụng đang hoạt động và không gian làm việc hiện tại
            # chỉ tìm cửa sổ trên không gian làm việc này
            Currclass_xids = []
            curr_ws = self.wnckscr.get_active_workspace().get_number()
            cho w trong self.wnckscr.get_windows_stacked():
                cố gắng:
                    onthis = w.get_workspace().get_number() == curr_ws
                ngoại trừ Thuộc tínhError:
                    vượt qua
                khác:
                    tôi ngã([
                        w.get_window_type() == Wnck.WindowType.NORMAL,
                        active_class == w.get_class_group_name(),
                        trên này
                    ]):
                        currclass_xids.append(w.get_xid())
            target_xid = [0, -2][self.triggers.index(fname)]
            cho w trong self.wnckscr.get_windows_stacked():
                cố gắng:
                    nếu w.get_xid() == currclass_xids[target_xid]:
                        bây giờ = GdkX11.x11_get_server_time(
                            GdkX11.X11Window.lookup_for_display(
                                Gdk.Display.get_default(),
                                GdkX11.x11_get_default_root_xwindow()
                            )
                        )
                        w.kích hoạt (bây giờ)
                ngoại trừ IndexError:
                    vượt qua
        cố gắng:
            os.remove(fname)
        ngoại trừ FileNotFoundError:
            vượt qua

        
coi chừng()

NB

Tái bút Có thể, bạn có thể cần cài đặt một hoặc hai lib bổ sung, nhưng hãy tìm hiểu xem có bất kỳ đầu ra nào trong thiết bị đầu cuối không.

lá cờ gb
Cảm ơn rất nhiều cho các kịch bản! Nó có vẻ hơi quá mức cần thiết, mặc dù. :) Bạn chắc chắn xứng đáng nhận được tiền thưởng, hãy để tôi tìm hiểu xem liệu tôi có thể khắc phục điều này bằng cách nâng cấp thiết lập của mình hay không.
Jacob Vlijm avatar
lá cờ by
@RickyRobinson ý bạn là quá mức cần thiết để tạo một tập lệnh cho nó hay quá mức cần thiết để -use- một tập lệnh cho nó? Nếu là trường hợp đầu tiên: đừng lo lắng, đó là phiên bản python được chỉnh sửa/đơn giản hóa của mã lấy ra mà tôi sử dụng ở nơi khác. Để sử dụng nó không thực sự phức tạp và nó khắc phục được sự cố. Tất nhiên, một tùy chọn khác là cập nhật lên phiên bản Ubuntu mới hơn, nơi nó dường như đã được sửa (ít nhất là trong phiên bản 21.10 dành cho nhà phát triển). Tuy nhiên, đó là công việc nhiều hơn nữa :)
Điểm:0
lá cờ cn

Cố gắng ghi đè lên các giá trị.

  1. Thiết lập một giá trị mới cho Chuyển ứng dụng.
  2. Ghi đè giá trị cho Chuyển cửa sổ.
lá cờ gb
Tôi hiểu rồi. Nhưng trên một máy khác, tôi có debian + xfce và việc chuyển đổi giữa các cửa sổ của cùng một ứng dụng hoạt động rất tốt. Ít nhất là trong thiết lập đó, dường như không có bất kỳ sự khác biệt nào trong hành vi từ ứng dụng này sang ứng dụng khác.
Unix avatar
lá cờ cn
À, tôi đã "đọc" (sai) 'tab' thay vì 'windows' ... Hãy để tôi sửa câu trả lời của mình.
lá cờ gb
Chắc chắn rồi! Nhưng ... "chuyển đổi ứng dụng" chuyển thành "chuyển đổi cửa sổ" trong thiết lập của tôi. Nó dường như làm chính xác điều tương tự trên cả hai không gian làm việc của tôi. Vấn đề của tôi là việc chuyển đổi giữa các cửa sổ của cùng một ứng dụng bị lỗi...
Unix avatar
lá cờ cn
Nếu việc ghi đè lên các giá trị (chỉ để kiểm tra) không khắc phục được sự cố thì bước tiếp theo là kiểm tra công cụ dconf. Hãy xem câu trả lời này: https://superuser.com/a/860001/396041
lá cờ gb
Được rồi, nhưng thật không may, điều đó không dẫn đến đâu cả. Vấn đề không phải là nó không bao giờ hoạt động. Vấn đề là đối với một số ứng dụng, nó hoạt động, nhưng đối với những ứng dụng khác, nó chỉ nhìn thấy một cửa sổ, trong khi có rất nhiều cửa sổ.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.