source: eviacam/trunk/fuentes/src/cvisualalert.cpp @ 567

Last change on this file since 567 was 567, checked in by mabarracus, 4 years ago

updated sources to version 2.0.3

  • Property svn:executable set to *
File size: 5.0 KB
Line 
1/////////////////////////////////////////////////////////////////////////////
2// Name:        cvisualalert.h
3// Purpose: 
4// Author:      Cesar Mauri Loba (cesar at crea-si dot com)
5// Modified by:
6// Created:     21/09/2010
7// Copyright:   (C) 2008 Cesar Mauri Loba - CREA Software Systems
8//
9//  This program is free software: you can redistribute it and/or modify
10//  it under the terms of the GNU General Public License as published by
11//  the Free Software Foundation, either version 3 of the License, or
12//  (at your option) any later version.
13//
14//  This program is distributed in the hope that it will be useful,
15//  but WITHOUT ANY WARRANTY; without even the implied warranty of
16//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17//  GNU General Public License for more details.
18//
19//  You should have received a copy of the GNU General Public License
20//  along with this program.  If not, see <http://www.gnu.org/licenses/>.
21/////////////////////////////////////////////////////////////////////////////
22#include "cvisualalert.h"
23#include <wx/utils.h>
24#if defined(__WXGTK__)
25#include <X11/Xutil.h>
26#include <X11/keysym.h>
27#include <gtk/gtk.h>
28#endif
29
30#define PROGRESS_SIZE 30
31#define PROGRESS_OFFSET 8
32#define LINE_WIDTH 2
33#define CROSS_SIZE 8
34
35CVisualAlertProgress::CVisualAlertProgress()
36{
37        m_oldSize= 0;
38        m_oldX= 0;
39        m_oldY= 0;
40}
41
42CVisualAlertProgress::~CVisualAlertProgress()
43{
44//      End();
45}
46
47void CVisualAlertProgress::Update(int x, int y, int percent)
48{
49#if defined(__WXGTK__)
50        int size = (PROGRESS_SIZE * (100 - percent)) / 100;
51       
52        if (size || m_oldSize) {
53                XGrabServer(m_display);
54       
55                if (m_oldSize!= 0) 
56                        // Need to clear previos drawing
57                        XDrawLine(m_display, m_window, m_gc, m_oldX + PROGRESS_OFFSET, m_oldY + PROGRESS_OFFSET, 
58                                m_oldX + PROGRESS_OFFSET, m_oldY + PROGRESS_OFFSET - m_oldSize);
59                if (size> 0)
60                        // Draw progress bar
61                        XDrawLine(m_display, m_window, m_gc, x+PROGRESS_OFFSET, y+PROGRESS_OFFSET,  x+PROGRESS_OFFSET, y+PROGRESS_OFFSET - size);
62               
63                XUngrabServer(m_display);
64                XFlush(m_display);
65        }
66       
67        m_oldSize = size;
68        m_oldX = x;
69        m_oldY = y;
70#else
71        // Remove warnings
72        (void)(percent);
73        (void)(x);
74        (void)(y);
75#endif
76}
77
78void CVisualAlertProgress::End()
79{
80#if defined(__WXGTK__)
81        if(m_oldSize!= 0) {
82                // Need to clear previos drawing       
83                XGrabServer(m_display);
84                XDrawLine(m_display, m_window, m_gc, m_oldX + PROGRESS_OFFSET, m_oldY + PROGRESS_OFFSET, 
85                          m_oldX + PROGRESS_OFFSET, m_oldY + PROGRESS_OFFSET - m_oldSize);
86                XUngrabServer(m_display);
87                XFlush(m_display);
88                m_oldSize= 0;
89        }
90#endif
91}
92
93CVisualAlertDirection::CVisualAlertDirection()
94{
95        m_running= false;
96        m_xOrigin= 0;
97        m_yOrigin= 0;
98        m_xOldDest= 0;
99        m_yOldDest= 0;
100}
101
102CVisualAlertDirection::~CVisualAlertDirection()
103{
104//      End();
105}
106
107void CVisualAlertDirection::Update(int x, int y)
108{
109#if defined(__WXGTK__)
110        XGrabServer(m_display);
111        if (!m_running) {
112                // Not running. Use this point as origin
113                m_xOrigin= x;
114                m_yOrigin= y;
115                m_running= true;
116               
117                // Draw cross.
118                XDrawLine(m_display, m_window, m_gc, m_xOrigin - CROSS_SIZE, m_yOrigin, m_xOrigin + CROSS_SIZE, m_yOrigin);
119                XDrawLine(m_display, m_window, m_gc, m_xOrigin, m_yOrigin - CROSS_SIZE, m_xOrigin, m_yOrigin + CROSS_SIZE);
120        }
121        else {
122                XSetForeground(m_display, m_gc, 0xff0000);
123                // Clear previous direction line
124                XDrawLine(m_display, m_window, m_gc, m_xOrigin, m_yOrigin, m_xOldDest, m_yOldDest);
125               
126                // Draw new
127                XDrawLine(m_display, m_window, m_gc, m_xOrigin, m_yOrigin, x, y);
128               
129                XSetForeground(m_display, m_gc, WhitePixel(m_display, m_screen));
130        }
131        XUngrabServer(m_display);
132        XFlush(m_display);
133       
134        m_xOldDest= x;
135        m_yOldDest= y;
136#else
137        // Remove warnings
138        (void)(x);
139        (void)(y);
140#endif
141}
142
143void CVisualAlertDirection::End()
144{
145#if defined(__WXGTK__)
146        if (m_running) {
147                XGrabServer(m_display);
148                // Clear cross.
149                XDrawLine(m_display, m_window, m_gc, m_xOrigin - CROSS_SIZE, m_yOrigin, m_xOrigin + CROSS_SIZE, m_yOrigin);
150                XDrawLine(m_display, m_window, m_gc, m_xOrigin, m_yOrigin - CROSS_SIZE, m_xOrigin, m_yOrigin + CROSS_SIZE);
151               
152                XSetForeground(m_display, m_gc, 0xff0000);
153                // Clear previous direction line
154                XDrawLine(m_display, m_window, m_gc, m_xOrigin, m_yOrigin, m_xOldDest, m_yOldDest);
155                               
156                XSetForeground(m_display, m_gc, WhitePixel(m_display, m_screen));
157                XUngrabServer(m_display);
158                XFlush(m_display);
159               
160                m_running= false;
161                m_xOrigin= 0;
162                m_yOrigin= 0;
163                m_xOldDest= 0;
164                m_yOldDest= 0;
165        }
166#endif
167}
168
169CVisualAlert::CVisualAlert()
170{
171#if defined(__WXGTK__) 
172        m_display = (Display*) wxGetDisplay(); //XOpenDisplay(0);
173       
174        m_screen = DefaultScreen(m_display);
175        m_window =  XRootWindow(m_display, m_screen);
176
177        // Create GCs
178        m_gc = XCreateGC(m_display, m_window, 0, 0);
179
180        // White pixel
181        XSetForeground(m_display, m_gc, WhitePixel(m_display, m_screen));
182
183        // Draw on root draws on everything
184        XSetSubwindowMode(m_display, m_gc, IncludeInferiors);
185
186        // Nice fat lines
187        XSetLineAttributes(m_display, m_gc, LINE_WIDTH, LineSolid, CapButt, JoinRound);
188
189        // Use XOR, so drawind twice removes it
190        XSetFunction(m_display, m_gc, GXxor);
191#endif
192}
193
194CVisualAlert::~CVisualAlert()
195{
196#if defined(__WXGTK__)
197        XFreeGC(m_display, m_gc);
198#endif
199}
Note: See TracBrowser for help on using the repository browser.