]> git.cworth.org Git - grrobot/blob - src/grr_icon.c
Fixed messages and scrolling
[grrobot] / src / grr_icon.c
1 /* grrobot - Ricochet Robot using GTK+ and Xr
2  *
3  * Copyright © 2003 Carl Worth
4  *
5  * Permission to use, copy, modify, distribute, and sell this software
6  * and its documentation for any purpose is hereby granted without
7  * fee, provided that the above copyright notice appear in all copies
8  * and that both that copyright notice and this permission notice
9  * appear in supporting documentation, and that the name of Carl Worth
10  * not be used in advertising or publicity pertaining to distribution
11  * of the software without specific, written prior permission.
12  * Carl Worth makes no representations about the suitability of this
13  * software for any purpose.  It is provided "as is" without express
14  * or implied warranty.
15  * 
16  * CARL WORTH DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
17  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
18  * NO EVENT SHALL CARL WORTH BE LIABLE FOR ANY SPECIAL, INDIRECT OR
19  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
20  * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
21  * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
22  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23  *
24  * Author: Carl Worth <carl@theworths.org>
25  */
26
27 #include "grr_icon.h"
28 #include "grr_icon_svg.h"
29
30 struct {
31     int type;
32     char *name;
33     char *svg;
34 } icons[] = {
35     { RR_ROBOT_BLUE,
36       "robot_blue",             GRR_ICON_SVG_ROBOT_BLUE },
37     { RR_ROBOT_GREEN,
38       "robot_green",            GRR_ICON_SVG_ROBOT_GREEN },
39     { RR_ROBOT_RED,
40       "robot_red",              GRR_ICON_SVG_ROBOT_RED },
41     { RR_ROBOT_YELLOW,
42       "robot_yellow",           GRR_ICON_SVG_ROBOT_YELLOW },
43
44     { RR_TARGET_BLUE_CIRCLE,
45       "target_blue_circle",     GRR_ICON_SVG_TARGET_BLUE_CIRCLE },
46     { RR_TARGET_BLUE_OCTAGON,
47       "target_blue_octagon",    GRR_ICON_SVG_TARGET_BLUE_OCTAGON },
48     { RR_TARGET_BLUE_SQUARE,
49       "target_blue_square",     GRR_ICON_SVG_TARGET_BLUE_SQUARE },
50     { RR_TARGET_BLUE_TRIANGLE,
51       "target_blue_triangle",   GRR_ICON_SVG_TARGET_BLUE_TRIANGLE },
52
53     { RR_TARGET_GREEN_CIRCLE,
54       "target_green_circle",    GRR_ICON_SVG_TARGET_GREEN_CIRCLE },
55     { RR_TARGET_GREEN_OCTAGON,
56       "target_green_octagon",   GRR_ICON_SVG_TARGET_GREEN_OCTAGON },
57     { RR_TARGET_GREEN_SQUARE,
58       "target_green_square",    GRR_ICON_SVG_TARGET_GREEN_SQUARE },
59     { RR_TARGET_GREEN_TRIANGLE,
60       "target_green_triangle",  GRR_ICON_SVG_TARGET_GREEN_TRIANGLE },
61
62     { RR_TARGET_RED_CIRCLE,
63       "target_red_circle",      GRR_ICON_SVG_TARGET_RED_CIRCLE },
64     { RR_TARGET_RED_OCTAGON,
65       "target_red_octagon",     GRR_ICON_SVG_TARGET_RED_OCTAGON },
66     { RR_TARGET_RED_SQUARE,
67       "target_red_square",      GRR_ICON_SVG_TARGET_RED_SQUARE },
68     { RR_TARGET_RED_TRIANGLE,
69       "target_red_triangle",    GRR_ICON_SVG_TARGET_RED_TRIANGLE },
70
71     { RR_TARGET_YELLOW_CIRCLE,
72       "target_yellow_circle",   GRR_ICON_SVG_TARGET_YELLOW_CIRCLE },
73     { RR_TARGET_YELLOW_OCTAGON,
74       "target_yellow_octagon",  GRR_ICON_SVG_TARGET_YELLOW_OCTAGON },
75     { RR_TARGET_YELLOW_SQUARE,
76       "target_yellow_square",   GRR_ICON_SVG_TARGET_YELLOW_SQUARE },
77     { RR_TARGET_YELLOW_TRIANGLE,
78       "target_yellow_triangle", GRR_ICON_SVG_TARGET_YELLOW_TRIANGLE },
79
80     { RR_TARGET_WHIRL,
81       "whirl",                  GRR_ICON_SVG_TARGET_WHIRL },
82
83     { RR_WALL_ABOVE,
84       "wall",                   GRR_ICON_SVG_WALL },
85
86     { RR_CELL,
87       "cell",                   GRR_ICON_SVG_CELL }
88 };
89
90 typedef struct grr_icon {
91     xsvg_t *xsvg;
92 } grr_icon_t;
93
94 grr_icon_t *
95 grr_icon_create (char *name)
96 {
97     grr_icon *icon;
98
99     icon = malloc (sizeof (grr_icon_t));
100     if (icon == NULL)
101         return NULL;
102
103     _grr_icon_init (icon, name);
104
105     return icon;
106 }
107
108 static rr_status_t
109 _grr_icon_init (grr_icon_t *icon, char *name)
110 {
111     xsvg_status_t status;
112     char *file, *buf;
113
114     status = xsvg_create (&icon->xsvg);
115     if (status)
116         return RR_STATUS_NO_MEMORY;
117
118     file = grr_icon_find_file (name);
119
120     if (file) {
121         status = xsvg_parse_file (icon->xsvg, file);
122         if (status == XSVG_STATUS_SUCCESS) {
123             free (file);
124             return RR_STATUS_SUCCESS;
125         }
126         fprintf (stderr, "Error parsing SVG icon: %s\n", file);
127         free (file);
128     }
129
130     buf = grr_icon_find_buffer (name);
131     status = xsvg_parse_buffer (icon->xsvg, buf, strlen (buf));
132     if (status) {
133         fprintf (stderr, "Error parsing built-in SVG icon for: %s\n", name);
134         return RR_STATUS_PARSE_ERROR;
135     }
136
137     return RR_STATUS_SUCCESS;
138 }
139
140 /* XXX: This could be made more interesting, (eg. search in ~/.grrobot
141    or something). */
142 static char *
143 _grr_icon_find_file (char *name)
144 {
145     int err;
146     char *file;
147     struct stat stat_buf;
148
149     rr_string_sprintf_alloc (&file, "%s/%s", GRR_ICON_DIR, name);
150     if (file == NULL)
151         return NULL;
152
153     err = stat (file, &stat_buf);
154     if (err == 0 && S_ISREG (state.st_mode))
155         return (file);
156     free (file);
157 }