From Fedora Project Wiki

< FWN‎ | Beats

No edit summary
No edit summary
 
(3 intermediate revisions by the same user not shown)
Line 5: Line 5:
LATAM Fedora is a regular column of Spanish language contributions around open source software.  It is our first expansion into incorporating foreign language content into FWN.   
LATAM Fedora is a regular column of Spanish language contributions around open source software.  It is our first expansion into incorporating foreign language content into FWN.   


This week's contribution is from [[User:gomix|Guillermo Gómez]], a third installment on Ruby.  Enjoy!
This week's contribution is from [[User:gomix|Guillermo Gómez]], a review of the dwm window manager.  Enjoy!


===Ruby Capítulo 3 : Métodos===
=== dwm ===


Como ya hemos venido desarrollando en nuestra previas entregas, los métodos sabemos se definen por medio de la palabra clave def. Los nombres de métodos deben comenzar con una letra minúscula. Los métodos que funcionan como consultas suelen ser llamados con el sufijo "?", tal como instance_of? Los métodos peligrosos o que modifican el objeto mismo suelen también llamarse con un el sufijo "!". Por ejemplo String tiene el método chop y chop!. El primero devuelve un string modificado, el segundo modifica el objeto mismo.
<code>
# yum install dwm
</code>
 
Cuando se intenta organizar ventanas en otros entornos de escritorio, la mayoría son una pesadilla, pruebe dwm, hiperligero, sólo para geeks. dwm consiste de un único binario de 54k (el distribuido por Fedora) que sólo se puede personalizar recompilando los fuentes. Ya veremos más adelante que en Fedora esto se puede hacer fácilmente.


El cuerpo de un método contiene expresiones Ruby normales, excepto que no se puede definir un método de instancia, clase o modulo dentro de un método, si lo intenta obtendrá un error como el siguiente:
Al comenzar ni sabrá cómo arrancar su primera aplicación, la documentación (man dwm) dice Mod4-Shift-Return para arrancar uxterm, eso se traduce usualmente a:
 
TeclaWin+Shift+Enter
 
    uxterm es un envoltorio para xterm, un emulador de terminal para X, ambos provistos por el paquete xterm.
 
A partir de ahí puede arrancar sus aplicaciones, si, desde un terminal, no olvide agregar el & para dejarla en el fondo, por ejemplo.


<code>
<code>
1 SyntaxError: compile error
$ totem &
2 (irb):2: class definition in method body
3    from (irb):7
</code>
</code>
dwm-user¶


El valor devuelto por los métodos es el valor de la última expresión ejecutada, o el resultado explícito de una expresión return.
dwm-user incluye los fuentes de dwm y el guión de arranque dwm-start.


<code>
<code>
1 >> def resultado
# yum install dwm-user
2 >> "Uno"
3 >> end
4 >> p resultado
5 "Uno"
6
7 >> def resultado
8 >> "Uno"
9 >> return true
10 >> end
11 => nil
12 >> p resultado
13 true
</code>
</code>


====Parámetros====
==== Login ====
 
El paquete dwm provee una entrada /usr/share/xsessions/dwm.desktop y el paquete dwm-user incluye /usr/share/xsessions/dwm-user.desktop. La única diferencia es el modo de arranque.
 
===== dwm.desktop =====
 
[Desktop Entry]
Type=Application
Encoding=UTF-8
Name=dwm
GenericName=Window Manager
Comment=Dynamic window manager for X
Exec=dwm
Terminal=false
TryExec=dwm
 
[Window Manager]
SessionManaged=true


Ya que sabe definir un método con su nombre, ahora seguramente se encontrará con la necesidad de invocar el método pasando parámetros.
===== dwm-user.desktop ======


<code>
[Desktop Entry]
1 def miMetodo(arg1, arg2, arg3)
Type=Application
2  # su codigo
Encoding=UTF-8
3 end
Name=dwm-user
4
GenericName=Window Manager
5 def miOtroMetodo
Comment=Dynamic window manager for X (user configuration)
6  # sin argumentos
Exec=dwm-start
7  # su codigo
Terminal=false
8 end
TryExec=dwm-start
 
