optimize x11
This commit is contained in:
parent
1a686e0248
commit
0e1fc86d08
1 changed files with 7 additions and 23 deletions
30
src/screen.c
30
src/screen.c
|
@ -44,6 +44,9 @@ static void init_x() {
|
||||||
key_count = dpy->max_keycode - dpy->min_keycode;
|
key_count = dpy->max_keycode - dpy->min_keycode;
|
||||||
key_state = malloc(sizeof(bool) * key_count);
|
key_state = malloc(sizeof(bool) * key_count);
|
||||||
key_checked = malloc(sizeof(bool) * key_count);
|
key_checked = malloc(sizeof(bool) * key_count);
|
||||||
|
|
||||||
|
memset(key_state, 0, sizeof(bool) * key_count);
|
||||||
|
memset(key_checked, 0, sizeof(bool) * key_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
static Window create_window(int x, int y, int w, int h, int d) {
|
static Window create_window(int x, int y, int w, int h, int d) {
|
||||||
|
@ -54,7 +57,7 @@ static Window create_window(int x, int y, int w, int h, int d) {
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
Visual* visual = vis_info.visual;;
|
Visual* visual = vis_info.visual;
|
||||||
|
|
||||||
XSetWindowAttributes xwa;
|
XSetWindowAttributes xwa;
|
||||||
xwa.background_pixel = 0;
|
xwa.background_pixel = 0;
|
||||||
|
@ -69,14 +72,14 @@ static Window create_window(int x, int y, int w, int h, int d) {
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|
||||||
static XImage* create_image(int width, int height) {
|
static XImage* create_image(int width, int height, void* data) {
|
||||||
return XCreateImage(
|
return XCreateImage(
|
||||||
dpy,
|
dpy,
|
||||||
CopyFromParent,
|
CopyFromParent,
|
||||||
bit_depth,
|
bit_depth,
|
||||||
ZPixmap,
|
ZPixmap,
|
||||||
0,
|
0,
|
||||||
malloc(width * height * bit_depth / 8),
|
data,
|
||||||
width,
|
width,
|
||||||
height,
|
height,
|
||||||
bit_depth,
|
bit_depth,
|
||||||
|
@ -118,7 +121,7 @@ void init_screen(struct Screen* screen, uint16_t width, uint16_t height) {
|
||||||
state->height = xwa.height;
|
state->height = xwa.height;
|
||||||
screen->internal = state;
|
screen->internal = state;
|
||||||
|
|
||||||
XImage* image = create_image(state->width, state->height);
|
XImage* image = create_image(state->width, state->height, screen->pixels);
|
||||||
state->image = image;
|
state->image = image;
|
||||||
|
|
||||||
count++;
|
count++;
|
||||||
|
@ -145,22 +148,6 @@ static void update_delta(struct Screen* screen) {
|
||||||
static void draw_screen(struct Screen* screen) {
|
static void draw_screen(struct Screen* screen) {
|
||||||
WindowState* state = (WindowState*) screen->internal;
|
WindowState* state = (WindowState*) screen->internal;
|
||||||
|
|
||||||
uint32_t* src = screen->pixels;
|
|
||||||
uint32_t* dst = (uint32_t*) state->image->data;
|
|
||||||
|
|
||||||
float x_step = screen->width / (float) state->width;
|
|
||||||
float y_step = screen->height / (float) state->height;
|
|
||||||
|
|
||||||
for (int x = 0; x < state->width; x++) {
|
|
||||||
int px = (int) (x * x_step);
|
|
||||||
|
|
||||||
for (int y = 0; y < state->height; y++) {
|
|
||||||
int py = (int) (y * y_step);
|
|
||||||
|
|
||||||
dst[x + y * state->width] = src[px + py * screen->width];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
XPutImage(
|
XPutImage(
|
||||||
dpy,
|
dpy,
|
||||||
state->window,
|
state->window,
|
||||||
|
@ -199,9 +186,6 @@ static void handle_event(WindowState* state) {
|
||||||
state->width = xce.width;
|
state->width = xce.width;
|
||||||
state->height = xce.height;
|
state->height = xce.height;
|
||||||
|
|
||||||
XDestroyImage(state->image);
|
|
||||||
state->image = create_image(state->width, state->height);
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue