-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathcheerilee-definitions.el
185 lines (158 loc) · 6.51 KB
/
cheerilee-definitions.el
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
;;; cheerilee-definitions.el --- Elements definitions -*- lexical-binding: t -*-
;; Copyright (C) 2015 Alessio Vanni
;; Author: Alessio Vanni <[email protected]>
;; Created: December 2015
;; This file is not part of GNU Emacs.
;; Cheerilee 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.
;; Cheerilee 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 GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; This file provides macros to generate new elements for
;; the application tree.
;;; Code:
(require 'cheerilee-classes)
(require 'cheerilee-core)
(defsubst cheerilee--mapcar-when-list (list)
"Return a list containing conses."
(delq nil
(mapcar (lambda (x) (when (and (not (eq (car-safe x) 'cons))
(not (eq (car-safe x) 'quote))
(listp x)) x)) list)))
(defsubst cheerilee--mapcar-unless-list (list)
"Return a list not containing conses."
(delq nil
(mapcar (lambda (x) (unless (and (not (eq (car-safe x) 'cons))
(not (eq (car-safe x) 'quote))
(listp x)) x)) list)))
(defmacro cheerilee-defframe (id &rest args)
"Define a new frame.
ID can be any Lisp object, and it is used as a name for the frame.
ARGS begins with any combinations of keywords, and ends with
the definition of any number of children (such as windows or buttons).
When no children are provided, it is not required to specify nil.
The available keywords for frames are:
:name - The string to be shown in the Window Manager title bar
:background - The default color for the frame background
:size - The frame's size relative to the display."
(declare (debug (form body))
(indent defun))
(let ((instlist)
(restlist))
(when args
(setq instlist (cheerilee--mapcar-unless-list args))
(setq restlist (cheerilee--mapcar-when-list args)))
`(list (list 'frame
(make-instance cheerilee-frame
,@instlist)
(xcb:generate-id cheerilee-connection)
,id ,@restlist))))
(defmacro cheerilee-defwindow (id &rest args)
"Define a new window.
ID can be any Lisp object, and it is used as a name for the frame.
ARGS begins with any combinations of keywords, and ends with
the definition of any number of children (such as windows or buttons).
When no children are provided, it is not required to specify nil.
The available keywords for windows are:
:location - Where the window is placed, relative to the parent position
:size - The window dimensions
:foreground - The default color for text and borders
:background - The default color for text background
:line-width - How much wide the text, borders, etc. are drawn"
(declare (debug (form body))
(indent defun))
(let ((instlist)
(restlist))
(when args
(setq instlist (cheerilee--mapcar-unless-list args))
(setq restlist (cheerilee--mapcar-when-list args)))
`(list 'window
(make-instance cheerilee-window
,@instlist)
(xcb:generate-id cheerilee-connection)
,id ,@restlist)))
(defmacro cheerilee-defbutton (id &rest args)
"Define a new button.
ID can be any Lisp object, and it is used as a name for the frame.
ARGS begins with any combinations of keywords, and ends with
the definition of any number of children (such as windows or buttons).
When no children are provided, it is not required to specify nil.
The available keywords for buttons are:
:location - Where the button is placed, relative to the parent position
:size - The button dimensions
:foreground - The default color for text and borders
:background - The default color for text background
:line-width - How much wide the borders, etc. are drawn
:font - The font used to display text
:text - Any string to be drawn inside the element"
(declare (debug (form body))
(indent defun))
(let ((instlist)
(restlist))
(when args
(setq instlist (cheerilee--mapcar-unless-list args))
(setq restlist (cheerilee--mapcar-when-list args)))
`(list 'button
(make-instance cheerilee-button
,@instlist)
(xcb:generate-id cheerilee-connection)
,id ,@restlist)))
(defmacro cheerilee-deftext (id &rest args)
"Define a new text element.
ID can be any Lisp object, and it is used as a name for the frame.
ARGS begins with any combinations of keywords, and ends with
the definition of any number of children (such as windows or buttons).
When no children are provided, it is not required to specify nil.
The available keywords for buttons are:
:location - Where the element is placed, relative to the parent position
:foreground - The default color for text
:background - The default color for text background
:line-width - How much wide the text, borders, etc. are drawn
:font - The font used to display text
:text - Any string to be drawn inside the element"
(declare (debug (form body))
(indent defun))
(let ((instlist)
(restlist))
(when args
(setq instlist (cheerilee--mapcar-unless-list args))
(setq restlist (cheerilee--mapcar-when-list args)))
`(list 'text
(make-instance cheerilee-text
,@instlist)
(xcb:generate-id cheerilee-connection)
,id ,@restlist)))
(defmacro cheerilee-deftextbox (id &rest args)
"Define a new textbox.
ID can be any Lisp object, and it is used as a name for the frame.
ARGS begins with any combinations of keywords, and ends with
the definition of any number of children (such as windows or buttons).
When no children are provided, it is not required to specify nil.
The available keywords for buttons are:
:location - Where the element is placed, relative to the parent position
:size - The box dimensions
:foreground - The default color for text
:background - The default color for text background
:line-width - How much wide the text, borders, etc. are drawn
:font - The font used to display text
:text - Initial string inside the box."
(declare (debug (form body))
(indent defun))
(let ((instlist)
(restlist))
(when args
(setq instlist (cheerilee--mapcar-unless-list args))
(setq restlist (cheerilee--mapcar-when-list args)))
`(list 'textbox
(make-instance cheerilee-textbox
,@instlist)
(xcb:generate-id cheerilee-connection)
,id ,@restlist)))
(provide 'cheerilee-definitions)
;;; cheerilee-definitions.el ends here