void DesktopManager::LoadDesktops() { Desktop * desk; Settings settings; Settings::Desktop deskSettings(&settings); //Temporary, to prevent AddDesktop from changing the current desktop m_currentDesktop = (Desktop*)1; //Load desktops from registry for(int i=0; deskSettings.Open(i); i++) { desk = new Desktop(&deskSettings); AddDesktop(desk); deskSettings.Close(); } //Sort the desktops according to their index Sort(); //Ensure there is at least one desktop if (m_desks.empty()) AddDesktop(); //Set layout UpdateLayout(); //Activate the first desktop m_currentDesktop = m_desks.front(); m_currentDesktop->Activate(); }
void DesktopManager::RemoveDesktop(Desktop * desk) { /* remove from the list */ vector<Desktop*>::iterator it = find(m_desks.begin(), m_desks.end(), desk); if (it != m_desks.end()) m_desks.erase(it); /* remove from the registry */ desk->Remove(); /* Change the current desktop, if needed */ if (m_currentDesktop == desk) { //Ensure there is still at least one desktop if (m_desks.empty()) AddDesktop(); m_currentDesktop = m_desks.front(); m_currentDesktop->Activate(); } /* Move all windows from this desktop to the currently active one */ for(WindowsManager::Iterator it = winMan->GetIterator(); it; it++) { Window * win = it; if (win->GetDesk() == desk) win->MoveToDesktop(m_currentDesktop); } /* Update the desktops layout */ UpdateLayout(); /* and remove the object from memory */ delete desk; }
/** * Probes and initializes. */ static int Open (vlc_object_t *obj) { services_discovery_t *sd = (services_discovery_t *)obj; services_discovery_sys_t *p_sys = malloc (sizeof (*p_sys)); if (p_sys == NULL) return VLC_ENOMEM; sd->p_sys = p_sys; sd->description = _("Screen capture"); /* Connect to X server */ char *display = var_InheritString (obj, "x11-display"); int snum; xcb_connection_t *conn = xcb_connect (display, &snum); free (display); if (xcb_connection_has_error (conn)) { free (p_sys); return VLC_EGENERIC; } p_sys->conn = conn; /* Find configured screen */ const xcb_setup_t *setup = xcb_get_setup (conn); const xcb_screen_t *scr = NULL; for (xcb_screen_iterator_t i = xcb_setup_roots_iterator (setup); i.rem > 0; xcb_screen_next (&i)) { if (snum == 0) { scr = i.data; break; } snum--; } if (scr == NULL) { msg_Err (obj, "bad X11 screen number"); goto error; } /* Add a permanent item for the entire desktop */ AddDesktop (sd); p_sys->root_window = scr->root; xcb_change_window_attributes (conn, scr->root, XCB_CW_EVENT_MASK, &(uint32_t) { XCB_EVENT_MASK_PROPERTY_CHANGE }); /* TODO: check that _NET_CLIENT_LIST is in _NET_SUPPORTED * (and _NET_SUPPORTING_WM_CHECK) */ xcb_intern_atom_reply_t *r; xcb_intern_atom_cookie_t ncl, nwn; ncl = xcb_intern_atom (conn, 1, strlen ("_NET_CLIENT_LIST"), "_NET_CLIENT_LIST"); nwn = xcb_intern_atom (conn, 0, strlen ("_NET_WM_NAME"), "_NET_WM_NAME"); r = xcb_intern_atom_reply (conn, ncl, NULL); if (r == NULL || r->atom == 0) { vlc_dialog_display_error (sd, _("Screen capture"), _("Your window manager does not provide a list of applications.")); msg_Err (sd, "client list not supported (_NET_CLIENT_LIST absent)"); } p_sys->net_client_list = r ? r->atom : 0; free (r); r = xcb_intern_atom_reply (conn, nwn, NULL); if (r != NULL) { p_sys->net_wm_name = r->atom; free (r); } p_sys->apps = NULL; p_sys->apps_root = input_item_NewExt("vlc://nop", _("Applications"), -1, ITEM_TYPE_NODE, ITEM_LOCAL); if (likely(p_sys->apps_root != NULL)) services_discovery_AddItem(sd, p_sys->apps_root); UpdateApps (sd); if (vlc_clone (&p_sys->thread, Run, sd, VLC_THREAD_PRIORITY_LOW)) goto error; return VLC_SUCCESS; error: xcb_disconnect (p_sys->conn); tdestroy (p_sys->apps, DelApp); if (p_sys->apps_root != NULL) input_item_Release(p_sys->apps_root); free (p_sys); return VLC_EGENERIC; }