/////////////////////////////////////////////////////////////////////////////
// Name: cvisualalert.h
// Purpose:
// Author: Cesar Mauri Loba (cesar at crea-si dot com)
// Modified by:
// Created: 21/09/2010
// Copyright: (C) 2008 Cesar Mauri Loba - CREA Software Systems
//
// This program 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.
//
// This program 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, see .
/////////////////////////////////////////////////////////////////////////////
#include "cvisualalert.h"
#include
#if defined(__WXGTK__)
#include
#include
#include
#endif
#define PROGRESS_SIZE 30
#define PROGRESS_OFFSET 8
#define LINE_WIDTH 2
#define CROSS_SIZE 8
CVisualAlertProgress::CVisualAlertProgress()
{
m_oldSize= 0;
m_oldX= 0;
m_oldY= 0;
}
CVisualAlertProgress::~CVisualAlertProgress()
{
// End();
}
void CVisualAlertProgress::Update(int x, int y, int percent)
{
#if defined(__WXGTK__)
int size = (PROGRESS_SIZE * (100 - percent)) / 100;
if (size || m_oldSize) {
XGrabServer(m_display);
if (m_oldSize!= 0)
// Need to clear previos drawing
XDrawLine(m_display, m_window, m_gc, m_oldX + PROGRESS_OFFSET, m_oldY + PROGRESS_OFFSET,
m_oldX + PROGRESS_OFFSET, m_oldY + PROGRESS_OFFSET - m_oldSize);
if (size> 0)
// Draw progress bar
XDrawLine(m_display, m_window, m_gc, x+PROGRESS_OFFSET, y+PROGRESS_OFFSET, x+PROGRESS_OFFSET, y+PROGRESS_OFFSET - size);
XUngrabServer(m_display);
XFlush(m_display);
}
m_oldSize = size;
m_oldX = x;
m_oldY = y;
#else
// Remove warnings
(void)(percent);
(void)(x);
(void)(y);
#endif
}
void CVisualAlertProgress::End()
{
#if defined(__WXGTK__)
if(m_oldSize!= 0) {
// Need to clear previos drawing
XGrabServer(m_display);
XDrawLine(m_display, m_window, m_gc, m_oldX + PROGRESS_OFFSET, m_oldY + PROGRESS_OFFSET,
m_oldX + PROGRESS_OFFSET, m_oldY + PROGRESS_OFFSET - m_oldSize);
XUngrabServer(m_display);
XFlush(m_display);
m_oldSize= 0;
}
#endif
}
CVisualAlertDirection::CVisualAlertDirection()
{
m_running= false;
m_xOrigin= 0;
m_yOrigin= 0;
m_xOldDest= 0;
m_yOldDest= 0;
}
CVisualAlertDirection::~CVisualAlertDirection()
{
// End();
}
void CVisualAlertDirection::Update(int x, int y)
{
#if defined(__WXGTK__)
XGrabServer(m_display);
if (!m_running) {
// Not running. Use this point as origin
m_xOrigin= x;
m_yOrigin= y;
m_running= true;
// Draw cross.
XDrawLine(m_display, m_window, m_gc, m_xOrigin - CROSS_SIZE, m_yOrigin, m_xOrigin + CROSS_SIZE, m_yOrigin);
XDrawLine(m_display, m_window, m_gc, m_xOrigin, m_yOrigin - CROSS_SIZE, m_xOrigin, m_yOrigin + CROSS_SIZE);
}
else {
XSetForeground(m_display, m_gc, 0xff0000);
// Clear previous direction line
XDrawLine(m_display, m_window, m_gc, m_xOrigin, m_yOrigin, m_xOldDest, m_yOldDest);
// Draw new
XDrawLine(m_display, m_window, m_gc, m_xOrigin, m_yOrigin, x, y);
XSetForeground(m_display, m_gc, WhitePixel(m_display, m_screen));
}
XUngrabServer(m_display);
XFlush(m_display);
m_xOldDest= x;
m_yOldDest= y;
#else
// Remove warnings
(void)(x);
(void)(y);
#endif
}
void CVisualAlertDirection::End()
{
#if defined(__WXGTK__)
if (m_running) {
XGrabServer(m_display);
// Clear cross.
XDrawLine(m_display, m_window, m_gc, m_xOrigin - CROSS_SIZE, m_yOrigin, m_xOrigin + CROSS_SIZE, m_yOrigin);
XDrawLine(m_display, m_window, m_gc, m_xOrigin, m_yOrigin - CROSS_SIZE, m_xOrigin, m_yOrigin + CROSS_SIZE);
XSetForeground(m_display, m_gc, 0xff0000);
// Clear previous direction line
XDrawLine(m_display, m_window, m_gc, m_xOrigin, m_yOrigin, m_xOldDest, m_yOldDest);
XSetForeground(m_display, m_gc, WhitePixel(m_display, m_screen));
XUngrabServer(m_display);
XFlush(m_display);
m_running= false;
m_xOrigin= 0;
m_yOrigin= 0;
m_xOldDest= 0;
m_yOldDest= 0;
}
#endif
}
CVisualAlert::CVisualAlert()
{
#if defined(__WXGTK__)
m_display = (Display*) wxGetDisplay(); //XOpenDisplay(0);
m_screen = DefaultScreen(m_display);
m_window = XRootWindow(m_display, m_screen);
// Create GCs
m_gc = XCreateGC(m_display, m_window, 0, 0);
// White pixel
XSetForeground(m_display, m_gc, WhitePixel(m_display, m_screen));
// Draw on root draws on everything
XSetSubwindowMode(m_display, m_gc, IncludeInferiors);
// Nice fat lines
XSetLineAttributes(m_display, m_gc, LINE_WIDTH, LineSolid, CapButt, JoinRound);
// Use XOR, so drawind twice removes it
XSetFunction(m_display, m_gc, GXxor);
#endif
}
CVisualAlert::~CVisualAlert()
{
#if defined(__WXGTK__)
XFreeGC(m_display, m_gc);
#endif
}