/* * vim: softtabstop=4 shiftwidth=4 cindent foldmethod=marker expandtab * * $LastChangedDate$ * $Revision$ * $LastChangedBy$ * $URL$ * * Copyright 2009-2011 Eric Connell * * This file is part of Mangler. * * Mangler 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 3 of the License, or * (at your option) any later version. * * Mangler 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 Mangler. If not, see . */ #include "mangler.h" #include "manglerosd.h" #ifdef HAVE_XOSD using namespace std; ManglerOsd::ManglerOsd() {/*{{{*/ userList = list(); osd_max_lines = 10; osd = NULL; }/*}}}*/ void ManglerOsd::createOsd(void) {/*{{{*/ if (osd) { destroyOsd(); } osd = xosd_create(osd_max_lines); //xosd_set_pos(osd,XOSD_top); //xosd_set_align(osd,XOSD_center); xosd_set_pos(osd, (xosd_pos)(Mangler::config["OnScreenDisplayVerticalPosition"].toInt())); xosd_set_align(osd, (xosd_align)(Mangler::config["OnScreenDisplayHorizontalAlignment"].toInt())); if (Mangler::config["OnScreenDisplayFontSize"].toDouble() > 8.0) { Glib::ustring fontstr = Glib::ustring::compose( "-*-*-*-*-*-*-0-%1-*-*-*-*-*-*", (int)(Mangler::config["OnScreenDisplayFontSize"].toDouble() * 10.0)); xosd_set_font(osd, fontstr.c_str()); } if (Mangler::config["OnScreenDisplayColor"].length()) { xosd_set_colour(osd, Mangler::config["OnScreenDisplayColor"].toCString()); } }/*}}}*/ void ManglerOsd::destroyOsd(void) {/*{{{*/ userList.clear(); if (osd) { xosd_destroy(osd); osd = NULL; } }/*}}}*/ bool ManglerOsd::checkOsdEnabled(void) {/*{{{*/ if (!Mangler::config["OnScreenDisplayEnabled"].toBool()) { if (osd) { destroyOsd(); } return false; } else if (!osd) { createOsd(); } return true; }/*}}}*/ void ManglerOsd::updateOsd(void) {/*{{{*/ if (!checkOsdEnabled()) { return; } if (userList.empty()) { xosd_hide(osd); return; } xosd_pos mosd_pos = (xosd_pos)(Mangler::config["OnScreenDisplayVerticalPosition"].toInt()); int i = (mosd_pos == XOSD_bottom) ? osd_max_lines - 1 : 0; list::iterator it; for(it=userList.begin(); it!= userList.end(); ++it) { xosd_display(osd,i,XOSD_string,it->c_str()); i += (mosd_pos == XOSD_bottom) ? -1 : 1; if ( i >= osd_max_lines || i < 0) { break; } } while (i >= 0 && i < osd_max_lines) { xosd_display(osd,i,XOSD_string," "); i += (mosd_pos == XOSD_bottom) ? -1 : 1; } }/*}}}*/ /* * Adds a user to the list of users talking */ void ManglerOsd::addUser(uint32_t id) {/*{{{*/ if (!checkOsdEnabled()) { return; } v3_user *u; list::iterator it; if ((u = v3_get_user(id))) { /* Don't 're-add' existing names */ for(it=userList.begin(); it!= userList.end(); ++it) { if (strcmp(it->c_str(),u->name)==0) { return; } } string s(u->name); userList.push_front(s); updateOsd(); v3_free_user(u); } }/*}}}*/ /* * Remove a user to the list of users talking */ void ManglerOsd::removeUser(uint32_t id) {/*{{{*/ if (!checkOsdEnabled()) { return; } v3_user *u; if ((u = v3_get_user(id))) { string s(u->name); userList.remove(s); updateOsd(); v3_free_user(u); } }/*}}}*/ #endif