[Window Manager]
SessionManaged=true
</code>
</code>


Ruby le permite definir valores por omisión a los argumentos de lo métodos que son obviados durante la invocación.
dwm-start es el método de arranque preferido para DWM en Fedora ya que entonces podrá personalizar su entorno, esto significa compilar su versión de DWM con su versión de las cabeceras en su directorio personal sin intervención manual, ¡cool!.
 
=== Keybindings ===
 
==== Layouts ====
 
* Mod4-t Poner la disposición tiled (cuadros).
 
* Mod4-f Poner la disposición a floating (flotante).
 
* Mod4-m Poner la disposición a monocle (monóxulo).
 
* Mod4-Shift-space Conmuta la disposición de estado de la ventana enfocada entre tiled y flotante.
 
==== Navegar entre ventanas ====
 
* Mod4-j Cambiar/enfocar la próxima ventana.
 
* Mod4-k Cambiar/enfocar la ventana previa.
 
* Mod4-Tab Cambia a los tags previamente seleccionados.


<code>
==== Area maestra ====
1 def trampa(arg1="boba", arg2="tnt", arg3="30s")
2  "#{arg1}, #{arg2}, #{arg3}"
3 end


1 ?> trampa
* Mod4-h Decrementa el tamaño del área maestra.
2 => "boba, tnt, 30s"
3 >> trampa("lisa")
4 => "lisa, tnt, 30s"
5 >> trampa("lisa","h2o")
6 => "lisa, h2o, 30s"
7 >> trampa("lisa","h2o", "45h")
8 => "lisa, h2o, 45h"
</code>


Si desea pasar una cantidad variable de argumentos, o desea capturar múltiples argumentos en un único parámetro, el colocar un asterisco (*) antes del nombre del último argumento hace justo eso.
* Mod4-l Incrementa el tamaño del área maestra.


<code>
* Mod4-Return Cicla/aumenta la ventana enfocada desde/hacia el área maestra (sólo en disposición de cuadros).
1 def varargs(arg1, *resto)
2  "Recibi #{arg1} y #{resto.join(', ')}"
3 end


1 >> varargs("uno")
2 => "Recibi uno + "
3 >> varargs("uno","dos")
4 => "Recibi uno + dos"
5 >> varargs("uno","dos","tres")
6 => "Recibi uno + dos, tres"
7 >> varargs("uno","dos","tres", "cuatro")
8 => "Recibi uno + dos, tres, cuatro"
</code>


El resto de argumentos se apilan en un Array y se pone a disposición del método bajo el nombre especificado.
==== Salir/cerrar ====


====Métodos con y sin bloques asociados====
* Mod4-Shift-c  Cerrar la ventana enfocada.


Una técnica poderosa con Ruby es la posibilidad de asociar bloques de código a los métodos, veamos un ejemplo simple para ilustrar la técnica.
* Mod4-Shift-q  Salir de dwm.


<code>
==== Poniendo los tags a las ventanas ====
1 >> def con_y_sin_bloque(p1)
2 >>  if block_given?
3 >>    yield(p1)
4 >>  else
5 ?>    p1
6 >>  end
7 >> end
8 => nil
9 >> con_y_sin_bloque(10) { |p1| (1..5).each { |m| p m + p1 } }
10 11
11 12
12 13
13 14
14 15
15 => 1..5
16 >> con_y_sin_bloque(10)
17 => 10
</code>


Para determinar la presencia del bloque hemos usado el método block_given? para condicionar el procesamiento en la ejecución del método. Luego yield permite ejecutar dicho bloque de código ruby con el argumento que deseemos, en este caso p1.
* Mod4-Shift-[1..n] Aplica el tag n a la ventana enfocada.


