usim

Check-in [8f1f5f72ee]
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Move send_accumulated_updates and accumulate_update to tv.c.
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | ams/sdl
Files: files | file ages | folders
SHA3-256: 8f1f5f72ee0666205795187385beb7feea8d964f01116141b645fa12e6151854
User & Date: ams 2024-06-25 09:39:04
Context
2024-06-25
09:54
ucfg.c: Handle setting modifiers in config file. check-in: 7bf9883f4f user: ams tags: ams/sdl
09:39
Move send_accumulated_updates and accumulate_update to tv.c. check-in: 8f1f5f72ee user: ams tags: ams/sdl
08:09
sdl2.c: Map Top key... check-in: d9db9b2bd7 user: ams tags: ams/sdl
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

Changes to sdl2.c.

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
#include <X11/keysym.h>		// for XK_FOO  meh
#include <X11/X.h>		// for FOOMapIndex  meh

SDL_Window *window;
SDL_Renderer *renderer;
SDL_Texture *texture;

/*
 * This is shared between x11.c, and sdl2.c ... the only difference is
 * the hook in send_accumulated_updates.
 */

unsigned long Background;
unsigned long Foreground;

static int u_minh = 0x7fffffff;
static int u_maxh;
static int u_minv = 0x7fffffff;
static int u_maxv;

void
accumulate_update(int h, int v, int hs, int vs)
{
	if (h < u_minh)
		u_minh = h;
	if (h + hs > u_maxh)
		u_maxh = h + hs;
	if (v < u_minv)
		u_minv = v;
	if (v + vs > u_maxv)
		u_maxv = v + vs;
}

static void
send_accumulated_updates(void)
{
//      int hs;
//      int vs;

//      hs = u_maxh - u_minh;
//      vs = u_maxv - u_minv;
//      if (u_minh != 0x7fffffff && u_minv != 0x7fffffff && u_maxh && u_maxv) {
	SDL_UpdateTexture(texture, NULL, tv_bitmap, tv_width * sizeof(Uint32));
	// Flush
	SDL_RenderClear(renderer);
	SDL_RenderCopy(renderer, texture, NULL, NULL);
	SDL_RenderPresent(renderer);
//      }
//      u_minh = 0x7fffffff;
//      u_maxh = 0;
//      u_minv = 0x7fffffff;
//      u_maxv = 0;
}

//typedef struct SDL_Keysym
//{
//    SDL_Scancode scancode;      /**< SDL physical key code - see SDL_Scancode for details */
//    SDL_Keycode sym;            /**< SDL virtual key code - see SDL_Keycode for details */
//    Uint16 mod;                 /**< current key modifiers */
//    Uint32 unused;
//} SDL_Keysym;

int
sdl2_bucky(SDL_KeyboardEvent e)
{
	int mod = SDL_GetModState();
	if (mod & KMOD_CTRL && (e.keysym.sym == SDLK_LCTRL || e.keysym.sym == SDLK_RCTRL))
		return ControlMapIndex;
	if (mod & KMOD_SHIFT && (e.keysym.sym == SDLK_LSHIFT || e.keysym.sym == SDLK_RSHIFT))







<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







14
15
16
17
18
19
20























































21
22
23
24
25
26
27
#include <X11/keysym.h>		// for XK_FOO  meh
#include <X11/X.h>		// for FOOMapIndex  meh

SDL_Window *window;
SDL_Renderer *renderer;
SDL_Texture *texture;
























































int
sdl2_bucky(SDL_KeyboardEvent e)
{
	int mod = SDL_GetModState();
	if (mod & KMOD_CTRL && (e.keysym.sym == SDLK_LCTRL || e.keysym.sym == SDLK_RCTRL))
		return ControlMapIndex;
	if (mod & KMOD_SHIFT && (e.keysym.sym == SDLK_LSHIFT || e.keysym.sym == SDLK_RSHIFT))
269
270
271
272
273
274
275










276
277
278
279
280
281
282
283
284
285
286
287
288
		knight_process_key(e.keysym.sym, bi, keydown);
	} else {
		bi = sdl2_bucky(e);
		cadet_process_key(keysym /* xk_keysym */ , bi, keydown, &cadet_allup_key);
	}
}











void
sdl2_event(void)
{
	SDL_Event ev;

	send_accumulated_updates();
	kbd_dequeue_key_event();
	if (is_mouse_warp) {
		is_mouse_warp = 0;
		SDL_WarpMouseInWindow(window, mouse_warp_x, mouse_warp_y);
	}
	while (SDL_PollEvent(&ev)) {
		switch (ev.type) {







>
>
>
>
>
>
>
>
>
>





|







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
		knight_process_key(e.keysym.sym, bi, keydown);
	} else {
		bi = sdl2_bucky(e);
		cadet_process_key(keysym /* xk_keysym */ , bi, keydown, &cadet_allup_key);
	}
}

void
update(int u_minh, int u_minv, int hs, int vs)
{
	SDL_UpdateTexture(texture, NULL, tv_bitmap, tv_width * sizeof(Uint32));
	// Flush
	SDL_RenderClear(renderer);
	SDL_RenderCopy(renderer, texture, NULL, NULL);
	SDL_RenderPresent(renderer);
}

void
sdl2_event(void)
{
	SDL_Event ev;

	send_accumulated_updates(&update);
	kbd_dequeue_key_event();
	if (is_mouse_warp) {
		is_mouse_warp = 0;
		SDL_WarpMouseInWindow(window, mouse_warp_x, mouse_warp_y);
	}
	while (SDL_PollEvent(&ev)) {
		switch (ev.type) {

Changes to sdl2.h.

1
2
3
4
5
6
7
8
9
10
11
12
#pragma once

#include <SDL2/SDL.h>

extern void sdl2_init(void);
extern void sdl2_event(void);

extern unsigned long Background;
extern unsigned long Foreground;

extern void accumulate_update(int, int, int, int);
extern void sdl2_beep(int);







<
<
<
<

1
2
3
4
5
6
7




8
#pragma once

#include <SDL2/SDL.h>

extern void sdl2_init(void);
extern void sdl2_event(void);





extern void sdl2_beep(int);

Changes to tv.c.

22
23
24
25
26
27
28






































29
30
31
32
33
34
35

uint32_t tv_width;
uint32_t tv_height;
uint32_t tv_bitmap[1024 * 1024];

static int tv_csr;
static int tv_colorbit;







































static void
tv_post_60hz_interrupt(void)
{
	tv_csr |= 1 << 4;
	assert_xbus_interrupt();
}







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







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

uint32_t tv_width;
uint32_t tv_height;
uint32_t tv_bitmap[1024 * 1024];

static int tv_csr;
static int tv_colorbit;

unsigned long Background;
unsigned long Foreground;

static int u_minh = 0x7fffffff;
static int u_maxh;
static int u_minv = 0x7fffffff;
static int u_maxv;

static void
accumulate_update(int h, int v, int hs, int vs)
{
	if (h < u_minh)
		u_minh = h;
	if (h + hs > u_maxh)
		u_maxh = h + hs;
	if (v < u_minv)
		u_minv = v;
	if (v + vs > u_maxv)
		u_maxv = v + vs;
}

void
send_accumulated_updates(void (*fn)(int, int , int , int))
{
	int hs;
	int vs;

	hs = u_maxh - u_minh;
	vs = u_maxv - u_minv;
	if (u_minh != 0x7fffffff && u_minv != 0x7fffffff && u_maxh && u_maxv) {
		(*fn)(u_minh, u_minv, hs, vs);
	}
	u_minh = 0x7fffffff;
	u_maxh = 0;
	u_minv = 0x7fffffff;
	u_maxv = 0;
}

static void
tv_post_60hz_interrupt(void)
{
	tv_csr |= 1 << 4;
	assert_xbus_interrupt();
}

Changes to tv.h.

1
2
3
4
5
6
7
8
9



10
11
12
13
14
15
16

#pragma once

#include <stdint.h>

extern int tv_monitor;
extern uint32_t tv_bitmap[1024 * 1024];
extern uint32_t tv_width;
extern uint32_t tv_height;




extern void tv_init(void);
extern void tv_poll(void);
extern void tv_write(uint32_t, uint32_t);
extern void tv_read(uint32_t, uint32_t *);
extern void tv_xbus_read(uint32_t, uint32_t *);
extern void tv_xbus_write(uint32_t, uint32_t);
extern void tv_screenshot(char *);










>
>
>







>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#pragma once

#include <stdint.h>

extern int tv_monitor;
extern uint32_t tv_bitmap[1024 * 1024];
extern uint32_t tv_width;
extern uint32_t tv_height;

extern unsigned long Background;
extern unsigned long Foreground;

extern void tv_init(void);
extern void tv_poll(void);
extern void tv_write(uint32_t, uint32_t);
extern void tv_read(uint32_t, uint32_t *);
extern void tv_xbus_read(uint32_t, uint32_t *);
extern void tv_xbus_write(uint32_t, uint32_t);
extern void tv_screenshot(char *);
extern void send_accumulated_updates(void (*fn)(int, int , int , int));

Changes to x11.c.

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
		knight_process_key(keysym, bi, keydown);
	} else {
		bi = x11_bucky(keycode);
		cadet_process_key(keysym, bi, keydown, &cadet_allup_key);
	}
}

static int u_minh = 0x7fffffff;
static int u_maxh;
static int u_minv = 0x7fffffff;
static int u_maxv;

void
accumulate_update(int h, int v, int hs, int vs)
{
	if (h < u_minh)
		u_minh = h;
	if (h + hs > u_maxh)
		u_maxh = h + hs;
	if (v < u_minv)
		u_minv = v;
	if (v + vs > u_maxv)
		u_maxv = v + vs;
}

static void
send_accumulated_updates(void)
{
	int hs;
	int vs;

	hs = u_maxh - u_minh;
	vs = u_maxv - u_minv;
	if (u_minh != 0x7fffffff && u_minv != 0x7fffffff && u_maxh && u_maxv) {
		XPutImage(display, window, gc, ximage, u_minh, u_minv, u_minh, u_minv, hs, vs);
		XFlush(display);
	}
	u_minh = 0x7fffffff;
	u_maxh = 0;
	u_minv = 0x7fffffff;
	u_maxv = 0;
}

void
x11_idle_change_handler(int mode)
{
	static int width = 22, bottom = 2, right = 2;

	switch (mode) {
	case IDLE_IDLE:







<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







189
190
191
192
193
194
195




































196
197
198
199
200
201
202
		knight_process_key(keysym, bi, keydown);
	} else {
		bi = x11_bucky(keycode);
		cadet_process_key(keysym, bi, keydown, &cadet_allup_key);
	}
}





































void
x11_idle_change_handler(int mode)
{
	static int width = 22, bottom = 2, right = 2;

	switch (mode) {
	case IDLE_IDLE:
261
262
263
264
265
266
267







268
269
270
271
272
273
274
275
276
277
278
279
280
281
	kc.bell_pitch = 755;	/* Hz */
	kc.bell_duration = 10;	/* milliseconds */
	XChangeKeyboardControl(display, KBBellPercent | KBBellPitch | KBBellDuration, &kc);
	XBell(display, onoff);	/* display, percent */
	XChangeKeyboardControl(display, KBBellPercent | KBBellPitch | KBBellDuration, &okc);
#endif
}








void
x11_event(void)
{
	XEvent e;

	send_accumulated_updates();
	kbd_dequeue_key_event();
	if (is_mouse_warp) {
		is_mouse_warp = 0;
		XWarpPointer(display, None, window, 0, 0, 0, 0, mouse_warp_x, mouse_warp_y);
	}
	while (XCheckWindowEvent(display, window, EVENT_MASK, &e)) {
		switch (e.type) {







>
>
>
>
>
>
>






|







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
	kc.bell_pitch = 755;	/* Hz */
	kc.bell_duration = 10;	/* milliseconds */
	XChangeKeyboardControl(display, KBBellPercent | KBBellPitch | KBBellDuration, &kc);
	XBell(display, onoff);	/* display, percent */
	XChangeKeyboardControl(display, KBBellPercent | KBBellPitch | KBBellDuration, &okc);
#endif
}

void
update(int u_minh, int u_minv, int hs, int vs)
{
		XPutImage(display, window, gc, ximage, u_minh, u_minv, u_minh, u_minv, hs, vs);
		XFlush(display);
}

void
x11_event(void)
{
	XEvent e;

	send_accumulated_updates(&update);
	kbd_dequeue_key_event();
	if (is_mouse_warp) {
		is_mouse_warp = 0;
		XWarpPointer(display, None, window, 0, 0, 0, 0, mouse_warp_x, mouse_warp_y);
	}
	while (XCheckWindowEvent(display, window, EVENT_MASK, &e)) {
		switch (e.type) {

Changes to x11.h.

11
12
13
14
15
16
17
18
19
20
21
22
extern int x11_query_keymap(char[32]);
extern KeyCode x11_keysym_to_keycode(KeySym);
extern XModifierKeymap *x11_get_modifier_mapping(void);
extern int x11_bucky(KeyCode);

extern void x11_init(void);
extern void x11_event(void);

extern unsigned long Background;
extern unsigned long Foreground;

extern void accumulate_update(int, int, int, int);







<
<
<
<
<
11
12
13
14
15
16
17





extern int x11_query_keymap(char[32]);
extern KeyCode x11_keysym_to_keycode(KeySym);
extern XModifierKeymap *x11_get_modifier_mapping(void);
extern int x11_bucky(KeyCode);

extern void x11_init(void);
extern void x11_event(void);