feat: 添加屏幕去重功能并调整测试用例目录结构
This commit is contained in:
56
src/backend/output_utils.c
Normal file
56
src/backend/output_utils.c
Normal file
@@ -0,0 +1,56 @@
|
||||
#include "backend/output_utils.h"
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "core/backend.h"
|
||||
#include "core/types.h"
|
||||
#include "core/wm_desc.h"
|
||||
#include "utils.h"
|
||||
|
||||
static inline int32_t right(wm_rect_t a) { return a.x + a.width; }
|
||||
static inline int32_t bottom(wm_rect_t a) { return a.y + a.height; }
|
||||
static inline bool fully_contains(wm_rect_t outer, wm_rect_t inner) {
|
||||
return inner.x >= outer.x && inner.y >= outer.y &&
|
||||
right(inner) <= right(outer) && bottom(inner) <= bottom(outer);
|
||||
}
|
||||
|
||||
wm_backend_detect_t *output_remove_duplication(const wm_output_info_t *output,
|
||||
const size_t count) {
|
||||
if (!output || count < 1) return nullptr;
|
||||
|
||||
bool *remove = p_new(bool, count);
|
||||
|
||||
for (int32_t i = (int32_t)count - 1; i >= 0; i--) {
|
||||
if (remove[i]) continue;
|
||||
for (int32_t j = i - 1; j >= 0; j--) {
|
||||
if (remove[j]) continue;
|
||||
if (fully_contains(output[j].geometry, output[i].geometry)) {
|
||||
remove[i] = true;
|
||||
} else if (fully_contains(output[i].geometry, output[j].geometry)) {
|
||||
remove[j] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int32_t amount = 0;
|
||||
for (size_t i = 0; i < count; i++) {
|
||||
if (!remove[i]) amount++;
|
||||
}
|
||||
if (!amount) {
|
||||
p_delete(&remove);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
wm_output_info_t *list = p_new(wm_output_info_t, amount);
|
||||
amount = 0;
|
||||
for (size_t i = 0; i < count; i++) {
|
||||
if (remove[i]) continue;
|
||||
list[amount++] = output[i];
|
||||
}
|
||||
p_delete(&remove);
|
||||
wm_backend_detect_t *detect = p_new(wm_backend_detect_t, 1);
|
||||
detect->outputs = list;
|
||||
detect->output_count = amount;
|
||||
return detect;
|
||||
}
|
||||
9
src/backend/output_utils.h
Normal file
9
src/backend/output_utils.h
Normal file
@@ -0,0 +1,9 @@
|
||||
#pragma once
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#include "core/backend.h"
|
||||
#include "core/wm_desc.h"
|
||||
|
||||
wm_backend_detect_t *output_remove_duplication(const wm_output_info_t *output,
|
||||
const size_t count);
|
||||
@@ -1,3 +1,5 @@
|
||||
#include "core/backend.h"
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
@@ -9,7 +11,7 @@
|
||||
#include <xcb/xinerama.h>
|
||||
#include <xcb/xproto.h>
|
||||
|
||||
#include "core/backend.h"
|
||||
#include "backend/output_utils.h"
|
||||
#include "core/wm_desc.h"
|
||||
#include "utils.h"
|
||||
|
||||
@@ -215,28 +217,30 @@ static bool detect_monitor_by_xinerama(const wm_backend_t *backend,
|
||||
}
|
||||
|
||||
wm_backend_detect_t *wm_backend_detect(wm_backend_t *backend) {
|
||||
wm_backend_detect_t *detect = p_new(wm_backend_detect_t, 1);
|
||||
|
||||
wm_output_info_t *outputs = nullptr;
|
||||
size_t count = 0;
|
||||
|
||||
if (detect_monitor_by_randr(backend, &outputs, &count)) {
|
||||
detect->output_count = count;
|
||||
detect->outputs = outputs;
|
||||
} else if (detect_monitor_by_xinerama(backend, &outputs, &count)) {
|
||||
detect->output_count = count;
|
||||
detect->outputs = outputs;
|
||||
} else {
|
||||
wm_output_info_t *output = p_new(wm_output_info_t, 1);
|
||||
output->geometry.x = 0;
|
||||
output->geometry.y = 0;
|
||||
output->geometry.width = backend->screen->width_in_pixels;
|
||||
output->geometry.height = backend->screen->height_in_pixels;
|
||||
|
||||
detect->outputs = output;
|
||||
detect->output_count = 1;
|
||||
wm_backend_detect_t *detect = output_remove_duplication(outputs, count);
|
||||
p_delete(&outputs);
|
||||
return detect;
|
||||
}
|
||||
|
||||
if (detect_monitor_by_xinerama(backend, &outputs, &count)) {
|
||||
wm_backend_detect_t *detect = output_remove_duplication(outputs, count);
|
||||
p_delete(&outputs);
|
||||
return detect;
|
||||
}
|
||||
|
||||
wm_output_info_t *output = p_new(wm_output_info_t, 1);
|
||||
output->geometry.x = 0;
|
||||
output->geometry.y = 0;
|
||||
output->geometry.width = backend->screen->width_in_pixels;
|
||||
output->geometry.height = backend->screen->height_in_pixels;
|
||||
|
||||
wm_backend_detect_t *detect = p_new(wm_backend_detect_t, 1);
|
||||
detect->outputs = output;
|
||||
detect->output_count = 1;
|
||||
return detect;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user