From: Daniel Caujolle-B. <f1...@us...> - 2001-11-28 21:08:02
|
Update of /cvsroot/xine/xine-ui/src/xitk/xine-toolkit In directory usw-pr-cvs1:/tmp/cvs-serv15738/src/xitk/xine-toolkit Modified Files: Makefile.am _xitk.h filebrowser.c font.c image.c inputtext.c labelbutton.c xitk.c Added Files: _config.h config.c Log Message: Add config stuff to xitk. load_font() have fallback. --- NEW FILE: _config.h --- /* * Copyright (C) 2000-2001 the xine project * * This file is part of xine, a unix video player. * * xine is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * xine is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * * $Id: _config.h,v 1.1 2001/11/28 21:02:16 f1rmb Exp $ * * */ #ifndef HAVE_XITK_CONFIG_H #define HAVE_XITK_CONFIG_H #include <stdio.h> typedef struct { FILE *fd; char *cfgfilename; char *ln; char buf[256]; struct { char *fallback; char *system; } fonts; struct { int black; int white; int background; int focus; int select; } colors; } xitk_config_t; xitk_config_t *xitk_config_init(void); void xitk_config_deinit(xitk_config_t *xtcf); char *xitk_config_get_system_font(xitk_config_t *xtcf); char *xitk_config_get_default_font(xitk_config_t *xtcf); int xitk_config_get_black_color(xitk_config_t *xtcf); int xitk_config_get_white_color(xitk_config_t *xtcf); int xitk_config_get_background_color(xitk_config_t *xtcf); int xitk_config_get_focus_color(xitk_config_t *xtcf); int xitk_config_get_select_color(xitk_config_t *xtcf); #endif --- NEW FILE: config.c --- /* * Copyright (C) 2000-2001 the xine project * * This file is part of xine, a unix video player. * * xine is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * xine is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * * $Id: config.c,v 1.1 2001/11/28 21:02:18 f1rmb Exp $ * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include <stdio.h> #include <assert.h> #include <string.h> #include "_config.h" #include "_xitk.h" /* * Extract color values */ static void xitk_config_colors(xitk_config_t *xtcf) { char *p = NULL; char *c = NULL; int i; assert(xtcf != NULL && xtcf->ln != NULL); p = xtcf->ln + 6; if(p) c = strchr(p, '='); if(c) { *(c++) = '\0'; while(*c == ' ' || *c == '\t') c++; sscanf(c, "%d", &i); if(!strncasecmp(p, "background", 10)) xtcf->colors.background = i; else if(!strncasecmp(p, "select", 6)) xtcf->colors.select = i; else if(!strncasecmp(p, "focus", 5)) xtcf->colors.focus = i; else if(!strncasecmp(p, "black", 5)) xtcf->colors.black = i; else if(!strncasecmp(p, "white", 5)) xtcf->colors.white = i; } } /* * Extract font names. */ static void xitk_config_fonts(xitk_config_t *xtcf) { char *p = NULL; char *c = NULL; assert(xtcf != NULL && xtcf->ln != NULL); p = xtcf->ln + 5; if(p) c = strchr(p, '='); if(c) { *(c++) = '\0'; while(*c == ' ' || *c == '\t') c++; if(!strncasecmp(p, "default", 7)) xtcf->fonts.fallback = strdup(c); else if(!strncasecmp(p, "system", 6)) { xtcf->fonts.system = (char *) realloc(xtcf->fonts.system, (strlen(c) + 1)); xtcf->fonts.system = strdup(c); } } } /* * Guess entries. */ static void xitk_config_store_entry(xitk_config_t *xtcf) { assert(xtcf != NULL); if(!strncasecmp(xtcf->ln, "color.", 6)) xitk_config_colors(xtcf); else if(!strncasecmp(xtcf->ln, "font.", 5)) xitk_config_fonts(xtcf); } /* * Cleanup the EOL ('\n','\r',' ') */ static void xitk_config_clean_eol(xitk_config_t *xtcf) { char *p; assert(xtcf != NULL); p = xtcf->ln; if(p) { while(*p != '\0') { if(*p == '\n' || *p == '\r') { *p = '\0'; break; } p++; } while(p > xtcf->ln) { --p; if(*p == ' ') *p = '\0'; else break; } } } /* * Read next line from file. */ static void xitk_config_get_next_line(xitk_config_t *xtcf) { assert(xtcf != NULL && xtcf->fd != NULL); __get_next_line: xtcf->ln = fgets(xtcf->buf, 255, xtcf->fd); while(xtcf->ln && (*xtcf->ln == ' ' || *xtcf->ln == '\t')) ++xtcf->ln; if(xtcf->ln) { if((strncmp(xtcf->ln, "//", 2) == 0) || (strncmp(xtcf->ln, "/*", 2) == 0) || /**/ (strncmp(xtcf->ln, ";", 1) == 0) || (strncmp(xtcf->ln, "#", 1) == 0)) { goto __get_next_line; } } xitk_config_clean_eol(xtcf); } /* * load config file. */ static void xitk_config_load_configfile(xitk_config_t *xtcf) { assert(xtcf); xitk_config_get_next_line(xtcf); while(xtcf->ln != NULL) { xitk_config_store_entry(xtcf); xitk_config_get_next_line(xtcf); } fclose(xtcf->fd); } /* * Initialiaze values to default. */ static void xitk_config_init_default_values(xitk_config_t *xtcf) { assert(xtcf != NULL); xtcf->fonts.system = strdup("fixed"); xtcf->fonts.fallback = NULL; xtcf->colors.black = -1; xtcf->colors.white = -1; xtcf->colors.background = -1; xtcf->colors.focus = -1; xtcf->colors.select = -1; } /* * Get stored values. */ char *xitk_config_get_system_font(xitk_config_t *xtcf) { if(!xtcf) return NULL; return xtcf->fonts.system; } char *xitk_config_get_default_font(xitk_config_t *xtcf) { if(!xtcf) return NULL; return xtcf->fonts.fallback; } int xitk_config_get_black_color(xitk_config_t *xtcf) { if(!xtcf) return -1; return xtcf->colors.black; } int xitk_config_get_white_color(xitk_config_t *xtcf) { if(!xtcf) return -1; return xtcf->colors.white; } int xitk_config_get_background_color(xitk_config_t *xtcf) { if(!xtcf) return -1; return xtcf->colors.background; } int xitk_config_get_focus_color(xitk_config_t *xtcf) { if(!xtcf) return -1; return xtcf->colors.focus; } int xitk_config_get_select_color(xitk_config_t *xtcf) { if(!xtcf) return -1; return xtcf->colors.select; } #define SYSTEM_RC "/etc/xitkrc" /* * Initialize config stuff. */ xitk_config_t *xitk_config_init(void) { xitk_config_t *xtcf; char *rcfile; char *user_rc = ".xitkrc"; xtcf = (xitk_config_t *) xitk_xmalloc(sizeof(xitk_config_t)); rcfile = (char *) xitk_xmalloc((strlen((xitk_get_homedir())) + strlen(user_rc)) + 2); sprintf(rcfile, "%s/%s", (xitk_get_homedir()), user_rc); if((xtcf->fd = fopen(rcfile, "r")) == NULL) { rcfile = (char *) realloc(rcfile, (strlen(SYSTEM_RC) + 1)); sprintf(rcfile, "%s", SYSTEM_RC); if((xtcf->fd = fopen(rcfile, "r")) == NULL) { XITK_FREE(rcfile); rcfile = NULL; } } xtcf->cfgfilename = rcfile; xitk_config_init_default_values(xtcf); if(rcfile) xitk_config_load_configfile(xtcf); return xtcf; } /* * Release memory from config object. */ void xitk_config_deinit(xitk_config_t *xtcf) { if(!xtcf) return; XITK_FREE(xtcf->cfgfilename); XITK_FREE(xtcf->fonts.fallback); XITK_FREE(xtcf->fonts.system); XITK_FREE(xtcf); } Index: Makefile.am =================================================================== RCS file: /cvsroot/xine/xine-ui/src/xitk/xine-toolkit/Makefile.am,v retrieving revision 1.19 retrieving revision 1.20 diff -u -r1.19 -r1.20 --- Makefile.am 2001/11/26 10:21:25 1.19 +++ Makefile.am 2001/11/28 21:02:13 1.20 @@ -7,14 +7,14 @@ noinst_LTLIBRARIES = libxitk.la libxitk_la_SOURCES = browser.c button.c checkbox.c combo.c dnd.c filebrowser.c font.c \ image.c inputtext.c label.c labelbutton.c list.c mrlbrowser.c skin.c \ - slider.c widget.c window.c tabs.c intbox.c xitk.c + slider.c widget.c window.c tabs.c intbox.c config.c xitk.c libxitk_la_LIBADD = $(X_LIBS) $(X_PRE_LIBS) -lX11 -lXext $(X_EXTRA_LIBS) \ $(THREAD_LIBS) $(INTLLIBS) $(top_builddir)/src/Imlib-light/libImlib-light.la noinst_HEADERS = _xitk.h browser.h button.h checkbox.c checkbox.h combo.h dnd.h tabs.h \ filebrowser.h font.h image.h inputtext.h label.h labelbutton.h xitkintl.h \ list.h mrlbrowser.h skin.h slider.h window.h widget.h widget_types.h \ - intbox.h xitk.h + intbox.h _config.h xitk.h test_SOURCES = test.c test_LDADD = $(top_builddir)/src/xitk/xine-toolkit/libxitk.la Index: _xitk.h =================================================================== RCS file: /cvsroot/xine/xine-ui/src/xitk/xine-toolkit/_xitk.h,v retrieving revision 1.21 retrieving revision 1.22 diff -u -r1.21 -r1.22 --- _xitk.h 2001/11/26 10:21:26 1.21 +++ _xitk.h 2001/11/28 21:02:16 1.22 @@ -372,7 +372,18 @@ #endif +const char *xitk_get_homedir(void); void xitk_usec_sleep(unsigned usec); + +char *xitk_get_system_font(void); +char *xitk_get_default_font(void); + +int xitk_get_black_color(void); +int xitk_get_white_color(void); +int xitk_get_background_color(void); +int xitk_get_focus_color(void); +int xitk_get_select_color(void); + int xitk_skin_get_coord_x(xitk_skin_config_t *, const char *); int xitk_skin_get_coord_y(xitk_skin_config_t *, const char *); char *xitk_skin_get_label_color(xitk_skin_config_t *, const char *); Index: filebrowser.c =================================================================== RCS file: /cvsroot/xine/xine-ui/src/xitk/xine-toolkit/filebrowser.c,v retrieving revision 1.21 retrieving revision 1.22 diff -u -r1.21 -r1.22 --- filebrowser.c 2001/11/13 23:21:53 1.21 +++ filebrowser.c 2001/11/28 21:02:18 1.22 @@ -91,8 +91,6 @@ } finfo_t; -const char *filebrowser_get_homedir(void); - /* * Return window id of widget. */ @@ -785,7 +783,7 @@ static void filebrowser_homedir(xitk_widget_t *w, void *data) { filebrowser_private_data_t *private_data = (filebrowser_private_data_t *) data; - sprintf(private_data->current_dir, "%s", filebrowser_get_homedir()); + sprintf(private_data->current_dir, "%s", xitk_get_homedir()); load_files(NULL, (void *)private_data); xitk_paint_widget_list (private_data->widget_list); } @@ -1191,10 +1189,10 @@ if((is_a_dir(private_data->current_dir) != 1) || (strlen(private_data->current_dir) == 0)) - sprintf(private_data->current_dir, "%s", filebrowser_get_homedir()); + sprintf(private_data->current_dir, "%s", xitk_get_homedir()); } else - sprintf(private_data->current_dir, "%s", filebrowser_get_homedir()); + sprintf(private_data->current_dir, "%s", xitk_get_homedir()); private_data->visible = 1; @@ -1238,39 +1236,3 @@ return mywidget; } -/* - * Return home directory. - */ -const char *filebrowser_get_homedir(void) { - struct passwd *pw = NULL; - char *homedir = NULL; -#ifdef HAVE_GETPWUID_R - int ret; - struct passwd pwd; - char *buffer = NULL; - int bufsize = 128; - - buffer = (char *) xmalloc(bufsize); - - if((ret = getpwuid_r(getuid(), &pwd, buffer, bufsize, &pw)) < 0) { -#else - if((pw = getpwuid(getuid())) == NULL) { -#endif - if((homedir = getenv("HOME")) == NULL) { - XITK_WARNING("Unable to get home directory, set it to /tmp.\n"); - homedir = strdup("/tmp"); - } - } - else { - if(pw) - homedir = strdup(pw->pw_dir); - } - - -#ifdef HAVE_GETPWUID_R - if(buffer) - XITK_FREE(buffer); -#endif - - return homedir; -} Index: font.c =================================================================== RCS file: /cvsroot/xine/xine-ui/src/xitk/xine-toolkit/font.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- font.c 2001/11/13 23:21:53 1.2 +++ font.c 2001/11/28 21:02:18 1.3 @@ -49,13 +49,29 @@ XUNLOCK(display); if(xtfs->font == NULL) { - XITK_WARNING("%s(): XLoadQueryFont() failed\n", __FUNCTION__); - free(xtfs); - return NULL; + char *fname = xitk_get_default_font(); + if(fname) { + XLOCK(display); + xtfs->font = XLoadQueryFont(display, fname); + XUNLOCK(display); + } + + if(xtfs->font == NULL) { + fname = xitk_get_system_font(); + XLOCK(display); + xtfs->font = XLoadQueryFont(display, fname); + XUNLOCK(display); + } + + if(xtfs->font == NULL) { + XITK_WARNING("%s(): XLoadQueryFont() failed\n", __FUNCTION__); + free(xtfs); + return NULL; + } } xtfs->display = display; - + return xtfs; } Index: image.c =================================================================== RCS file: /cvsroot/xine/xine-ui/src/xitk/xine-toolkit/image.c,v retrieving revision 1.18 retrieving revision 1.19 diff -u -r1.18 -r1.19 --- image.c 2001/11/24 13:31:17 1.18 +++ image.c 2001/11/28 21:02:20 1.19 @@ -64,18 +64,33 @@ * Some default pixel colors. */ unsigned int xitk_get_pixel_color_black(ImlibData *im) { + int user_color = xitk_get_black_color(); + if(user_color > 0) + return (unsigned int) user_color; return xitk_get_pixel_color_from_rgb(im, 0, 0, 0); } unsigned int xitk_get_pixel_color_white(ImlibData *im) { + int user_color = xitk_get_white_color(); + if(user_color > 0) + return (unsigned int) user_color; return xitk_get_pixel_color_from_rgb(im, 255, 255, 255); } unsigned int xitk_get_pixel_color_lightgray(ImlibData *im) { + int user_color = xitk_get_focus_color(); + if(user_color > 0) + return (unsigned int) user_color; return xitk_get_pixel_color_from_rgb(im, 224, 224, 224); } unsigned int xitk_get_pixel_color_gray(ImlibData *im) { + int user_color = xitk_get_background_color(); + if(user_color > 0) + return (unsigned int) user_color; return xitk_get_pixel_color_from_rgb(im, 192, 192, 192); } unsigned int xitk_get_pixel_color_darkgray(ImlibData *im) { + int user_color = xitk_get_select_color(); + if(user_color > 0) + return (unsigned int) user_color; return xitk_get_pixel_color_from_rgb(im, 160, 160, 160); } Index: inputtext.c =================================================================== RCS file: /cvsroot/xine/xine-ui/src/xitk/xine-toolkit/inputtext.c,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- inputtext.c 2001/11/23 14:56:32 1.17 +++ inputtext.c 2001/11/28 21:02:20 1.18 @@ -173,12 +173,11 @@ fs = xitk_font_load_font(private_data->imlibdata->x.disp, private_data->fontname); if(fs == NULL) - fs = xitk_font_load_font(private_data->imlibdata->x.disp, "fixed"); + fs = xitk_font_load_font(private_data->imlibdata->x.disp, xitk_get_system_font()); - if(fs == NULL) { + if(fs == NULL) XITK_DIE("%s()@%d: xitk_font_load_font() failed. Exiting\n", __FUNCTION__, __LINE__); - } - + xitk_font_set_font(fs, wl->gc); private_data->disp_offset = private_data->pos_in_pos = 0; @@ -232,11 +231,10 @@ fs = xitk_font_load_font(private_data->imlibdata->x.disp, private_data->fontname); if(fs == NULL) - fs = xitk_font_load_font(private_data->imlibdata->x.disp, "fixed"); + fs = xitk_font_load_font(private_data->imlibdata->x.disp, xitk_get_system_font()); - if(fs == NULL) { + if(fs == NULL) XITK_DIE("%s()@%d: xitk_font_load_font() failed. Exiting\n", __FUNCTION__, __LINE__); - } xitk_font_set_font(fs, gc); xitk_font_string_extent(fs, label, &lbear, &rbear, &width, &asc, &des); @@ -444,11 +442,10 @@ fs = xitk_font_load_font(private_data->imlibdata->x.disp, private_data->fontname); if(fs == NULL) - fs = xitk_font_load_font(private_data->imlibdata->x.disp, "fixed"); + fs = xitk_font_load_font(private_data->imlibdata->x.disp, xitk_get_system_font()); - if(fs == NULL) { + if(fs == NULL) XITK_DIE("%s()@%d: xitk_font_load_font() failed. Exiting\n", __FUNCTION__, __LINE__); - } xitk_font_set_font(fs, wl->gc); Index: labelbutton.c =================================================================== RCS file: /cvsroot/xine/xine-ui/src/xitk/xine-toolkit/labelbutton.c,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- labelbutton.c 2001/11/23 14:56:32 1.17 +++ labelbutton.c 2001/11/28 21:02:23 1.18 @@ -117,12 +117,11 @@ if(private_data->fontname) fs = xitk_font_load_font(private_data->imlibdata->x.disp, private_data->fontname); + if(fs == NULL) + fs = xitk_font_load_font(private_data->imlibdata->x.disp, xitk_get_system_font()); + if(fs == NULL) - fs = xitk_font_load_font(private_data->imlibdata->x.disp, "fixed"); - - if(fs == NULL) { XITK_DIE("%s()@%d: xitk_font_load_font() failed. Exiting\n", __FUNCTION__, __LINE__); - } xitk_font_set_font(fs, gc); xitk_font_string_extent(fs, label, &lbear, &rbear, &width, &asc, &des); Index: xitk.c =================================================================== RCS file: /cvsroot/xine/xine-ui/src/xitk/xine-toolkit/xitk.c,v retrieving revision 1.23 retrieving revision 1.24 diff -u -r1.23 -r1.24 --- xitk.c 2001/11/18 15:58:42 1.23 +++ xitk.c 2001/11/28 21:02:24 1.24 @@ -31,6 +31,7 @@ #include <stdlib.h> #include <string.h> #include <pthread.h> +#include <pwd.h> #include <errno.h> #include <inttypes.h> #include <unistd.h> @@ -44,6 +45,7 @@ #include "widget.h" #include "list.h" #include "dnd.h" +#include "_config.h" #include "_xitk.h" @@ -114,6 +116,7 @@ pthread_mutex_t mutex; int running; xitk_register_key_t key; + xitk_config_t *config; } __xitk_t; static __xitk_t *gXitk; @@ -139,6 +142,9 @@ #endif } +/* + * + */ static void xitk_signal_handler(int sig) { pid_t cur_pid = getppid(); @@ -587,6 +593,8 @@ gXitk->display = display; gXitk->key = 0; + gXitk->config = xitk_config_init(); + pthread_mutex_init (&gXitk->mutex, NULL); } @@ -680,6 +688,8 @@ xitk_list_free(gXitk->list); xitk_list_free(gXitk->gfx); + xitk_config_deinit(gXitk->config); + XITK_FREE(gXitk); } @@ -688,4 +698,63 @@ */ void xitk_stop(void) { gXitk->running = 0; +} + +char *xitk_get_system_font(void) { + return xitk_config_get_system_font(gXitk->config); +} +char *xitk_get_default_font(void) { + return xitk_config_get_default_font(gXitk->config); +} +int xitk_get_black_color(void) { + return xitk_config_get_black_color(gXitk->config); +} +int xitk_get_white_color(void) { + return xitk_config_get_white_color(gXitk->config); +} +int xitk_get_background_color(void) { + return xitk_config_get_background_color(gXitk->config); +} +int xitk_get_focus_color(void) { + return xitk_config_get_focus_color(gXitk->config); +} +int xitk_get_select_color(void) { + return xitk_config_get_select_color(gXitk->config); +} + +/* + * Return home directory. + */ +const char *xitk_get_homedir(void) { + struct passwd *pw = NULL; + char *homedir = NULL; +#ifdef HAVE_GETPWUID_R + int ret; + struct passwd pwd; + char *buffer = NULL; + int bufsize = 128; + + buffer = (char *) xmalloc(bufsize); + + if((ret = getpwuid_r(getuid(), &pwd, buffer, bufsize, &pw)) < 0) { +#else + if((pw = getpwuid(getuid())) == NULL) { +#endif + if((homedir = getenv("HOME")) == NULL) { + XITK_WARNING("Unable to get home directory, set it to /tmp.\n"); + homedir = strdup("/tmp"); + } + } + else { + if(pw) + homedir = strdup(pw->pw_dir); + } + + +#ifdef HAVE_GETPWUID_R + if(buffer) + XITK_FREE(buffer); +#endif + + return homedir; } |