2 #include "../lib/xdock.h"
11 ImlibData
* imlib_data
;
12 int screen_w
, screen_h
;
15 Pixmap
load_xpm(char** xpm
)
17 ImlibImage
* image
= Imlib_create_image_from_xpm_data(
19 Imlib_render(imlib_data
, image
, image
->rgb_width
, image
->rgb_height
);
20 return Imlib_copy_image(imlib_data
, image
);
23 static void add_color(client_t
* client
, int n
, const char* c
)
25 XParseColor(display
, client
->colormap
, c
, &client
->color
[n
]);
26 XAllocColor(display
, client
->colormap
, &client
->color
[n
]);
29 static void initialize_colormap(client_t
* client
)
31 client
->colormap
= DefaultColormap(display
, 0);
32 add_color(client
, XD_BLACK
, "#000000");
33 add_color(client
, XD_GRAY_10
, "#191919");
34 add_color(client
, XD_GRAY_20
, "#333333");
35 add_color(client
, XD_GRAY_30
, "#4C4C4C");
36 add_color(client
, XD_GRAY_40
, "#656565");
37 add_color(client
, XD_GRAY_50
, "#7F7F7F");
38 add_color(client
, XD_GRAY_60
, "#989898");
39 add_color(client
, XD_GRAY_70
, "#B1B1B1");
40 add_color(client
, XD_GRAY_80
, "#CACACA");
41 add_color(client
, XD_GRAY_90
, "#E3E3E3");
42 add_color(client
, XD_WHITE
, "#FFFFFF");
44 add_color(client
, XD_LED_BG
, "#1B1B1B");
45 add_color(client
, XD_LED_UNLIT_1
, "#004840");
46 add_color(client
, XD_LED_UNLIT_2
, "#007C70");
47 add_color(client
, XD_LED_LIT_1
, "#188880");
48 add_color(client
, XD_LED_LIT_2
, "#20B0A8");
49 add_color(client
, XD_LED_GLOW
, "#00E800");
56 display
= XOpenDisplay(NULL
);
59 fprintf(stderr
, "Could not open display.\n");
63 imlib_data
= Imlib_init(display
);
65 white
= WhitePixel(display
, DefaultScreen(display
));
67 screen_w
= XDisplayWidth(display
, DefaultScreen(display
));
68 screen_h
= XDisplayHeight(display
, DefaultScreen(display
));
73 int draw_new_client(client_t
* client
)
75 Atom atoms
[2] = { None
, None
};
77 unsigned long struts
[12] = { 0, };
79 client
->window
= XCreateSimpleWindow(
81 DefaultRootWindow(display
),
82 screen_w
- 64, 0, // position
87 // XSelectInput(display, client->window, StructureNotifyMask);
89 XMapWindow(display
, client
->window
);
91 atoms
[0] = XInternAtom(display
, "_NET_WM_WINDOW_TYPE_DOCK", False
);
92 XChangeProperty(display
, client
->window
,
93 XInternAtom(display
, "_NET_WM_WINDOW_TYPE", False
),
94 XA_ATOM
, 32, PropModeReplace
,
95 (unsigned char*) atoms
,
98 strut
= XInternAtom(display
, "_NET_WM_STRUT", False
);
100 XChangeProperty(display
, client
->window
, strut
, XA_CARDINAL
, 32, PropModeReplace
,
101 (unsigned char*)&struts
, 4);
103 // XMoveWindow(display, client->window, screen_w - 64, 0);
104 XResizeWindow(display
, client
->window
, 64, 64);
106 client
->gc
= XCreateGC(display
, client
->window
, 0, NULL
);
108 initialize_colormap(client
);
112 client
->pixmap
= load_xpm(square_xpm
);
114 XSelectInput(display
, client
->window
, ExposureMask
| StructureNotifyMask
);
119 void undraw_client(client_t
* client
)
121 XUnmapWindow(display
, client
->window
);
122 XDestroyWindow(display
, client
->window
);
131 XNextEvent(display
, &event
);
136 client_t
* current
= first_client
;
139 if(current
->window
== event
.xexpose
.window
)
141 draw_update(current
);
144 current
= current
->next
;
154 int draw_update(client_t
* client
)
157 XCopyArea(display
, client
->pixmap
, client
->window
, client
->gc
, 0, 0, 64, 64, 0, 0);
162 int draw_pixel(client_t
* client
, int cl
, int x
, int y
)
164 // TODO check if color validated
165 XSetForeground(display
, client
->gc
, client
->color
[cl
].pixel
);
166 XDrawPoint(display
, client
->pixmap
, client
->gc
, x
, y
);
171 int draw_line(client_t
* client
, int cl
, int x1
, int y1
, int x2
, int y2
)
173 // TODO check if color validated
174 XSetForeground(display
, client
->gc
, client
->color
[cl
].pixel
);
175 XDrawLine(display
, client
->pixmap
, client
->gc
, x1
, y1
, x2
, y2
);
180 int write_text(client_t
* client
, int f
, int x
, int y
, unsigned char *text
)
188 // printf("write_text -> %s\n", text);
190 while(i
< strlen((char*)text
))
194 XGetGeometry(display
, font
[f
][text
[i
]], &tmpw
, &t
, &t
,
196 if(x
> 0 && (x
+w
) < 64 && y
> 0 && (y
+h
) < 64)
197 XCopyArea(display
, font
[f
][text
[i
]], client
->pixmap
, client
->gc
,
207 int move_box(client_t
* client
, int x
, int y
, int w
, int h
, int direction
, int s
, int bg_color
)
209 XSetForeground(display
, client
->gc
, client
->color
[bg_color
].pixel
);
214 XCopyArea(display
, client
->pixmap
, client
->pixmap
, client
->gc
,
215 x
+s
, y
, w
-1, h
, x
, y
);
216 XDrawLine(display
, client
->pixmap
, client
->gc
, x
+w
-s
, y
, x
+w
-s
, y
+h
-s
);
219 XCopyArea(display
, client
->pixmap
, client
->pixmap
, client
->gc
,
220 x
, y
, w
-s
, h
, x
+s
, y
);
221 XDrawLine(display
, client
->pixmap
, client
->gc
, x
, y
, x
, y
+h
-s
);
224 XCopyArea(display
, client
->pixmap
, client
->pixmap
, client
->gc
,
225 x
, y
, w
, h
-s
, x
, y
+s
);
226 XDrawLine(display
, client
->pixmap
, client
->gc
, x
, y
, x
+w
-s
, y
);
229 XCopyArea(display
, client
->pixmap
, client
->pixmap
, client
->gc
,
230 x
, y
+s
, w
, h
-s
, x
, y
);
231 XDrawLine(display
, client
->pixmap
, client
->gc
, x
, y
+h
-s
, x
+w
-s
, y
+h
-s
);
240 int new_pixmap(client_t
* client
, int number
, int bytes
, unsigned char* xpm
)
243 int c
, j
, i
= 0, n
= 0, nulls
= 0;
246 for(j
=0; j
<bytes
; j
++)
249 xpm_pixmap
= malloc((nulls
+ 1) * sizeof(char*));
254 // find number of characters
258 xpm_pixmap
[n
] = malloc(c
+1);
259 memcpy(xpm_pixmap
[n
], &xpm
[i
], c
+1);
264 xpm_pixmap
[n
] = NULL
;
267 client
->image
= realloc(client
->image
, sizeof(image_t
) * client
->n_images
);
268 client
->image
[client
->n_images
].n
= number
;
269 client
->image
[client
->n_images
].pixmap
= load_xpm(xpm_pixmap
);
277 int draw_image(client_t
* client
, int n
, int x
, int y
)
283 unsigned int w
, h
, ut
;
287 for(i
=0; i
<client
->n_images
; i
++)
288 if(client
->image
[i
].n
== n
)
291 pixmap
= client
->image
[i
].pixmap
;
297 XGetGeometry(display
, pixmap
, &tmpw
, &t
, &t
,
299 XCopyArea(display
, pixmap
, client
->pixmap
, client
->gc
,
305 int draw_led_panel(client_t
* client
, int x
, int y
, int w
, int h
)
307 XSetForeground(display
, client
->gc
, client
->color
[XD_GRAY_90
].pixel
);
308 XSetBackground(display
, client
->gc
, client
->color
[XD_GRAY_90
].pixel
);
309 XFillRectangle(display
, client
->pixmap
, client
->gc
, x
, y
, w
, h
);
311 XSetForeground(display
, client
->gc
, client
->color
[XD_BLACK
].pixel
);
312 XSetBackground(display
, client
->gc
, client
->color
[XD_BLACK
].pixel
);
313 XFillRectangle(display
, client
->pixmap
, client
->gc
, x
, y
, w
-1, h
-1);
315 XSetForeground(display
, client
->gc
, client
->color
[XD_LED_BG
].pixel
);
316 XSetBackground(display
, client
->gc
, client
->color
[XD_LED_BG
].pixel
);
317 XFillRectangle(display
, client
->pixmap
, client
->gc
, x
+1, y
+1, w
-2, h
-2);