Ganti judul jendela untuk jendela sembarang di KDE dan tetapkan judul jendela khusus

14

Menggunakan KDE di sini, tetapi mungkin ada solusi yang bekerja dengan lingkungan desktop lain juga. Saya sering berurusan dengan banyak jendela. Sebagian besar jendela berisi banyak tab (misalnya jendela Dolphin dengan banyak tab, atau Firefox, Konsole, dll). Judul jendela akan berubah berdasarkan pada tab saya saat ini (yang sebagian besar sangat membantu sebagian besar waktu), tetapi ketika bekerja dengan begitu banyak jendela saya ingin sedikit mengaturnya dan dapat secara manual memberi nama baru jendela tersebut , menimpa judul jendela yang diberikan aplikasi . Saya mungkin menamai satu jendela Firefox "Penelitian" dan jendela Firefox lainnya "Dokumentasi" untuk dapat dengan mudah membedakan antara windows yang saya gunakan untuk mengatur dan mengelompokkan tab yang berbeda sesuai.

Idealnya, saya dapat mengklik bilah judul jendela dan dengan mudah memberikannya nama khusus, tetapi saya akan puas dengan solusi yang sedikit lebih rumit selama ini berhasil.

Saya sudah mencoba wmctrl -r :SELECT: -T "Research"tetapi itu hanya berfungsi sementara (judulnya dikembalikan ketika aplikasi mengubahnya, misalnya ketika berpindah tab).

Sean
sumber
Aplikasi asli KDE memang memiliki --captionopsi baris perintah yang memungkinkan Anda mengatur judul jendela, tapi saya rasa itu bukan yang Anda cari.
David Z
@SeanMadsen Heya, apakah Anda masih membutuhkan ini? Karena jika Anda melakukannya, saya ingin tahu apakah Anda dapat membuat skrip saya berfungsi untuk Anda. ^^;
Owen_R
Terima kasih @Owen_R Skrip Anda berfungsi, dan saya menambahkan repo untuk itu di GitHub .
Sean
@SeanMadsen ha, saya senang mendengar orang lain akhirnya menggunakan jawaban saya! Meskipun lucunya saya tidak menggunakan skrip ikan itu lagi; Saya menulis ulang di ruby ​​beberapa waktu lalu. Saya secara realistis tidak akan berkeliling untuk meletakkannya di github dalam waktu dekat, jadi saya hanya mengeditnya di akhir jawaban saya jika Anda menginginkannya.
Owen_R

Jawaban:

4

Saya punya masalah yang sama persis ini.

Jadi saya menulis skrip shell yang saya terikat ke hotkey.

Ketika saya menekan tombol pintas, ia mendapatkan id jendela dari jendela yang sedang aktif (salah satu yang memiliki fokus).

Kemudian itu memberi Anda dialog sembulan di mana Anda memasukkan judul yang Anda ingin memiliki jendela itu.

Lalu setiap kali jendela itu mengubah namanya, itu mengubahnya kembali ke judul yang Anda inginkan.

Untuk menggunakan skrip, Anda perlu:

  • yang fishshell
    (saya tulis dalam ikan daripada pesta cuz pesta memberi saya sakit kepala)

  • kdialog

  • beberapa cara untuk mengikat skrip ke hotkey
    (saya gunakan xbindkeys, karena semua yang harus saya lakukan untuk membuatnya bekerja adalah menambahkan:

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

(Yaitu, kunci jendela + t)
ke saya /home/o1/.xbindkeysrc)

Berkat pria ini , yang memberi saya info tentang hal-hal xprop ajaib.

(Seperti, setahun yang lalu, dan kemudian saya tidak pernah sempat menulis naskah sampai hari ini. XD)

PS Jika ada pemula yang menemukan jawaban ini dan tidak tahu bagaimana menggunakannya, tanyakan saja kepada saya dan saya akan memandu Anda melalui itu. ^^

EDIT: Saya memperbaruinya sehingga Anda dapat menggunakannya dari baris perintah dengan sakelar -tuntuk title_i_wantdan -wuntuk window_id.

Ini skripnya:

#!/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: Saya sebenarnya tidak menggunakan skrip Ikan ini lagi;
Saya menulis ulang di 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
Owen_R
sumber
Ya ini berhasil untuk saya!
Sean
Temukan skrip ini di GitHub di sini: github.com/seanmadsen/kustom-window-title
Sean
Skrip ruby ​​tampaknya tidak berfungsi di Kubuntu 16.04? Saya mendapatkan jendela pop-up, tetapi judul jendela tidak berubah. Namun, script ikannya sangat bagus!
Supernormal
2

Apa yang Anda cari terdengar seperti fasilitas penandaan jendela . Saya ragu KDE memiliki dukungan untuk ini, WM lain (seperti XMonad atau DWM dll) melakukannya.

Jadi salah satu kemungkinan untuk mencapai peningkatan produktivitas ini adalah dengan bertukar kwinuntuk XMonad dan mengkonfigurasi XMonad untuk melakukan penandaan . Mekanisme penandaan XMonad seperti yang dijelaskan dalam tautan kedua adalah untuk mengikat kombinasi tombol untuk membuka prompt yang memungkinkan Anda menandai jendela fokus. (Konfigurasi XMonad sebenarnya adalah program Haskell, jadi jangan ragu untuk meminta bantuan di #xmonad.

Sunting: Sementara saya menyarankan semua orang untuk setidaknya mencoba WM ubin, saya lupa menunjukkan bahwa sementara XMonad umumnya disebut sebagai WM ubin, ada -mode "simple float" -mode. Tentu saja ada WM lain yang mendukung penandaan dan tata letak non-ubin, tapi saya tidak tahu tentang interoperabilitas mereka dengan KDE.

sr_
sumber
1

Karena tidak ada cara untuk mengatur judul jendela untuk menulis proteksi tidak akan ada solusi untuk masalah itu, karena banyak program mengatur ulang judulnya pada tindakan yang berbeda seperti yang telah Anda temukan.

Tapi mungkin saran yang bagus untuk orang-orang KDE dan Gnome ;-)

ktf
sumber
0

Saya mencari hal yang sama dan untuk alasan yang sama. Akhirnya menghabiskan terlalu banyak waktu untuk ini, dengan skrip 70 baris ini.

Bagaimana cara kerjanya?

  • mulai skrip
  • klik jendela yang ingin Anda atur judul
  • dan masukkan judul yang Anda inginkan

Maka itu akan memulai loop di latar belakang, periksa setiap 3 detik, dan atur judulnya jika itu berubah.

Peringatan: jangan dijalankan dua kali di jendela yang sama, skrip tidak sempurna.

contoh nama skrip: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
bksunday
sumber