X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fblackbox.cc;h=1c543bbea69c155fd2de41a7630783f40a0e5554;hb=478771552533b63ff6c0dda136bca5e6b1701c91;hp=dd4c278ea6c6242ba8c7048b911bf7104cf19e31;hpb=341c4e04ffc5572dc02563df914dc65a0a57b9f3;p=chaz%2Fopenbox diff --git a/src/blackbox.cc b/src/blackbox.cc index dd4c278e..1c543bbe 100644 --- a/src/blackbox.cc +++ b/src/blackbox.cc @@ -108,7 +108,7 @@ using std::string; #include "Window.hh" #include "Workspace.hh" #include "Workspacemenu.hh" - +#include "XAtom.hh" // X event scanner for enter/leave notifies - adapted from twm struct scanargs { @@ -159,7 +159,7 @@ Blackbox::Blackbox(char **m_argv, char *dpy_name, char *rc, char *menu) XrmInitialize(); load_rc(); - init_icccm(); + xatom = new XAtom(this); cursor.session = XCreateFontCursor(getXDisplay(), XC_left_ptr); cursor.move = XCreateFontCursor(getXDisplay(), XC_fleur); @@ -207,6 +207,8 @@ Blackbox::~Blackbox(void) { std::for_each(menuTimestamps.begin(), menuTimestamps.end(), PointerAssassin()); + delete xatom; + delete timer; } @@ -557,11 +559,14 @@ void Blackbox::process_event(XEvent *e) { } case FocusIn: { - if (e->xfocus.detail != NotifyNonlinear) { + if (e->xfocus.detail != NotifyNonlinear && + e->xfocus.detail != NotifyAncestor) { /* don't process FocusIns when: 1. the new focus window isn't an ancestor or inferior of the old focus window (NotifyNonlinear) + make sure to allow the FocusIn when the old focus window was an + ancestor but didn't have a parent, such as root (NotifyAncestor) */ break; } @@ -742,89 +747,6 @@ bool Blackbox::handleSignal(int sig) { } -void Blackbox::init_icccm(void) { - xa_wm_colormap_windows = - XInternAtom(getXDisplay(), "WM_COLORMAP_WINDOWS", False); - xa_wm_protocols = XInternAtom(getXDisplay(), "WM_PROTOCOLS", False); - xa_wm_state = XInternAtom(getXDisplay(), "WM_STATE", False); - xa_wm_change_state = XInternAtom(getXDisplay(), "WM_CHANGE_STATE", False); - xa_wm_delete_window = XInternAtom(getXDisplay(), "WM_DELETE_WINDOW", False); - xa_wm_take_focus = XInternAtom(getXDisplay(), "WM_TAKE_FOCUS", False); - motif_wm_hints = XInternAtom(getXDisplay(), "_MOTIF_WM_HINTS", False); - - blackbox_hints = XInternAtom(getXDisplay(), "_BLACKBOX_HINTS", False); - blackbox_attributes = - XInternAtom(getXDisplay(), "_BLACKBOX_ATTRIBUTES", False); - blackbox_change_attributes = - XInternAtom(getXDisplay(), "_BLACKBOX_CHANGE_ATTRIBUTES", False); - blackbox_structure_messages = - XInternAtom(getXDisplay(), "_BLACKBOX_STRUCTURE_MESSAGES", False); - blackbox_notify_startup = - XInternAtom(getXDisplay(), "_BLACKBOX_NOTIFY_STARTUP", False); - blackbox_notify_window_add = - XInternAtom(getXDisplay(), "_BLACKBOX_NOTIFY_WINDOW_ADD", False); - blackbox_notify_window_del = - XInternAtom(getXDisplay(), "_BLACKBOX_NOTIFY_WINDOW_DEL", False); - blackbox_notify_current_workspace = - XInternAtom(getXDisplay(), "_BLACKBOX_NOTIFY_CURRENT_WORKSPACE", False); - blackbox_notify_workspace_count = - XInternAtom(getXDisplay(), "_BLACKBOX_NOTIFY_WORKSPACE_COUNT", False); - blackbox_notify_window_focus = - XInternAtom(getXDisplay(), "_BLACKBOX_NOTIFY_WINDOW_FOCUS", False); - blackbox_notify_window_raise = - XInternAtom(getXDisplay(), "_BLACKBOX_NOTIFY_WINDOW_RAISE", False); - blackbox_notify_window_lower = - XInternAtom(getXDisplay(), "_BLACKBOX_NOTIFY_WINDOW_LOWER", False); - blackbox_change_workspace = - XInternAtom(getXDisplay(), "_BLACKBOX_CHANGE_WORKSPACE", False); - blackbox_change_window_focus = - XInternAtom(getXDisplay(), "_BLACKBOX_CHANGE_WINDOW_FOCUS", False); - blackbox_cycle_window_focus = - XInternAtom(getXDisplay(), "_BLACKBOX_CYCLE_WINDOW_FOCUS", False); - -#ifdef NEWWMSPEC - net_supported = XInternAtom(getXDisplay(), "_NET_SUPPORTED", False); - net_client_list = XInternAtom(getXDisplay(), "_NET_CLIENT_LIST", False); - net_client_list_stacking = - XInternAtom(getXDisplay(), "_NET_CLIENT_LIST_STACKING", False); - net_number_of_desktops = - XInternAtom(getXDisplay(), "_NET_NUMBER_OF_DESKTOPS", False); - net_desktop_geometry = - XInternAtom(getXDisplay(), "_NET_DESKTOP_GEOMETRY", False); - net_desktop_viewport = - XInternAtom(getXDisplay(), "_NET_DESKTOP_VIEWPORT", False); - net_current_desktop = - XInternAtom(getXDisplay(), "_NET_CURRENT_DESKTOP", False); - net_desktop_names = XInternAtom(getXDisplay(), "_NET_DESKTOP_NAMES", False); - net_active_window = XInternAtom(getXDisplay(), "_NET_ACTIVE_WINDOW", False); - net_workarea = XInternAtom(getXDisplay(), "_NET_WORKAREA", False); - net_supporting_wm_check = - XInternAtom(getXDisplay(), "_NET_SUPPORTING_WM_CHECK", False); - net_virtual_roots = XInternAtom(getXDisplay(), "_NET_VIRTUAL_ROOTS", False); - net_close_window = XInternAtom(getXDisplay(), "_NET_CLOSE_WINDOW", False); - net_wm_moveresize = XInternAtom(getXDisplay(), "_NET_WM_MOVERESIZE", False); - net_properties = XInternAtom(getXDisplay(), "_NET_PROPERTIES", False); - net_wm_name = XInternAtom(getXDisplay(), "_NET_WM_NAME", False); - net_wm_desktop = XInternAtom(getXDisplay(), "_NET_WM_DESKTOP", False); - net_wm_window_type = - XInternAtom(getXDisplay(), "_NET_WM_WINDOW_TYPE", False); - net_wm_state = XInternAtom(getXDisplay(), "_NET_WM_STATE", False); - net_wm_strut = XInternAtom(getXDisplay(), "_NET_WM_STRUT", False); - net_wm_icon_geometry = - XInternAtom(getXDisplay(), "_NET_WM_ICON_GEOMETRY", False); - net_wm_icon = XInternAtom(getXDisplay(), "_NET_WM_ICON", False); - net_wm_pid = XInternAtom(getXDisplay(), "_NET_WM_PID", False); - net_wm_handled_icons = - XInternAtom(getXDisplay(), "_NET_WM_HANDLED_ICONS", False); - net_wm_ping = XInternAtom(getXDisplay(), "_NET_WM_PING", False); -#endif // NEWWMSPEC - -#ifdef HAVE_GETPID - blackbox_pid = XInternAtom(getXDisplay(), "_BLACKBOX_PID", False); -#endif // HAVE_GETPID -} - - bool Blackbox::validateWindow(Window window) { XEvent event; if (XCheckTypedWindowEvent(getXDisplay(), window, DestroyNotify, &event)) { @@ -1161,17 +1083,17 @@ void Blackbox::setFocusedWindow(BlackboxWindow *win) { if (active_screen) { // set input focus to the toolbar of the screen with mouse XSetInputFocus(getXDisplay(), - active_screen->getToolbar()->getWindowID(), + active_screen->getRootWindow(), RevertToPointerRoot, CurrentTime); } else { // set input focus to the toolbar of the first managed screen XSetInputFocus(getXDisplay(), - screenList.front()->getToolbar()->getWindowID(), + screenList.front()->getRootWindow(), RevertToPointerRoot, CurrentTime); } } else { // set input focus to the toolbar of the last screen - XSetInputFocus(getXDisplay(), old_screen->getToolbar()->getWindowID(), + XSetInputFocus(getXDisplay(), old_screen->getRootWindow(), RevertToPointerRoot, CurrentTime); } }