Si en la definición de método, el último parámetro es precedido por un ampersand "&", cualquier bloque asociado a la llamada es convertido a un objeto Proc y dicho objeto es asignado a dicho parámetro, veamos un ejemplo para visualizar su uso.
* Mod4-Button1-tagicon Aplica el tag n a la ventana enfocada (haga clic en la barra con botón izquierdo)


<code>
* Mod4-Button2-tagicon Agrega el tag n a la ventana enfocada (haga clic en la barra con botón derecho)
1 class CalculadoraDeVentas
2  def initialize(nombre, &bloque)
3    @nombre, @bloque = nombre, bloque
4  end
5
6  def precio_de_venta(costo)
7    @bloque.call(costo)
8  end
9 end


1 >> cpd = CalculadoraDeVentas.new("Distribuidor1") { |costo| p "Precio de venta #{(1.5*costo).to_s} BsF." }
* Mod4-Shift-0 Aplica todos los tags a la ventana enfocada.
2 => #<CalculadoraDeVentas:0xb735ccc8 @nombre="Distribuidor1", @bloque=#<Proc:0xb735cd18@(irb):75>
3 >> cpm = CalculadoraDeVentas.new("Minorista1") { |costo| p "Precio de venta #{(1.8*costo).to_s} BsF." }
4 => #<CalculadoraDeVentas:0xb7347008 @nombre="Minorista1", @bloque=#<Proc:0xb7347058@(irb):77>
5
6 >> cpd.precio_de_venta(100)
7 "Precio de venta 150.0 BsF."
8 => nil
9 >> cpm.precio_de_venta(100)
10 "Precio de venta 180.0 BsF."
11 => nil
</code>


En el ejemplo hemos introducido el uso del método call de Proc para invocar la ejecución correspondiente y con los argumentos necesarios. Tendremos más que decir acerca de Proc en futuras ediciones.
==== Dos pantallas ====


Por supuesto que esta funcionalidad puede implementarse de otras maneras, muchas otras maneras, el ejemplo lo que demuestra sutilmente es que también es posible reusar bloques de código por medio del uso de los bloques asociados a las llamadas de los métodos, es decir, puede por ejemplo compartir un bloque de código con más de una definición de método en su aplicación de hecho reduciendo y reusando el código por medio de funcionalidad común no representaba en clases o módulos. Esto igualmente puede hacerse en tiempo de ejecución, es decir, código que genera código y que lo pasa otro código para que lo ejecute. Si está confundido es porque está comenzando a experimentar el fuerte componente de dinamismo que tiene Ruby, no se asuste y abrace el poder que de esto se deriva.
* Para enviar una app de una pantalla a otra tiene las siguientes tres opciones:
  * En modo flotante, se puede simplemente arrastrar la ventana de una pantalla a otra.
  * Mod4-Shift-, envía la ventana con el foco a la pantalla previa, si hay alguna.
  * Mod4-Shift-. envía la ventana con el foco a la próxima pantalla, si hay alguna.


====Invocando los métodos====
==== dmenu: lanzador de aplicaciones ====


Usted puede invocar o "llamar" un método especificando un "receptor" (objeto), el nombre del método, y opcionalmente algunos parámetros y un bloque asociado. Para el caso de los métodos de clase y módulo, el receptor sería el nombre de clase o módulo.
dmenu es un menú dinámico para X (lanzador de aplicaciones).


<code>
<code>
1  File.size("archivo_grande.mpeg")
# yum install dmenu
2  Math.sin(Math::PI/3)
</code>
</code>


Si se omite el receptor, se usa self, el objeto actual:
Para usarlo en dwm Fedora presione:
 
TeclaWin+p


<code>
Aparecerá un menú en la parte superior, en la medida que tipee se reducirán las opciones, termina tu selección, o navega con las teclas flecha, presiona enter y listo, su aplicación será iniciada, incluso puede utilizar tab para autocompletar.
1 >> self.class
 
