}
/* see if the user entered the window on a certain window decoration */
- int layout = (enter_child ? con->parent->layout : con->layout);
+ layout_t layout = (enter_child ? con->parent->layout : con->layout);
if (layout == L_DEFAULT) {
Con *child;
TAILQ_FOREACH(child, &(con->nodes_head), nodes)
if (fullscreen != con && con_is_floating(con) && con_is_leaf(con)) {
/* find the height for the decorations */
- int deco_height = config.font.height + 5;
+ int deco_height = con->deco_rect.height;
/* we actually need to apply the size/position changes to the *parent*
* container */
Rect bsr = con_border_style_rect(con);
}
Con *floatingcon = con->parent;
+ if (strcmp(con_get_workspace(floatingcon)->name, "__i3_scratch") == 0) {
+ DLOG("This is a scratchpad container, ignoring ConfigureRequest\n");
+ return;
+ }
+
Rect newrect = floatingcon->rect;
if (event->value_mask & XCB_CONFIG_WINDOW_X) {
LOG("ClientMessage for window 0x%08x\n", event->window);
if (event->type == A__NET_WM_STATE) {
- if (event->format != 32 || event->data.data32[1] != A__NET_WM_STATE_FULLSCREEN) {
- DLOG("atom in clientmessage is %d, fullscreen is %d\n",
- event->data.data32[1], A__NET_WM_STATE_FULLSCREEN);
- DLOG("not about fullscreen atom\n");
+ if (event->format != 32 ||
+ (event->data.data32[1] != A__NET_WM_STATE_FULLSCREEN &&
+ event->data.data32[1] != A__NET_WM_STATE_DEMANDS_ATTENTION)) {
+ DLOG("Unknown atom in clientmessage of type %d\n", event->data.data32[1]);
return;
}
return;
}
- /* Check if the fullscreen state should be toggled */
- if ((con->fullscreen_mode != CF_NONE &&
- (event->data.data32[0] == _NET_WM_STATE_REMOVE ||
- event->data.data32[0] == _NET_WM_STATE_TOGGLE)) ||
- (con->fullscreen_mode == CF_NONE &&
- (event->data.data32[0] == _NET_WM_STATE_ADD ||
- event->data.data32[0] == _NET_WM_STATE_TOGGLE))) {
- DLOG("toggling fullscreen\n");
- con_toggle_fullscreen(con, CF_OUTPUT);
+ if (event->data.data32[1] == A__NET_WM_STATE_FULLSCREEN) {
+ /* Check if the fullscreen state should be toggled */
+ if ((con->fullscreen_mode != CF_NONE &&
+ (event->data.data32[0] == _NET_WM_STATE_REMOVE ||
+ event->data.data32[0] == _NET_WM_STATE_TOGGLE)) ||
+ (con->fullscreen_mode == CF_NONE &&
+ (event->data.data32[0] == _NET_WM_STATE_ADD ||
+ event->data.data32[0] == _NET_WM_STATE_TOGGLE))) {
+ DLOG("toggling fullscreen\n");
+ con_toggle_fullscreen(con, CF_OUTPUT);
+ }
+ } else if (event->data.data32[1] == A__NET_WM_STATE_DEMANDS_ATTENTION) {
+ /* Check if the urgent flag must be set or not */
+ if (event->data.data32[0] == _NET_WM_STATE_ADD)
+ con_set_urgency(con, true);
+ else if (event->data.data32[0] == _NET_WM_STATE_REMOVE)
+ con_set_urgency(con, false);
+ else if (event->data.data32[0] == _NET_WM_STATE_TOGGLE)
+ con_set_urgency(con, !con->urgent);
}
tree_render();
goto render_and_return;
/* Check if we need to set proportional_* variables using the correct ratio */
+ double aspect_ratio = 0.0;
if ((width / height) < min_aspect) {
- if (con->proportional_width != width ||
- con->proportional_height != (width / min_aspect)) {
- con->proportional_width = width;
- con->proportional_height = width / min_aspect;
- changed = true;
- }
+ aspect_ratio = min_aspect;
} else if ((width / height) > max_aspect) {
- if (con->proportional_width != width ||
- con->proportional_height != (width / max_aspect)) {
- con->proportional_width = width;
- con->proportional_height = width / max_aspect;
- changed = true;
- }
+ aspect_ratio = max_aspect;
} else goto render_and_return;
+ if (fabs(con->aspect_ratio - aspect_ratio) > DBL_EPSILON) {
+ con->aspect_ratio = aspect_ratio;
+ changed = true;
+ }
+
render_and_return:
if (changed)
tree_render();
if (!xcb_icccm_get_wm_hints_from_reply(&hints, reply))
return false;
- if (!con->urgent && focused == con) {
- DLOG("Ignoring urgency flag for current client\n");
- con->window->urgent.tv_sec = 0;
- con->window->urgent.tv_usec = 0;
- goto end;
- }
-
/* Update the flag on the client directly */
bool hint_urgent = (xcb_icccm_wm_hints_get_urgency(&hints) != 0);
-
- if (con->urgency_timer == NULL) {
- con->urgent = hint_urgent;
- } else
- DLOG("Discarding urgency WM_HINT because timer is running\n");
-
- //CLIENT_LOG(con);
- if (con->window) {
- if (con->urgent) {
- gettimeofday(&con->window->urgent, NULL);
- } else {
- con->window->urgent.tv_sec = 0;
- con->window->urgent.tv_usec = 0;
- }
- }
-
- con_update_parents_urgency(con);
-
- LOG("Urgency flag changed to %d\n", con->urgent);
-
- Con *ws;
- /* Set the urgency flag on the workspace, if a workspace could be found
- * (for dock clients, that is not the case). */
- if ((ws = con_get_workspace(con)) != NULL)
- workspace_update_urgent_flag(ws);
+ con_set_urgency(con, hint_urgent);
tree_render();
-end:
if (con->window)
window_update_hints(con->window, reply);
else free(reply);
/* Client message are sent to the root window. The only interesting
* client message for us is _NET_WM_STATE, we honour
- * _NET_WM_STATE_FULLSCREEN */
+ * _NET_WM_STATE_FULLSCREEN and _NET_WM_STATE_DEMANDS_ATTENTION */
case XCB_CLIENT_MESSAGE:
handle_client_message((xcb_client_message_event_t*)event);
break;