From Fedora Project Wiki

< FWN‎ | Beats

No edit summary
No edit summary
 
(2 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 fourth 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 4 : Control de Acceso y Duck Typing===
=== dwm ===


Cuando se diseña una interfase de una clase es importante considerar cuánto se expone de la clase al exterior. El permitir mucho acceso a su clase incrementa el riesgo de incrementar el "acoplamiento" en su aplicación, es decir, depender en demasía de los detalles de la implementación en vez de su interfase lógica.
<code>
# yum install dwm
</code>


En Ruby la única forma fácil de cambiar el estado de un objeto es por medio del uso de uno de sus métodos, controle el acceso a los métodos y controlará el acceso al objeto. Ruby ofrece tres niveles de protección:
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.


    * Métodos públicos: pueden ser invocados por cualquiera, no se aplica ningún control de acceso. Los métodos son públicos por omisión excepto initiliaze que siempre es privado.
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:
    * Métodos protegidos: sólo pueden ser invocados por objetos de la misma clase o subclases. El acceso se mantiene a la familia.
    * Métodos privados: no pueden ser invocados con un receptor explícito, el receptor siempre es self. Esto significa que los métodos privados sólo pueden ser llamados en el contexto del objeto actual, no se puede invocar los métodos privados de otro objeto.


Una diferencia importante con otros lenguajes orientados a objeto es que el control de acceso es determinado dinámicamente en la medida que el programa se ejecuta. Obtendrá una violación de acceso sólo cuando intente ejecutar el método restringido.
TeclaWin+Shift+Enter


====Especificación del control de acceso====
    uxterm es un envoltorio para xterm, un emulador de terminal para X, ambos provistos por el paquete xterm.


Se especifica el nivel de acceso de los métodos dentro de una clase o módulo utilizando una o más de las tres funciones public, protected y private. Puede usar cada función en dos formas diferentes.
A partir de ahí puede arrancar sus aplicaciones, si, desde un terminal, no olvide agregar el & para dejarla en el fondo, por ejemplo.
 
Si se usan sin argumentos, las tres funciones definen el control de acceso de los métodos subsiguientes.


<code>
<code>
1 class MiClase
$ totem &
2    def metodo1    # 'public' por omisión
3      #
4    end
5
6  protected        # los subsiguientes métodos serán 'protected'
7
8    def metodo2   
9      #
10    end
11
12  private          # los subsiguientes métodos serán 'private'
13
14    def metodo3
15      #
16    end     
17
18  public          # los subsiguientes métodos serán 'public'
19
20    def metodo4
21      #
22    end
23 end
</code>
</code>
dwm-user¶


De forma alternativa puede simplemente listar los métodos en dichas funciones.
dwm-user incluye los fuentes de dwm y el guión de arranque dwm-start.


<code>
<code>
1 class MiClase
# yum install dwm-user
2  def metodo1
3    #
4  end
5  # ... y el resto de las definiciones de métodos
6
7  public    :metodo1, :metodo4
8  protected :metodo2
9  private  :metodo3
10 end
</code>
</code>


====Ejemplo private====
==== Login ====


El ejemplo abajo muestra un esqueleto para proteger un método peligroso de alteración del estado del objeto por medio del uso de otro método intermediario que se supone asegura el acceso, esto ayuda a mantener el código separado pero simple, uno asegura por ejemplo las credenciales, el otro ajusta el estado del objeto.
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.


<code>
===== dwm.desktop =====
1 class Banco
 
2  def initialize
[Desktop Entry]
3    @tasa="10%"
Type=Application
4  end
Encoding=UTF-8
5
Name=dwm
6  def tasa
GenericName=Window Manager
7    @tasa
Comment=Dynamic window manager for X
8  end
Exec=dwm
9
Terminal=false
10  def interfase_segura(nueva_tasa)  # Se supone que es "segura", llama al método privado
TryExec=dwm
11    # Código de seguridad
 
12    self.tasa=nueva_tasa
[Window Manager]
13  end
SessionManaged=true
14
 
15 private
===== dwm-user.desktop ======
16  def tasa=(nueva_tasa)
 
17    @tasa=nueva_tasa
[Desktop Entry]
18  end
Type=Application
19 end
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
</code>
</code>


<code>
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!.
1 >> banco = Banco.new
 
2 => #<Banco:0xb747e318 @tasa="10%">
=== Keybindings ===
3 >> banco.tasa
 
4 => "10%"
==== Layouts ====
5 >> banco.interfase_segura("20%")
 
6 => "20%"
* Mod4-t Poner la disposición tiled (cuadros).
  7 >> banco.tasa
 
8 => "20%"
* Mod4-f Poner la disposición a floating (flotante).
  9 >> banco.tasa="30%"
 
10 NoMethodError: private method `tasa=' called for #<Banco:0xb747e318 @tasa="20%">
* Mod4-m Poner la disposición a monocle (monóxulo).
11    from (irb):63
 
12
* Mod4-Shift-space Conmuta la disposición de estado de la ventana enfocada entre tiled y flotante.
</code>
 
==== 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.


====Ejemplo protected====
==== dmenu: lanzador de aplicaciones ====


Por definición este control de acceso limita el acceso a la familia, objetos de la misma clase, y objetos de clases derivadas de la clase que define el método protegido. Abajo un ejemplo simple para comparar manzanas con manzanas, no con peras.
dmenu es un menú dinámico para X (lanzador de aplicaciones).


<code>
<code>
1 class Manzana
# yum install dmenu
2  def initialize(peso)
3    @peso = peso
4  end
5
6  def <=>(otra_manzana)
7    self.peso <=> otra_manzana.peso
8  end
9
10  protected
11
12  def peso
13    @peso
14  end
15 end
16
17 class Pera
18  def initialize(peso)
19    @peso = peso
20  end
21
22  def <=>(otra_pera)
23    self.peso <=> otra_pera.peso
24  end
25
26  protected
27
28  def peso
29    @peso
30  end
31 end
</code>
</code>


<code>
Para usarlo en dwm Fedora presione:
1 >> m1 = Manzana.new(100)
2 => #<Manzana:0xb74838e0 @peso=100>
3 >> m2 = Manzana.new(200)
4 => #<Manzana:0xb747dda0 @peso=200>
5 >> p1 = Pera.new(50)
6 => #<Pera:0xb74783c8 @peso=50>
7 >> m1 <=> m2
8 => -1
9 >> m1 <=> p1
10 NoMethodError: protected method `peso' called for #<Pera:0xb74783c8 @peso=50>
11    from ./manzanas.rb:7:in `<=>'
12    from (irb):11
13
</code>


Al intentar hacer la comparación entre manzana y pera, se invoca pera.peso en el contexto de las manzanas, y ya que el método está protegido, entonces da el error.
TeclaWin+p


Ahora bien, esta idea de uso para protected en realidad está en franco desuso por muchos ya que va en contra de la flexibilidad y dinamismo natural de Ruby y del concepto de Duck Typing que explicaremos a continuación.
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.


====Duck Typing====
==== Hacks ====


En Ruby no declaramos tipos de variables o tipos para los métodos, todo es simplemente alguna encarnación, un objeto de una clase, y las clases no son tipos. Si deseamos programar con la filosofía Duck Typing lo único que necesita recordar es que el "tipo" de objeto está determinado por lo que puede hacer, no por su clase.
===== stalonetray systray =====


En la práctica esto significa que hay pocas pruebas de valores de objeto. Por ejemplo digamos que estamos programando un método para agregar información de dos objetos de cierta clase y obtener un resultado String. Los programadores con conocmientos de C# o Java estarían tentados a hacer algo como lo siguiente:
stalonetray es un systray simple, punto.


<code>
<code>
1 def anexar(obj1,obj2)
~/.dwm/config.h
2  # probar que se nos han dado lo parámetros correctos
 
3  unless obj1.kind_of?(String)
static Rule rules[] = {
4    fail TypeError.new("Se espera String")
/* class instance title tags mask isfloating */
5  end
{ "stalonetray", NULL, "stalonetray", ~0, False },
6  unless obj2.kind_of?(String)
};
7    fail TypeError.new("Se espera String")
8  end
9  obj1 << obj2
10 end
</code>
</code>
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


<code>
<code>
  1 >> anexar("Hola", " Mundo")
~/.dwm/config.h
  2 => "Hola Mundo"
 
3 >> anexar("Hola", 1)
1 /*static const char *termcmd[] = { "uxterm", NULL };*/
4 TypeError: Se espera String
2 static const char *termcmd[] = { "terminator", NULL };
5    from ./dt.rb:7:in `anexar'
6
</code>
</code>


Si abraza la filosofía Duck Typing de Ruby podrá escribir este método de una forma mucho más simple.
===== tags con nombres =====
 
Tener los tags simplemente numerados es conveniente, pero tal vez sienta la necesidad de ponerles un nombre.


<code>
<code>
1 def anexar(obj1,obj2)
~/.dwm/config.h
2  obj1 << obj2
 
3 end
/* tagging */
static const char *tags[] = { "term", "web", "email", "chat", "fm", "mmx", "7", "8", "9" };
</code>
</code>


Usted no necesita verificar el tipo de los argumentos en tanto que se soporte el método << en obj1 simplemente todo funcionará bien. Si no es así, se lanzará una excepción de todas maneras, el mismo resultado de que si usted hubiera implementado la verificación. Pero de pronto su método es mucho más flexible, puede pasarle otros objetos no necesariamente String, tal vez un Fixnum.
==== 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 >> anexar("Hola", 1)
/usr/src/dwm-user-5.8.2-9.fc15/dwm.c
2 => "Hola\001"
 
1       [DestroyNotify] = destroynotify,
2 /*      [EnterNotify] = enternotify, */
3      [Expose] = expose,
</code>
</code>


¿Qué pasa si obj1 no soporta el método << entonces?
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 >> anexar(1.2, " dos ")
~/xrandr
2 NoMethodError: undefined method `<<' for 1.2:Float
 
3    from (irb):6:in `anexar'
xrandr --output VGA1 --mode 1280x1024
4    from (irb):13
xrandr --output LVDS1 --mode 1280x800
5
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>


Obtenemos una excepción NoMethodError para el método << para la clase Float en este ejemplo. Una forma de prevenir posible es usar el método respond_to?:
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:


<code>
* nm-applet : applet para systray de Network Manager, le facilitará conectarse a redes.
1 def anexar(obj1,obj2)
* PNMixer : mezclador de audio para el systray, le permitirá ajustar el volumen.
2  # probar que se nos han dado lo par ámetros correctos
* Empathy , cliente chat.
3  unless obj1.respond_to?(:<<)
* Pidgin , cliente chat.
4    fail TypeError.new("'obj1' necesita la capacidad <<")
* batti, monitor de batería, suspender, hibernar.
5  end
6
7  obj1 << obj2
8 end
</code>


Pero nuevamente esto es más código que mantener y hay que evaluar si realmente quiere tomar ese trabajo ya que igualmente podría manejar las excepciones más arriba.
==== Mi configuración feliz ====


Si ahora pasa un Array como obj2 obtendrá un error de tipo ya que Array no es un String pero si podemos invocar el método to_s para obtener una representación razonable. En última instancia lo que queremos es que nuestro método si nos devuelva un String.
Esta sección es para poner "mi configuración", mis ajustes, mis aplicaciones preferidas que se ajustan a mi manera de trabajar en dwm.


<code>
* fbpanel configurado a lo mínimo, no toma foco y se esconde solo, lo veo cuando quiero :).
1 >> arreglo = [0,1,2]
* dmenu como lanzador de aplicaciones.
2 => [0, 1, 2]
* terminator como emulador de terminales.
3 >> anexar("Hola", arreglo.to_s)
* tmux multiplexor de terminales.
4 => "Hola012"
* pidgin cliente multiprotocolo para chat (irc, gtalk, identica, twitter, fb ).
</code>
* 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.


