miércoles, 6 de abril de 2011

Configuarión de gnome desde consola con el comando gconftool-2


Para establecer por defecto siertos valores como el fondo de pantalla, iconos y themas del gdk, se utiliza el comando “gconftools-2″ de consola, lo cual afecta a cada usuario presente o nuevo usuario dependiendo del caso.

el comando se compone de varias partes:

  • gconftool-2 –direct –config-source xml:readwrite:/etc/gconf/gconf.xml.mandatory \  = Define el recurso que se quiera modificar, además si es por defecto o reglamentario
  • –type string \  = Define el tipo de la entrada
  • –set /desktop/gnome/background/picture_filename nombre-de-archivo.png  = define la entrada a modificar y el valor que se quiere modificar.

Así entonces, si se quiere definir por defecto un fondo de pantalla el comando en la consola, como super usuario, sería:

gconftool-2 –direct –config-source xml:readwrite:/etc/gconf/gconf.xml.defaults \

–type string \

–set /desktop/gnome/background/picture_filename nombre-de-archivo.png

Si se quiere modificar el paquete de íconos por defecto en nuestra distro entonces pondríamos:
gconftool-2 –direct –config-source xml:readwrite:/etc/gconf/gconf.xml.defaults \

–type string \

–set /desktop/gnome/interface/icon_theme nombre-de-tema

O bien si se quiere modificar el thema del gtk:
gconftool-2 –direct –config-source xml:readwrite:/etc/gconf/gconf.xml.defaults \

–type string \

–set /desktop/gnome/interface/gtk_theme nombre-del-tema

Crear tema de Plymouth para el arranque del sistema

Este mini-manual está hecho para las distribuciones Ubuntu Lucid/Maverick, y se utiliza con línea de comandos sobre la terminal.


Antes de empezar se debe descargar el paquete simply_line que se encuentra en gnome-look.org, donde escogemos la versión de plymouth. Esto nos descargará un ".deb", el cual debemos abrir con el gestor de archivadores (como file-roller que es el que viene por defecto en Ubuntu). Nos posicionamos en de la ruta /lib/plymouth/themes/ dentro del paquete .deb y copiamos en el Escritorio (por cuestiones prácticas en este lugar es donde se realizarán los trabajos) la carpeta simply_line/, la cual es el tema que vamos a trabajar. Se procede seguido a cambiar el nombre de la carpeta por uno nuevo, el cual será el nombre del nuevo tema, en nuestro caso "innovaOS". Para esto utilizamos el comando mv desde la consola de comandos:
mv /home/usuario/Escritorio/simply_line /home/usuario/Escritorio/innovaOS

Entonces se debería tener una ruta como /home/usuario/Escritorio/innovaOS/ y dentro de ella unos archivos que en transcurso del manual se detallará para qué sirven.
Como se puede hacer notar el método de utilización para la creación del tema en este mini-manual es "La modificación" (gracias al software libre y sus libertades ;)). El tema a realizar se llamará InnovaOS.


Partes de un tema Plymouth

Un thema en plymouth es básicamente una serie de archivos en una carpeta, la carpeta tiene el nombre del tema que quiere crear. Esta carpeta se encuentra en una ruta específica que se verá más adelante, pero para su trabajo y modificación se puede hacer desde cualquier parte (como el escritorio /home/usuario/Escritorio). Para nuestro ejemplo del tema innovaOS la ruta sería: /home/usuario/Escritorio/innovaOS
Normalmente lleva el nombre del tema más la extensión "plymouth" (ejemplo simply_line.plymouth). En la configuración de un tema nuevo mediante el método de modificación, como es nuestro caso, se le cambiaría el nombre respetando la extensión (ejempo tu_tema.plymouth).
En el contenido de este archivo se establece el nombre, la descripción y las características de los archivos de script. Posee 2 características:


  • ImageDir: carpeta donde se encuentran las imágenes a utilizar en el tema
  • ScriptFile: se establece la ruta y nombre del archivo de script que tiene la programación del tema Plymouth.

El contenido del archivo sería:
[Plymouth Theme]
Name=Nombre del Tema
Description= Descripción que deseamos mostrar en el tema

ModuleName=script
[script]
ImageDir=/lib/plymouth/themes/nombre_del_tema
ScriptFile=/lib/plymouth/themes/nombre_del_tema/script.script


Archivos de imágenes.