2 => Object
==== Hacks ====
3 >> self.hash
4 => -608576338
5 >> hash
6 => -608576338
7 >> self.object_id
8 => -608576338
9 >> object_id
10 => -608576338
</code>


Note que he evitado intencionalmente llamar a class omitiendo el receptor, y ello es porque provoca un error, class es ambiguo, es una palabra clave (keyword) y Ruby cree que usted está tratando de definir una clase, no intenta self.class. En estos casos, use self.class, en general es mejor explicitar el receptor, es más legible y potencialmente evitará estas ambigüedades difíciles de depurar.
===== stalonetray systray =====


También observe con cuidado que no es igual Object.hash a self.hash ya que self es una instancia de Object en el ejemplo y Object.hash es un método de clase, referencian a hash diferentes, uno a la instancia (self), y el otro a la clase Object.
stalonetray es un systray simple, punto.


<code>
<code>
1 >> self.class
~/.dwm/config.h
2 => Object
 
3 >> self.object_id
static Rule rules[] = {
4 => -608576338
/* class instance title tags mask isfloating */
5 >> Object.object_id
{ "stalonetray", NULL, "stalonetray", ~0, False },
6 => -608573798
};
</code>
</code>


Los paréntesis en la llamada al método para listar los argumentos son opcionales, sin embargo para evitar ambigüedades, le recomendamos fuertemente que siempre use los paréntesis, tal vez sólo en los casos más simples puede evitarse.
Esto asegura que stalonetray sea visible a lo largo de todos los tags.


====Expandiendo arreglos en las llamadas====
===== terminator en vez de uxterm =====


De forma similar a la invocación con asterisco, en reversa, al invocar un método es posible "expandir" un arreglo para que cada elemento sea tomado como elemento individual.
Mod4-Shift-Return de caja arranca uxterm, deseo cambiar eso a terminator


<code>
<code>
1  def cinco(a,b,c,d,e)
~/.dwm/config.h
2    "Argumentos #{a} #{b} #{c} #{d} #{e}"
3  end


1 >> cinco("un", *["dos", "tres" , "cuatro", "cinco"])
1 /*static const char *termcmd[]  = { "uxterm", NULL };*/
  2 => "Argumentos un dos tres cuatro cinco"  
2 static const char *termcmd[]  = { "terminator", NULL };
3 >> cinco(*["un", "dos", "tres" , "cuatro", "cinco"])
4 => "Argumentos un dos tres cuatro cinco"
5 >> cinco("un", *["dos", "tres" , "cuatro", "cinco"])
  6 => "Argumentos un dos tres cuatro cinco"
7 >> cinco("un", *["dos", "tres"] , "cuatro", "cinco")    # Debe ser el último argumento
8 SyntaxError: compile error
</code>
</code>


==== Argumentos opcionales====
===== tags con nombres =====


Usando el mismo ejemplo de arriba, intente pasar menos de cinco argumentos:
Tener los tags simplemente numerados es conveniente, pero tal vez sienta la necesidad de ponerles un nombre.


<code>
<code>
1 >> cinco
~/.dwm/config.h
2 ArgumentError: wrong number of arguments (0 for 5)
 
/* tagging */
static const char *tags[] = { "term", "web", "email", "chat", "fm", "mmx", "7", "8", "9" };
</code>
</code>


Los cinco argumentos son obligatorios, una forma de convertirlos en opcionales es asignarles un valor por omisión nil.
==== Foco sigue al ratón, deshabilitar ====
 
No me gusta la idea de que el movimiento del ratón defina el foco de las ventanas, suele provocarme problemas por la sensibilidad de los touchpad y de los ratones ópticos que "se mueven solos" entonces cambian el foco de la ventana a una ventana que nada que ver con lo que estoy trabajando. En este caso debe comentar una declaración en el código fuente.
 
<code>
<code>
1  def cinco(a=nil,b=nil,c=nil,d=nil,e=nil)
/usr/src/dwm-user-5.8.2-9.fc15/dwm.c
2     "Argumentos #{a} #{b} #{c} #{d} #{e}"
3  end