Esto nos lleva a una nueva versión del método anexar, usando to_s para "convertir" los objetos en String, ahora ya tampoco necesitamos la verificación respond_to? ya que String responde a << . Tal vez ahora lo que necesita es validar es que tengan una representación en String, es decir, que respondan a to_s.
* Pendiente bloqueo de pantalla.


<code>
Un pantallazo, por supuesto.
1 def anexar(obj1, obj2)
2  # probar que se nos han dado lo parámetros correctos
3  unless obj1.respond_to?(:to_s)
4    fail TypeError.new("Se espera que responda a to_s")
5  end
6  unless obj2.respond_to?(:to_s)
7    fail TypeError.new("Se espera que responda a to_s")
8  end
9
10  obj1.to_s << obj2.to_s
11 end
</code>


El código de prueba puede llevarle nuevamente a situaciones indeseables. ¿Soporta obj1 << pero no to_s? Es mejor lidiar con las excepciones que ponerse a probar los tipos y/o los métodos a los que responde. Con esta nueva versión, podemos por ejemplo pasarle dos arreglos, mejor dicho, cualquier par de objetos que tenga una representación String (to_s) y concatenarlos y obtener una salida en String.
==== Referencias ====


<code>
* http://en.gentoo-wiki.com/wiki/Dwm
1 >> arreglo = [0,1,2]
* http://www.linuxjournal.com/content/going-fast-dwm
2 => [0, 1, 2]
* http://www.linuxgoodies.com/review_dwm.html
3 >> anexar(arreglo, arreglo)
4 => "012012"
</code>


