/ src / gui / stock.c
stock.c
  1  #include "stock.h"
  2  #include <stdlib.h>
  3  #include <string.h>
  4  #include <gtk/gtk.h>
  5  
  6  static char *id = "@(#) $Id$";
  7  
  8  #define UIFILE "gtk-lshw.ui"
  9  
 10  GtkWidget *mainwindow = NULL;
 11  GtkWidget *list1 = NULL;
 12  GtkWidget *list2 = NULL;
 13  GtkWidget *list3 = NULL;
 14  GtkWidget *description = NULL;
 15  GtkWidget *statusbar = NULL;
 16  GMenuModel *menubar = NULL;
 17  GHashTable *pixbufs = NULL;
 18  
 19  static struct StockIcon
 20  {
 21    const char *name;
 22    const char *filename;
 23  
 24  } const stock_icons[] =
 25  {
 26    { LSHW_STOCK_AUDIO, "audio.svg" },
 27    { LSHW_STOCK_AMD, "amd.svg" },
 28    { LSHW_STOCK_BATTERY, "battery.svg" },
 29    { LSHW_STOCK_BLUETOOTH, "bluetooth.svg" },
 30    { LSHW_STOCK_BOARD, "board.svg" },
 31    { LSHW_STOCK_CHIP, "chip.svg" },
 32    { LSHW_STOCK_CPU, "cpu.svg" },
 33    { LSHW_STOCK_DESKTOPCOMPUTER, "desktopcomputer.svg" },
 34    { LSHW_STOCK_DISABLED, "disabled.svg" },
 35    { LSHW_STOCK_DISPLAY, "display.svg" },
 36    { LSHW_STOCK_CD, "cd.svg" },
 37    { LSHW_STOCK_DISC, "disc.svg" },
 38    { LSHW_STOCK_FIREWIRE, "firewire.svg" },
 39    { LSHW_STOCK_INTEL, "intel.svg" },
 40    { LSHW_STOCK_LAPTOP, "laptop.svg" },
 41    { LSHW_STOCK_LOGO, "logo.svg" },
 42    { LSHW_STOCK_MEMORY, "memory.svg" },
 43    { LSHW_STOCK_MINI, "mini.svg" },
 44    { LSHW_STOCK_MODEM, "modem.svg" },
 45    { LSHW_STOCK_MOTHERBOARD, "motherboard.svg" },
 46    { LSHW_STOCK_NETWORK, "network.svg" },
 47    { LSHW_STOCK_PARALLEL, "parallel.svg" },
 48    { LSHW_STOCK_POWERMAC, "powermac.svg" },
 49    { LSHW_STOCK_POWERMACG5, "powermacg5.svg" },
 50    { LSHW_STOCK_POWERPC, "powerpc.svg" },
 51    { LSHW_STOCK_PRINTER, "printer.svg" },
 52    { LSHW_STOCK_RADIO, "radio.svg" },
 53    { LSHW_STOCK_MD, "md.svg" },
 54    { LSHW_STOCK_SCSI, "scsi.svg" },
 55    { LSHW_STOCK_SERIAL, "serial.svg" },
 56    { LSHW_STOCK_TOWERCOMPUTER, "towercomputer.svg" },
 57    { LSHW_STOCK_USB, "usb.svg" },
 58    { LSHW_STOCK_WIFI, "wifi.svg" },
 59  };
 60  
 61  static gchar *
 62  find_file(const char *base, const char *dir)
 63  {
 64    char *filename;
 65    char *basedir;
 66  
 67    if (base == NULL)
 68      return NULL;
 69  
 70    if((basedir = getenv("BASEDIR")))
 71      filename = g_build_filename(basedir, dir, base, NULL);
 72    else
 73      filename = g_build_filename(DATADIR, "lshw", dir, base, NULL);
 74  
 75    if (!g_file_test(filename, G_FILE_TEST_EXISTS))
 76    {
 77      g_free(filename);
 78      return NULL;
 79    }
 80    else
 81      return filename;
 82  }
 83  
 84  
 85  void
 86  lshw_gtk_stock_init(void)
 87  {
 88    static int stock_initted = 0;
 89    int i;
 90  
 91    if (stock_initted)
 92      return;
 93  
 94    stock_initted = 1;
 95  
 96  /* Setup the icons hash table. */
 97    pixbufs = g_hash_table_new(g_str_hash, g_str_equal);
 98  
 99    for (i = 0; i < G_N_ELEMENTS(stock_icons); i++)
100    {
101      GdkPixbuf *pixbuf;
102      gchar *filename;
103  
104        filename = find_file(stock_icons[i].filename, "artwork");
105  
106        if (filename == NULL)
107          continue;
108  
109        pixbuf = gdk_pixbuf_new_from_file_at_size(filename, LSHW_DEFAULT_ICON_SIZE, LSHW_DEFAULT_ICON_SIZE, NULL);
110        g_free(filename);
111  
112        if(pixbuf)	/* we managed to load something */
113        {
114          g_hash_table_insert(pixbufs, (char*)stock_icons[i].name, pixbuf);
115        }
116    }
117  
118    (void) &id;                                     /* avoid "id defined but not used" warning */
119  }
120  
121  void lshw_ui_init(GtkApplication *app)
122  {
123    GError *error = NULL;
124    GtkBuilder *builder = NULL;
125    GdkPixbuf *icon = NULL;
126    gchar *uiname = NULL;
127  
128    mainwindow = NULL;
129  
130    builder = gtk_builder_new();
131    uiname = find_file(UIFILE, "ui");
132    if(!uiname)
133    {
134      g_critical( "Could not find UI file: %s", UIFILE );
135      return;
136    }
137    if(!gtk_builder_add_from_file(builder, uiname, &error))
138    {
139      g_critical( "Could not create UI: %s", error->message );
140      g_free( error );
141      g_object_unref( G_OBJECT( builder ) );
142      return;
143    }
144    g_free(uiname);
145  
146    mainwindow = GTK_WIDGET( gtk_builder_get_object( builder, "mainwindow" ) );
147    list1 = GTK_WIDGET(gtk_builder_get_object( builder, "treeview1"));
148    list2 = GTK_WIDGET(gtk_builder_get_object( builder, "treeview2"));
149    list3 = GTK_WIDGET(gtk_builder_get_object( builder, "treeview3"));
150    description = GTK_WIDGET(gtk_builder_get_object( builder, "description"));
151    statusbar = GTK_WIDGET(gtk_builder_get_object( builder, "statusbar"));
152    gtk_builder_connect_signals( builder, mainwindow );
153    menubar = G_MENU_MODEL( gtk_builder_get_object( builder, "menubar"));
154    gtk_window_set_application( GTK_WINDOW( mainwindow ), app );
155    gtk_application_set_menubar( app, menubar );
156    g_object_unref( G_OBJECT( builder ) );
157  
158    icon = g_hash_table_lookup(pixbufs, LSHW_STOCK_LOGO);
159    if(GDK_IS_PIXBUF(icon))
160    {
161      gtk_window_set_icon(GTK_WINDOW(mainwindow), icon);
162      gtk_window_set_default_icon(icon);
163    }
164  }