Poesía Binaria

Representar imágenes a pantalla completa con GTK+ en C (y romperles la pantalla del portátil)

Aunque muchos de mis proyectos con GTK+ son en C++, cuando es algo pequeño, es más corto hacerlo en C (aunque una vez que te acostumbras a los objetos, es poco intuitivo).

Lo que vamos a hacer es crear una ventana, introducir una imagen dentro redimensionada para ocupar la pantalla y poner la ventana a pantalla completa (ojo, no en todos los window managers funciona, pero en casi todos). Al final, lo que conseguimos es poner de fondo la imagen que ilustra el post en cualquier pantalla de portátil para conseguir dar un susto al dueño.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <gtk/gtk.h>

int main(int argc, char **argv)
{
  GtkWindow *window;
  GdkPixbuf *pixbuf;
  GtkWidget *picture;
  GdkScreen *screen;

  gtk_init(&argc, &argv);

  /* Creamos una ventana en el nivel superior */
  window = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL));
  /* Obtenemos la información de pantalla */
  screen = gtk_window_get_screen(window);
  /* Cargamos la imagen */
  pixbuf = gdk_pixbuf_new_from_file_at_scale("CrackedScreen1440x900.jpg", /* nombre de fichero */
                         gdk_screen_get_width(screen), /* ancho de la pantalla */
                         gdk_screen_get_height(screen), /* alto de la pantalla */
                         FALSE, /* No respetar aspecto */
                         NULL);

  /* Cuando cerremos la ventana, salimos de la aplicación */
  gtk_signal_connect (GTK_OBJECT (window), "destroy",
              GTK_SIGNAL_FUNC (gtk_main_quit), NULL);

  /* Metemos la imagen dentro de la ventana */
  picture=gtk_image_new_from_pixbuf(pixbuf);
  gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(picture));

  /* Mostramos todo */
  gtk_widget_show_all(GTK_WIDGET(window));

  /* Hacemos pantalla completa */
  gtk_window_fullscreen(window);

  /* Comenzamos */
  gtk_main();

  return 0;
}

Es importante ver cómo obtenemos los parámetros de la pantalla: una vez tenemos la ventana, podemos obtener la pantalla (screen) donde se encuentra, con ese elemento podemos acceder a sus dimensiones y pasárselas a la función de carga de la imagen para que la redimensione con esas características.
Al final, cuando tenemos todo preparado llamamos a gtk_window_fullscreen() pasándole la ventana actual. Si usáis GTKmm el método es Gdk::Window::fullscreen()

También es importante que, aunque sea para una tontería como esta, se capture la señal «destroy» ya que aunque se cierre la ventana, el programa seguirá en ejecución de forma indefinida, y no queremos eso.

Para compilar el ejemplo directamente:

$ gcc -o fsfoto fsfoto.c `pkg-config –cflags gtk+-2.0` `pkg-config –libs gtk+-2.0`

También podría interesarte....