Son todos los archivos de imágenes que se utilizarán para hacer nuestras animaciones, la ruta donde se encuentran se establece en el archivo de configuración. Pero a la hora de trabajar y modificar el thema lo trabajaremos en la carpeta que creamos al principio (en nuestro ejempo /home/usuario/Escritorio/innovaOS).


Archivo del script de programación.


El archivo que tiene todas las tareas y procedimientos que realizará plymouth según nosotros lo definamos. Este se encuentra en la ruta establecida en el archivo de configuración de plymouth, igual el nombre que debe tener
Antes de continuar se debe conocer un poco sobre el lenguaje de script utilizado por plymouth, para esto se debe leer el artículo publicado en freedesktop.org sobre el como programar en el lenguaje de script de plymouth.





Modificando nuestro tema



Primero cambiamos el nombre de la carpeta que anteriormente sacamos del paquete del tema de "simply_line" por "innovaOS". Esto se puede hacer en la linea de comandos con el comando mv:


# mv -R /home/usuario/Escritorio/simply_line /home/usuario/Escritorio/innovaOS




 nos posicionamos dentro de la carpeta del tema:



# cd /home/usuario/Escritorio/innovaOS



Editamos el archivo de configuración del plymouth, lo primero es cambiar el nombre del archivo por "innovaOS.plymouth". 


# mv simply_line.plymouth innovaOS.plymouth

Luego el contenido con un editor de texto (usaremos nano, pero pueden utilizar gedit, vi,kate o el que quieran):


# nano innovaOS.plymouth

quedando de la siguiente manera:

[Plymouth Theme]
Name=InnovaOS


Description= Innovando para vos


ModuleName=script



[script]

ImageDir=/lib/plymouth/themes/innovaOS

ScriptFile=/lib/plymouth/themes/innovaOS/script.script




Con respecto a las imágenes el tema que estamos modificando trae algunas interesantes, como las referentes a la barra de carga, estas imágenes se pueden sobrescribir por otras y así de fácil ya cambiamos un poco la apariencia de nuestra animación de arranque, eso sí, se debe respetar completamente el nombre que ya trae por defecto, caso contrario no aparecería y se tendría que modificar el script de programación. Para sobrescribir el archivo de imagen se puede hacer con un "cp" desde la línea de comandos:

# cp /ruta/imagen.png /home/usuario/Escritorio/innovaOS/progress_bar.png

Para agregar más imágenes en caso necesario se pueden también copiar dentro, por ejemplo:

# cp /ruta/logo.png /home/usuario/Escritorio/innovaOS/



Cuando agregamos una imagen nueva, o queremos hacer un cambio en la animación, se debe modificar el archivo de script que se encuentra dentro de la carpeta del tema que se está trabajando. Tomando el ejemplo anterior donde se agregó la imagen logo.png que no se encuentra dentro de la animación se puede agregar en el archivo (recordemos que el nombre del archivo es script.script y se establece en la propiedad ScriptFile del archivo de configuración), manteniendo cierta proporción entre el ancho y el alto, mediante el script:

#-------------------------------------- Logo --------------------------------

logo.original_image = Image("logo.png");

relacion =  (Window.GetWidth() / 4) / logo.original_image.GetWidth() ;

logo.image = Image("logo.png").Scale(Window.GetWidth() / 4 , logo.original_image.GetHeight() * relacion);
logo.sprite = Sprite(logo.image);
logo.sprite.SetOpacity(0);
logo.x = Window.GetX() + Window.GetWidth() / 2 - logo.image.GetWidth() / 2;
logo.y = Window.GetY() + Window.GetHeight() / 2 - logo.image.GetHeight() / 2;
logo.sprite.SetPosition(logo.x, logo.y, 200);

Es muy importante tener orden, y documentar bien todos los cambios y partes del código, como son las buenas prácticas de cualquier lenguaje de programación, para su mantenimiento y que cualquier persona que quiera modificar luego el tema pueda hacerlo sin mayor inconveniente. Así el contenido del archivo script.script que agrega "logo.png" puede quedar:



# This is an example plymouth plugin script



Window.SetBackgroundTopColor(0.0, 0.0, 0.0);



#-------------------------------- Dialogue --------------------------------



status = "normal";