1 >> cinco
1       [DestroyNotify] = destroynotify,
2 => "Argumentos    "
2 /*      [EnterNotify] = enternotify, */
3 >> cinco("uno")
3       [Expose] = expose,
4 => "Argumentos uno    "
</code>
</code>


Sin embargo note que no puede especificar el tercer argumento sin especificar el segundo, debe respetar la secuencialidad en la definición de los argumentos. Veamos la siguiente versión revisada para visualizar los argumentos pasados al método.
Y forzar una compilación, yo resolví ajustando ficticiamente por ejemplo un nombre de un tag y luego devolviendo el cambio (no estoy seguro que el sistema de construcción de dwm en Fedora note mis cambios en dwm.c).
 
==== Dos monitores al vuelo ====
 
Si iniciamos sesión DWM con los dos monitores encendidos en Fedora no hay problemas todo funciona al pelo, sin embargo, puede que necesite conectar y encender el segundo monitor una vez ya iniciada la sesión, por supuesto no queremos reiniciar nuestra sesión DWM. Casualmente me tropecé con esta circunstancia y reusé un pequeño script xrandr, la sorpresa es que no tuve que hacer nada con DWM, simplemente apareció el segundo monitor con sus nueve tags listo para trabajar. En resumidas, sólo debe configurar para detectar el segundo monitor, el script abajo es la forma que usé en mi laptop:


<code>
<code>
1  def cinco(a=nil,b=nil,c=nil,d=nil,e=nil)
~/xrandr
2    "Argumentos 1:#{a} 2:#{b} 3:#{c} 4:#{d} 5:#{e}"
 
3  end
xrandr --output VGA1 --mode 1280x1024
xrandr --output LVDS1 --mode 1280x800
xrandr --output VGA1 --left-of LVDS1
 
~/xrandr-alreves
 
xrandr --output VGA1 --mode 1024x768
xrandr --output LVDS1 --mode 1280x800
xrandr --output VGA1 --right-of LVDS1
</code>
</code>


Use nil para saltar al próximo argumento en la lista cuanda haga la invocación del método.
La primera forma es para que el segundo monitor quede al lado izquierdo del primero, la segunda, al revés.
 
==== Aplicaciones systray ====
 
Ya sea con stalonetray o cualquier otro panel que incorpore un systray para el sistema, seguro deseará usar algunas de las siguientes aplicaciones:
 
* nm-applet : applet para systray de Network Manager, le facilitará conectarse a redes.
* PNMixer : mezclador de audio para el systray, le permitirá ajustar el volumen.
* Empathy , cliente chat.
* Pidgin , cliente chat.
* batti, monitor de batería, suspender, hibernar.
 
==== Mi configuración feliz ====
 
Esta sección es para poner "mi configuración", mis ajustes, mis aplicaciones preferidas que se ajustan a mi manera de trabajar en dwm.
 
* fbpanel configurado a lo mínimo, no toma foco y se esconde solo, lo veo cuando quiero :).
* dmenu como lanzador de aplicaciones.
* terminator como emulador de terminales.
* tmux multiplexor de terminales.
* pidgin cliente multiprotocolo para chat (irc, gtalk, identica, twitter, fb ).
* pcmanfm es mi gestor de archivos gui preferido, seguido de nautilus.
* totem y/o xine para ver películas y videos en general.
* listen como reproductor de audio.
* radiotray como reproductor de radio.
* nm-applet para conectarme a redes.
* batti para vigilar la batería de mi laptop, suspender e hibernar.
 
* Pendiente bloqueo de pantalla.
 
Un pantallazo, por supuesto.
 
==== Referencias ====


<code>
* http://en.gentoo-wiki.com/wiki/Dwm
1 >> cinco
* http://www.linuxjournal.com/content/going-fast-dwm
2 => "Argumentos 1: 2: 3: 4: 5:"
* http://www.linuxgoodies.com/review_dwm.html
3 >> cinco("A",nil,nil,"D")
4 => "Argumentos 1:A 2: 3: 4:D 5:"
</code>


==== Simulando argumentos por nombres: hash ====
==== Pendientes ====


Si bien Ruby no tiene un verdadero soporte para "keyword arguments", es decir, pasar argumentos con su nombre y valor, nada nos impide simular dicho comportamiento usando un hash. Ruby incluso tiene un pequeño atajo que nos evita la sintáxis Hash {} para evitarnos confundir con un bloque asociado. El hash debe estar especificado de último en la lista de argumentos.
* Al usar tint2 este es sujeto de foco de ventana, quiero evitar ello ya que no deseo pasar por tint2 para llegar a otra aplicación, es en realidad el primer punto fastidioso para mi en el uso de dwm. Si tint2 aparece en todos los tags (algo deseable), entonces es sujeto de tener el foco, es una "ventana más flotante" (stalonetray sufre igual).


<code>
* Con dos pantallas, en mi Fedora funciona perfecto, incluso mover las apps de una pantalla a otra, BUT, cómo etiqueto una app para que esté en la "otra" pantalla. En las dos pantallas tengo el panel con los 9 tags individuales del 1 al 9.
1 def hash_params(params)
2  p "ID: #{params[:id]}"  
3  p "Clave: #{params[:clave]}"
4 end


code class="ruby">
* dmenu no se muestra correctamente, en mi laptop cuando arranco con dos monitores, dmenu no se muestra correctamente, el reconectar físicamente el segundo monitor repara la falla, es algo con el X o el propio dwm.
>> hash_params(:id => "XXX" , :clave => "Z A Z Z")
"ID: XXX"
"Clave: Z A Z Z"
=> nil
>> hash_params(:clave => "1 2 3 4", :id => "007")
"ID: 007"
"Clave: 1 2 3 4"
=> nil
>> hash_params({:clave => "1 2 3 4", :id => "007"})  # Sintaxis estricta con las {}
"ID: 007"
"Clave: 1 2 3 4"


Loading...
Gomix"
Fudcon-panama-2011_728x90_leaderboard_rotated
Powered by Redmine Poder_fedora Poder_ruby Haproxy Powered_by_apache
</code>

Latest revision as of 01:48, 18 August 2011

LATAM Fedora!

LATAM Fedora is a regular column of Spanish language contributions around open source software. It is our first expansion into incorporating foreign language content into FWN.

This week's contribution is from Guillermo Gómez, a review of the dwm window manager. Enjoy!

dwm

  1. yum install dwm

Cuando se intenta organizar ventanas en otros entornos de escritorio, la mayoría son una pesadilla, pruebe dwm, hiperligero, sólo para geeks. dwm consiste de un único binario de 54k (el distribuido por Fedora) que sólo se puede personalizar recompilando los fuentes. Ya veremos más adelante que en Fedora esto se puede hacer fácilmente.

Al comenzar ni sabrá cómo arrancar su primera aplicación, la documentación (man dwm) dice Mod4-Shift-Return para arrancar uxterm, eso se traduce usualmente a:

TeclaWin+Shift+Enter

   uxterm es un envoltorio para xterm, un emulador de terminal para X, ambos provistos por el paquete xterm.

A partir de ahí puede arrancar sus aplicaciones, si, desde un terminal, no olvide agregar el & para dejarla en el fondo, por ejemplo.

$ totem & dwm-user¶

dwm-user incluye los fuentes de dwm y el guión de arranque dwm-start.

  1. yum install dwm-user

Login

El paquete dwm provee una entrada /usr/share/xsessions/dwm.desktop y el paquete dwm-user incluye /usr/share/xsessions/dwm-user.desktop. La única diferencia es el modo de arranque.

dwm.desktop

[Desktop Entry] Type=Application Encoding=UTF-8 Name=dwm GenericName=Window Manager Comment=Dynamic window manager for X Exec=dwm Terminal=false TryExec=dwm

