4 * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 // Global objects for the user interface
32 #include "bcdisplayinfo.inc"
33 #include "bcfilebox.h"
34 #include "bcfontentry.inc"
35 #include "bcresources.inc"
36 #include "bcsignals.inc"
37 #include "bcsynchronous.inc"
38 #include "bcwindowbase.inc"
58 BC_Resources(); // The window parameter is used to get the display information initially
61 friend class BC_WindowBase;
63 int initialize_display(BC_WindowBase *window);
67 // Get ID for filebox history. Persistent.
69 int get_bg_color(); // window backgrounds
70 int get_bg_shadow1(); // border for windows
74 // Get synchronous thread for OpenGL
75 BC_Synchronous* get_synchronous();
76 // Called by user after synchronous thread is created.
77 void set_synchronous(BC_Synchronous *synchronous);
79 static void set_signals(BC_Signals *signal_handler);
80 static BC_Signals* get_signals();
83 // These values should be changed before the first window is created.
85 int bg_color; // window backgrounds
91 int bg_shadow1; // border for windows
95 int default_text_color;
96 int disabled_text_color;
101 int button_highlighted;
105 int button_uphighlighted;
108 int highlight_inverse;
110 // 3D box colors for menus
112 int menu_highlighted;
116 // If these are nonzero, they override the menu backgrounds.
117 VFrame *menu_popup_bg;
118 VFrame **menu_title_bg;
120 VFrame **popupmenu_images;
122 // Minimum menu width
124 // Menu bar text color
126 // color of popup title
127 int popup_title_text;
128 // Right and left margin for text not including triangle space.
129 int popupmenu_margin;
130 // post popup on button release event
132 // Right margin for triangle not including text margin.
133 int popupmenu_triangle_margin;
134 // color for item text
136 // Override the menu item background if nonzero.
137 VFrame **menu_item_bg;
140 // color for progress text
144 int menu_highlighted_fontcolor;
146 // ms for double click
148 // ms for cursor flash
150 // ms for scroll repeats
154 int tooltip_bg_color;
155 int tooltips_enabled;
156 int textbox_focus_policy;
158 int audiovideo_color;
160 // default color of text
162 // background color of textboxes and list boxes
167 int text_background_hi;
168 int text_background_noborder_hi;
173 int text_inactive_highlight;
175 int text_background_noborder;
177 // Optional background for highlighted text in toggle
178 VFrame *toggle_highlight_bg;
179 int toggle_text_margin;
182 static VFrame *bg_image;
183 static VFrame *menu_bg;
187 VFrame **cancel_images;
188 VFrame **filebox_text_images;
189 VFrame **filebox_icons_images;
190 VFrame **filebox_updir_images;
191 VFrame **filebox_newfolder_images;
192 VFrame **filebox_rename_images;
193 VFrame **filebox_descend_images;
194 VFrame **filebox_delete_images;
195 VFrame **filebox_reload_images;
197 // Generic button images
198 VFrame **generic_button_images;
199 // Generic button text margin
200 int generic_button_margin;
201 VFrame **usethis_button_images;
204 VFrame **checkbox_images;
205 VFrame **radial_images;
206 VFrame **label_images;
210 VFrame **tumble_data;
218 VFrame **listbox_button;
219 VFrame **listbox_expand;
220 VFrame **listbox_column;
223 int listbox_title_overlap;
224 // Margin for titles in addition to listbox border
225 int listbox_title_margin;
226 int listbox_title_color;
227 int listbox_title_hotspot;
229 int listbox_border2_hi;
231 int listbox_border3_hi;
234 // Selected row color
235 int listbox_selected;
236 // Highlighted row color
237 int listbox_highlighted;
238 // Inactive row color
239 int listbox_inactive;
240 // Default text color
245 VFrame **horizontal_slider_data;
246 VFrame **vertical_slider_data;
247 VFrame **hscroll_data;
249 VFrame **vscroll_data;
250 // Minimum pixels in handle
251 int scroll_minhandle;
259 int pot_x1, pot_y1, pot_r;
260 // Amount of deflection of pot when down
262 int pot_needle_color;
265 VFrame **xmeter_images, **ymeter_images;
267 int meter_font_color;
272 VFrame **progress_images;
274 // Motion required to start a drag
278 static suffix_to_type_t suffix_to_type[TOTAL_SUFFIXES];
279 VFrame **type_to_icon;
280 // Display mode for fileboxes
282 // Filter currently used in filebox
283 char filebox_filter[BCTEXTLEN];
284 // History of submitted files
285 filebox_history_t filebox_history[FILEBOX_HISTORY_SIZE];
289 // Column types for filebox
290 int filebox_columntype[FILEBOX_COLUMNS];
291 int filebox_columnwidth[FILEBOX_COLUMNS];
292 int filebox_sortcolumn;
293 int filebox_sortorder;
294 // Column types for filebox in directory mode
295 int dirbox_columntype[FILEBOX_COLUMNS];
296 int dirbox_columnwidth[FILEBOX_COLUMNS];
297 int dirbox_sortcolumn;
298 int dirbox_sortorder;
299 // Bottom margin between list and window
304 double font_scale, icon_scale;
307 static const char *small_font;
308 static const char *medium_font;
309 static const char *large_font;
310 static const char *big_font;
311 // Backup of fonts in case the first choices don't exist
312 static const char *small_font2;
313 static const char *medium_font2;
314 static const char *large_font2;
315 static const char *big_font2;
317 static const char *small_fontset;
318 static const char *medium_fontset;
319 static const char *large_fontset;
320 static const char *big_fontset;
322 static const char *small_font_xft, *small_b_font_xft;
323 static const char *medium_font_xft, *medium_b_font_xft;
324 static const char *large_font_xft, *large_b_font_xft;
325 static const char *big_font_xft, *big_b_font_xft;
327 // Backup of fonts in case the first choices don't exist
328 static const char *small_font_xft2;
329 static const char *medium_font_xft2;
330 static const char *large_font_xft2;
331 static const char *big_font_xft2;
332 void init_font_defs(double scale);
333 void finit_font_defs();
335 VFrame **medium_7segment;
338 int draw_clock_background;
343 // Current locale uses utf8
344 static int locale_utf8;
345 // Byte order is little_endian
346 static int little_endian;
347 // Language and region
348 static char language[LEN_LANG];
349 static char region[LEN_LANG];
350 static char encoding[LEN_ENCOD];
351 static const char *wide_encoding;
352 static ArrayList<BC_FontEntry*> *fontlist;
353 static int init_fontconfig(const char *search_path);
354 static BC_FontEntry *find_fontentry(const char *displayname, int style,
355 int mask, int preferred_style = 0);
356 static void encode_to_utf8(char *buffer, int buflen);
357 static FcPattern* find_similar_font(FT_ULong char_code, FcPattern *oldfont);
358 static size_t encode(const char *from_enc, const char *to_enc,
359 char *input, int input_length, char *output, int output_length);
360 static int find_font_by_char(FT_ULong char_code, char *path_new, const FT_Face oldface);
361 static void dump_fonts(FILE *fp = stdout);
364 static VFrame *default_type_to_icon[];
365 static VFrame *default_bar;
366 static VFrame *default_cancel_images[];
367 static VFrame *default_ok_images[];
368 static VFrame *default_usethis_images[];
370 static VFrame *default_checkbox_images[];
371 static VFrame *default_radial_images[];
372 static VFrame *default_label_images[];
374 static VFrame *default_menuitem_data[];
375 static VFrame *default_menubar_data[];
376 static VFrame *default_menu_popup_bg;
377 static VFrame *default_menu_bar_bg;
378 static VFrame *default_check_image;
379 static VFrame *default_filebox_text_images[];
380 static VFrame *default_filebox_icons_images[];
381 static VFrame *default_filebox_updir_images[];
382 static VFrame *default_filebox_newfolder_images[];
383 static VFrame *default_filebox_rename_images[];
384 static VFrame *default_filebox_delete_images[];
385 static VFrame *default_filebox_reload_images[];
386 static VFrame *default_listbox_button[];
387 static VFrame *default_listbox_bg;
388 static VFrame *default_listbox_expand[];
389 static VFrame *default_listbox_column[];
390 static VFrame *default_listbox_up;
391 static VFrame *default_listbox_dn;
392 static VFrame *default_pot_images[];
393 static VFrame *default_progress_images[];
394 static VFrame *default_medium_7segment[];
396 // Make VFrame use shm
398 int use_vframe_shm() { return use_shm && vframe_shm ? 1 : 0; }
400 static int get_machine_cpus();
401 static int machine_cpus;
402 // Available display extensions
406 // If the program uses recursive_resizing
407 int recursive_resizing;
408 // Work around X server bugs
410 // Seems to help if only 1 window is created at a time.
411 Mutex *create_window_lock;
414 // Test for availability of shared memory pixmaps
415 void init_shm(BC_WindowBase *window);
416 void init_sizes(BC_WindowBase *window);
417 static int x_error_handler(Display *display, XErrorEvent *event);
418 VFrame **list_pointers[100];
419 int list_lengths[100];
421 static const char *fc_properties[];
425 static Mutex fontconfig_lock;
427 // Pointer to signal handler class to run after ipc
428 static BC_Signals *signal_handler;
429 BC_Synchronous *synchronous;