GNU/Linux >> Znalost Linux >  >> Linux

Přepsat nadpis okna pro libovolné okno v Kde a nastavit vlastní nadpis okna?

Zde se používá KDE, ale může existovat řešení, které funguje i v jiných prostředích desktopů. Často mám co do činění s mnoha mnoha okny. Většina oken obsahuje mnoho karet (např. okno Dolphin s mnoha kartami nebo Firefox, Konsole atd.). Název okna se změní na základě mé aktuální karty (což je většinou užitečné), ale při práci s tolika okny bych je rád trochu uspořádal amohl ručně pojmenujte okno, přičemž přepíšete nadpis okna, který aplikace poskytuje . Jedno okno Firefoxu bych mohl pojmenovat „Výzkum“ a další okno Firefoxu „Dokumentace“, abych mohl snadno rozlišovat mezi okny, která jsem použil k uspořádání a podle toho seskupit různé karty.

V ideálním případě bych mohl kliknout na záhlaví okna a snadno mu dát vlastní název, ale spokojil bych se s řešením, které je o něco těžkopádnější, pokud to funguje.

Vyzkoušel jsem wmctrl -r :SELECT: -T "Research" ale to funguje pouze dočasně (název se vrátí zpět, když jej aplikace změní, například při přepínání karet).

Přijatá odpověď:

Měl jsem úplně stejný problém.

Napsal jsem tedy skript shellu, který jsem svázal s klávesovou zkratkou.

Když stisknu klávesovou zkratku, získá ID okna aktuálně aktivního okna (toho, které má fokus).

Poté se vám zobrazí vyskakovací dialogové okno, kde zadáte název, který chcete, aby toto okno mělo.

Potom pokaždé, když toto okno změní svůj název, změní jej zpět na požadovaný název.

K použití skriptu potřebujete:

  • fish shell
    (napsal jsem to v rybách spíše než bash, protože z bash mě bolí hlava)

  • kdialog

  • nějaký způsob, jak svázat skript s klávesovou zkratkou
    (používám xbindkeys , protože vše, co jsem musel udělat, aby to fungovalo, bylo přidat:

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

(tj. klávesa okna + t)
na můj /home/o1/.xbindkeysrc )

Díky tomuto chlápkovi, který mi dal informace o magických xprop věcech.

(Jako před rokem a pak jsem se nikdy nedostal k psaní scénáře až do dneška. xD )

P.S. Pokud nějaký nováček najde tuto odpověď a neví, jak ji použít, zeptejte se mě a já vám ji provedu. ^^

EDIT:Aktualizoval jsem jej, abyste jej mohli používat z příkazového řádku pomocí přepínačů -t pro title_i_want a -w pro window_id .

Zde je skript:

#!/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:Ve skutečnosti už tento skript Fish nepoužívám;
Přepsal jsem ho do 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

Linux
  1. Jak nastavit výchozí terminál (nebo správce oken, prohlížeč a mnoho dalšího) v Linuxu

  2. Název aplikace Qt

  3. Jak mohu získat aktuální datum a čas v terminálu a nastavit pro něj vlastní příkaz v terminálu?

  1. Jak změnit výchozí délku čáry pro Od a Hexdump?

  2. Nastavte datum, čas a časové pásmo na serveru Linux

  3. Použití skriptu Apache2Buddy pro výkon a stabilitu

  1. Získejte aktuální název okna pomocí Pythonu a Xorg

  2. Kdy zkontrolovat EINTR a opakovat volání funkce?

  3. Hibernate + MySQL:Jak nastavit kódování utf-8 pro databázi a tabulky