Modificando Gadgets de Windows 7

Después de formatear la partición de Windows 7, me encontré con que ya no tenía los Gadgets que creé hace unos años. Con pocas (nulas) ganas de crearlos de vuelta, me decidí por buscar un gadget ya existente y modificarlo a mi gusto. Les comento como fue el proceso. Aunque no estoy del todo convencido del producto final, creo que logré algo similar a lo que buscaba.

Buscar algo que se parezca a lo que quiero

Encontré un Pack de gadgets bastante interesante: Chameleon Glass en DeviantArt, del cual me interesan los gadgets de:

  • Calendario
  • Clima
  • Status(IP y tiempo online)
  • Netstats (Velocidad de subida/bajada de red)

Adicionalmente voy a estar usando el Core Temp Gadget 2.7 de ALCPU  y el GPU Observer de OrbLog.

Modificaciones

Introducción

Los Gadgets instalados se encuentran en

C:\Users\TU_USUARIO\AppData\Local\Microsoft\Windows Sidebar\Gadgets\

Para los que no sepan, los gadgets en Windows Vista , Windows 7 y Windows 8 son simplemente páginas html, por lo que generalmente estan escritos en javascript o visualbasic script, pero podrían tranquilamente estar escritos en cualquier código que podamos usar en un navegador.

En el caso de los Gadgets del Pack Chameleon Glass, el autor usó una encriptación bastante simple en javascript, que puede arreglarse muy facilmente usando JSBeautifier de modo que lo que antes se veía así:

ahora va a verse con el código real y con la sintaxis correcta:

Y ahora podemos editar el código tranquilamente.

Calendario

No encontré problemas con el calendario así como está, pero para ser constante con el sistema, que está instalado en español, me decidí por traducirlo. En la carpeta

C:\Users\TU_USUARIO\AppData\Local\Microsoft\Windows Sidebar\Gadgets\chameleon_calendar.gadget\js\

cambié el archivo gadget.js original por uno decodificado. Y adentro simplemente cambié todas las palabras en inglés(Ej. Monday) por su versión en español (Ej. Lunes). Eso es todo.

Netstats

No requiere cambios en el código, simplemente configurar el gadget para que muestre los datos de la interfaz que me interesa ver.

Clima

No requiere cambios en el código, simplemente configurar el gadget para que muestre los datos de mi ciudad y en escala métrica.

Stats

El problema inicial que encontré es que estaba mostrando el tiempo online y dirección IP de una interfaz que no era la principal. Adicionalmente solo muestra la IP de una interfaz, pero dejando eso de lado es exactamente igual (visualmente) al Gadget que tenía antes donde se mostraban todas las IP’s de las diferentes interfaces (Muy útil cuando se tienen varias interfaces o varias maquinas virtuales).

Este script obtiene los datos por VisualBasic Script y los ordena y muestra por javascript. Primero edité el vbscript (el archivo es \vbs\uptimeip.vbs), en la linea 41 para cambiar

Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration")

por

Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration Where IPEnabled = True")

para que solo devuelva valores de interfaces que tengan una IP definida.

Luego defino una variable contador cerca de la linea 39. Vamos a inicializarla con el valor -1 para obviar el valor por defecto que pueden ver unas lineas mas arriba (“Geen adres..”), que por cierto pueden libremente cambiar por “Obteniendo IP” o lo que quieran.

contador = -1

Luego edité el ciclo For de la linea 43 para convertir el contenido de la variable (una IP) en una lista de IPs separadas por comas y adicionalmente agregando un contador, cambiando esto:


For Each objItem in colItems
if isNull(objItem.IPAddress) = false then
ipadresData = objItem.IPAddress(0)
End if
Next

por esto:

For Each objItem in colItems
if isNull(objItem.IPAddress) = false then
contador = contador + 1
ipadresData = objItem.IPAddress(0) + "," + ipadresData
End if
Next

Y ahora a editar el javascript (\js\onoffline.js que previamente cambié por su versión decodificada) para que se ajuste a este cambio:

Creamos dos variables nuevas al comienzo del archivo


var contador;
var lista_ip = new Array();

Después pasamos todas las ip’s al array cerca de la linea 23 está background.removeObjects() , en la linea siguiente agregamos:

lista_ip = ipadresData.split(",");

Los datos se muestran en la función displayUpdate() en la forma:

var nombre_variable = background.addTextObject(datos_a_mostrar, fuente, tamaño_de_fuente, color_de_fuente , espacio_margen, numero_de_linea);

Es importante notar que numero_de_linea va variando de a 15 pixeles, por eso hay una diferencia de 15 puntos entre linea y linea como se ve entre la primera y segunda:

var statusDisplay = background.addTextObject(statusData, "Segoe UI", 13, "White", 10, 8);
var uptimeDisplay = background.addTextObject(uptimeData, "Segoe UI", 13, "White", 10, 23);

Asi que agregamos un ciclo

var i=0;
while (i<=contador)
{ numlinea=38+(15*i);
var tomDisplay2 = background.addTextObject(lista_ip[i], "Segoe UI", 13, "White", 10, numlinea);
i=i+1;
}

Y comentamos la linea que ya mostraba el IP agregando // adelante de la línea, de modo que quede así:

var ipadresDisplay = background.addTextObject(ipadresData, “Segoe UI”, 13, “White”, 10, 38);

Ahora nos queda ajustar el ancho. En la función window.onload = function () cambiamos

background.style.width = "130px";
background.style.height = largo+"px";

por

var largo;
GetLocalIP();
largo = 29 + 38 + (15* contador)
background.style.width = "130px";
background.style.height = largo+"px";

Cabe aclarar que este ultimo cambio va a generar unos segundos extra en la carga del Widget.

Y opcionalmente podemos colocar el valor fijo también en el archivo gadget.css si lo desean e incluso redimensionar la imagen background.png, pese a que no es necesario.

Core Temp Gadget

Este gadget es genial y además tiene todo su código sin ofuscar ni ocultar. Es muy interesante si quieren aprender cómo se comunica con su programa madre (El Core Temp). Una vez configurado el Gadget a nuestro gusto, no hay mucho más para hacer, pero en este caso vamos a cambiarle el fondo para que quede acorde a los otros Gadgets.

Primero buscamos uno de los fondos del otro pack y lo editamos en photoshop para agrandarlo un poco (130×130 pixeles es suficiente) y lo copiamos a \CoreTempGadget2.7.gadget\images\backgrounds . Despues simplemente lo seleccionamos en las opciones del widget.

Al parecer las transparencias hacen que todo se vea con una tonalidad rosa por un problema conocido con los gadgets de Windows y con superponer varias transparencias. Asi que no vamos a editar nada.

 GPU Observer

Este es uno de los peores Gadgets que encontré. No tiene ajustada la compatibilidad con alto DPI (lo cual no costaba nada activar) y por lo tanto es prácticamente ilegible en resoluciones altas (1920×1080). El Widget no trae opción para cambiar el tamaño y el código está completamente encriptado. Tengo el recuerdo de que antes yo podía ver bien este widget, por lo que asumo debe haber alguna forma de agrandarlo o de desencriptar su código, pero hoy no tengo tiempo ni ganas como para dedicarme a este tema. Lo utilizo porque las alternativas no son lo suficientemente específicas ni confiables en cuando a los valores de temperatura y dado que mi placa de video tiene un historial de problemas, prefiero tener la temperatura correcta aunque tenga que quedar casi ciego cada vez que quiera leer los valores.

Otros Gadgets

En el espacio que me queda usualmente coloco la ventana flotante del Skype, pero las alternativas son muchas. Si usan pidgin, existe un gadget de nombre pidglet que es bastante útil. Si usan Skype y quieren tener la lista de contactos ahi pueden usar este gadget. Y existen muchos que pueden mostrar actualizaciones o accesos directos a redes sociales y otras tareas.

 

One thought on “Modificando Gadgets de Windows 7”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *