void select_window(xcb_window_t window) { int desktop = desktop_of_window(window); focus_window(window); switch_to_desktop(desktop); }
void buttonpress(XEvent* event) { XButtonEvent* be = &(event->xbutton); HSDebug("name is: ButtonPress on sub %lx, win %lx\n", be->subwindow, be->window); if (mouse_binding_find(be->state, be->button)) { mouse_start_drag(event); } else { focus_window(be->window, false, true); if (*g_raise_on_click) { HSClient* client = get_client_from_window(be->window); if (client) { client_raise(client); } } } XAllowEvents(g_display, ReplayPointer, be->time); }
void enternotify(XEvent* event) { XCrossingEvent *ce = &event->xcrossing; HSDebug("name is: EnterNotify, focus = %d\n", event->xcrossing.focus); if (!mouse_is_dragging() && *g_focus_follows_mouse && false == ce->focus) { HSClient* c = get_client_from_window(ce->window); HSFrame* target; if (c && c->tag->floating == false && (target = find_frame_with_window(c->tag->frame, ce->window)) && target->content.clients.layout == LAYOUT_MAX && frame_focused_window(target) != ce->window) { // don't allow focus_follows_mouse if another window would be // hidden during that focus change (which only occurs in max layout) } else { focus_window(ce->window, false, true); } } }
int jumpto_command(int argc, char** argv, GString* output) { if (argc < 2) { return HERBST_NEED_MORE_ARGS; } HSClient* client = NULL; string_to_client(argv[1], &client); if (client) { focus_window(client->window, true, true); return 0; } else { g_string_append_printf(output, "%s: Could not find client", argv[0]); if (argc > 1) { g_string_append_printf(output, " \"%s\".\n", argv[1]); } else { g_string_append(output, ".\n"); } return HERBST_INVALID_ARGUMENT; } }
void ewmh_handle_client_message(XEvent* event) { HSDebug("Received event: ClientMessage\n"); XClientMessageEvent* me = &(event->xclient); int index; for (index = 0; index < NetCOUNT; index++) { if (me->message_type == g_netatom[index]) { break; } } if (index >= NetCOUNT) { HSDebug("received unknown client message\n"); return; } HSClient* client; int desktop_index; switch (index) { case NetActiveWindow: // only steal focus it allowed to the current source // (i.e. me->data.l[0] in this case as specified by EWMH) if (focus_stealing_allowed(me->data.l[0])) { focus_window(me->window, true, true); } break; case NetCurrentDesktop: desktop_index = me->data.l[0]; if (desktop_index < 0 || desktop_index >= g_tags->len) { HSDebug("_NET_CURRENT_DESKTOP: invalid index \"%d\"\n", desktop_index); break; } HSTag* tag = g_array_index(g_tags, HSTag*, desktop_index); monitor_set_tag(get_current_monitor(), tag); break; case NetWmDesktop: desktop_index = me->data.l[0]; if (!focus_stealing_allowed(me->data.l[1])) { break; } HSTag* target = get_tag_by_index(desktop_index); client = get_client_from_window(me->window); if (client && target) { tag_move_client(client, target); } break; case NetWmState: client = get_client_from_window(me->window); /* ignore requests for unmanaged windows */ if (!client || !client->ewmhrequests) break; /* mapping between EWMH atoms and client struct members */ struct { int atom_index; bool enabled; void (*callback)(HSClient*, bool); } client_atoms[] = { { NetWmStateFullscreen, client->fullscreen, client_set_fullscreen }, { NetWmStateDemandsAttention, client->urgent, client_set_urgent }, }; /* me->data.l[1] and [2] describe the properties to alter */ for (int prop = 1; prop <= 2; prop++) { if (me->data.l[prop] == 0) { /* skip if no property is specified */ continue; } /* check if we support the property data[prop] */ int i; for (i = 0; i < LENGTH(client_atoms); i++) { if (g_netatom[client_atoms[i].atom_index] == me->data.l[prop]) { break; } } if (i >= LENGTH(client_atoms)) { /* property will not be handled */ continue; } bool new_value[] = { [ _NET_WM_STATE_REMOVE ] = false, [ _NET_WM_STATE_ADD ] = true, [ _NET_WM_STATE_TOGGLE ] = !client_atoms[i].enabled, }; int action = me->data.l[0]; if (action >= LENGTH(new_value)) { HSDebug("_NET_WM_STATE: invalid action %d\n", action); } /* change the value */ client_atoms[i].callback(client, new_value[action]); } break; default: HSDebug("no handler for the client message \"%s\"\n", g_netatom_names[index]); break; } }
void enternotify(XEvent* event) { if (focus_follows_mouse && !event->xcrossing.focus) focus_window(event->xcrossing.window, false, true); // sloppy focus }