Remplacez le titre de la fenêtre pour une fenêtre arbitraire dans KDE et définissez un titre de fenêtre personnalisé

14

Utiliser KDE ici, mais il pourrait y avoir une solution qui fonctionne aussi avec d'autres environnements de bureau. J'ai souvent affaire à de nombreuses fenêtres. La plupart des fenêtres contiennent de nombreux onglets (par exemple une fenêtre Dolphin avec de nombreux onglets, ou Firefox, Konsole, etc.). Le titre de la fenêtre changera en fonction de mon onglet actuel (ce qui est généralement utile la plupart du temps), mais lorsque je travaille avec autant de fenêtres, j'aimerais les organiser un peu et pouvoir renommer manuellement la fenêtre , remplaçant le titre de la fenêtre que l'application donne . Je pourrais nommer une fenêtre Firefox "Recherche" et une autre fenêtre Firefox "Documentation" pour pouvoir distinguer facilement les fenêtres que j'ai utilisées pour organiser et grouper les différents onglets en conséquence.

Idéalement, je serais en mesure de cliquer sur la barre de titre d'une fenêtre et de lui donner facilement un nom personnalisé, mais je me contenterais d'une solution un peu plus lourde tant qu'elle fonctionnerait.

J'ai essayé wmctrl -r :SELECT: -T "Research"mais cela ne fonctionne que temporairement (le titre est inversé lorsque l'application le change, par exemple lors du changement d'onglets).

Sean
la source
Les applications natives de KDE ont une --captionoption de ligne de commande qui vous permet de définir le titre de la fenêtre, mais je ne pense pas que ce soit exactement ce que vous recherchez.
David Z
@SeanMadsen Heya, en avez-vous toujours besoin? Cuz si vous le faites, j'aimerais savoir si vous pouvez faire fonctionner mon script pour vous. ^^;
Owen_R
Merci @Owen_R Votre script a fonctionné, et j'ai ajouté un dépôt pour cela sur GitHub .
Sean
@SeanMadsen ha, je suis heureux d'entendre que quelqu'un d'autre a finalement utilisé ma réponse! Bien que ce qui est drôle, c'est que moi-même je n'utilise plus ce script de poisson; Je l'ai réécrit en rubis il y a quelque temps. En réalité, je ne vais pas pouvoir le mettre sur github de sitôt moi-même, donc je l'ai juste édité à la fin de ma réponse si vous le souhaitez.
Owen_R

Réponses:

4

J'ai eu exactement le même problème.

J'ai donc écrit un script shell que j'ai lié à un raccourci clavier.

Lorsque j'appuie sur le raccourci clavier, il obtient l'ID de fenêtre de la fenêtre actuellement active (celle qui a le focus).

Ensuite, il vous donne une boîte de dialogue contextuelle où vous entrez le titre que vous souhaitez que cette fenêtre ait.

Ensuite, chaque fois que cette fenêtre change de nom, elle le change de nouveau pour le titre que vous souhaitez.

Pour utiliser le script, vous avez besoin:

  • la fishcoquille
    (je l'ai écrit en poisson plutôt qu'en bash cuz bash me donne mal à la tête)

  • kdialog

  • un moyen de lier le script à un raccourci clavier
    (j'utilise xbindkeys, car tout ce que j'avais à faire pour le faire fonctionner était d'ajouter:

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

(c'est-à-dire la touche de la fenêtre + t)
vers mon /home/o1/.xbindkeysrc)

Merci à ce mec qui m'a donné des informations sur les trucs magiques de xprop.

(Comme, il y a un an, et puis je n'ai jamais réussi à écrire le script jusqu'à aujourd'hui. XD)

PS Si un débutant trouve cette réponse et ne sait pas comment l'utiliser, demandez-le-moi et je vous expliquerai. ^^

EDIT: je l'ai mis à jour afin que vous puissiez l'utiliser à partir de la ligne de commande avec les commutateurs -tpour title_i_wantet -wpourwindow_id .

Voici le script:

#!/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: En fait, je n'utilise plus ce script Fish;
Je l'ai réécrit en 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
la source
Oui, cela a fonctionné pour moi!
Sean
Trouvez ce script sur GitHub ici: github.com/seanmadsen/kustom-window-title
Sean
Le script ruby ​​ne semble pas fonctionner sur Kubuntu 16.04? Je reçois la fenêtre contextuelle, mais le titre de la fenêtre ne change pas. Le script poisson fonctionne très bien, cependant!
Supernormal
2

Ce que vous recherchez ressemble à une fonction de balisage de fenêtre . Je doute que KDE prenne en charge cela, d'autres WM (comme XMonad ou DWM, etc.) le font.

Ainsi, une possibilité pour obtenir cette augmentation de la productivité serait d' échanger kwinXMonad et de configurer XMonad pour effectuer le marquage . Le mécanisme de balisage XMonad tel que décrit dans le deuxième lien serait de lier une combinaison de touches pour ouvrir une invite qui vous permet de baliser la fenêtre focalisée. (La configuration de XMonad est en fait un programme Haskell, alors n'hésitez pas à demander de l'aide dans #xmonad.

Edit: Bien que je conseille à tout le monde d'essayer au moins un WM de mosaïque, j'ai oublié de souligner que bien que XMonad soit communément appelé WM de mosaïque, il existe un mode "flottant simple". Il y a sûrement d'autres WM qui prennent en charge le balisage et les dispositions sans mosaïque, mais je ne connais pas leur interopérabilité avec KDE.

sr_
la source
1

Puisqu'il n'y a aucun moyen de définir le titre de la fenêtre pour protéger en écriture, il n'y aura pas de solution à ce problème, car de nombreux programmes réinitialisent leur titre sur différentes actions comme vous l'avez déjà découvert.

Mais peut-être une belle suggestion pour les gens de KDE et Gnome ;-)

ktf
la source
0

Je cherchais la même chose et pour la même raison. J'ai fini par y consacrer trop de temps avec ce script de 70 lignes.

Comment ça marche?

  • démarrer le script
  • cliquez sur la fenêtre dont vous souhaitez définir le titre
  • et entrez le titre que vous voulez

Ensuite, il démarrera une boucle en arrière-plan, vérifiera toutes les 3 secondes et définira le titre s'il change.

Attention: ne courez pas deux fois sur la même fenêtre, le script n'est pas parfait.

exemple de nom de script: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
la source