Implement quick&dirty approach to update window size and position
This commit is contained in:
parent
f2e39fb2f7
commit
b05b8bae8b
9 changed files with 53 additions and 8 deletions
|
|
@ -497,6 +497,13 @@ FrameBufferWindow* FrameBuffer::createWindow(int x, int y, int width, int height
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FrameBuffer::updateWindow(FrameBufferWindow *window, int x, int y, int width, int height) {
|
||||||
|
if (!window)
|
||||||
|
return;
|
||||||
|
|
||||||
|
updateSubWindow(window->native_window, x, y, width, height);
|
||||||
|
}
|
||||||
|
|
||||||
void FrameBuffer::destroyWindow(FrameBufferWindow *window) {
|
void FrameBuffer::destroyWindow(FrameBufferWindow *window) {
|
||||||
if (!window)
|
if (!window)
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
|
|
@ -79,6 +79,7 @@ public:
|
||||||
static bool initialize(EGLNativeDisplayType nativeDisplay);
|
static bool initialize(EGLNativeDisplayType nativeDisplay);
|
||||||
|
|
||||||
FrameBufferWindow* createWindow(int x, int y, int width, int height);
|
FrameBufferWindow* createWindow(int x, int y, int width, int height);
|
||||||
|
void updateWindow(FrameBufferWindow *window, int x, int y, int width, int height);
|
||||||
void destroyWindow(FrameBufferWindow *window);
|
void destroyWindow(FrameBufferWindow *window);
|
||||||
|
|
||||||
// Finalize the instance.
|
// Finalize the instance.
|
||||||
|
|
|
||||||
|
|
@ -82,13 +82,16 @@ void LayerManager::post_layer(const LayerInfo &layer) {
|
||||||
l.second.updated = true;
|
l.second.updated = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
printf("New layer '%s' {%d,%d,%d,%d}\n", layer.name.c_str());
|
auto width = layer.display_frame.right - layer.display_frame.left;
|
||||||
window = FrameBuffer::getFB()->createWindow(
|
auto height = layer.display_frame.bottom - layer.display_frame.top;
|
||||||
layer.display_frame.left,
|
|
||||||
layer.display_frame.top,
|
if (!window) {
|
||||||
layer.display_frame.right,
|
auto buffer = FrameBuffer::getFB()->getColorBufferFromHandle(layer.buffer_handle);
|
||||||
layer.display_frame.bottom);
|
|
||||||
|
window = FrameBuffer::getFB()->createWindow(layer.display_frame.left,
|
||||||
|
layer.display_frame.top,
|
||||||
|
width, height);
|
||||||
if (!window) {
|
if (!window) {
|
||||||
printf("Failed to create window for layer '%s'\n", layer.name.c_str());
|
printf("Failed to create window for layer '%s'\n", layer.name.c_str());
|
||||||
return;
|
return;
|
||||||
|
|
@ -97,7 +100,10 @@ void LayerManager::post_layer(const LayerInfo &layer) {
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("%s: window %p buffer %d\n", __func__, window, layer.buffer_handle);
|
printf("%s: window %p buffer %d\n", __func__, window, layer.buffer_handle);
|
||||||
|
FrameBuffer::getFB()->updateWindow(window,
|
||||||
|
layer.display_frame.left,
|
||||||
|
layer.display_frame.top,
|
||||||
|
width, height);
|
||||||
FrameBuffer::getFB()->post(window, layer.buffer_handle);
|
FrameBuffer::getFB()->post(window, layer.buffer_handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,7 @@ class SubWindowHandler {
|
||||||
public:
|
public:
|
||||||
virtual ~SubWindowHandler() { }
|
virtual ~SubWindowHandler() { }
|
||||||
virtual EGLNativeWindowType create_window(int x, int y, int width, int height) = 0;
|
virtual EGLNativeWindowType create_window(int x, int y, int width, int height) = 0;
|
||||||
|
virtual void update_window(EGLNativeWindowType win, int x, int y, int width, int height) = 0;
|
||||||
virtual void destroy_window(EGLNativeWindowType win) = 0;
|
virtual void destroy_window(EGLNativeWindowType win) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -55,6 +56,8 @@ EGLNativeWindowType createSubWindow(FBNativeWindowType p_window,
|
||||||
int width,
|
int width,
|
||||||
int height);
|
int height);
|
||||||
|
|
||||||
|
void updateSubWindow(EGLNativeWindowType win, int x, int y, int width, int height);
|
||||||
|
|
||||||
// Destroy a sub-window previously created through createSubWindow() above.
|
// Destroy a sub-window previously created through createSubWindow() above.
|
||||||
void destroySubWindow(EGLNativeWindowType win);
|
void destroySubWindow(EGLNativeWindowType win);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,13 @@ EGLNativeWindowType createSubWindow(FBNativeWindowType p_window,
|
||||||
return current_handler->create_window(x, y, width, height);
|
return current_handler->create_window(x, y, width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void updateSubWindow(EGLNativeWindowType win, int x, int y, int width, int height) {
|
||||||
|
if (!current_handler)
|
||||||
|
return;
|
||||||
|
|
||||||
|
return current_handler->update_window(win, x, y, width, height);
|
||||||
|
}
|
||||||
|
|
||||||
void destroySubWindow(EGLNativeWindowType win) {
|
void destroySubWindow(EGLNativeWindowType win) {
|
||||||
if (!current_handler)
|
if (!current_handler)
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
|
|
@ -62,6 +62,14 @@ Window::~Window() {
|
||||||
SDL_DestroyWindow(window_);
|
SDL_DestroyWindow(window_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Window::resize(int width, int height) {
|
||||||
|
SDL_SetWindowSize(window_, width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Window::update_position(int x, int y) {
|
||||||
|
SDL_SetWindowPosition(window_, x, y);
|
||||||
|
}
|
||||||
|
|
||||||
EGLNativeWindowType Window::native_window() const {
|
EGLNativeWindowType Window::native_window() const {
|
||||||
return native_window_;
|
return native_window_;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,9 @@ public:
|
||||||
Window(int x, int y, int width, int height);
|
Window(int x, int y, int width, int height);
|
||||||
~Window();
|
~Window();
|
||||||
|
|
||||||
|
void resize(int width, int height);
|
||||||
|
int update_position(int x, int y);
|
||||||
|
|
||||||
EGLNativeWindowType native_window() const;
|
EGLNativeWindowType native_window() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
||||||
|
|
@ -91,6 +91,15 @@ catch (std::exception &err) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WindowCreator::update_window(EGLNativeWindowType win, int x, int y, int width, int height) {
|
||||||
|
auto iter = windows_.find(win);
|
||||||
|
if (iter == windows_.end())
|
||||||
|
return;
|
||||||
|
|
||||||
|
iter->second->resize(width, height);
|
||||||
|
iter->second->update_position(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
void WindowCreator::destroy_window(EGLNativeWindowType win) {
|
void WindowCreator::destroy_window(EGLNativeWindowType win) {
|
||||||
auto iter = windows_.find(win);
|
auto iter = windows_.find(win);
|
||||||
if (iter == windows_.end())
|
if (iter == windows_.end())
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,7 @@ public:
|
||||||
~WindowCreator();
|
~WindowCreator();
|
||||||
|
|
||||||
EGLNativeWindowType create_window(int x, int y, int width, int height) override;
|
EGLNativeWindowType create_window(int x, int y, int width, int height) override;
|
||||||
|
void update_window(EGLNativeWindowType win, int x, int y, int width, int height) override;
|
||||||
void destroy_window(EGLNativeWindowType win) override;
|
void destroy_window(EGLNativeWindowType win) override;
|
||||||
|
|
||||||
DisplayInfo display_info() const override;
|
DisplayInfo display_info() const override;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue