PageRenderTime 25ms CodeModel.GetById 16ms app.highlight 6ms RepoModel.GetById 1ms app.codeStats 0ms

/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/gtk-support.c

http://github.com/xbmc/xbmc
C | 162 lines | 124 code | 24 blank | 14 comment | 18 complexity | b2e0a1b6ad0d5d48ebb12ec89872fba2 MD5 | raw file
  1/*
  2 * DO NOT EDIT THIS FILE - it is generated by Glade.
  3 */
  4
  5#ifdef HAVE_CONFIG_H
  6#  include <config.h>
  7#endif
  8
  9#include <sys/types.h>
 10#include <sys/stat.h>
 11#include <unistd.h>
 12#include <string.h>
 13
 14#include <gtk/gtk.h>
 15
 16#include "gtk-support.h"
 17
 18/* This is an internally used function to check if a pixmap file exists. */
 19static gchar* check_file_exists        (const gchar     *directory,
 20                                        const gchar     *filename);
 21
 22/* This is an internally used function to create pixmaps. */
 23static GtkWidget* create_dummy_pixmap  (GtkWidget       *widget);
 24
 25GtkWidget*
 26lookup_widget                          (GtkWidget       *widget,
 27                                        const gchar     *widget_name)
 28{
 29  GtkWidget *parent, *found_widget;
 30
 31  for (;;)
 32    {
 33      if (GTK_IS_MENU (widget))
 34        parent = gtk_menu_get_attach_widget (GTK_MENU (widget));
 35      else
 36        parent = widget->parent;
 37      if (parent == NULL)
 38        break;
 39      widget = parent;
 40    }
 41
 42  found_widget = (GtkWidget*) gtk_object_get_data (GTK_OBJECT (widget),
 43                                                   widget_name);
 44  if (!found_widget)
 45    g_warning ("Widget not found: %s", widget_name);
 46  return found_widget;
 47}
 48
 49/* This is a dummy pixmap we use when a pixmap can't be found. */
 50static char *dummy_pixmap_xpm[] = {
 51/* columns rows colors chars-per-pixel */
 52"1 1 1 1",
 53"  c None",
 54/* pixels */
 55" "
 56};
 57
 58/* This is an internally used function to create pixmaps. */
 59static GtkWidget*
 60create_dummy_pixmap                    (GtkWidget       *widget)
 61{
 62  GdkColormap *colormap;
 63  GdkPixmap *gdkpixmap;
 64  GdkBitmap *mask;
 65  GtkWidget *pixmap;
 66
 67  colormap = gtk_widget_get_colormap (widget);
 68  gdkpixmap = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap, &mask,
 69                                                     NULL, dummy_pixmap_xpm);
 70  if (gdkpixmap == NULL)
 71    g_error ("Couldn't create replacement pixmap.");
 72  pixmap = gtk_pixmap_new (gdkpixmap, mask);
 73  gdk_pixmap_unref (gdkpixmap);
 74  gdk_bitmap_unref (mask);
 75  return pixmap;
 76}
 77
 78static GList *pixmaps_directories = NULL;
 79
 80/* Use this function to set the directory containing installed pixmaps. */
 81void
 82add_pixmap_directory                   (const gchar     *directory)
 83{
 84  pixmaps_directories = g_list_prepend (pixmaps_directories,
 85                                        g_strdup (directory));
 86}
 87
 88/* This is an internally used function to create pixmaps. */
 89GtkWidget*
 90create_pixmap                          (GtkWidget       *widget,
 91                                        const gchar     *filename)
 92{
 93  gchar *found_filename = NULL;
 94  GdkColormap *colormap;
 95  GdkPixmap *gdkpixmap;
 96  GdkBitmap *mask;
 97  GtkWidget *pixmap;
 98  GList *elem;
 99
100  if (!filename || !filename[0])
101      return create_dummy_pixmap (widget);
102
103  /* We first try any pixmaps directories set by the application. */
104  elem = pixmaps_directories;
105  while (elem)
106    {
107      found_filename = check_file_exists ((gchar*)elem->data, filename);
108      if (found_filename)
109        break;
110      elem = elem->next;
111    }
112
113  /* If we haven't found the pixmap, try the source directory. */
114  if (!found_filename)
115    {
116      found_filename = check_file_exists ("../pixmaps", filename);
117    }
118
119  if (!found_filename)
120    {
121      g_warning (_("Couldn't find pixmap file: %s"), filename);
122      return create_dummy_pixmap (widget);
123    }
124
125  colormap = gtk_widget_get_colormap (widget);
126  gdkpixmap = gdk_pixmap_colormap_create_from_xpm (NULL, colormap, &mask,
127                                                   NULL, found_filename);
128  if (gdkpixmap == NULL)
129    {
130      g_warning (_("Error loading pixmap file: %s"), found_filename);
131      g_free (found_filename);
132      return create_dummy_pixmap (widget);
133    }
134  g_free (found_filename);
135  pixmap = gtk_pixmap_new (gdkpixmap, mask);
136  gdk_pixmap_unref (gdkpixmap);
137  gdk_bitmap_unref (mask);
138  return pixmap;
139}
140
141/* This is an internally used function to check if a pixmap file exists. */
142gchar*
143check_file_exists                      (const gchar     *directory,
144                                        const gchar     *filename)
145{
146  gchar *full_filename;
147  struct stat s;
148  gint status;
149
150  full_filename = (gchar*) g_malloc (strlen (directory) + 1
151                                     + strlen (filename) + 1);
152  strcpy (full_filename, directory);
153  strcat (full_filename, G_DIR_SEPARATOR_S);
154  strcat (full_filename, filename);
155
156  status = stat (full_filename, &s);
157  if (status == 0 && S_ISREG (s.st_mode))
158    return full_filename;
159  g_free (full_filename);
160  return NULL;
161}
162