fun dialog_setup()

  {

    local.box;

    local.lock;

    local.entry;

    

    box.image = Image("box.png");

    lock.image = Image("lock.png");

    entry.image = Image("entry.png");
    
    box.sprite = Sprite(box.image);
    box.x = Window.GetX() + Window.GetWidth()  / 2 - box.image.GetWidth ()/2;
    box.y = Window.GetY() + Window.GetHeight() / 2 - box.image.GetHeight()/2;
    box.z = 10000;
    box.sprite.SetPosition(box.x, box.y, box.z);
    
    lock.sprite = Sprite(lock.image);
    lock.x = box.x + box.image.GetWidth()/2 - (lock.image.GetWidth() + entry.image.GetWidth()) / 2;
    lock.y = box.y + box.image.GetHeight()/2 - lock.image.GetHeight()/2;
    lock.z = box.z + 1;
    lock.sprite.SetPosition(lock.x, lock.y, lock.z);
    
    entry.sprite = Sprite(entry.image);
    entry.x = lock.x + lock.image.GetWidth();
    entry.y = box.y + box.image.GetHeight()/2 - entry.image.GetHeight()/2;
    entry.z = box.z + 1;
    entry.sprite.SetPosition(entry.x, entry.y, entry.z);
    
    global.dialog.box = box;
    global.dialog.lock = lock;
    global.dialog.entry = entry;
    global.dialog.bullet_image = Image("bullet.png");
    dialog_opacity (1);
  }
    
fun dialog_opacity(opacity)
  {
    dialog.box.sprite.SetOpacity (opacity);
    dialog.lock.sprite.SetOpacity (opacity);
    dialog.entry.sprite.SetOpacity (opacity);
    for (index = 0; dialog.bullet[index]; index++)
      {
        dialog.bullet[index].sprite.SetOpacity(opacity);
      }
  }

fun display_normal_callback ()
  {
    global.status = "normal";
    if (global.dialog)
      dialog_opacity (0);
  }

fun display_password_callback (prompt, bullets)
  {
    global.status = "password";
    if (!global.dialog)
dialog_setup();
    else
dialog_opacity(1);
    for (index = 0; dialog.bullet[index] || index < bullets; index++)
      {
        if (!dialog.bullet[index])
          {
            dialog.bullet[index].sprite = Sprite(dialog.bullet_image);
            dialog.bullet[index].x = dialog.entry.x + index * dialog.bullet_image.GetWidth();
            dialog.bullet[index].y = dialog.entry.y + dialog.entry.image.GetHeight() / 2 - dialog.bullet_image.GetHeight() / 2;
            dialog.bullet[index].z = dialog.entry.z + 1;
            dialog.bullet[index].sprite.SetPosition(dialog.bullet[index].x, dialog.bullet[index].y, dialog.bullet[index].z);
          }
        if (index < bullets)
          dialog.bullet[index].sprite.SetOpacity(1);
        else progress_box.image = Image("progress_box.png");
progress_box.sprite = Sprite(progress_box.image);
          dialog.bullet[index].sprite.SetOpacity(0);
      }
  }

Plymouth.SetDisplayNormalFunction(display_normal_callback);
Plymouth.SetDisplayPasswordFunction(display_password_callback);



#-------------------------------- Progress Bar --------------------------------

progress_box.image = Image("progress_box.png");
progress_box.sprite = Sprite(progress_box.image);

progress_box.x = Window.GetX() + Window.GetWidth() / 2 - progress_box.image.GetWidth() / 2;
progress_box.y = Window.GetY() + Window.GetHeight() * 0.75 - progress_box.image.GetHeight() / 2;
progress_box.sprite.SetPosition(progress_box.x, progress_box.y, 100);

progress_bar.original_image = Image("progress_bar.png");
progress_bar.sprite = Sprite();

progress_bar.x = Window.GetX() + Window.GetWidth()  / 2 -        progress_bar.original_image.GetWidth() / 2;
progress_bar.y = Window.GetY() + Window.GetHeight() / 2 * 1.5  - progress_box.image.GetHeight() / 2 + (progress_box.image.GetHeight() - progress_bar.original_image.GetHeight()) / 2;
progress_bar.sprite.SetPosition(progress_bar.x, progress_bar.y, 1);

fun progress_callback (duration, progress)
  {
    if (progress_bar.image.GetWidth () != Math.Int (progress_bar.original_image.GetWidth () * progress))
      {
        progress_bar.image = progress_bar.original_image.Scale(progress_bar.original_image.GetWidth(progress_bar.original_image) * progress, progress_bar.original_image.GetHeight());
        progress_bar.sprite.SetImage (progress_bar.image);
      }
  }

Plymouth.SetBootProgressFunction(progress_callback);




#--------------------------------- Background ---------------------------------

background.image = Image("background.png").Scale(Window.GetWidth() , Window.GetHeight());
background.sprite = Sprite(background.image);
background.x = Window.GetX() + Window.GetWidth() / 2 - background.image.GetWidth() / 2;
background.y = Window.GetY() + Window.GetHeight() / 2 - background.image.GetHeight() / 2;
background.sprite.SetPosition(background.x, background.y, 0);



#-------------------------------------- Logo --------------------------------

logo.original_image = Image("logo.png");

relacion =  (Window.GetWidth() / 4) / logo.original_image.GetWidth() ;

logo.image = Image("logo.png").Scale(Window.GetWidth() / 4 , logo.original_image.GetHeight() * relacion);
logo.sprite = Sprite(logo.image);
logo.sprite.SetOpacity(0);
logo.x = Window.GetX() + Window.GetWidth() / 2 - logo.image.GetWidth() / 2;
logo.y = Window.GetY() + Window.GetHeight() / 2 - logo.image.GetHeight() / 2;
logo.sprite.SetPosition(logo.x, logo.y, 200);



#---------------------------------------- Quit --------------------------------

fun quit_callback ()
{
  logo.sprite.SetOpacity (1);
}

Plymouth.SetQuitFunction(quit_callback);

#----------------------------------- Message --------------------------------

message_sprite = Sprite();
message_sprite.SetPosition(10, 10, 10000);

fun message_callback (text)
{
  my_image = Image.Text(text, 1, 1, 1).Scale(Window.GetWidth() * 0.75, Window.GetHeight() * 0.035);
  message_sprite.SetImage(my_image);
}

Plymouth.SetMessageFunction(message_callback);
Una vez terminado de modificar el script procedemos a mostrarlo en el arranque de nuestro ordenador para ver el resultado. Nos posicionamos en la ruta que contiene la carpeta del tema:
# cd /home/usuario/Escritorio

Se copia la carpeta del tema en la ruta por defecto para temas de plymouth (en el caso de ubuntu lucid/Maverick sería):
# cp -R innovaOS/ /lib/plymouth/themes/
Ahora se establecerá nuestro tema innovaOS como tema predeterminado, el que aparecerá cada vez que se inicie la máquina. Esto  mediante el comando update-alternatives, que es un script que nos permite definir las aplicaciones por defecto. primero se instala el tema en las opciones de plymouth:
# update-alternatives --install /lib/plymouth/themes/default.plymouth default.plymouth /lib/plymouth/themes/InnovaOS/InnovaOS.plymouth 100
Se configura las opciones de plymouth para establecer la opción predeterminada a la hora del arranque:

# update-alternatives --config default.plymouth
lo cual genera la siguiente salida:

Hay 2 opciones para la alternativa default.plymouth (proporcionando /lib/plymouth/themes/default.plymouth)

  Selección   Ruta                                                   Prioridad  Estado
------------------------------------------------------------
  0            /lib/plymouth/themes/innovaOS/innovaOS.plymouth         100       modo automático
  1            /lib/plymouth/themes/innovaOS/innovaOS.plymouth         100       modo manual
  *2            /lib/plymouth/themes/ubuntu-logo/ubuntu-logo.plymouth   100       modo manual

Pulse <Intro> para mantener el valor por omisión [*] o pulse un número de selección: 


Se escoge en este caso la opción 1 que es la de nuestro tema.

# update-initramfs -u





Como hacer un buen tema en plymouth



Plymouth es un programa configurable por medio de scripting. Lo cual quiere decir que se tiene que, como se diría en mi tierra, programar. y la única forma de aprender a programar en cualquier lenguaje, es programando, así que ha hecharce la soga al cuello y practicar.
>
Entonces, para poder hacer un buen tema en plymouth se necesita:

  • Un editor de texto
  • Un editor de imágenes
  • Constancia
  • Perseverancia
  • Paciencia
  • Ingenio
  • Innovación
  • Imaginación
  • demás cosas que se te ocurra
  • y más paciencia ;)



Para un poco más de información se puede consultar: