Ghi đè tiêu đề cửa sổ cho một cửa sổ tùy ý trong KDE và đặt tiêu đề cửa sổ tùy chỉnh


14

Sử dụng KDE ở đây, nhưng cũng có thể có một giải pháp hoạt động với các môi trường máy tính để bàn khác. Tôi thường xuyên phải đối phó với nhiều cửa sổ. Hầu hết các cửa sổ chứa nhiều tab (ví dụ: cửa sổ Cá heo có nhiều tab hoặc Firefox, Konsole, v.v.). Tiêu đề cửa sổ sẽ thay đổi dựa trên tab hiện tại của tôi (phần lớn thời gian này hữu ích nhất), nhưng khi làm việc với rất nhiều cửa sổ, tôi muốn tổ chức chúng một chút và có thể tự đặt tên lại cho cửa sổ , ghi đè tiêu đề cửa sổ mà ứng dụng đưa ra . Tôi có thể đặt tên cho một cửa sổ Firefox là "Nghiên cứu" và "Tài liệu" khác của cửa sổ Firefox để có thể dễ dàng phân biệt giữa các cửa sổ mà tôi đã sử dụng để sắp xếp và nhóm các tab khác nhau tương ứng.

Lý tưởng nhất là tôi có thể nhấp vào thanh tiêu đề cửa sổ và dễ dàng đặt tên tùy chỉnh, nhưng tôi sẽ giải quyết một giải pháp hơi cồng kềnh miễn là nó hoạt động.

Tôi đã thử wmctrl -r :SELECT: -T "Research"nhưng nó chỉ hoạt động tạm thời (tiêu đề được hoàn nguyên khi ứng dụng thay đổi nó, ví dụ như khi chuyển tab).


Các ứng dụng KDE gốc có --captiontùy chọn dòng lệnh cho phép bạn đặt tiêu đề cửa sổ, nhưng tôi không nghĩ đó hoàn toàn là những gì bạn đang tìm kiếm.
David Z

@SeanMadsen Heya, bạn vẫn cần cái này chứ? Vì nếu bạn làm thế, tôi rất muốn biết liệu bạn có thể làm cho kịch bản của tôi làm việc cho bạn không. ^^;
Owen_R

Cảm ơn bạn @Owen_R Kịch bản của bạn đã hoạt động và tôi đã thêm một repo cho nó trên GitHub .
Sean

@SeanMadsen ha, tôi rất vui khi biết người khác cuối cùng đã sử dụng câu trả lời của tôi! Mặc dù điều buồn cười là bản thân tôi không sử dụng kịch bản cá đó nữa; Tôi đã viết lại nó trong ruby ​​một thời gian trước đây. Mặc dù vậy, thực tế tôi không có ý định đưa nó lên github bất cứ lúc nào sớm, vì vậy tôi chỉ chỉnh sửa nó đến cuối câu trả lời của tôi nếu bạn muốn.
Owen_R

Câu trả lời:


4

Tôi đã có chính xác vấn đề này.

Vì vậy, tôi đã viết một kịch bản shell mà tôi ràng buộc với một phím nóng.

Khi tôi nhấn phím nóng, nó sẽ nhận được id cửa sổ của cửa sổ hiện đang hoạt động (cửa sổ có tiêu điểm).

Sau đó, nó cung cấp cho bạn một hộp thoại bật lên nơi bạn nhập tiêu đề bạn muốn cửa sổ đó có.

Sau đó, mỗi khi cửa sổ đó thay đổi tên, nó sẽ thay đổi tên đó thành tiêu đề bạn muốn.

Để sử dụng tập lệnh, bạn cần:

  • các fishvỏ
    (Tôi đã viết nó trong cá chứ không phải bash cuz bash mang lại cho tôi đau đầu)

  • kdialog

  • một số cách để liên kết tập lệnh với một phím nóng
    (tôi sử dụng xbindkeys, vì tất cả những gì tôi phải làm để làm cho nó hoạt động được thêm vào:

"[PATH TO SCRIPT]/[NAME OF SCRIPT]" Mod4 + t

(đó là, phím cửa sổ + t)
cho tôi /home/o1/.xbindkeysrc)

Nhờ anh chàng này , người đã cho tôi thông tin về những thứ xprop ma thuật.

(Giống như, một năm trước, và sau đó tôi chưa bao giờ viết kịch bản cho đến ngày hôm nay. XD)

PS Nếu bất kỳ người mới nào tìm thấy câu trả lời này và không biết cách sử dụng nó, chỉ cần hỏi tôi và tôi sẽ hướng dẫn bạn qua nó. ^^

EDIT: Tôi đã cập nhật nó để bạn có thể sử dụng nó từ dòng lệnh với các công tắc -tcho title_i_want-wcho window_id.

Đây là kịch bản:

#!/usr/local/bin/fish

# this block is so you can use it from the command line with -t and -w
if test "$argv" != "" -a (math (count $argv)%2 == 0)
    for i in (seq 1 (count $argv))
        if test $argv[$i] = '-t'
            set title_i_want $argv[(math 1 + $i)]
        else if test $argv[$i] = '-w'
            set window_id $argv[(math 1 + $i)]
        end
    end
    if not test $window_id
        echo "YOU DIDN'T ENTER A `window_id` WITH `-w`,
SO MAKE SURE THE WINDOW YOU WANT HAS FOCUS
TWO SECONDS FROM NOW!"
        sleep 2
    end
end

# get the id of the currently focused window
if not test $window_id
    set window_id (xprop -root _NET_ACTIVE_WINDOW | grep -P -o "0x\w+")
end

# get the title to force on that window

if not test $title_i_want
    set title_i_want (kdialog --title "entitled" --inputbox "type the title you want and hit enter.
to stop renaming,
just enter nothing and hit esc")
end

# this bit is needed for a kludge that allows window renaming
set has_renamed_before "FALSE"
set interrupt_message "WAIT WAIT I WANT A TURN BLOO BLOO BLEE BLUH BLOO" # hopefully i never want to actually use that as a title xD
xprop -f _NET_WM_NAME 8u -set _NET_WM_NAME $interrupt_message -id $window_id

# take the output of xprop
# pipe it into a while loop
# everytime it outputs a new line
# stuff it into a variable named "current_title"
xprop -spy _NET_WM_NAME -id $window_id | while read current_title

    # cut off extraneous not-the-title bits of that string
    set current_title (echo $current_title | grep -P -o '(?<=_NET_WM_NAME\(UTF8_STRING\) = ").*(?="\z)')

    # if the current title is the interrupt message
    # AND
    # this script has renamed the window at least once before
    # then we wanna let the new name take over
    if test $current_title = $interrupt_message -a $has_renamed_before = "TRUE"
        exit
    # if title_i_want is an empty string, exit
    else if test $title_i_want = ""
        xprop -f _NET_WM_NAME 8u -set _NET_WM_NAME "WIDNOW WILL START RENAMING ITSELF AS NORMAL" -id $window_id
        exit
    # otherwise just change the title to what i want
    else if test $current_title != $title_i_want
        xprop -f _NET_WM_NAME 8u -set _NET_WM_NAME "$title_i_want" -id $window_id
        set has_renamed_before "TRUE"
    end
end

EDIT: Tôi thực sự không sử dụng kịch bản Fish này nữa;
Tôi viết lại nó trong Ruby:

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

require 'trollop'
opts = Trollop.options do
                        opt :title_i_want,  "title_i_want",     default: ""
                        opt :bluh,          "write to bluh",    default: nil
                        opt :copy_title,    "copy_title",       default: nil
# TODO - AUTO OPTION                                            
                        opt :auto,          "auto",             default: nil
end

title_i_want    = opts[:title_i_want]


def get_current_wid
    `xprop -root _NET_ACTIVE_WINDOW`[/0x\w+/]
end

def with_current_title wid, &block
    IO.popen("xprop -spy _NET_WM_NAME _NET_WM_ICON_NAME -id #{wid}") do |io|
        loop do
            line = io.gets
            exit if line.nil?
            line = line.strip
            # cut off extraneous not-the-title bits of that string
            current_title = line[/(?:_NET_WM_(?:ICON_)?NAME\(UTF8_STRING\) = ")(.*)("$)/, 1]

            block.call current_title unless current_title.nil?
        end
    end
end
def get_current_title wid
    IO.popen("xprop _NET_WM_NAME _NET_WM_ICON_NAME -id #{wid}") do |io|
            line = io.gets.strip
            # cut off extraneous not-the-title bits of that string
            current_title = line[/(?:_NET_WM_(?:ICON_)?NAME\(UTF8_STRING\) = ")(.*)("$)/, 1]

            return current_title unless current_title.nil?
    end
end

if opts[:copy_title]
    # require "muflax"
    p 1
    wid = get_current_wid
    `echo -n '#{get_current_title wid}(WID: #{wid})'|xclip -selection c`
    exit
end
if opts[:bluh]
    require "muflax"
    loop do
        # p 1   #db
        wid = get_current_wid
        # p 2   #db
        File.open "bluh", "a+" do |f| f.puts get_current_title wid end
        while wid == get_current_wid
            # puts "..."    #db
            sleep 1
        end
    end
    exit
end

#> 1A - from terminal - give title_i_want
if not title_i_want.empty?
#> 1A.1 - get current wid - assume it's the terminal_wid
    terminal_wid = get_current_wid
#> 1A.2 - wait for wid to change
    while get_current_wid == terminal_wid
        puts "focus the window you want to title «#{title_i_want}»..."
        sleep 1
    end
#> 1A.3 - set new wid to target TWID
    TWID = get_current_wid

#> 1B - from hotkey (or just sleeping) - no give title_i_want
else
#> 1B.1 - set current wid to target TWID
    TWID = get_current_wid
#> 1B.2 - get title_i_want (with kdialog)
#> 1B.2.1 - default to current title
    with_current_title TWID do |current_title|
        # v :current_title  #db
        default_title = current_title

        sublime_match = /
            (?<beginning>.*?)                                   # beginning might be...
                                                                #           path
                                                                #           untitled, find results, other useless junk
                                                                #           𝌆 dired
            (?<dirty>\s•)?                                      # dirty?
            (?:\s\(\.?(?<projname>[^()]*)\))?                   # project name, preceded by "." (i name them that way), and in rkaks (sublime does that)
                                                                # or, sans dot, it's the dir, if the window was opened as a dir
            (?<issub>\s-\sSublime\sText\s2\s\(UNREGISTERED\))   # garbage at the end that marks it as a sublime window
        /x =~ current_title

        #if it's a sublime window...
        if sublime_match
            dummy = beginning.split("/")
            if dummy.length > 1
                taildir = dummy[-2]
            end
            /𝌆 (?<direddir>.*)/ =~ beginning

            default_title =
            if      projname    ;   projname
            elsif   taildir     ;   taildir
            elsif   direddir    ;   direddir
            else                ;   beginning
            end
        end

        if opts[:auto]
            title_i_want = default_title
        else
            title_i_want = `kdialog --title "entitled" --inputbox "type the title you want and hit enter.\nto stop renaming,\njust enter nothing and hit esc" '#{default_title}'`.chomp
        end
        break
    end
end


# v :terminal_wid   #db
# v :TWID           #db
# v :ARGV           #db
# v :title_i_want   #db


def set_title wid, title
    `xprop  -f _NET_WM_NAME 8u      -set _NET_WM_NAME       "#{title}"  -id #{wid}`
    `xprop  -f _NET_WM_ICON_NAME 8u -set _NET_WM_ICON_NAME  "#{title}"  -id #{wid}`
end


#> 2 - apply title to TWID
#> 2.1 - allow de-naming
#> 2.2 - allow renaming

# this bit is needed for a kludge that allows window renaming
has_renamed_before  = false
interrupt_message   = "WAIT WAIT I WANT A TURN BLOO BLOO BLEE BLUH BLOO" # hopefully i never want to actually use that as a title xD
`xprop -f _NET_WM_NAME 8u -set _NET_WM_NAME '#{interrupt_message}' -id #{TWID}`

with_current_title TWID do |current_title|

    # if title_i_want is an empty string, exit
    if title_i_want.empty?
        # p 1   #db
        set_title TWID, "WINDOW WILL START RENAMING ITSELF AS NORMAL"
        exit

    # if the current title is the interrupt message
    # AND
    # this script has renamed the window at least once before
    # then we wanna let the new name take over
    elsif current_title == interrupt_message and has_renamed_before
        # p 2   #db
        exit


    # otherwise just change the title to what i want
    elsif current_title != title_i_want
        # p 3   #db
        set_title TWID, title_i_want
        has_renamed_before = true
    end
end

Có cái này làm việc cho tôi!
Sean

Tìm tập lệnh này trên GitHub tại đây: github.com/seanmadsen/kustom-window-title
Sean

Kịch bản ruby ​​dường như không hoạt động trên Kubfox 16.04? Tôi nhận được cửa sổ bật lên, nhưng tiêu đề cửa sổ không thay đổi. Kịch bản cá hoạt động tuyệt vời, mặc dù!
Siêu nhiên

2

Những gì bạn đang tìm kiếm âm thanh như một cơ sở gắn thẻ cửa sổ . Tôi nghi ngờ KDE có hỗ trợ cho việc này, các WM khác (như XMonad hoặc DWM, v.v.) làm.

Do đó, một khả năng để đạt được sự tăng năng suất này sẽ là đổi kwinlấy XMonadđịnh cấu hình XMonad để thực hiện gắn thẻ . Cơ chế gắn thẻ XMonad như được mô tả trong liên kết thứ hai sẽ là liên kết một tổ hợp phím để mở một dấu nhắc cho phép bạn gắn thẻ cửa sổ tập trung. (Cấu hình của XMonad thực sự là một chương trình Haskell, vì vậy đừng ngần ngại yêu cầu trợ giúp trong #xmonad.

Chỉnh sửa: Mặc dù tôi khuyên mọi người ít nhất nên thử ốp lát WM một thời gian, tôi đã quên chỉ ra rằng trong khi XMonad thường được gọi là WM ốp lát, có một nút "phao đơn giản". Chắc chắn có các WM khác hỗ trợ gắn thẻ và bố cục không ốp lát, nhưng tôi không biết về khả năng tương tác của chúng với KDE.


1

Vì không có cách nào để đặt tiêu đề cửa sổ thành viết bảo vệ, sẽ không có giải pháp cho vấn đề đó, vì nhiều chương trình đặt lại tiêu đề của chúng theo các hành động khác nhau như bạn đã phát hiện ra.

Nhưng có lẽ một gợi ý hay cho người KDE và Gnome ;-)


0

Tôi đã tìm kiếm điều tương tự và cho cùng một lý do. Đã kết thúc việc dành quá nhiều thời gian cho việc này, với kịch bản 70 dòng này.

Làm thế nào nó hoạt động?

  • bắt đầu kịch bản
  • bấm vào cửa sổ bạn muốn đặt tiêu đề
  • và nhập tiêu đề bạn muốn

Sau đó, nó sẽ bắt đầu một vòng lặp trong nền, kiểm tra cứ sau 3 giây và đặt tiêu đề nếu nó thay đổi.

Cảnh báo: không chạy hai lần trên cùng một cửa sổ, tập lệnh không hoàn hảo.

tên tập lệnh ví dụ:sticky-title

#!/bin/bash


# stop all instance of this script if "killall" provided as first argument
if [ "$1" == "killall" ]; then
  scriptname=$(basename "$0")
  pattern="[0-9]* /bin/bash .*$scriptname$"
  pids=$(ps ax -o pid,cmd | grep -P "$pattern" | sed 's/^ *//;s/ *$//' | grep -Pv ' grep|killall$' | cut -d" " -f1)
  if [ "$pids" != "" ]; then
    kill -TERM $pids
    echo "$(echo '$pids' | wc -l) instances stopped"
  else
    echo "None found to stop"
  fi
  exit 0
fi

# ask for window
echo -en "\nClick the window you want to set its title "
id=$(printf %i $(xwininfo | grep 'Window id' | cut -d" " -f4))

# fail if no window id
if [ "$id" == "" ]; then
  echo 'Error: Window id not found'
  exit 1
else
  echo "- Got it"
fi

# ask for title
read -e -p "Enter target title: " title

# fail if no title
if [ "$title" == "" ]; then
  echo "Error: No title to set"
  exit 1
fi

# define loop as a function, so we can run it in background
windowByIdSetStickyTitle() {
  local id title curr_title
  id="$1"
  title="$2"

  while true; do
    # get current title
    curr_title="$(xdotool getwindowname $id 2>/dev/null)"

    # exit if we can't find window anymore
    if [ $? -ne 0 ]; then
      echo "Window id does not exist anymore"
      break
    fi

    # update title if changed
    if [ "$curr_title" != "$title" ]; then
      xdotool set_window --name "$title" $id
    fi

    # needed else you will eat up a significant amount of cpu
    sleep 3
  done
}

# infinite loop
windowByIdSetStickyTitle $id "$title" &


# done
echo "Sticky title set"
exit 0
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.