41e2b874c5f16a06d26bd36a5c8bdb78b5cfb0a3
[monky] / src / fonts.c
1 /* -*- mode: c; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: t -*-
2  *
3  * Conky, a system monitor, based on torsmo
4  *
5  * Any original torsmo code is licensed under the BSD license
6  *
7  * All code written since the fork of torsmo is licensed under the GPL
8  *
9  * Please see COPYING for details
10  *
11  * Copyright (c) 2004, Hannu Saransaari and Lauri Hakkarainen
12  * Copyright (c) 2005-2009 Brenden Matthews, Philip Kovacs, et. al.
13  *      (see AUTHORS)
14  * All rights reserved.
15  *
16  * This program is free software: you can redistribute it and/or modify
17  * it under the terms of the GNU General Public License as published by
18  * the Free Software Foundation, either version 3 of the License, or
19  * (at your option) any later version.
20  *
21  * This program is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24  * GNU General Public License for more details.
25  * You should have received a copy of the GNU General Public License
26  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
27  *
28  * vim: ts=4 sw=4 noet ai cindent syntax=c
29  *
30  */
31 #include "conky.h"
32 #include "ctx->fonts.h"
33 #include "logging.h"
34
35 void set_font(conky_context *ctx)
36 {
37 #ifdef XFT
38         if (use_xft->ctx) return;
39 #endif /* XFT */
40         if (ctx->font_count > -1 && ctx->fonts[selected_font].font) {
41                 XSetFont(display, window.gc, ctx->fonts[selected_font].font->fid);
42         }
43 }
44
45 void setup_fonts(conky_context *ctx)
46 {
47         if ((output_methods & TO_X) == 0) {
48                 return;
49         }
50 #ifdef XFT
51         if (use_xft->ctx) {
52                 if (window.xftdraw) {
53                         XftDrawDestroy(window.xftdraw);
54                         window.xftdraw = 0;
55                 }
56                 window.xftdraw = XftDrawCreate(display, window.drawable,
57                                 DefaultVisual(display, screen), DefaultColormap(display, screen));
58         }
59 #endif /* XFT */
60         set_font();
61 }
62
63 int add_font(conky_context *ctx, const char *data_in)
64 {
65         if ((output_methods & TO_X) == 0) {
66                 return 0;
67         }
68         if (ctx->font_count > MAX_FONTS) {
69                 CRIT_ERR(NULL, NULL, "you don't need that many ctx->fonts, sorry.");
70         }
71         ctx->font_count++;
72         if (ctx->font_count == 0) {
73                 if (ctx->fonts != NULL) {
74                         free(ctx->fonts);
75                 }
76                 if ((ctx->fonts = (struct font_list *) malloc(sizeof(struct font_list)))
77                                 == NULL) {
78                         CRIT_ERR(NULL, NULL, "malloc");
79                 }
80                 memset(ctx->fonts, 0, sizeof(struct font_list));
81         }
82         ctx->fonts = realloc(ctx->fonts, (sizeof(struct font_list) * (ctx->font_count + 1)));
83         memset(&ctx->fonts[ctx->font_count], 0, sizeof(struct font_list));
84         if (ctx->fonts == NULL) {
85                 CRIT_ERR(NULL, NULL, "realloc in add_font");
86         }
87         // must account for null terminator
88         if (strlen(data_in) < DEFAULT_TEXT_BUFFER_SIZE) {
89                 strncpy(ctx->fonts[ctx->font_count].name, data_in, DEFAULT_TEXT_BUFFER_SIZE);
90 #ifdef XFT
91                 ctx->fonts[ctx->font_count].font_alpha = 0xffff;
92 #endif
93         } else {
94                 CRIT_ERR(NULL, NULL, "Oops...looks like something overflowed in add_font().");
95         }
96         return ctx->font_count;
97 }
98
99 void set_first_font(conky_context *ctx, const char *data_in)
100 {
101         if ((output_methods & TO_X) == 0) {
102                 return;
103         }
104         if (ctx->font_count < 0) {
105                 if ((ctx->fonts = (struct font_list *) malloc(sizeof(struct font_list)))
106                                 == NULL) {
107                         CRIT_ERR(NULL, NULL, "malloc");
108                 }
109                 memset(ctx->fonts, 0, sizeof(struct font_list));
110                 ctx->font_count++;
111         }
112         if (strlen(data_in) > 1) {
113                 strncpy(ctx->fonts[0].name, data_in, DEFAULT_TEXT_BUFFER_SIZE);
114 #ifdef XFT
115                 ctx->fonts[0].font_alpha = 0xffff;
116 #endif
117         }
118 }
119
120 void free_fonts(conky_context *ctx)
121 {
122         int i;
123
124         if ((output_methods & TO_X) == 0) {
125                 return;
126         }
127         if(ctx->fontloaded == 0) {
128                 free(ctx->fonts);
129                 return;
130         }
131         for (i = 0; i <= ctx->font_count; i++) {
132 #ifdef XFT
133                 if (use_xft->ctx) {
134                         XftFontClose(display, ctx->fonts[i].xftfont);
135                         ctx->fonts[i].xftfont = 0;
136                 } else
137 #endif /* XFT */
138                 {
139                         XFreeFont(display, ctx->fonts[i].font);
140                         ctx->fonts[i].font = 0;
141                 }
142         }
143         free(ctx->fonts);
144         ctx->fonts = 0;
145         ctx->font_count = -1;
146         selected_font = 0;
147 #ifdef XFT
148         if (window.xftdraw) {
149                 XftDrawDestroy(window.xftdraw);
150                 window.xftdraw = 0;
151         }
152 #endif /* XFT */
153 }
154
155 void load_fonts(conky_context *ctx)
156 {
157         int i;
158
159         if ((output_methods & TO_X) == 0)
160                 return;
161         for (i = 0; i <= ctx->font_count; i++) {
162 #ifdef XFT
163                 /* load Xft font */
164                 if (use_xft->ctx && ctx->fonts[i].xftfont) {
165                         continue;
166                 } else if (use_xft->ctx) {
167                         ctx->fonts[i].xftfont = XftFontOpenName(display, screen,
168                                         ctx->fonts[i].name);
169                         if (ctx->fonts[i].xftfont) {
170                                 continue;
171                         }
172
173                         NORM_ERR("can't load Xft font '%s'", ctx->fonts[i].name);
174                         if ((ctx->fonts[i].xftfont = XftFontOpenName(display, screen,
175                                         "courier-12")) != NULL) {
176                                 continue;
177                         }
178
179                         NORM_ERR("can't load Xft font '%s'", "courier-12");
180
181                         if ((ctx->fonts[i].font = XLoadQueryFont(display, "fixed")) == NULL) {
182                                 CRIT_ERR(NULL, NULL, "can't load font '%s'", "fixed");
183                         }
184                         use_xft->ctx = 0;
185
186                         continue;
187                 }
188 #endif
189                 /* load normal font */
190                 if (!ctx->fonts[i].font && (ctx->fonts[i].font = XLoadQueryFont(display, ctx->fonts[i].name)) == NULL) {
191                         NORM_ERR("can't load font '%s'", ctx->fonts[i].name);
192                         if ((ctx->fonts[i].font = XLoadQueryFont(display, "fixed")) == NULL) {
193                                 CRIT_ERR(NULL, NULL, "can't load font '%s'", "fixed");
194                         }
195                 }
196         }
197         ctx->fontloaded = 1;
198 }