struct rcxml {
bool xdg_shell_server_side_deco;
+ bool focus_follow_mouse;
+ bool raise_on_focus;
char *theme_name;
int corner_radius;
char *font_name_activewindow;
void view_for_each_popup_surface(struct view *view,
wlr_surface_iterator_func_t iterator, void *data);
+void desktop_set_focus_view_only(struct seat *seat, struct view *view);
void desktop_focus_view(struct seat *seat, struct view *view);
/**
fill_font(nodename, content, font_place);
} else if (!strcmp(nodename, "size.font.theme")) {
fill_font(nodename, content, font_place);
+ } else if (!strcasecmp(nodename, "FollowMouse.focus")) {
+ rc.focus_follow_mouse = get_bool(content);
+ } else if (!strcasecmp(nodename, "RaisemOnFocus.focus")) {
+ rc.focus_follow_mouse = true;
+ rc.raise_on_focus = get_bool(content);
}
}
uint32_t resize_edges = get_resize_edges(
view, server->seat.cursor->x, server->seat.cursor->y);
switch (resize_edges) {
+ case 0:
+ if (rc.focus_follow_mouse){
+ if (rc.raise_on_focus){
+ desktop_focus_view(&server->seat, view);
+ } else {
+ desktop_set_focus_view_only(&server->seat, view);
+ }
+ }
+ break;
case WLR_EDGE_TOP:
cursor_name = "top_side";
break;
}
}
+void
+desktop_set_focus_view_only(struct seat *seat, struct view *view)
+{
+ if (!view || view->minimized || !view->mapped) {
+ return;
+ }
+ struct wlr_surface *prev_surface;
+ prev_surface = seat->seat->keyboard_state.focused_surface;
+ if (prev_surface == view->surface) {
+ /* Don't re-focus an already focused surface. */
+ return;
+ }
+ if (prev_surface) {
+ set_activated(prev_surface, false);
+ }
+ set_activated(view->surface, true);
+ seat_focus_surface(seat, view->surface);
+}
+
void
desktop_focus_view(struct seat *seat, struct view *view)
{
prev_surface = seat->seat->keyboard_state.focused_surface;
if (prev_surface == view->surface) {
/* Don't re-focus an already focused surface. */
+ move_to_front(view);
+#if HAVE_XWAYLAND
+ move_xwayland_sub_views_to_front(view);
+#endif
return;
}
if (prev_surface) {