X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;ds=sidebyside;f=src%2FScreen.cc;h=2ff2ce4d67bf1d95118b4746de26ebb5d39127a1;hb=20bc088a998a362977233086577d74d00eea8765;hp=4716d23a3532e56991d34a30a0f063b7d1ac0846;hpb=eb136b9629b61d43c00c3cf105ff170fb8c75ad1;p=chaz%2Fopenbox diff --git a/src/Screen.cc b/src/Screen.cc index 4716d23a..2ff2ce4d 100644 --- a/src/Screen.cc +++ b/src/Screen.cc @@ -27,11 +27,6 @@ extern "C" { #include #include -// for strcasestr() -#ifndef _GNU_SOURCE -# define _GNU_SOURCE -#endif // _GNU_SOURCE - #ifdef HAVE_STDLIB_H # include #endif // HAVE_STDLIB_H @@ -76,6 +71,7 @@ using std::string; #include "i18n.hh" #include "blackbox.hh" #include "Clientmenu.hh" +#include "Font.hh" #include "GCCache.hh" #include "Iconmenu.hh" #include "Image.hh" @@ -110,7 +106,7 @@ static int anotherWMRunning(Display *display, XErrorEvent *) { BScreen::BScreen(Blackbox *bb, unsigned int scrn) : ScreenInfo(bb, scrn) { blackbox = bb; - screenstr = (string)"session.screen" + itostring(scrn) + '.'; + screenstr = "session.screen" + itostring(scrn) + '.'; config = blackbox->getConfig(); xatom = blackbox->getXAtom(); @@ -133,10 +129,10 @@ BScreen::BScreen(Blackbox *bb, unsigned int scrn) : ScreenInfo(bb, scrn) { rootmenu = 0; - resource.mstyle.t_fontset = resource.mstyle.f_fontset = - resource.tstyle.fontset = resource.wstyle.fontset = (XFontSet) 0; resource.mstyle.t_font = resource.mstyle.f_font = resource.tstyle.font = - resource.wstyle.font = (XFontStruct *) 0; + resource.wstyle.font = (BFont *) 0; + + geom_pixmap = None; xatom->setSupported(this); // set-up netwm support #ifdef HAVE_GETPID @@ -168,9 +164,6 @@ BScreen::BScreen(Blackbox *bb, unsigned int scrn) : ScreenInfo(bb, scrn) { LoadStyle(); XGCValues gcv; - unsigned long gc_value_mask = GCForeground; - if (! i18n.multibyte()) gc_value_mask |= GCFont; - gcv.foreground = WhitePixel(blackbox->getXDisplay(), getScreenNumber()) ^ BlackPixel(blackbox->getXDisplay(), getScreenNumber()); gcv.function = GXxor; @@ -180,23 +173,8 @@ BScreen::BScreen(Blackbox *bb, unsigned int scrn) : ScreenInfo(bb, scrn) { const char *s = i18n(ScreenSet, ScreenPositionLength, "0: 0000 x 0: 0000"); - int l = strlen(s); - - if (i18n.multibyte()) { - XRectangle ink, logical; - XmbTextExtents(resource.wstyle.fontset, s, l, &ink, &logical); - geom_w = logical.width; - - geom_h = resource.wstyle.fontset_extents->max_ink_extent.height; - } else { - geom_h = resource.wstyle.font->ascent + - resource.wstyle.font->descent; - - geom_w = XTextWidth(resource.wstyle.font, s, l); - } - - geom_w += (resource.bevel_width * 2); - geom_h += (resource.bevel_width * 2); + geom_w = resource.wstyle.font->measureString(s) + resource.bevel_width * 2; + geom_h = resource.wstyle.font->height() + resource.bevel_width * 2; XSetWindowAttributes attrib; unsigned long mask = CWBorderPixel | CWColormap | CWSaveUnder; @@ -340,23 +318,14 @@ BScreen::~BScreen(void) { delete toolbar; delete image_control; - if (resource.wstyle.fontset) - XFreeFontSet(blackbox->getXDisplay(), resource.wstyle.fontset); - if (resource.mstyle.t_fontset) - XFreeFontSet(blackbox->getXDisplay(), resource.mstyle.t_fontset); - if (resource.mstyle.f_fontset) - XFreeFontSet(blackbox->getXDisplay(), resource.mstyle.f_fontset); - if (resource.tstyle.fontset) - XFreeFontSet(blackbox->getXDisplay(), resource.tstyle.fontset); - if (resource.wstyle.font) - XFreeFont(blackbox->getXDisplay(), resource.wstyle.font); + delete resource.wstyle.font; if (resource.mstyle.t_font) - XFreeFont(blackbox->getXDisplay(), resource.mstyle.t_font); + delete resource.mstyle.t_font; if (resource.mstyle.f_font) - XFreeFont(blackbox->getXDisplay(), resource.mstyle.f_font); + delete resource.mstyle.f_font; if (resource.tstyle.font) - XFreeFont(blackbox->getXDisplay(), resource.tstyle.font); + delete resource.tstyle.font; XFreeGC(blackbox->getXDisplay(), opGC); } @@ -419,6 +388,13 @@ void BScreen::saveFocusLast(bool f) { } +void BScreen::saveAAFonts(bool f) { + resource.aa_fonts = f; + reconfigure(); + config->setValue(screenstr + "antialiasFonts", resource.aa_fonts); +} + + void BScreen::saveHideToolbar(bool h) { resource.hide_toolbar = h; if (resource.hide_toolbar) @@ -528,6 +504,7 @@ void BScreen::save_rc(void) { saveSloppyFocus(resource.sloppy_focus); saveAutoRaise(resource.auto_raise); saveImageDither(doImageDither()); + saveAAFonts(resource.aa_fonts); saveOpaqueMove(resource.opaque_move); saveFullMax(resource.full_max); saveFocusNew(resource.focus_new); @@ -571,6 +548,9 @@ void BScreen::load_rc(void) { if (! config->getValue(screenstr + "opaqueMove", resource.opaque_move)) resource.opaque_move = false; + if (! config->getValue(screenstr + "antialiasFonts", resource.aa_fonts)) + resource.aa_fonts = true; + if (! config->getValue(screenstr + "hideToolbar", resource.hide_toolbar)) resource.hide_toolbar = false; @@ -669,9 +649,6 @@ void BScreen::reconfigure(void) { LoadStyle(); XGCValues gcv; - unsigned long gc_value_mask = GCForeground; - if (! i18n.multibyte()) gc_value_mask |= GCFont; - gcv.foreground = WhitePixel(blackbox->getXDisplay(), getScreenNumber()); gcv.function = GXinvert; @@ -681,22 +658,9 @@ void BScreen::reconfigure(void) { const char *s = i18n(ScreenSet, ScreenPositionLength, "0: 0000 x 0: 0000"); - int l = strlen(s); - if (i18n.multibyte()) { - XRectangle ink, logical; - XmbTextExtents(resource.wstyle.fontset, s, l, &ink, &logical); - geom_w = logical.width; - - geom_h = resource.wstyle.fontset_extents->max_ink_extent.height; - } else { - geom_w = XTextWidth(resource.wstyle.font, s, l); - - geom_h = resource.wstyle.font->ascent + resource.wstyle.font->descent; - } - - geom_w += (resource.bevel_width * 2); - geom_h += (resource.bevel_width * 2); + geom_w = resource.wstyle.font->measureString(s) + resource.bevel_width * 2; + geom_h = resource.wstyle.font->height() + resource.bevel_width * 2; BTexture* texture = &(resource.wstyle.l_focus); geom_pixmap = texture->render(geom_w, geom_h, geom_pixmap); @@ -774,7 +738,7 @@ void BScreen::rereadMenu(void) { void BScreen::LoadStyle(void) { - Configuration style; + Configuration style(False); const char *sfile = blackbox->getStyleFilename(); if (sfile != NULL) { @@ -786,54 +750,27 @@ void BScreen::LoadStyle(void) { } } + // merge in the rc file + style.merge(config->file(), True); + string s; // load fonts/fontsets - if (resource.wstyle.fontset) - XFreeFontSet(blackbox->getXDisplay(), resource.wstyle.fontset); - if (resource.tstyle.fontset) - XFreeFontSet(blackbox->getXDisplay(), resource.tstyle.fontset); - if (resource.mstyle.f_fontset) - XFreeFontSet(blackbox->getXDisplay(), resource.mstyle.f_fontset); - if (resource.mstyle.t_fontset) - XFreeFontSet(blackbox->getXDisplay(), resource.mstyle.t_fontset); - resource.wstyle.fontset = 0; - resource.tstyle.fontset = 0; - resource.mstyle.f_fontset = 0; - resource.mstyle.t_fontset = 0; if (resource.wstyle.font) - XFreeFont(blackbox->getXDisplay(), resource.wstyle.font); + delete resource.wstyle.font; if (resource.tstyle.font) - XFreeFont(blackbox->getXDisplay(), resource.tstyle.font); + delete resource.tstyle.font; if (resource.mstyle.f_font) - XFreeFont(blackbox->getXDisplay(), resource.mstyle.f_font); + delete resource.mstyle.f_font; if (resource.mstyle.t_font) - XFreeFont(blackbox->getXDisplay(), resource.mstyle.t_font); - resource.wstyle.font = 0; - resource.tstyle.font = 0; - resource.mstyle.f_font = 0; - resource.mstyle.t_font = 0; - - if (i18n.multibyte()) { - resource.wstyle.fontset = readDatabaseFontSet("window.font", style); - resource.tstyle.fontset = readDatabaseFontSet("toolbar.font", style); - resource.mstyle.t_fontset = readDatabaseFontSet("menu.title.font", style); - resource.mstyle.f_fontset = readDatabaseFontSet("menu.frame.font", style); - - resource.mstyle.t_fontset_extents = - XExtentsOfFontSet(resource.mstyle.t_fontset); - resource.mstyle.f_fontset_extents = - XExtentsOfFontSet(resource.mstyle.f_fontset); - resource.tstyle.fontset_extents = - XExtentsOfFontSet(resource.tstyle.fontset); - resource.wstyle.fontset_extents = - XExtentsOfFontSet(resource.wstyle.fontset); - } else { - resource.wstyle.font = readDatabaseFont("window.font", style); - resource.tstyle.font = readDatabaseFont("toolbar.font", style); - resource.mstyle.t_font = readDatabaseFont("menu.title.font", style); - resource.mstyle.f_font = readDatabaseFont("menu.frame.font", style); - } + delete resource.mstyle.t_font; + resource.wstyle.font = resource.tstyle.font = resource.mstyle.f_font = + resource.mstyle.t_font = (BFont *) 0; + + resource.wstyle.font = readDatabaseFont("window.", style); + resource.tstyle.font = readDatabaseFont("toolbar.", style); + resource.mstyle.t_font = readDatabaseFont("menu.title.", style); + resource.mstyle.f_font = readDatabaseFont("menu.frame.", style); // load window config resource.wstyle.t_focus = @@ -1217,8 +1154,8 @@ void BScreen::manageWindow(Window w) { // desktop windows cant do anything, so we remove all the normal window // stuff from them, they are only kept around so that we can keep them on // the bottom of the z-order - addDesktopWindow(win->getClientWindow()); win->restore(True); + addDesktopWindow(win->getClientWindow()); delete win; return; } @@ -1303,6 +1240,7 @@ void BScreen::updateWorkArea(void) { } xatom->setValue(getRootWindow(), XAtom::net_workarea, XAtom::cardinal, dims, 4 * workspacesList.size()); + delete [] dims; } else xatom->setValue(getRootWindow(), XAtom::net_workarea, XAtom::cardinal, 0, 0); @@ -1980,19 +1918,10 @@ void BScreen::showPosition(int x, int y) { XClearWindow(blackbox->getXDisplay(), geom_window); - BPen pen(resource.wstyle.l_text_focus, resource.wstyle.font); - if (i18n.multibyte()) { - XmbDrawString(blackbox->getXDisplay(), geom_window, - resource.wstyle.fontset, pen.gc(), - resource.bevel_width, resource.bevel_width - - resource.wstyle.fontset_extents->max_ink_extent.y, - label, strlen(label)); - } else { - XDrawString(blackbox->getXDisplay(), geom_window, - pen.gc(), resource.bevel_width, - resource.wstyle.font->ascent + resource.bevel_width, - label, strlen(label)); - } + resource.wstyle.font->drawString(geom_window, + resource.bevel_width, resource.bevel_width, + resource.wstyle.l_text_focus, + label); } @@ -2014,19 +1943,10 @@ void BScreen::showGeometry(unsigned int gx, unsigned int gy) { XClearWindow(blackbox->getXDisplay(), geom_window); - BPen pen(resource.wstyle.l_text_focus, resource.wstyle.font); - if (i18n.multibyte()) { - XmbDrawString(blackbox->getXDisplay(), geom_window, - resource.wstyle.fontset, pen.gc(), - resource.bevel_width, resource.bevel_width - - resource.wstyle.fontset_extents->max_ink_extent.y, - label, strlen(label)); - } else { - XDrawString(blackbox->getXDisplay(), geom_window, - pen.gc(), resource.bevel_width, - resource.wstyle.font->ascent + - resource.bevel_width, label, strlen(label)); - } + resource.wstyle.font->drawString(geom_window, + resource.bevel_width, resource.bevel_width, + resource.wstyle.l_text_focus, + label); } @@ -2102,7 +2022,7 @@ Workspace* BScreen::getWorkspace(unsigned int index) { } -void BScreen::buttonPressEvent(XButtonEvent *xbutton) { +void BScreen::buttonPressEvent(const XButtonEvent *xbutton) { if (xbutton->button == 1) { if (! isRootColormapInstalled()) image_control->installRootColormap(); @@ -2167,28 +2087,26 @@ void BScreen::buttonPressEvent(XButtonEvent *xbutton) { void BScreen::toggleFocusModel(FocusModel model) { + std::for_each(windowList.begin(), windowList.end(), + std::mem_fun(&BlackboxWindow::ungrabButtons)); + if (model == SloppyFocus) { saveSloppyFocus(True); } else { + // we're cheating here to save writing the config file 3 times + resource.auto_raise = False; + resource.click_raise = False; saveSloppyFocus(False); - saveAutoRaise(False); - saveClickRaise(False); } - updateFocusModel(); -} - - -void BScreen::updateFocusModel() -{ - std::for_each(workspacesList.begin(), workspacesList.end(), - std::mem_fun(&Workspace::updateFocusModel)); + std::for_each(windowList.begin(), windowList.end(), + std::mem_fun(&BlackboxWindow::grabButtons)); } BTexture BScreen::readDatabaseTexture(const string &rname, const string &default_color, - Configuration &style) { + const Configuration &style) { BTexture texture; string s; @@ -2218,8 +2136,8 @@ BTexture BScreen::readDatabaseTexture(const string &rname, BColor BScreen::readDatabaseColor(const string &rname, - const string &default_color, - Configuration &style) { + const string &default_color, + const Configuration &style) { BColor color; string s; if (style.getValue(rname, s)) @@ -2230,195 +2148,41 @@ BColor BScreen::readDatabaseColor(const string &rname, } -XFontSet BScreen::readDatabaseFontSet(const string &rname, - Configuration &style) { - char *defaultFont = "fixed"; +BFont *BScreen::readDatabaseFont(const string &rbasename, + const Configuration &style) { + string fontname; - bool load_default = True; string s; - XFontSet fontset = 0; - if (style.getValue(rname, s) && (fontset = createFontSet(s))) - load_default = False; - - if (load_default) { - fontset = createFontSet(defaultFont); - - if (! fontset) { - fprintf(stderr, - i18n(ScreenSet, ScreenDefaultFontLoadFail, - "BScreen::setCurrentStyle(): couldn't load default font.\n")); - exit(2); - } - } - return fontset; -} - - -XFontStruct *BScreen::readDatabaseFont(const string &rname, - Configuration &style) { - char *defaultFont = "fixed"; - - bool load_default = False; - string s; - XFontStruct *font = 0; - if (style.getValue(rname, s)) { - if ((font = XLoadQueryFont(blackbox->getXDisplay(), s.c_str())) == NULL) { - fprintf(stderr, - i18n(ScreenSet, ScreenFontLoadFail, - "BScreen::setCurrentStyle(): couldn't load font '%s'\n"), - s.c_str()); - - load_default = True; - } - } else { - load_default = True; - } - - if (load_default) { - font = XLoadQueryFont(blackbox->getXDisplay(), defaultFont); - if (font == NULL) { - fprintf(stderr, - i18n(ScreenSet, ScreenDefaultFontLoadFail, - "BScreen::setCurrentStyle(): couldn't load default font.\n")); - exit(2); - } - } - - return font; -} - - -#ifndef HAVE_STRCASESTR -static const char * strcasestr(const char *str, const char *ptn) { - const char *s2, *p2; - for(; *str; str++) { - for(s2=str,p2=ptn; ; s2++,p2++) { - if (! *p2) return str; - if (toupper(*s2) != toupper(*p2)) break; - } - } - return NULL; -} -#endif // HAVE_STRCASESTR - - -static const char *getFontElement(const char *pattern, char *buf, - int bufsiz, ...) { - const char *p, *v; - char *p2; - va_list va; - - va_start(va, bufsiz); - buf[bufsiz-1] = 0; - buf[bufsiz-2] = '*'; - while((v = va_arg(va, char *)) != NULL) { - p = strcasestr(pattern, v); - if (p) { - strncpy(buf, p+1, bufsiz-2); - p2 = strchr(buf, '-'); - if (p2) *p2=0; - va_end(va); - return p; - } - } - va_end(va); - strncpy(buf, "*", bufsiz); - return NULL; -} - - -static const char *getFontSize(const char *pattern, int *size) { - const char *p; - const char *p2=NULL; - int n=0; - - for (p=pattern; 1; p++) { - if (! *p) { - if (p2!=NULL && n>1 && n<72) { - *size = n; return p2+1; - } else { - *size = 16; return NULL; - } - } else if (*p=='-') { - if (n>1 && n<72 && p2!=NULL) { - *size = n; - return p2+1; - } - p2=p; n=0; - } else if (*p>='0' && *p<='9' && p2!=NULL) { - n *= 10; - n += *p-'0'; - } else { - p2=NULL; n=0; +#ifdef XFT + int i; + if (style.getValue(rbasename + "xft.font", s) && + style.getValue(rbasename + "xft.size", i)) { + string family = s; + bool bold = False; + bool italic = False; + if (style.getValue(rbasename + "xft.flags", s)) { + if (s.find("bold") != string::npos) + bold = True; + if (s.find("italic") != string::npos) + italic = True; } + + BFont *b = new BFont(blackbox->getXDisplay(), this, family, i, bold, + italic, resource.aa_fonts); + if (b->valid()) + return b; + else + delete b; // fall back to the normal X font stuff } -} - - -XFontSet BScreen::createFontSet(const string &fontname) { - XFontSet fs; - char **missing, *def = "-"; - int nmissing, pixel_size = 0, buf_size = 0; - char weight[FONT_ELEMENT_SIZE], slant[FONT_ELEMENT_SIZE]; - - fs = XCreateFontSet(blackbox->getXDisplay(), - fontname.c_str(), &missing, &nmissing, &def); - if (fs && (! nmissing)) - return fs; - - const char *nfontname = fontname.c_str(); -#ifdef HAVE_SETLOCALE - if (! fs) { - if (nmissing) XFreeStringList(missing); - - setlocale(LC_CTYPE, "C"); - fs = XCreateFontSet(blackbox->getXDisplay(), fontname.c_str(), - &missing, &nmissing, &def); - setlocale(LC_CTYPE, ""); - } -#endif // HAVE_SETLOCALE +#endif // XFT - if (fs) { - XFontStruct **fontstructs; - char **fontnames; - XFontsOfFontSet(fs, &fontstructs, &fontnames); - nfontname = fontnames[0]; - } + style.getValue(rbasename + "font", s); + // if this fails, a blank string will be used, which will cause the fallback + // font to load. - getFontElement(nfontname, weight, FONT_ELEMENT_SIZE, - "-medium-", "-bold-", "-demibold-", "-regular-", NULL); - getFontElement(nfontname, slant, FONT_ELEMENT_SIZE, - "-r-", "-i-", "-o-", "-ri-", "-ro-", NULL); - getFontSize(nfontname, &pixel_size); - - if (! strcmp(weight, "*")) - strncpy(weight, "medium", FONT_ELEMENT_SIZE); - if (! strcmp(slant, "*")) - strncpy(slant, "r", FONT_ELEMENT_SIZE); - if (pixel_size < 3) - pixel_size = 3; - else if (pixel_size > 97) - pixel_size = 97; - - buf_size = strlen(nfontname) + (FONT_ELEMENT_SIZE * 2) + 64; - char *pattern2 = new char[buf_size]; - sprintf(pattern2, - "%s," - "-*-*-%s-%s-*-*-%d-*-*-*-*-*-*-*," - "-*-*-*-*-*-*-%d-*-*-*-*-*-*-*,*", - nfontname, weight, slant, pixel_size, pixel_size); - nfontname = pattern2; - - if (nmissing) - XFreeStringList(missing); - if (fs) - XFreeFontSet(blackbox->getXDisplay(), fs); - - fs = XCreateFontSet(blackbox->getXDisplay(), nfontname, &missing, - &nmissing, &def); - - delete [] pattern2; - - return fs; + BFont *b = new BFont(blackbox->getXDisplay(), this, s); + if (! b->valid()) + exit(2); // can't continue without a font + return b; }