about summary refs log tree commit diff stats
path: root/tests
Commit message (Collapse)AuthorAgeFilesLines
* Fix http_upload stubMichael Vetter2020-04-171-0/+3
|
* Update database stubMichael Vetter2020-04-071-3/+1
|
* Remove chat_log_get_previous()Michael Vetter2020-04-061-5/+0
| | | | | | | | | | | | We now dont get the log files from the text files via chat_log_get_previous() anymore. We use the sql backend via log_database_get_previous_chat(). So far it just has the same behaviour like chat_log_get_previous(), except that in _chatwin_history() we don't pass the sender to win_print_history() which should be fixed in a commit soon. And log_database_get_previous_chat() can later easily be expanded to fix https://github.com/profanity-im/profanity/issues/205.
* Add log_database_add_*() test stubsMichael Vetter2020-04-061-1/+6
|
* Fix message_send_private unittest stubMichael Vetter2020-04-061-1/+6
|
* db: add database unit test stubMichael Vetter2020-04-061-0/+31
|
* Add slashguard featureMichael Vetter2020-03-181-0/+1
| | | | | New command `/slashguard` tries to protect against typing ` /quit` by not allowing a slash in the first 4 characters.
* Add cons_avatar_setting to unit test stubMichael Vetter2020-03-101-0/+1
|
* Fix log test stubMichael Vetter2020-02-211-4/+5
|
* Fix test stubMichael Vetter2020-02-211-1/+1
| | | | Change done in eb2fbdba2efb9c81275461bf3651215b9456e496
* Allow utf8 symbols as omemo/pgp/otr indicator charMichael Vetter2020-02-201-2/+2
| | | | Fix https://github.com/profanity-im/profanity/issues/1264
* Parse mentions and triggers in muc history if display is 'regular'Michael Vetter2020-02-202-3/+3
| | | | Fix https://github.com/profanity-im/profanity/issues/1261
* Add builds.sr.ht CI for OpenBSDWilliam Wennerström2020-02-171-0/+6
| | | | | | | | * Add .builds/openbsd.yml for builds.sr.ht * Update travis-build.sh -> ci-build.sh with OpenBSD case * Fix libdl check in configure.ac (OpenBSD has libdl built-in) * Fix some minor issues found when compiling on OpenBSD with GCC (e.g. uninitialized variables)
* test: Init window.layout to make compiler happyMichael Vetter2020-02-141-0/+1
| | | | | Fix tests/unittests/test_cmd_otr.c:415: warning: 'window.layout' is used uninitialized in this function on openbsd (thanks optmzr)
* Fix testsMichael Vetter2020-02-141-1/+1
|
* xep-0308: adapt unit test stubsMichael Vetter2020-02-142-8/+6
|
* xep-0308: add cons_correction_setting stub to testsMichael Vetter2020-02-101-0/+1
|
* Fix unittest buildPaul Fariello2020-01-311-14/+14
|
* Add context to autocomplete_with_func and use it for omemo trust commandPaul Fariello2020-01-313-5/+5
| | | | Fix #1068
* Add cons_os_setting stub for testsMichael Vetter2020-01-241-0/+1
|
* Use OMEMO for offline MUC members (#1242)Paul Fariello2020-01-201-1/+1
|
* xep-0084: add test stub fileMichael Vetter2019-12-181-0/+7
|
* test: add cons_color_settingMichael Vetter2019-12-091-0/+1
|
* Add cons_logging_setting() to test stubMichael Vetter2019-11-131-2/+1
|
* Add cons_titlebar_setting stubMichael Vetter2019-11-051-1/+1
| | | | and remove encwarn one.
* Don't override ProfMessage Id with origin-idMichael Vetter2019-10-311-1/+1
| | | | | | | | | | Profanity sends the same value for both. Other clients might not. Safe both since we could need them later. Once we implement Last Message Correction we will need the regular id. If we override it with origin-id and another client chooses to not use the same value for id and origin-id then we can't interpret the id sent with the LMC request correctly.
* Adjust message stubs in unit testsMichael Vetter2019-10-291-4/+4
|
* Adjust stub for connection_get_profanity_identifierMichael Vetter2019-10-221-1/+1
|
* Move ProfMessage and message_is_sent_by_us to xmppMichael Vetter2019-10-191-1/+0
| | | | Not meant for internal usage only.
* Add message_is_sent_by_us stubMichael Vetter2019-10-181-0/+5
|
* Remove accidentally added fileMichael Vetter2019-10-181-7/+0
|
* Add connection_get_profanity_identifier stubMichael Vetter2019-10-183-0/+12
| | | | And move defintion to xmpp.h
* Fix memory leak in unittestsDmitry Podgorny2019-10-141-0/+1
|
* Fix invalid reads in unit testsMichael Vetter2019-10-101-2/+0
|
* Revert "Free lits in test_cmd_roster unittest"Michael Vetter2019-10-101-1/+0
| | | | | | This reverts commit 5b19ed28ce6f8bd8f46248de612f7ed466dc7a73. This caused a segfault.
* First destroy roster then free list in test_cmd_rosterMichael Vetter2019-10-061-3/+3
|
* Free strings in test_cmd_aliasMichael Vetter2019-10-061-0/+4
| | | | Regards https://github.com/profanity-im/profanity/issues/1019
* Free lits in test_cmd_roster unittestMichael Vetter2019-10-061-0/+4
| | | | Regards https://github.com/profanity-im/profanity/issues/1019
* Remove not needed strdupin test_cmd_roomsMichael Vetter2019-10-061-2/+3
| | | | Regards https://github.com/profanity-im/profanity/issues/1019
* Free autocomplete_complete results in unittestMichael Vetter2019-10-061-1/+19
| | | | Regards https://github.com/profanity-im/profanity/issues/1019
* Fix autocomplete memleak in test_autocompleteMichael Vetter2019-10-061-16/+16
| | | | | | | autocomplete_free() calls autocomplete_clear() and then frees the struct itself. Regards https://github.com/profanity-im/profanity/issues/1019
* Free lists in test_roster_listMichael Vetter2019-10-061-0/+20
| | | | | Fix memleaks. Regards https://github.com/profanity-im/profanity/issues/1019
* Fix two memleaks in test_parserMichael Vetter2019-10-061-0/+4
| | | | Regards https://github.com/profanity-im/profanity/issues/1019
* Fix memleak in cmd_bookmark_list_shows_bookmarks unittestMichael Vetter2019-10-061-0/+16
| | | | Regards https://github.com/profanity-im/profanity/issues/1019
* Fix memleak in test_parser unittestMichael Vetter2019-10-061-0/+2
| | | | Regards https://github.com/profanity-im/profanity/issues/1019
* Fix memleak in test_callbacks unittestMichael Vetter2019-10-061-0/+2
| | | | Regards https://github.com/profanity-im/profanity/issues/1019
* Fix memleak in test_parser unittestMichael Vetter2019-10-061-1/+7
| | | | Regards https://github.com/profanity-im/profanity/issues/1019
* Fix test_callbacks memleakMichael Vetter2019-10-061-0/+5
| | | | Regards https://github.com/profanity-im/profanity/issues/1019
* Fix test_jid unittest memleakMichael Vetter2019-10-061-0/+29
| | | | Regards https://github.com/profanity-im/profanity/issues/1019
* Fix unittest memleak in test_cmd_joinMichael Vetter2019-10-051-0/+8
| | | | | | muc_init() call without muc_close() Regards https://github.com/profanity-im/profanity/issues/1019
/suckless/dwm/blame/wm.c?h=5.8.1&id=8a8b7956b6de80decbfd3bff6d2ad6e5bb69b2bd'>^
1076f2b
39677ec ^
9e8b325 ^



39677ec ^
9cd686c ^



83d2390 ^
9cd686c ^

6458d72 ^
9cd686c ^









eb756ee ^



9cd686c ^
83d2390 ^
16c67f3 ^

439e15d ^
9cd686c ^
439e15d ^

9cd686c ^
1076f2b

0e5c819 ^
eb756ee ^
e3fd306 ^
0e5c819 ^
5b44976 ^

0e5c819 ^







6475be9 ^





0e5c819 ^
5b44976 ^
0e5c819 ^
eb756ee ^

5b44976 ^


eb756ee ^



0e5c819 ^
eb756ee ^
0e5c819 ^



439e15d ^

1076f2b




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
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327




                                                              
                  


                   
                   
                   




                           
                
 




                                 



                         

                                 
               
             
                    
                                        
                       
                    
           
 
                                  

                                               
 
            

                       

                             
                             
                                                              
                                                         

           
                                             
 














                                                                                           
                                                     





                            






















                                                                               
                                 



                       
                                                                              

























                                                     





                                                                 
   















                                                                      
                                                                             















                                                                 

         
                    
                                  

                              
                                                                           

 
    
              



                        


                            

                  

                                
                              
                 
                  
 













                                                            
                                                        








                                                              
                    

                            
                                                                          
 



                                                          

                                                                        

                                                                           


                                                                              




                                                                
                      
 
                   



                                           
 



                                        
 

                                              
                                                       









                                                                                       



                                                                                  
                                                                        
 

                                                                    
                                      
 

                                                                        
                                     

                    
                                                                   
         
                        
                             

                                                  







                                                                    





                                                                                           
                         
                                                                      
                                          

                                                                    


                                                                                 



                                                                               
                                                       
                                 



                                             

         




                           
/*
 * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
 * See LICENSE file for license details.
 */

#include <errno.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#include <X11/cursorfont.h>
#include <X11/Xatom.h>
#include <X11/Xproto.h>

#include "dwm.h"

/********** CUSTOMIZE **********/

char *tags[TLast] = {
	[Tscratch] = "scratch",
	[Tdev] = "dev",
	[Twww] = "www",
	[Twork] = "work",
};

/********** CUSTOMIZE **********/

/* X structs */
Display *dpy;
Window root, barwin;
Atom wm_atom[WMLast], net_atom[NetLast];
Cursor cursor[CurLast];
Bool running = True;
Bool issel;

int tsel = Tdev; /* default tag */
int screen, sx, sy, sw, sh, bx, by, bw, bh, mw;
char stext[1024];

DC dc = {0};
Client *clients = NULL;
Client *sel = NULL;

static Bool other_wm_running;
static const char version[] =
	"dwm-" VERSION ", (C)opyright MMVI Anselm R. Garbe\n";
static int (*x_error_handler) (Display *, XErrorEvent *);

static void
usage() {	error("usage: dwm [-v]\n"); }

static void
scan_wins()
{
	unsigned int i, num;
	Window *wins;
	XWindowAttributes wa;
	Window d1, d2;

	if(XQueryTree(dpy, root, &d1, &d2, &wins, &num)) {
		for(i = 0; i < num; i++) {
			if(!XGetWindowAttributes(dpy, wins[i], &wa))
				continue;
			if(wa.override_redirect || XGetTransientForHint(dpy, wins[i], &d1))
				continue;
			if(wa.map_state == IsViewable)
				manage(wins[i], &wa);
		}
	}
	if(wins)
		XFree(wins);
}

static int
win_property(Window w, Atom a, Atom t, long l, unsigned char **prop)
{
	Atom real;
	int format;
	unsigned long res, extra;
	int status;

	status = XGetWindowProperty(dpy, w, a, 0L, l, False, t, &real, &format,
			&res, &extra, prop);

	if(status != Success || *prop == 0) {
		return 0;
	}
	if(res == 0) {
		free((void *) *prop);
	}
	return res;
}

int
win_proto(Window w)
{
	unsigned char *protocols;
	long res;
	int protos = 0;
	int i;

	res = win_property(w, wm_atom[WMProtocols], XA_ATOM, 20L, &protocols);
	if(res <= 0) {
		return protos;
	}
	for(i = 0; i < res; i++) {
		if(protocols[i] == wm_atom[WMDelete])
			protos |= WM_PROTOCOL_DELWIN;
	}
	free((char *) protocols);
	return protos;
}

void
send_message(Window w, Atom a, long value)
{
	XEvent e;

	e.type = ClientMessage;
	e.xclient.window = w;
	e.xclient.message_type = a;
	e.xclient.format = 32;
	e.xclient.data.l[0] = value;
	e.xclient.data.l[1] = CurrentTime;
	XSendEvent(dpy, w, False, NoEventMask, &e);
	XFlush(dpy);
}

/*
 * There's no way to check accesses to destroyed windows, thus
 * those cases are ignored (especially on UnmapNotify's).
 * Other types of errors call Xlib's default error handler, which
 * calls exit().
 */
int
error_handler(Display *dpy, XErrorEvent *error)
{
	if(error->error_code == BadWindow
			|| (error->request_code == X_SetInputFocus
				&& error->error_code == BadMatch)
			|| (error->request_code == X_PolyText8
				&& error->error_code == BadDrawable)
			|| (error->request_code == X_PolyFillRectangle
				&& error->error_code == BadDrawable)
			|| (error->request_code == X_PolySegment
				&& error->error_code == BadDrawable)
			|| (error->request_code == X_ConfigureWindow
				&& error->error_code == BadMatch)
			|| (error->request_code == X_GrabKey
				&& error->error_code == BadAccess))
		return 0;
	fprintf(stderr, "dwm: fatal error: request code=%d, error code=%d\n",
			error->request_code, error->error_code);
	return x_error_handler(dpy, error); /* may call exit() */
}

/*
 * Startup Error handler to check if another window manager
 * is already running.
 */
static int
startup_error_handler(Display *dpy, XErrorEvent *error)
{
	other_wm_running = True;
	return -1;
}

static void
cleanup()
{
	while(sel) {
		resize(sel, True);
		unmanage(sel);
	}
	XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
}

void
quit(Arg *arg)
{
	running = False;
}

int
main(int argc, char *argv[])
{
	int i, n;
	fd_set rd;
	XSetWindowAttributes wa;
	unsigned int mask;
	Bool readstdin = True;
	Window w;
	XEvent ev;

	for(i = 1; (i < argc) && (argv[i][0] == '-'); i++) {
		switch (argv[i][1]) {
		case 'v':
			fprintf(stdout, "%s", version);
			exit(0);
			break;
		default:
			usage();
			break;
		}
	}

	dpy = XOpenDisplay(0);
	if(!dpy)
		error("dwm: cannot connect X server\n");

	screen = DefaultScreen(dpy);
	root = RootWindow(dpy, screen);

	/* check if another WM is already running */
	other_wm_running = False;
	XSetErrorHandler(startup_error_handler);
	/* this causes an error if some other WM is running */
	XSelectInput(dpy, root, SubstructureRedirectMask);
	XFlush(dpy);

	if(other_wm_running)
		error("dwm: another window manager is already running\n");

	XSetErrorHandler(0);
	x_error_handler = XSetErrorHandler(error_handler);

	/* init atoms */
	wm_atom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False);
	wm_atom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False);
	net_atom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False);
	net_atom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False);
	XChangeProperty(dpy, root, net_atom[NetSupported], XA_ATOM, 32,
			PropModeReplace, (unsigned char *) net_atom, NetLast);

	/* init cursors */
	cursor[CurNormal] = XCreateFontCursor(dpy, XC_left_ptr);
	cursor[CurResize] = XCreateFontCursor(dpy, XC_sizing);
	cursor[CurMove] = XCreateFontCursor(dpy, XC_fleur);

	update_keys();

	/* style */
	dc.bg = initcolor(BGCOLOR);
	dc.fg = initcolor(FGCOLOR);
	dc.border = initcolor(BORDERCOLOR);
	initfont(FONT);

	sx = sy = 0;
	sw = DisplayWidth(dpy, screen);
	sh = DisplayHeight(dpy, screen);
	mw = (sw * MASTERW) / 100;

	wa.override_redirect = 1;
	wa.background_pixmap = ParentRelative;
	wa.event_mask = ButtonPressMask | ExposureMask;

	bx = by = 0;
	bw = sw;
	dc.h = bh = dc.font.height + 4;
	barwin = XCreateWindow(dpy, root, bx, by, bw, bh, 0, DefaultDepth(dpy, screen),
			CopyFromParent, DefaultVisual(dpy, screen),
			CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa);
	XDefineCursor(dpy, barwin, cursor[CurNormal]);
	XMapRaised(dpy, barwin);

	dc.drawable = XCreatePixmap(dpy, root, sw, bh, DefaultDepth(dpy, screen));
	dc.gc = XCreateGC(dpy, root, 0, 0);
	draw_bar();

	issel = XQueryPointer(dpy, root, &w, &w, &i, &i, &i, &i, &mask);

	wa.event_mask = SubstructureRedirectMask | EnterWindowMask \
					| LeaveWindowMask;
	wa.cursor = cursor[CurNormal];

	XChangeWindowAttributes(dpy, root, CWEventMask | CWCursor, &wa);

	strcpy(stext, "dwm-"VERSION);
	scan_wins();

	/* main event loop, reads status text from stdin as well */
Mainloop:
	while(running) {
		FD_ZERO(&rd);
		if(readstdin)
			FD_SET(STDIN_FILENO, &rd);
		FD_SET(ConnectionNumber(dpy), &rd);

		i = select(ConnectionNumber(dpy) + 1, &rd, 0, 0, 0);
		if(i == -1 && errno == EINTR)
			continue;
		if(i < 0)
			error("select failed\n");
		else if(i > 0) {
			if(FD_ISSET(ConnectionNumber(dpy), &rd)) {
				while(XPending(dpy)) {
					XNextEvent(dpy, &ev);
					if(handler[ev.type])
						(handler[ev.type])(&ev); /* call handler */
				}
			}
			if(readstdin && FD_ISSET(STDIN_FILENO, &rd)) {
				i = n = 0;
				for(;;) {
					if((i = getchar()) == EOF) {
						/* broken pipe/end of producer */
						readstdin = False;
						strcpy(stext, "broken pipe");
						goto Mainloop;
					}
					if(i == '\n' || n >= sizeof(stext) - 1)
						break;
					stext[n++] = i;
				}
				stext[n] = 0;
				draw_bar();
			}
		}
	}

	cleanup();
	XCloseDisplay(dpy);

	return 0;
}