Überschreiben Sie den Fenstertitel für ein beliebiges Fenster in KDE und legen Sie einen benutzerdefinierten Fenstertitel fest

14

Wenn Sie hier KDE verwenden, gibt es möglicherweise eine Lösung, die auch mit anderen Desktop-Umgebungen funktioniert. Ich habe es oft mit vielen, vielen Fenstern zu tun. Die meisten Fenster enthalten viele Registerkarten (z. B. ein Dolphin-Fenster mit vielen Registerkarten oder Firefox, Konsole usw.). Der Fenstertitel ändert sich basierend auf meiner aktuellen Registerkarte (was meistens hilfreich ist), aber wenn ich mit so vielen Fenstern arbeite, möchte ich sie ein wenig organisieren und das Fenster manuell umbenennen Überschreiben des Fenstertitels, den die Anwendung angibt . Ich könnte ein Firefox-Fenster "Recherchieren" und ein anderes Firefox-Fenster "Dokumentation" nennen, um leicht zwischen den Fenstern unterscheiden zu können, die ich zum Organisieren und Gruppieren verschiedener Registerkarten verwendet habe.

Im Idealfall könnte ich auf eine Fenstertitelleiste klicken und ihr auf einfache Weise einen benutzerdefinierten Namen geben, aber ich würde mich mit einer Lösung begnügen, die etwas umständlicher ist, solange sie funktioniert.

Ich habe versucht, wmctrl -r :SELECT: -T "Research"aber das funktioniert nur vorübergehend (der Titel wird zurückgesetzt, wenn die Anwendung ihn ändert, zum Beispiel beim Wechseln der Registerkarten).

Sean
quelle
Native KDE-Apps haben eine --captionBefehlszeilenoption, mit der Sie den Fenstertitel festlegen können, aber ich glaube nicht, dass Sie genau danach suchen.
David Z
@ SeanMadsen Heya, brauchst du das noch? Denn wenn Sie das tun, würde ich gerne wissen, ob Sie mein Skript für Sie zum Laufen bringen können. ^^;
Owen_R
Vielen Dank @Owen_R Ihr Skript hat funktioniert, und ich habe eine Repo auf GitHub .
Sean
@ SeanMadsen ha, ich bin froh zu hören, dass jemand anderes endlich etwas von meiner Antwort hat! Obwohl das Komische ist, dass ich selbst dieses Fisch-Skript nicht mehr benutze; Ich habe es vor einiger Zeit in Ruby umgeschrieben. Ich werde es aber realistisch nicht schaffen, es irgendwann selbst auf Github zu setzen, also habe ich es einfach bis zum Ende meiner Antwort bearbeitet, wenn du es willst.
Owen_R

Antworten:

4

Ich hatte genau das gleiche Problem.

Also habe ich ein Shell-Skript geschrieben, das ich an einen Hotkey gebunden habe.

Wenn ich den Hotkey drücke, erhält er die Fenster-ID des aktuell aktiven Fensters (dasjenige, das den Fokus hat).

Anschließend wird ein Popup-Dialogfeld angezeigt, in dem Sie den Titel eingeben, den das Fenster haben soll.

Jedes Mal, wenn dieses Fenster seinen Namen ändert, wird der gewünschte Titel angezeigt.

Um das Skript zu verwenden, benötigen Sie:

  • das fish Muschel
    (ich habe es eher in Fisch geschrieben als in Bash, weil Bash mir Kopfschmerzen bereitet)

  • kdialog

  • eine Möglichkeit, das Skript an einen Hotkey zu binden
    (ich benutze xbindkeys, denn alles, was ich tun musste, um es zum Laufen zu bringen, war:

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

(dh Fenstertaste + t)
für meine /home/o1/.xbindkeysrc)

Vielen Dank an diesen Typen , der mir die Informationen über das magische Xprop-Zeug gegeben hat.

(Wie vor einem Jahr, und dann bin ich nie dazu gekommen, das Drehbuch bis heute zu schreiben. XD)

PS Wenn ein Neuling diese Antwort findet und nicht weiß, wie er sie verwenden soll, frag mich einfach und ich werde dich durch sie führen. ^^

EDIT: Ich habe es aktualisiert, so dass Sie es von der Kommandozeile mit den Schaltern -tfür title_i_wantund verwenden können-w für verwenden können window_id.

Hier ist das 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: Ich benutze dieses Fish-Skript eigentlich nicht mehr.
Ich habe es in Ruby umgeschrieben:

#!/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
quelle
Ja, das hat bei mir funktioniert!
Sean
Finden Sie dieses Skript auf GitHub hier: github.com/seanmadsen/kustom-window-title
Sean
Das Ruby-Skript scheint auf Kubuntu 16.04 nicht zu funktionieren? Ich erhalte das Popup-Fenster, aber der Fenstertitel ändert sich nicht. Das Fischskript funktioniert aber super!
Supernormal
2

Was Sie suchen, klingt wie eine Fensterbeschriftungsfunktion . Ich bezweifle, dass KDE dies unterstützt, andere WMs (wie XMonad oder DWM usw.).

So ist eine Möglichkeit , diese Steigerung der Produktivität zu erreichen , wäre zu handeln kwinin für XMonad und configure XMonad Tagging zu tun . Der XMonad-Markierungsmechanismus, wie er im zweiten Link beschrieben ist, besteht darin, eine Tastenkombination zu binden, um eine Eingabeaufforderung zu öffnen, mit der Sie das fokussierte Fenster markieren können. (XMonads Konfiguration ist eigentlich ein Haskell-Programm, also zögern Sie nicht, in #xmonad um Hilfe zu bitten.

Bearbeiten: Während ich jedem raten würde, zumindest einmal eine Kachel-WM auszuprobieren, habe ich vergessen darauf hinzuweisen, dass XMonad im Allgemeinen als Kachel-WM bezeichnet wird, es jedoch einen "einfachen Float" -Modus gibt. Es gibt sicherlich andere WMs, die Tagging- und Non-Tiling-Layouts unterstützen, aber ich weiß nicht, ob sie mit KDE kompatibel sind.

sr_
quelle
1

Da es keine Möglichkeit gibt, den Fenstertitel so einzustellen, dass er schreibgeschützt ist, gibt es keine Lösung für dieses Problem, da viele Programme ihren Titel nach verschiedenen Aktionen zurücksetzen, wie Sie bereits festgestellt haben.

Aber vielleicht ein netter Vorschlag für die KDE- und Gnome-Leute ;-)

ktf
quelle
0

Ich suchte das Gleiche und den gleichen Grund. Es endete damit, zu viel Zeit damit zu verbringen, mit diesem 70-Zeilen-Skript.

Wie funktioniert es?

  • Starten Sie das Skript
  • Klicken Sie auf das Fenster, in dem Sie einen Titel festlegen möchten
  • und geben Sie den gewünschten Titel ein

Dann wird eine Schleife im Hintergrund gestartet, alle 3 Sekunden überprüft und der Titel festgelegt, wenn er sich ändert.

Warnung: Führen Sie das Programm nicht zweimal im selben Fenster aus, da das Skript nicht perfekt ist.

Beispiel für einen Skriptnamen: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
quelle