ObPopup *popup_new(void) { XSetWindowAttributes attrib; ObPopup *self = g_slice_new0(ObPopup); self->obwin.type = OB_WINDOW_CLASS_INTERNAL; self->gravity = NorthWestGravity; self->x = self->y = self->textw = self->h = 0; self->a_bg = RrAppearanceCopy(ob_rr_theme->osd_bg); self->a_text = RrAppearanceCopy(ob_rr_theme->osd_hilite_label); self->iconwm = self->iconhm = 1; attrib.override_redirect = True; self->bg = XCreateWindow(obt_display, obt_root(ob_screen), 0, 0, 1, 1, 0, RrDepth(ob_rr_inst), InputOutput, RrVisual(ob_rr_inst), CWOverrideRedirect, &attrib); self->text = XCreateWindow(obt_display, self->bg, 0, 0, 1, 1, 0, RrDepth(ob_rr_inst), InputOutput, RrVisual(ob_rr_inst), 0, NULL); XSetWindowBorderWidth(obt_display, self->bg, ob_rr_theme->obwidth); XSetWindowBorder(obt_display, self->bg, RrColorPixel(ob_rr_theme->osd_border_color)); XMapWindow(obt_display, self->text); stacking_add(INTERNAL_AS_WINDOW(self)); window_add(&self->bg, INTERNAL_AS_WINDOW(self)); return self; }
ObMenuFrame* menu_frame_new(ObMenu *menu, guint show_from, ObClient *client) { ObMenuFrame *self; XSetWindowAttributes attr; self = g_slice_new0(ObMenuFrame); self->obwin.type = OB_WINDOW_CLASS_MENUFRAME; self->menu = menu; self->selected = NULL; self->client = client; self->direction_right = TRUE; self->show_from = show_from; attr.event_mask = FRAME_EVENTMASK; self->window = createWindow(obt_root(ob_screen), CWEventMask, &attr); /* make it a popup menu type window */ OBT_PROP_SET32(self->window, NET_WM_WINDOW_TYPE, ATOM, OBT_PROP_ATOM(NET_WM_WINDOW_TYPE_POPUP_MENU)); XSetWindowBorderWidth(obt_display, self->window, ob_rr_theme->mbwidth); XSetWindowBorder(obt_display, self->window, RrColorPixel(ob_rr_theme->menu_border_color)); self->a_items = RrAppearanceCopy(ob_rr_theme->a_menu); window_add(&self->window, MENUFRAME_AS_WINDOW(self)); stacking_add(MENUFRAME_AS_WINDOW(self)); return self; }
void stacking_add_nonintrusive(struct wm_window *win) { struct wm_client *client; GList *it_below = NULL; GList *it_above; GList *wins; if(!WINDOW_IS_CLIENT(win)) { stacking_add(win); return; } client = WINDOW_AS_CLIENT(win); g_assert(client->managed); it_below = find_highest_relative(client); if(!it_below) { if(focus_client && client != focus_client && focus_client->layer == client->layer) { it_below = g_list_find(stacking_list, focus_client); it_below = g_list_next(it_below); } else { it_below = stacking_list; } } for(; it_below; it_below = g_list_next(it_below)) { if(client->layer >= window_layer(it_below->data)) break; } for(; it_below != stacking_list; it_below = it_above) { it_above = it_below ? g_list_previous(it_below) : g_list_last(stacking_list); if(client->layer <= window_layer(it_above->data)) break; } wins = g_list_append(NULL, win); do_restack(wins, it_below); g_list_free(wins); stacking_list_tail = g_list_last(stacking_list); }