#include <wayland-cursor.h>
#include <xkbcommon/xkbcommon.h>
#include "eloop.h"
-#include "log.h"
#include "shl_array.h"
#include "shl_dlist.h"
#include "shl_hook.h"
+#include "shl_log.h"
#include "shl_misc.h"
#include "tsm_vte.h"
#include "wlt_main.h"
bool buffer_attached;
bool skip_damage;
bool need_resize;
- bool need_redraw;
bool need_frame;
bool idle_pending;
unsigned int new_width;
}
}
- if (state == WL_KEYBOARD_KEY_STATE_RELEASED &&
- sym == disp->repeat_sym) {
+ if (state == WL_KEYBOARD_KEY_STATE_RELEASED) {
ev_timer_update(disp->repeat_timer, NULL);
} else if (state == WL_KEYBOARD_KEY_STATE_PRESSED) {
disp->repeat_sym = sym;
if (!disp)
return -EINVAL;
- return shl_hook_add_cast(disp->listeners, cb, data);
+ return shl_hook_add_cast(disp->listeners, cb, data, false);
}
void wlt_display_unregister_cb(struct wlt_display *disp,
}
static int resize_window(struct wlt_window *wnd, unsigned int width,
- unsigned int height, bool force_redraw)
+ unsigned int height)
{
struct shl_dlist *iter;
struct wlt_widget *widget;
if (width == wnd->buffer.width &&
height == wnd->buffer.height) {
- if (force_redraw)
- wlt_window_do_redraw(wnd, width, height);
+ wlt_window_do_redraw(wnd, width, height);
return 0;
}
static void do_frame(struct wlt_window *wnd)
{
- bool force;
-
- wnd->idle_pending = false;
ev_eloop_unregister_idle_cb(wnd->disp->eloop, idle_frame, wnd,
EV_NORMAL);
if (wnd->need_resize) {
- force = wnd->need_redraw;
wnd->need_frame = true;
wnd->need_resize = false;
- wnd->need_redraw = false;
wnd->w_frame = wl_surface_frame(wnd->w_surface);
wl_callback_add_listener(wnd->w_frame,
&frame_callback_listener, wnd);
- resize_window(wnd, wnd->new_width, wnd->new_height, force);
- }
-
- if (wnd->need_redraw) {
+ resize_window(wnd, wnd->new_width, wnd->new_height);
+ } else {
wnd->need_frame = true;
- wnd->need_redraw = false;
wnd->w_frame = wl_surface_frame(wnd->w_surface);
wl_callback_add_listener(wnd->w_frame,
&frame_callback_listener, wnd);
}
}
+static void schedule_frame(struct wlt_window *wnd);
+
static void frame_callback(void *data, struct wl_callback *w_callback,
uint32_t time)
{
wl_callback_destroy(w_callback);
wnd->w_frame = NULL;
- wnd->need_frame = false;
- do_frame(wnd);
+ wnd->idle_pending = false;
+ if (wnd->need_frame)
+ schedule_frame(wnd);
}
static void idle_frame(struct ev_eloop *eloop, void *unused, void *data)
{
int ret;
- if (!wnd || wnd->w_frame)
+ if (!wnd)
return;
- if (wnd->need_frame || wnd->idle_pending)
+ wnd->need_frame = true;
+
+ if (wnd->idle_pending)
return;
ret = ev_eloop_register_idle_cb(wnd->disp->eloop, idle_frame, wnd,
&shell_surface_listener, wnd);
wl_shell_surface_set_toplevel(wnd->w_shell_surface);
- ret = resize_window(wnd, width, height, true);
+ ret = resize_window(wnd, width, height);
if (ret)
goto err_shell_surface;
if (!wnd)
return;
- wnd->need_redraw = true;
schedule_frame(wnd);
}
wnd->maximized = !wnd->maximized;
}
+bool wlt_window_is_maximized(struct wlt_window *wnd)
+{
+ return wnd && wnd->maximized;
+}
+
void wlt_window_toggle_fullscreen(struct wlt_window *wnd)
{
if (!wnd)
wnd->fullscreen = !wnd->fullscreen;
}
+bool wlt_window_is_fullscreen(struct wlt_window *wnd)
+{
+ return wnd && wnd->fullscreen;
+}
+
struct ev_eloop *wlt_window_get_eloop(struct wlt_window *wnd)
{
if (!wnd)