X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2FScreen.cc;h=1b3860f46166ea02062e74f5ad86b4db340863e4;hb=b21cf8b33520e44611657e2876131b67dc0472d6;hp=a05c23865ee8380d0a1f565d2bd3e45ebad79069;hpb=08d793bb796f608774d6fdefd1950df54477e2c6;p=chaz%2Fopenbox diff --git a/src/Screen.cc b/src/Screen.cc index a05c2386..1b3860f4 100644 --- a/src/Screen.cc +++ b/src/Screen.cc @@ -106,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(); @@ -132,6 +132,8 @@ BScreen::BScreen(Blackbox *bb, unsigned int scrn) : ScreenInfo(bb, scrn) { resource.mstyle.t_font = resource.mstyle.f_font = resource.tstyle.font = resource.wstyle.font = (BFont *) 0; + geom_pixmap = None; + xatom->setSupported(this); // set-up netwm support #ifdef HAVE_GETPID xatom->setValue(getRootWindow(), XAtom::blackbox_pid, XAtom::cardinal, @@ -238,7 +240,7 @@ BScreen::BScreen(Blackbox *bb, unsigned int scrn) : ScreenInfo(bb, scrn) { raiseWindows(0, 0); // this also initializes the empty stacking list rootmenu->update(); - updateClientList(); // initialize the client list, which will be empty + updateClientList(); // initialize the client lists, which will be empty updateAvailableArea(); changeWorkspaceID(0); @@ -386,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) @@ -403,6 +412,12 @@ void BScreen::saveWindowToWindowSnap(bool s) { } +void BScreen::saveResizeZones(unsigned int z) { + resource.resize_zones = z; + config->setValue(screenstr + "resizeZones", resource.resize_zones); +} + + void BScreen::saveWindowCornerSnap(bool s) { resource.window_corner_snap = s; config->setValue(screenstr + "windowCornerSnap", @@ -495,6 +510,8 @@ void BScreen::save_rc(void) { saveSloppyFocus(resource.sloppy_focus); saveAutoRaise(resource.auto_raise); saveImageDither(doImageDither()); + saveAAFonts(resource.aa_fonts); + saveResizeZones(resource.resize_zones); saveOpaqueMove(resource.opaque_move); saveFullMax(resource.full_max); saveFocusNew(resource.focus_new); @@ -538,6 +555,14 @@ 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 + "resizeZones", resource.resize_zones) || + (resource.resize_zones != 1 && resource.resize_zones != 2 && + resource.resize_zones != 4)) + resource.resize_zones = 4; + if (! config->getValue(screenstr + "hideToolbar", resource.hide_toolbar)) resource.hide_toolbar = false; @@ -725,7 +750,7 @@ void BScreen::rereadMenu(void) { void BScreen::LoadStyle(void) { - Configuration style; + Configuration style(False); const char *sfile = blackbox->getStyleFilename(); if (sfile != NULL) { @@ -737,6 +762,9 @@ void BScreen::LoadStyle(void) { } } + // merge in the rc file + style.merge(config->file(), True); + string s; // load fonts/fontsets @@ -751,10 +779,10 @@ void BScreen::LoadStyle(void) { resource.wstyle.font = resource.tstyle.font = resource.mstyle.f_font = resource.mstyle.t_font = (BFont *) 0; - 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); + 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 = @@ -1045,6 +1073,8 @@ void BScreen::updateClientList(void) { } else xatom->setValue(getRootWindow(), XAtom::net_client_list, XAtom::window, 0, 0); + + updateStackingList(); } @@ -1056,7 +1086,7 @@ void BScreen::updateStackingList(void) { BlackboxWindowList stack_order; /* - * Get the atacking order from all of the workspaces. + * Get the stacking order from all of the workspaces. * We start with the current workspace so that the sticky windows will be * in the right order on the current workspace. * XXX: Do we need to have sticky windows in the list once for each workspace? @@ -1065,13 +1095,13 @@ void BScreen::updateStackingList(void) { for (unsigned int i = 0; i < getWorkspaceCount(); ++i) if (i != getCurrentWorkspaceID()) getWorkspace(i)->appendStackOrder(stack_order); - + if (stack_order.size() > 0) { // set the client list atoms Window *windows = new Window[stack_order.size()]; Window *win_it = windows; - BlackboxWindowList::iterator it = stack_order.begin(); - const BlackboxWindowList::iterator end = stack_order.end(); + BlackboxWindowList::iterator it = stack_order.begin(), + end = stack_order.end(); for (; it != end; ++it, ++win_it) *win_it = (*it)->getClientWindow(); xatom->setValue(getRootWindow(), XAtom::net_client_list_stacking, @@ -1374,6 +1404,7 @@ void BScreen::reassociateWindow(BlackboxWindow *w, unsigned int wkspc_id, getWorkspace(w->getWorkspaceNumber())->removeWindow(w); getWorkspace(wkspc_id)->addWindow(w); } + updateStackingList(); } @@ -2006,7 +2037,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(); @@ -2071,6 +2102,9 @@ 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 { @@ -2080,14 +2114,8 @@ void BScreen::toggleFocusModel(FocusModel model) { saveSloppyFocus(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)); } @@ -2135,13 +2163,38 @@ BColor BScreen::readDatabaseColor(const string &rname, } -BFont *BScreen::readDatabaseFont(const string &rname, +BFont *BScreen::readDatabaseFont(const string &rbasename, const Configuration &style) { string fontname; string s; - style.getValue(rname, s); // if this fails, a blank string will be used, - // which will cause the fallback font to load. + +#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 + } +#endif // XFT + + style.getValue(rbasename + "font", s); + // if this fails, a blank string will be used, which will cause the fallback + // font to load. BFont *b = new BFont(blackbox->getXDisplay(), this, s); if (! b->valid())