Anule el título de la ventana para una ventana arbitraria en KDE y establezca un título de ventana personalizado


14

Usando KDE aquí, pero puede haber una solución que también funcione con otros entornos de escritorio. A menudo estoy tratando con muchas ventanas. La mayoría de las ventanas contienen muchas pestañas (por ejemplo, una ventana Dolphin con muchas pestañas, o Firefox, Konsole, etc.). El título de la ventana cambiará en función de mi pestaña actual (que en su mayor parte es útil la mayor parte del tiempo), pero cuando trabajo con tantas ventanas me gustaría organizarlas un poco y poder cambiar el nombre de la ventana manualmente , anulando el título de la ventana que da la aplicación . Podría nombrar una ventana de Firefox "Investigación" y otra ventana de Firefox "Documentación" para poder distinguir fácilmente entre las ventanas que he usado para organizar y agrupar diferentes pestañas en consecuencia.

Lo ideal sería poder hacer clic en la barra de título de una ventana y darle fácilmente un nombre personalizado, pero me conformaría con una solución que sea un poco más engorrosa mientras funcione.

Lo he intentado wmctrl -r :SELECT: -T "Research"pero eso solo funciona temporalmente (el título se revierte cuando la aplicación lo cambia, por ejemplo, al cambiar de pestaña).


Las aplicaciones nativas de KDE tienen una --captionopción de línea de comandos que le permite configurar el título de la ventana, pero no creo que sea lo que está buscando.
David Z

@SeanMadsen Heya, ¿todavía necesitas esto? Porque si lo haces, me encantaría saber si puedes hacer que mi guión funcione para ti. ^^;
Owen_R

Gracias @Owen_R Tu script funcionó, y agregué un repositorio para él en GitHub .
Sean

@SeanMadsen, ja, ¡estoy feliz de escuchar que alguien finalmente consiguió algo de mi respuesta! Aunque lo curioso es que yo ya no uso ese guión de peces; Lo reescribí en rubí hace un tiempo. Sin embargo, en realidad no voy a poder ponerlo en Github pronto, así que lo edité al final de mi respuesta si lo desea.
Owen_R

Respuestas:


4

Tuve exactamente el mismo problema.

Así que escribí un script de shell que até a una tecla de acceso rápido.

Cuando presiono la tecla de acceso rápido, obtiene la identificación de la ventana de la ventana actualmente activa (la que tiene el foco).

Luego le da un cuadro de diálogo emergente donde ingresa el título que desea que tenga esa ventana.

Luego, cada vez que esa ventana cambia su nombre, lo vuelve a cambiar al título que desea.

Para usar el script, necesita:

  • la fishconcha
    (lo escribí en pescado en lugar de bash porque bash me da dolor de cabeza)

  • kdialog

  • alguna forma de vincular el script a una tecla de acceso rápido
    (lo uso xbindkeys, porque todo lo que tenía que hacer para que funcionara era agregar:

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

(es decir, tecla de ventana + t)
a mi /home/o1/.xbindkeysrc)

Gracias a este tipo , que me dio la información sobre las cosas mágicas de xprop.

(Como, hace un año, y nunca pude escribir el guión hasta hoy. XD)

PD: si un novato encuentra esta respuesta y no sabe cómo usarla, pregúnteme y lo guiaré. ^^

EDITAR: Lo actualicé para que pueda usarlo desde la línea de comandos con los interruptores -tpor title_i_wanty -wpara window_id.

Aquí está el guión:

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

EDITAR: en realidad ya no uso este script de Fish;
Lo reescribí 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

Sí, esto funcionó para mí!
Sean

Encuentre este script en GitHub aquí: github.com/seanmadsen/kustom-window-title
Sean

¿El script ruby ​​no parece funcionar en Kubuntu 16.04? Aparece la ventana emergente, pero el título de la ventana no cambia. ¡Sin embargo, el guión de peces funciona muy bien!
Supernormal el

2

Lo que estás buscando suena como una instalación de etiquetado de ventanas . Dudo que KDE tenga soporte para esto, otros WM (como XMonad o DWM, etc.) lo hacen.

Por lo tanto una posibilidad de lograr este aumento de la productividad sería el comercio kwinpor xmonad y configurar xmonad hacer etiquetado . El mecanismo de etiquetado de XMonad como se describe en el segundo enlace sería vincular una combinación de teclas para abrir un mensaje que le permita etiquetar la ventana enfocada. (La configuración de XMonad es en realidad un programa Haskell, así que no dudes en pedir ayuda en #xmonad.

Editar: Si bien aconsejaría a todos que al menos intenten un WM en mosaico en algún momento, olvidé señalar que, aunque XMonad se conoce comúnmente como WM en mosaico, hay un modo de "flotación simple". Seguramente hay otros WM que admiten diseños de etiquetado y sin mosaico, pero no sé sobre su interoperabilidad con KDE.


1

Dado que no hay forma de configurar el título de la ventana para proteger contra escritura, no habrá solución a ese problema, ya que muchos programas restablecen su título en diferentes acciones como ya ha descubierto.

Pero tal vez una buena sugerencia para la gente de KDE y Gnome ;-)


0

Estaba buscando lo mismo y por la misma razón. Terminé pasando demasiado tiempo en esto, con este script de 70 líneas.

¿Como funciona?

  • comenzar el guión
  • haga clic en la ventana que desea establecer un título
  • e ingrese el título que desea

Luego comenzará un bucle en el fondo, verificará cada 3 segundos y establecerá el título si cambia.

Advertencia: no se ejecute dos veces en la misma ventana, el script no es perfecto.

nombre de script de ejemplo: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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.