void mb_wm_atoms_init(MBWindowManager *wm) { /* * The list below *MUST* be kept in the same order as the corresponding * emun in structs.h or *everything* will break. * Doing it like this avoids a mass of round trips on startup. */ char *atom_names[] = { "WM_NAME", "WM_STATE", "WM_HINTS", "WM_NORMAL_HINTS", "WM_CHANGE_STATE", "WM_PROTOCOLS", "WM_DELETE_WINDOW", "WM_COLORMAP_WINDOWS", "WM_CLIENT_MACHINE", "WM_TRANSIENT_FOR", "WM_TAKE_FOCUS", "_NET_WM_WINDOW_TYPE", "_NET_WM_WINDOW_TYPE_NORMAL", "_NET_WM_WINDOW_TYPE_TOOLBAR", "_NET_WM_WINDOW_TYPE_INPUT", "_NET_WM_WINDOW_TYPE_DOCK", "_NET_WM_WINDOW_TYPE_MENU", "_NET_WM_WINDOW_TYPE_POPUP_MENU", "_NET_WM_WINDOW_TYPE_DROPDOWN_MENU", "_NET_WM_WINDOW_TYPE_DIALOG", "_NET_WM_WINDOW_TYPE_SPLASH", "_NET_WM_WINDOW_TYPE_DESKTOP", "_NET_WM_WINDOW_TYPE_NOTIFICATION", "_NET_WM_STATE", "_NET_WM_STATE_FULLSCREEN", "_NET_WM_STATE_MODAL", "_NET_WM_STATE_ABOVE", "_NET_WM_STATE_STICKY", "_NET_WM_STATE_MAXIMIZED_VERT", "_NET_WM_STATE_MAXIMIZED_HORZ", "_NET_WM_STATE_SHADED", "_NET_WM_STATE_SKIP_TASKBAR", "_NET_WM_STATE_SKIP_PAGER", "_NET_WM_STATE_HIDDEN", "_NET_WM_STATE_BELOW", "_NET_WM_STATE_DEMANDS_ATTENTION", "_NET_SUPPORTED", "_NET_CLIENT_LIST", "_NET_NUMBER_OF_DESKTOPS", "_NET_ACTIVE_WINDOW", "_NET_SUPPORTING_WM_CHECK", "_NET_CLOSE_WINDOW", "_NET_WM_NAME", "_NET_WM_USER_TIME", "_NET_CLIENT_LIST_STACKING", "_NET_CURRENT_DESKTOP", "_NET_WM_DESKTOP", "_NET_WM_ICON", "_NET_DESKTOP_GEOMETRY", "_NET_WORKAREA", "_NET_SHOWING_DESKTOP", "_NET_DESKTOP_VIEWPORT", "_NET_FRAME_EXTENTS", "_NET_WM_FULL_PLACEMENT", "_NET_WM_ALLOWED_ACTIONS", "_NET_WM_ACTION_MOVE", "_NET_WM_ACTION_RESIZE", "_NET_WM_ACTION_MINIMIZE", "_NET_WM_ACTION_SHADE", "_NET_WM_ACTION_STICK", "_NET_WM_ACTION_MAXIMIZE_HORZ", "_NET_WM_ACTION_MAXIMIZE_VERT", "_NET_WM_ACTION_FULLSCREEN", "_NET_WM_ACTION_CHANGE_DESKTOP", "_NET_WM_ACTION_CLOSE", "_NET_WM_PING", "_NET_WM_PID", "_NET_STARTUP_ID", "UTF8_STRING", "_MOTIF_WM_HINTS", "WIN_SUPPORTING_WM_CHECK", "_NET_WM_CONTEXT_HELP", "_NET_WM_CONTEXT_ACCEPT", "_NET_WM_CONTEXT_CUSTOM", "_NET_WM_SYNC_REQUEST", "CM_TRANSLUCENCY", "_MB_APP_WINDOW_LIST_STACKING", "_MB_THEME", "_MB_THEME_NAME", "_MB_COMMAND", "_MB_GRAB_TRANSFER", "_MB_CURRENT_APP_WINDOW", }; /* FIXME: Error Traps */ MBWM_ASSERT (MBWM_ATOM_COUNT == sizeof (atom_names) / sizeof (char*)); XInternAtoms (wm->xdpy, atom_names, MBWM_ATOM_COUNT, False, wm->atoms); }
static int mb_wm_decor_button_init (MBWMObject *obj, va_list vap) { MBWMDecorButton *button = MB_WM_DECOR_BUTTON (obj); MBWindowManager *wm = NULL; MBWMDecor *decor = NULL; MBWMDecorButtonPressedFunc press = NULL; MBWMDecorButtonReleasedFunc release = NULL; MBWMDecorButtonFlags flags = 0; MBWMDecorButtonType type = 0; MBWMDecorButtonPack pack = MBWMDecorButtonPackEnd; MBWMObjectProp prop; prop = va_arg(vap, MBWMObjectProp); while (prop) { switch (prop) { case MBWMObjectPropWm: wm = va_arg(vap, MBWindowManager *); break; case MBWMObjectPropDecor: decor = va_arg(vap, MBWMDecor*); break; case MBWMObjectPropDecorButtonPressedFunc: press = va_arg(vap, MBWMDecorButtonPressedFunc); break; case MBWMObjectPropDecorButtonReleasedFunc: release = va_arg(vap, MBWMDecorButtonReleasedFunc); break; case MBWMObjectPropDecorButtonFlags: flags = va_arg(vap, MBWMDecorButtonFlags); break; case MBWMObjectPropDecorButtonType: type = va_arg(vap, MBWMDecorButtonType); break; case MBWMObjectPropDecorButtonPack: pack = va_arg(vap, MBWMDecorButtonPack); break; default: MBWMO_PROP_EAT (vap, prop); } prop = va_arg(vap, MBWMObjectProp); } if (!wm || !decor) return 0; /* * Decors must be attached before we can start adding buttons to them, * otherwise we cannot work out the button geometry. */ MBWM_ASSERT (decor->parent_client); button->geom.width = 0; button->geom.height = 0; mb_wm_theme_get_button_size (wm->theme, decor, type, (int *)&button->geom.width, (int *)&button->geom.height); button->press = press; button->release = release; button->decor = decor; button->type = type; button->pack = pack; button->flags = flags; button->press_activated = mb_wm_theme_is_button_press_activated (wm->theme, decor, type); decor->buttons = mb_wm_util_list_append (decor->buttons, button); /* the decor assumes a reference, so add one for the caller */ mb_wm_object_ref (obj); return 1; }