History

wayland: clean up, copy less and remove locking on frame done callback (a bit faster redrawing)

Sigrid Solveig Haflínudóttir committed 4 years ago

Commit 6b448b91 parent efe20ef2 files · +17 −22Browse files

Unified · Split

2 files
  1. gui-wl/wl-cb.c +3 −6
  2. gui-wl/wl-screen.c +14 −16
gui-wl/wl-cb.c+3−6
@@ -79,10 +79,8 @@ wl_surface_frame_done(void *data, struct wl_callback *cb, uint32_t time) · 78 unmodified lines
7979 wl = data;
8080 wl_callback_destroy(cb);
8181 cb = wl_surface_frame(wl->surface);
82− qlock(&drawlock);
83− wlflush(wl);
84− qunlock(&drawlock);
8582 wl_callback_add_listener(cb, &wl_surface_frame_listener, wl);
83+ wlflush(wl);
8684 }
8785
8886 static void
@@ -93,7 +91,7 @@ keyboard_keymap(void *data, struct wl_keyboard *keyboard, uint32_t format, int32 · 4 unmodified lines
9391 Wlwin *wl;
9492
9593 wl = data;
96− keymap_string = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0);
94+ keymap_string = mmap(nil, size, PROT_READ, MAP_SHARED, fd, 0);
9795 xkb_keymap_unref(keymap);
9896 keymap = xkb_keymap_new_from_string(wl->xkb_context, keymap_string, XKB_KEYMAP_FORMAT_TEXT_V1, XKB_KEYMAP_COMPILE_NO_FLAGS);
9997 munmap(keymap_string, size);
@@ -477,9 +475,8 @@ data_device_handle_selection(void *data, struct wl_data_device *data_device, str · 377 unmodified lines
477475 int fds[2];
478476
479477 // An application has set the clipboard contents
480− if (offer == NULL) {
478+ if(offer == nil)
481479 return;
482− }
483480
484481 wl = data;
485482 pipe2(fds, O_CLOEXEC);
gui-wl/wl-screen.c+14−16
@@ -47,14 +47,17 @@ newwlwin(void) · 46 unmodified lines
4747 void
4848 wlflush(Wlwin *wl)
4949 {
50− if(wl->dirty == 1)
51− memcpy(wl->shm_data, gscreen->data->bdata, wl->dx*wl->dy*4);
50+ Point p;
5251
5352 wl_surface_attach(wl->surface, wl->screenbuffer, 0, 0);
54− if(wl->dirty)
55− wl_surface_damage(wl->surface, wl->r.min.x, wl->r.min.y, Dx(wl->r), Dy(wl->r));
53+ if(wl->dirty){
54+ p.x = wl->r.min.x;
55+ for(p.y = wl->r.min.y; p.y < wl->r.max.y; p.y++)
56+ memcpy(wl->shm_data+(p.y*wl->dx+p.x)*4, byteaddr(gscreen, p), Dx(wl->r)*4);
57+ wl_surface_damage(wl->surface, p.x, wl->r.min.y, Dx(wl->r), Dy(wl->r));
58+ wl->dirty = 0;
59+ }
5660 wl_surface_commit(wl->surface);
57− wl->dirty = 0;
5861 }
5962
6063 void
@@ -86,9 +89,8 @@ dispatchproc(void *a) · 25 unmodified lines
8689 {
8790 Wlwin *wl;
8891 wl = a;
89− for(;wl->runing == 1;){
92+ while(wl->runing)
9093 wl_display_dispatch(wl->display);
91− }
9294 }
9395
9496 static Wlwin*
@@ -99,7 +101,7 @@ wlattach(char *label) · 4 unmodified lines
99101
100102 wl = newwlwin();
101103 gwin = wl;
102− wl->display = wl_display_connect(NULL);
104+ wl->display = wl_display_connect(nil);
103105 if(wl->display == nil)
104106 sysfatal("could not connect to display");
105107
@@ -151,19 +153,15 @@ attachscreen(Rectangle *r, ulong *chan, int *depth, int *width, int *softscreen) · 45 unmodified lines
151153 void
152154 flushmemscreen(Rectangle r)
153155 {
154− Wlwin *wl;
155−
156− wl = gwin;
157− wl->dirty = 1;
158− wl->r = r;
159− wlflush(wl);
156+ gwin->dirty = 1;
157+ gwin->r = r;
158+ wlflush(gwin);
160159 }
161160
162161 void
163162 screensize(Rectangle r, ulong chan)
164163 {
165− gwin->dirty = 1;
166− gwin->r = r;
164+ flushmemscreen(r);
167165 }
168166
169167 void

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t