Browse Source

Hello C, either I am stupid or you're double edged

Anyway, you make me feel kind of stupid.
Lucas Stadler 13 years ago
parent
commit
170ee86b27
1 changed files with 52 additions and 40 deletions
  1. 52 40
      rust/keylog_xlib.c

+ 52 - 40
rust/keylog_xlib.c

@ -3,6 +3,7 @@
3 3
#include <stdio.h>
4 4
#include <stdlib.h>
5 5
#include <string.h>
6
#include <assert.h>
6 7
7 8
#include <X11/Xlib.h>
8 9
#include <X11/Xutil.h>
@ -10,6 +11,7 @@
10 11
11 12
/* internal state */
12 13
Window focused_window = None;
14
Window last_focused_window = None;
13 15
14 16
char *rfc3339_format_time(struct tm *time) {
15 17
	char *rfc3339 = malloc(sizeof(char) * 100);
@ -45,52 +47,28 @@ XTextProperty *get_window_name(Display *display, Window window) {
45 47
	return wm_name_prop;
46 48
}
47 49
48
void print_next_event(Display *display) {
49
	XEvent ev;
50
void print_focus() { printf("%ld %ld\n", last_focused_window, focused_window); }
51
void print_title(Display *display) {
52
	XTextProperty *wm_name_prop = get_window_name(display, focused_window);
53
	printf("focus '%s' %s\n", wm_name_prop->value, rfc3339_now_str());
54
	free(wm_name_prop);
55
}
56
void print_key(XEvent ev) {
50 57
	KeyCode kc= -1;
51 58
	KeySym ksym;
52 59
	char *ksymname = NULL;
53 60
	char *kname = malloc(sizeof(char) * 2);
54
	
55
	//printf("hi there, nice to see you.\n");
56
	
57
	if (focused_window == None) {
58
		//printf("no focus, let's look for it.\n");
59
		int r = 0;
60
		XGetInputFocus(display, &focused_window, &r);
61
		//printf("got focus\n");
62
		if (focused_window != None) {
63
			XSelectInput(display, focused_window, KeyPressMask | FocusChangeMask | PropertyChangeMask);
64
			//printf("selected input");
65
		} else {
66
			
67
		}
68
		return;
69
	}
70 61
71
	XNextEvent(display, &ev);
72
	if(ev.xany.type == FocusOut) {
73
		focused_window = None;
74
	} else if (ev.xany.type == PropertyNotify) {
75
		Atom _NET_WM_NAME = XInternAtom(display, "_NET_WM_NAME", False);
76
		if (ev.xproperty.atom == _NET_WM_NAME) {
77
			XTextProperty *wm_name_prop = get_window_name(display, focused_window);
78
			printf("focus '%s' %s\n", wm_name_prop->value, rfc3339_now_str());
79
			free(wm_name_prop);
80
		}
81
	} else if (ev.xany.type == KeyPress) {
82
		/* XLookupString  handle keyboard input events in Latin-1 */
83
		XLookupString(&ev.xkey, kname, 2, &ksym, 0);
62
	XLookupString(&ev.xkey, kname, 2, &ksym, 0);
84 63
85
		/* Find out string representation */
86
		if(ksym == NoSymbol) {
87
			ksymname = "NoSymbol";
88
		} else {
89
			if (!(ksymname = XKeysymToString (ksym))) {
90
				ksymname = "(no name)";
91
			}
92
			kc = XKeysymToKeycode(display, ksym);
64
	/* Find out string representation */
65
	if(ksym == NoSymbol) {
66
		ksymname = "NoSymbol";
67
	} else {
68
		if (!(ksymname = XKeysymToString (ksym))) {
69
			ksymname = "(no name)";
93 70
		}
71
		kc = XKeysymToKeycode(ev.xany.display, ksym);
94 72
	}
95 73
	
96 74
	if (ksymname != NULL) {
@ -102,6 +80,40 @@ void print_next_event(Display *display) {
102 80
			printf("'%s'", kname);
103 81
		}
104 82
		printf(" %s\n", rfc3339_now_str());
105
		fflush(stdout);
83
	}
84
}
85
86
void setup(Display *display) {
87
	int _ignore; Window window;
88
	XGetInputFocus(display, &window, &_ignore);
89
	XSelectInput(display, window, KeyPressMask | FocusChangeMask | PropertyChangeMask);
90
}
91
92
void unfocus(Display *display) {
93
	if (focused_window != None) {
94
		last_focused_window = focused_window;
95
		focused_window = None;
96
	}
97
}
98
99
void refocus(Display *display) {
100
	int _ignore;
101
	XGetInputFocus(display, &focused_window, &_ignore);
102
	assert(focused_window != None);
103
}
104
105
void print_next_event(Display *display) {
106
	setup(display); XGetInputFocus(display, &focused_window, malloc(sizeof(int)));
107
	XEvent ev; XNextEvent(display, &ev);
108
	Atom _NET_WM_NAME = XInternAtom(display, "_NET_WM_NAME", False);
109
	
110
	if (ev.xany.type == FocusOut) {
111
		unfocus(display);
112
	} else if ((ev.xany.type == PropertyNotify && ev.xproperty.atom == _NET_WM_NAME)
113
			|| (ev.xany.type == FocusIn)) {
114
		refocus(display);
115
		print_title(display);
116
	} else if (ev.xany.type == KeyPress) {
117
		print_key(ev);
106 118
	}
107 119
}