[Window Manager] SessionManaged=true

dwm-user.desktop =

[Desktop Entry] Type=Application Encoding=UTF-8 Name=dwm-user GenericName=Window Manager Comment=Dynamic window manager for X (user configuration) Exec=dwm-start Terminal=false TryExec=dwm-start

[Window Manager] SessionManaged=true

dwm-start es el método de arranque preferido para DWM en Fedora ya que entonces podrá personalizar su entorno, esto significa compilar su versión de DWM con su versión de las cabeceras en su directorio personal sin intervención manual, ¡cool!.

Keybindings

Layouts

  • Mod4-t Poner la disposición tiled (cuadros).
  • Mod4-f Poner la disposición a floating (flotante).
  • Mod4-m Poner la disposición a monocle (monóxulo).
  • Mod4-Shift-space Conmuta la disposición de estado de la ventana enfocada entre tiled y flotante.

Navegar entre ventanas

  • Mod4-j Cambiar/enfocar la próxima ventana.
  • Mod4-k Cambiar/enfocar la ventana previa.
  • Mod4-Tab Cambia a los tags previamente seleccionados.

Area maestra

  • Mod4-h Decrementa el tamaño del área maestra.
  • Mod4-l Incrementa el tamaño del área maestra.
  • Mod4-Return Cicla/aumenta la ventana enfocada desde/hacia el área maestra (sólo en disposición de cuadros).


Salir/cerrar

  • Mod4-Shift-c Cerrar la ventana enfocada.
  • Mod4-Shift-q Salir de dwm.

Poniendo los tags a las ventanas

  • Mod4-Shift-[1..n] Aplica el tag n a la ventana enfocada.
  • Mod4-Button1-tagicon Aplica el tag n a la ventana enfocada (haga clic en la barra con botón izquierdo)
  • Mod4-Button2-tagicon Agrega el tag n a la ventana enfocada (haga clic en la barra con botón derecho)
  • Mod4-Shift-0 Aplica todos los tags a la ventana enfocada.

Dos pantallas

  • Para enviar una app de una pantalla a otra tiene las siguientes tres opciones:
  * En modo flotante, se puede simplemente arrastrar la ventana de una pantalla a otra.
  * Mod4-Shift-, envía la ventana con el foco a la pantalla previa, si hay alguna.
  * Mod4-Shift-. envía la ventana con el foco a la próxima pantalla, si hay alguna.

dmenu: lanzador de aplicaciones

dmenu es un menú dinámico para X (lanzador de aplicaciones).

  1. yum install dmenu

Para usarlo en dwm Fedora presione:

TeclaWin+p

Aparecerá un menú en la parte superior, en la medida que tipee se reducirán las opciones, termina tu selección, o navega con las teclas flecha, presiona enter y listo, su aplicación será iniciada, incluso puede utilizar tab para autocompletar.

Hacks

stalonetray systray

stalonetray es un systray simple, punto.

~/.dwm/config.h

static Rule rules[] = { /* class instance title tags mask isfloating */ { "stalonetray", NULL, "stalonetray", ~0, False }, };

Esto asegura que stalonetray sea visible a lo largo de todos los tags.

terminator en vez de uxterm

Mod4-Shift-Return de caja arranca uxterm, deseo cambiar eso a terminator

~/.dwm/config.h

1 /*static const char *termcmd[] = { "uxterm", NULL };*/ 2 static const char *termcmd[] = { "terminator", NULL };

tags con nombres

Tener los tags simplemente numerados es conveniente, pero tal vez sienta la necesidad de ponerles un nombre.

~/.dwm/config.h

/* tagging */ static const char *tags[] = { "term", "web", "email", "chat", "fm", "mmx", "7", "8", "9" };

Foco sigue al ratón, deshabilitar

No me gusta la idea de que el movimiento del ratón defina el foco de las ventanas, suele provocarme problemas por la sensibilidad de los touchpad y de los ratones ópticos que "se mueven solos" entonces cambian el foco de la ventana a una ventana que nada que ver con lo que estoy trabajando. En este caso debe comentar una declaración en el código fuente.

