KDE'de rastgele bir pencere için pencere başlığını geçersiz kılma ve özel bir pencere başlığı ayarlama


14

KDE'yi burada kullanmak, ancak diğer masaüstü ortamlarıyla da çalışan bir çözüm olabilir. Çoğu zaman birçok pencere ile uğraşıyorum. Pencerelerin çoğunda çok sayıda sekme bulunur (örneğin, çok sayıda sekmeli bir Dolphin penceresi veya Firefox, Konsole vb.). Pencere başlığı geçerli sekme göre değişir (çoğunlukla çoğu zaman yardımcı olur), ancak çok fazla pencereyle çalışırken bunları biraz organize etmek ve pencereyi manuel olarak yeniden adlandırabilmeyi istiyorum , uygulamanın verdiği pencere başlığını geçersiz kılar . Farklı sekmeleri buna göre düzenlemek ve gruplandırmak için kullandığım pencereleri kolayca ayırt edebilmek için bir Firefox penceresi "Araştırma" ve diğer Firefox penceresi "Belgeleri" olarak adlandırabilirim.

İdeal olarak bir pencere başlık çubuğuna tıklayabilir ve kolayca özel bir ad verebilirim, ancak çalıştığı sürece biraz daha hantal bir çözüm bulurdum.

Denedim wmctrl -r :SELECT: -T "Research"ama bu sadece geçici olarak çalışıyor (başlık, uygulama değiştiğinde, örneğin sekmeleri değiştirirken geri döndürülür).


Yerel KDE uygulamalarının --captionpencere başlığını ayarlamanızı sağlayan bir komut satırı seçeneği var, ancak aradığınız şeyin bu olduğunu sanmıyorum.
David Z

@SeanMadsen Heya, buna hala ihtiyacın var mı? Çünkü eğer yaparsan, senaryonun senin için çalışıp çalışmayacağını bilmek isterim. ^^;
Owen_R

Teşekkürler @Owen_R Senaryonuz çalıştı ve GitHub'da bir repo ekledim .
Sean

@SeanMadsen ha, başka birinin sonunda cevabımdan biraz faydalandığını duyduğuma sevindim! Komik olan şey şu ki ben kendim artık o balık senaryosunu kullanmıyorum; Bir süre önce Ruby'de yeniden yazdım. Gerçi gerçekçi bir şekilde yakında kendimi github üzerine koymak için uğraşmayacağım, bu yüzden eğer istersen cevabımın sonuna kadar düzenledim.
Owen_R

Yanıtlar:


4

Aynı problemi yaşadım.

Bu yüzden bir kısayol tuşuna bağlı olduğum bir kabuk betiği yazdım.

Kısayol tuşuna bastığımda, o anda etkin olan pencerenin pencere kimliğini alır (odağı olan).

Ardından, pencerenin sahip olmasını istediğiniz başlığı girdiğiniz bir açılır iletişim kutusu sağlar.

Sonra bu pencere adını her değiştirdiğinde, pencereyi istediğiniz başlığa geri döndürür.

Komut dosyasını kullanmak için şunlara ihtiyacınız vardır:

  • fishKabuk
    (Daha doğrusu bash çünkü bash daha balık yazdım başımı ağrıtıyor)

  • kdialog

  • bir kısayol için komut dosyası bağlamak için bir yol
    (ben kullanmak xbindkeys, çünkü işe almak için yapmak zorunda tüm eklemek oldu:

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

(Bu pencere tuşu + t vardır)
kardeşime karşı /home/o1/.xbindkeysrc)

Bana sihirli xprop şeyleri hakkında bilgi veren bu ahbap sayesinde .

(Mesela bir yıl önce ve sonra senaryoyu bugüne kadar hiç yazmadım. XD)

PS: Herhangi bir acemi bu cevabı bulur ve nasıl kullanılacağını bilmiyorsa, bana sor ve ben de sana yol göstereceğim. ^^

DÜZENLEME: Ben anahtarlarla komut satırından kullanabilirsiniz böylece onu güncellenmiş -tiçin title_i_wantve -wiçin window_id.

İşte senaryo:

#!/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

DÜZENLEME: Aslında bu Fish betiğini artık kullanmıyorum;
Ruby'de yeniden yazdım:

#!/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

Evet bu benim için çalıştı!
Sean

GitHub'da bu script'i bulabilirsiniz: github.com/seanmadsen/kustom-window-title
Sean

Ruby script Kubuntu 16.04 üzerinde çalışmıyor gibi görünüyor? Açılır pencereyi alıyorum, ancak pencere başlığı değişmiyor. Balık betiği olsa harika çalışıyor!
Olağanüstü

2

Aradığınız şey bir pencere etiketleme tesisi gibi geliyor . KDE'nin bunu desteklediğinden şüpheliyim, diğer WM'ler ( XMonad veya DWM vb.)

Dolayısıyla, bu verimlilik artışını elde etmek için bir olasılık XMonad için ticaret kwinyapmak ve XMonad'ı etiketleme yapacak şekilde yapılandırmak olacaktır . İkinci bağlantıda açıklandığı gibi XMonad etiketleme mekanizması, odaklanmış pencereyi etiketlemenize izin veren bir istem açmak için bir tuş kombinasyonunu bağlamak olacaktır. (XMonad'ın yapılandırması aslında bir Haskell programıdır, bu nedenle #xmonad'da yardım istemekten çekinmeyin.

Düzenleme: Herkes en azından bir süre bir döşeme WM denemek için tavsiye ederken, XMonad yaygın bir döşeme WM olarak adlandırılırken, "basit bir şamandıra" -mode olduğunu işaret etmeyi unuttum. Etiketleme ve döşeme olmayan düzenleri destekleyen başka WM'ler de vardır, ancak KDE ile birlikte çalışabilirliklerini bilmiyorum.


1

Pencere başlığını yazmaya karşı korumaya ayarlamanın bir yolu olmadığından, birçok program zaten keşfettiğiniz gibi farklı eylemler üzerine başlıklarını sıfırladığından, bu sorunun çözümü olmayacaktır.

Ama belki KDE ve Gnome insanları için güzel bir öneri ;-)


0

Aynı şeyi ve aynı nedenle arıyordum. Bu 70 satır komut dosyasıyla, bunun için çok fazla zaman harcadı.

O nasıl çalışır?

  • senaryoyu başlat
  • başlık ayarlamak istediğiniz pencereyi tıklayın
  • ve istediğiniz başlığı girin

Ardından arka planda bir döngü başlatır, her 3 saniyede bir kontrol eder ve değişirse başlığı ayarlar.

Uyarı: Aynı pencerede iki kez çalışma, komut dosyası mükemmel değil.

örnek komut dosyası adı: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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.