Ahora veamos nuestro método en acción con varios objetos involucrados:
==== Pendientes ====


<code>
* 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).
1 >> anexar("Hola", " Mundo")                          ; dos String
2 => "Hola Mundo"
3 >> anexar(1, " Mundo")                                ; Fixnum + String
4 => "1 Mundo"
5 >> anexar(1, 1)                                       ; dos Fixnum
6 => "11"
7 >> anexar(1, 1.1)                                    ; Fixnum + Float
8 => "11.1"   
9 >> anexar(1, [1,2," :) "])                            ; Fixnum + Array
10 => "112 :) "  
11 >> anexar({1=> "mundo", 2 => "hola"}, [1,2," :) "])  ; Hash + Array
12 => "1mundo2hola12 :) "
</code>


De lo único que debe preocuparse en su clase particular es que soporte to_s para tomar ventaja de nuestro método, si no fallará con una excepción. Veamos:
* 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.


<code>
* 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.
1 >> class Miclase
2 >> end
3 => nil
4 >> miobj = Miclase.new
5 => #<Miclase:0x7fb2a1b2c770>
6 >> anexar("Uh?", miobj)
7 => "Uh?#<Miclase:0x7fb2a1b2c770>"          ; to_s ya existe!
8 >> anexar(miobj, "¡Ah!")
9 => "#<Miclase:0x7fb2a1b2c770>\302\241Ah!"  ; to_s ya existe...
</code>


Por supuesto puede sobrescribir el método to_s heredado de Object.
Gomix"

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"