/usr/src/dwm-user-5.8.2-9.fc15/dwm.c

1 [DestroyNotify] = destroynotify, 2 /* [EnterNotify] = enternotify, */ 3 [Expose] = expose,

Y forzar una compilación, yo resolví ajustando ficticiamente por ejemplo un nombre de un tag y luego devolviendo el cambio (no estoy seguro que el sistema de construcción de dwm en Fedora note mis cambios en dwm.c).

Dos monitores al vuelo

Si iniciamos sesión DWM con los dos monitores encendidos en Fedora no hay problemas todo funciona al pelo, sin embargo, puede que necesite conectar y encender el segundo monitor una vez ya iniciada la sesión, por supuesto no queremos reiniciar nuestra sesión DWM. Casualmente me tropecé con esta circunstancia y reusé un pequeño script xrandr, la sorpresa es que no tuve que hacer nada con DWM, simplemente apareció el segundo monitor con sus nueve tags listo para trabajar. En resumidas, sólo debe configurar para detectar el segundo monitor, el script abajo es la forma que usé en mi laptop:

~/xrandr

xrandr --output VGA1 --mode 1280x1024 xrandr --output LVDS1 --mode 1280x800 xrandr --output VGA1 --left-of LVDS1

~/xrandr-alreves

xrandr --output VGA1 --mode 1024x768 xrandr --output LVDS1 --mode 1280x800 xrandr --output VGA1 --right-of LVDS1

La primera forma es para que el segundo monitor quede al lado izquierdo del primero, la segunda, al revés.

Aplicaciones systray

Ya sea con stalonetray o cualquier otro panel que incorpore un systray para el sistema, seguro deseará usar algunas de las siguientes aplicaciones:

  • nm-applet : applet para systray de Network Manager, le facilitará conectarse a redes.
  • PNMixer : mezclador de audio para el systray, le permitirá ajustar el volumen.
  • Empathy , cliente chat.
  • Pidgin , cliente chat.
  • batti, monitor de batería, suspender, hibernar.

Mi configuración feliz

Esta sección es para poner "mi configuración", mis ajustes, mis aplicaciones preferidas que se ajustan a mi manera de trabajar en dwm.

  • fbpanel configurado a lo mínimo, no toma foco y se esconde solo, lo veo cuando quiero :).
  • dmenu como lanzador de aplicaciones.
  • terminator como emulador de terminales.
  • tmux multiplexor de terminales.
  • pidgin cliente multiprotocolo para chat (irc, gtalk, identica, twitter, fb ).
  • pcmanfm es mi gestor de archivos gui preferido, seguido de nautilus.
  • totem y/o xine para ver películas y videos en general.
  • listen como reproductor de audio.
  • radiotray como reproductor de radio.
  • nm-applet para conectarme a redes.
  • batti para vigilar la batería de mi laptop, suspender e hibernar.
  • Pendiente bloqueo de pantalla.

Un pantallazo, por supuesto.

Referencias

Pendientes

  • Al usar tint2 este es sujeto de foco de ventana, quiero evitar ello ya que no deseo pasar por tint2 para llegar a otra aplicación, es en realidad el primer punto fastidioso para mi en el uso de dwm. Si tint2 aparece en todos los tags (algo deseable), entonces es sujeto de tener el foco, es una "ventana más flotante" (stalonetray sufre igual).
  • Con dos pantallas, en mi Fedora funciona perfecto, incluso mover las apps de una pantalla a otra, BUT, cómo etiqueto una app para que esté en la "otra" pantalla. En las dos pantallas tengo el panel con los 9 tags individuales del 1 al 9.
  • dmenu no se muestra correctamente, en mi laptop cuando arranco con dos monitores, dmenu no se muestra correctamente, el reconectar físicamente el segundo monitor repara la falla, es algo con el X o el propio dwm.

Gomix"