ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/rxvtcolor.C
Revision: 1.5
Committed: Tue Feb 10 00:40:39 2004 UTC (20 years, 4 months ago) by pcg
Content type: text/plain
Branch: MAIN
Changes since 1.4: +9 -0 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 pcg 1.1 #include "../config.h"
2     #include <rxvt.h>
3 pcg 1.4 #include <rxvtcolor.h>
4 pcg 1.1
5 pcg 1.4 #include <unistd.h>
6     #include <fcntl.h>
7 pcg 1.1
8 pcg 1.4 /////////////////////////////////////////////////////////////////////////////
9    
10     rxvt_display::rxvt_display (const char *name)
11     : x_watcher (this, &rxvt_display::x_event)
12 pcg 1.5 , selection_owner (0)
13 pcg 1.4 {
14     this->name = STRDUP (name);
15     }
16    
17     rxvt_display::~rxvt_display ()
18     {
19     free (name);
20     }
21    
22     bool rxvt_display::open ()
23     {
24     display = XOpenDisplay (name);
25    
26     screen = DefaultScreen (display);
27     root = DefaultRootWindow (display);
28     visual = DefaultVisual (display, screen);
29     cmap = DefaultColormap (display, screen);
30     depth = DefaultDepth (display, screen);
31    
32     #ifdef PREFER_24BIT
33     /*
34     * If depth is not 24, look for a 24bit visual.
35     */
36     if (depth != 24)
37     {
38     XVisualInfo vinfo;
39    
40     if (XMatchVisualInfo (display, screen, 24, TrueColor, &vinfo))
41     {
42     depth = 24;
43     visual = vinfo.visual;
44     cmap = XCreateColormap (display,
45     RootWindow (display, screen),
46     visual, AllocNone);
47     }
48     }
49     #endif
50    
51     int fd = XConnectionNumber (display);
52     x_watcher.start (fd, EVENT_READ);
53     fcntl (fd, F_SETFL, FD_CLOEXEC);
54    
55     return true;
56     }
57    
58     void rxvt_display::close ()
59     {
60     x_watcher.stop ();
61    
62     XCloseDisplay (display);
63     }
64    
65     void rxvt_display::x_event (io_watcher &w, short revents)
66     {
67     do
68     {
69     XEvent xev;
70     XNextEvent (display, &xev);
71    
72     for (int i = xw.size (); i--; )
73     {
74     if (!xw[i])
75     xw.erase_unordered (i);
76     else if (xw[i]->window == xev.xany.window)
77     xw[i]->call (xev);
78     }
79     }
80     while (XPending (display));
81     }
82    
83     void rxvt_display::reg (xevent_watcher *w)
84     {
85     xw.push_back (w);
86     w->active = xw.size ();
87     }
88    
89     void rxvt_display::unreg (xevent_watcher *w)
90     {
91     if (w->active)
92     xw[w->active - 1] = 0;
93     }
94    
95 pcg 1.5 void rxvt_display::set_selection_owner (rxvt_term *owner)
96     {
97     if (selection_owner && selection_owner != owner)
98     selection_owner->selection_clear ();
99    
100     selection_owner = owner;
101     }
102    
103 pcg 1.4 /////////////////////////////////////////////////////////////////////////////
104    
105     rxvt_displays displays;
106    
107     rxvt_display *rxvt_displays::get (const char *name)
108     {
109     for (rxvt_display **i = list.begin (); i < list.end (); ++i)
110     {
111     if (!strcmp (name, (*i)->name))
112     {
113     (*i)->referenced++;
114     return *i;
115     }
116     }
117    
118     rxvt_display *display = new rxvt_display (name);
119    
120     display->referenced = 1;
121    
122     if (display && display->open ())
123     list.push_back (display);
124     else
125     {
126     delete display;
127     display = 0;
128     }
129    
130     return display;
131     }
132    
133     void rxvt_displays::release (rxvt_display *display)
134     {
135     if (!--display->referenced)
136     {
137     display->close ();
138     delete display;
139     list.erase (find (list.begin (), list.end (), display));
140     }
141     }
142    
143     /////////////////////////////////////////////////////////////////////////////
144    
145 pcg 1.1 bool
146 pcg 1.4 rxvt_color::set (rxvt_display *display, Pixel p)
147 pcg 1.1 {
148     #if XFT
149     XColor xc;
150    
151     xc.pixel = p;
152 pcg 1.4 if (!XQueryColor (display->display, display->cmap, &xc))
153 pcg 1.1 return false;
154    
155     XRenderColor d;
156    
157     d.red = xc.red;
158     d.green = xc.green;
159     d.blue = xc.blue;
160     d.alpha = 0xffff;
161    
162     return
163 pcg 1.4 XftColorAllocValue (display->display,
164     display->visual,
165     display->cmap,
166     &d, &c);
167 pcg 1.1 #else
168     this->p = p;
169     #endif
170    
171     return true;
172     }
173    
174     bool
175 pcg 1.4 rxvt_color::set (rxvt_display *display, const char *name)
176 pcg 1.1 {
177     XColor xc;
178    
179 pcg 1.4 if (XParseColor (display->display, display->cmap, name, &xc))
180     return set (display, xc.red, xc.green, xc.blue);
181 pcg 1.1
182     return false;
183     }
184    
185     bool
186 pcg 1.4 rxvt_color::set (rxvt_display *display, unsigned short cr, unsigned short cg, unsigned short cb)
187 pcg 1.1 {
188     XColor xc;
189    
190     xc.red = cr;
191     xc.green = cg;
192     xc.blue = cb;
193     xc.flags = DoRed | DoGreen | DoBlue;
194    
195 pcg 1.4 if (XAllocColor (display->display, display->cmap, &xc))
196     return set (display, xc.pixel);
197 pcg 1.1
198     return false;
199     }
200    
201     void
202 pcg 1.4 rxvt_color::get (rxvt_display *display, unsigned short &cr, unsigned short &cg, unsigned short &cb)
203 pcg 1.1 {
204     #if XFT
205     cr = c.color.red;
206     cg = c.color.green;
207     cb = c.color.blue;
208     #else
209     XColor c;
210    
211     c.pixel = p;
212 pcg 1.4 XQueryColor (display->display, display->cmap, &c);
213 pcg 1.1
214     cr = c.red;
215     cg = c.green;
216     cb = c.blue;
217     #endif
218     }
219    
220 pcg 1.4 void
221     rxvt_color::free (rxvt_display *display)
222     {
223     #if XFT
224     XftColorFree (display->display, display->visual, display->cmap, &c);
225     #else
226     XFreeColors (display->display, display->cmap, &c, 1, AllPlanes);
227     #endif
228     }
229