void subHookCall(int type, void *data) { int i; /* Call matching hooks */ for(i = 0; i < subtle->hooks->ndata; i++) { SubHook *h = HOOK(subtle->hooks->data[i]); if((h->flags & ~SUB_TYPE_HOOK) == type) { subRubyCall(SUB_CALL_HOOKS, h->proc, data); subSubtleLogDebug("call=hook, type=%d, proc=%ld, data=%p\n", type, h->proc, data); } } } /* }}} */
long subEwmhGetXEmbedState(Window win) { long flags = 0; XEmbedInfo *info = NULL; /* Get xembed data */ if((info = (XEmbedInfo *)subSharedPropertyGet(subtle->dpy, win, subEwmhGet(SUB_EWMH_XEMBED_INFO), subEwmhGet(SUB_EWMH_XEMBED_INFO), NULL))) { flags = (long)info->flags; subSubtleLogDebug("XEmbedInfo: win=%#lx, version=%ld, flags=%ld, mapped=%ld\n", win, info->version, info->flags, info->flags & XEMBED_MAPPED); XFree(info); } return flags; } /* }}} */
void subEwmhInit(void) { int len = 0; long data[2] = { 0, 0 }, pid = (long)getpid(); char *selection = NULL, *names[] = { /* ICCCM */ "WM_NAME", "WM_CLASS", "WM_STATE", "WM_PROTOCOLS", "WM_TAKE_FOCUS", "WM_DELETE_WINDOW", "WM_NORMAL_HINTS", "WM_SIZE_HINTS", "WM_HINTS", "WM_WINDOW_ROLE", "WM_CLIENT_LEADER", /* EWMH */ "_NET_SUPPORTED", "_NET_CLIENT_LIST", "_NET_CLIENT_LIST_STACKING", "_NET_NUMBER_OF_DESKTOPS", "_NET_DESKTOP_NAMES", "_NET_DESKTOP_GEOMETRY", "_NET_DESKTOP_VIEWPORT", "_NET_CURRENT_DESKTOP", "_NET_ACTIVE_WINDOW", "_NET_WORKAREA", "_NET_SUPPORTING_WM_CHECK", "_NET_WM_FULL_PLACEMENT", "_NET_FRAME_EXTENTS", /* Client */ "_NET_CLOSE_WINDOW", "_NET_RESTACK_WINDOW", "_NET_MOVERESIZE_WINDOW", "_NET_WM_NAME", "_NET_WM_PID", "_NET_WM_DESKTOP", "_NET_WM_STRUT", /* Types */ "_NET_WM_WINDOW_TYPE", "_NET_WM_WINDOW_TYPE_DOCK", "_NET_WM_WINDOW_TYPE_DESKTOP", "_NET_WM_WINDOW_TYPE_TOOLBAR", "_NET_WM_WINDOW_TYPE_SPLASH", "_NET_WM_WINDOW_TYPE_DIALOG", /* States */ "_NET_WM_STATE", "_NET_WM_STATE_FULLSCREEN", "_NET_WM_STATE_ABOVE", "_NET_WM_STATE_STICKY", "_NET_WM_STATE_DEMANDS_ATTENTION", /* Tray */ "_NET_SYSTEM_TRAY_OPCODE", "_NET_SYSTEM_TRAY_MESSAGE_DATA", "_NET_SYSTEM_TRAY_S", /* Misc */ "UTF8_STRING", "MANAGER", "_MOTIF_WM_HINTS", /* XEmbed */ "_XEMBED", "_XEMBED_INFO", /* subtle */ "SUBTLE_CLIENT_TAGS", "SUBTLE_CLIENT_RETAG", "SUBTLE_CLIENT_GRAVITY", "SUBTLE_CLIENT_SCREEN", "SUBTLE_CLIENT_FLAGS", "SUBTLE_GRAVITY_NEW", "SUBTLE_GRAVITY_FLAGS", "SUBTLE_GRAVITY_LIST", "SUBTLE_GRAVITY_KILL", "SUBTLE_TAG_NEW", "SUBTLE_TAG_LIST", "SUBTLE_TAG_KILL", "SUBTLE_TRAY_LIST", "SUBTLE_VIEW_NEW", "SUBTLE_VIEW_TAGS", "SUBTLE_VIEW_STYLE", "SUBTLE_VIEW_ICONS", "SUBTLE_VIEW_KILL", "SUBTLE_SUBLET_UPDATE", "SUBTLE_SUBLET_DATA", "SUBTLE_SUBLET_STYLE", "SUBTLE_SUBLET_FLAGS", "SUBTLE_SUBLET_LIST", "SUBTLE_SUBLET_KILL", "SUBTLE_SCREEN_PANELS", "SUBTLE_SCREEN_VIEWS", "SUBTLE_SCREEN_JUMP", "SUBTLE_VISIBLE_TAGS", "SUBTLE_VISIBLE_VIEWS", "SUBTLE_RENDER", "SUBTLE_RELOAD", "SUBTLE_RESTART", "SUBTLE_QUIT", "SUBTLE_COLORS", "SUBTLE_FONT", "SUBTLE_DATA", "SUBTLE_VERSION" }; assert(SUB_EWMH_TOTAL == LENGTH(names)); /* Update tray selection name for current screen */ len = strlen(names[SUB_EWMH_NET_SYSTEM_TRAY_SELECTION]) + 5; ///< For high screen counts selection = (char *)subSharedMemoryAlloc(len, sizeof(char)); snprintf(selection, len, "%s%u", names[SUB_EWMH_NET_SYSTEM_TRAY_SELECTION], SCRN); subSubtleLogDebug("Selection: len=%d, name=%s\n", len, selection); names[SUB_EWMH_NET_SYSTEM_TRAY_SELECTION] = selection; /* Register atoms */ XInternAtoms(subtle->dpy, names, SUB_EWMH_TOTAL, 0, atoms); subtle->flags |= SUB_SUBTLE_EWMH; ///< Set EWMH flag free(selection); /* EWMH: Supported hints */ XChangeProperty(subtle->dpy, ROOT, atoms[SUB_EWMH_NET_SUPPORTED], XA_ATOM, 32, PropModeReplace, (unsigned char *)&atoms, SUB_EWMH_TOTAL); /* EWMH: Window manager information */ subEwmhSetWindows(ROOT, SUB_EWMH_NET_SUPPORTING_WM_CHECK, &subtle->windows.support, 1); subEwmhSetString(subtle->windows.support, SUB_EWMH_NET_WM_NAME, PKG_NAME); subEwmhSetString(subtle->windows.support, SUB_EWMH_WM_CLASS, PKG_NAME); subEwmhSetCardinals(subtle->windows.support, SUB_EWMH_NET_WM_PID, &pid, 1); subEwmhSetString(subtle->windows.support, SUB_EWMH_SUBTLE_VERSION, PKG_VERSION); /* EWMH: Desktop geometry */ data[0] = subtle->width; data[1] = subtle->height; subEwmhSetCardinals(ROOT, SUB_EWMH_NET_DESKTOP_GEOMETRY, (long *)&data, 2); /* EWMH: Client list and client list stacking */ subEwmhSetWindows(ROOT, SUB_EWMH_NET_CLIENT_LIST, NULL, 0); subEwmhSetWindows(ROOT, SUB_EWMH_NET_CLIENT_LIST_STACKING, NULL, 0); subSubtleLogDebugSubtle("Init\n"); } /* }}} */