static dlist * do_layout(MainWin *mw, dlist *clients, Window focus, Window leader) { unsigned long desktop = wm_get_current_desktop(mw->dpy); unsigned int width, height; float factor; int xoff, yoff; dlist *iter, *tmp; /* Update the client table, pick the ones we want and sort them */ clients = update_clients(mw, clients, 0); if(mw->cod) dlist_free(mw->cod); tmp = dlist_first(dlist_find_all(clients, (dlist_match_func)clientwin_validate_func, &desktop)); if(leader != None) { mw->cod = dlist_first(dlist_find_all(tmp, clientwin_check_group_leader_func, (void*)&leader)); dlist_free(tmp); } else mw->cod = tmp; if(! mw->cod) return clients; dlist_sort(mw->cod, clientwin_sort_func, 0); /* Move the mini windows around */ layout_run(mw, mw->cod, &width, &height); factor = (float)(mw->width - 100) / width; if(factor * height > mw->height - 100) factor = (float)(mw->height - 100) / height; xoff = (mw->width - (float)width * factor) / 2; yoff = (mw->height - (float)height * factor) / 2; mainwin_transform(mw, factor); for(iter = mw->cod; iter; iter = iter->next) clientwin_move((ClientWin*)iter->data, factor, xoff, yoff); /* Get the currently focused window and select which mini-window to focus */ iter = dlist_find(mw->cod, clientwin_cmp_func, (void *)focus); if(! iter) iter = mw->cod; mw->focus = (ClientWin*)iter->data; mw->focus->focused = 1; /* Map the client windows */ for(iter = mw->cod; iter; iter = iter->next) clientwin_map((ClientWin*)iter->data); XWarpPointer(mw->dpy, None, mw->focus->mini.window, 0, 0, 0, 0, mw->focus->mini.width / 2, mw->focus->mini.height / 2); return clients; }
/* Sorts the list basing on the period, getting a rate-monotonic priority * assignment */ static int set_rm_priorities (dlist_t **threads, int minprio) { diter_t *i; dlist_t *ts; /* Sort by period */ ts = *threads = dlist_sort(*threads, (dcmp_func_t) prio_cmp); i = dlist_iter_new(&ts); /* Assign priorities */ while (diter_hasnext(i)) { thrd_t *t; t = (thrd_t *) diter_next(i); t->priority = minprio ++; } dlist_iter_free(i); return 0; }
static dlist * skippy_run(MainWin *mw, dlist *clients, int force, Window focus, Window leader, Bool all_xin) { unsigned int width, height, tree_count, u; float factor; int xoff, yoff; XEvent ev; int die = 0; dlist *iter, *tmp; Window dummy_w, *tree_windows; CARD32 desktop = wm_get_current_desktop(mw->dpy); Bool refocus = False; /* Update the main window's geometry (and Xinerama info if applicable) */ mainwin_update(mw); #ifdef XINERAMA if(all_xin) mw->xin_active = 0; #else /* ! XINERAMA */ if(all_xin); #endif /* XINERAMA */ /* Update the client table, pick the ones we want and sort them */ clients = update_clients(mw, clients); tmp = dlist_first(dlist_find_all(clients, (dlist_match_func)clientwin_validate_func, &desktop)); if(leader != None) { mw->cod = dlist_first(dlist_find_all(tmp, clientwin_check_group_leader_func, (void*)&leader)); dlist_free(tmp); } else mw->cod = tmp; if(! mw->cod) return clients; dlist_sort(mw->cod, clientwin_sort_func, 0); /* Move the mini windows around */ layout_run(mw, mw->cod, &width, &height); factor = (float)(mw->width - 100) / width; if(factor * height > mw->height - 100) factor = (float)(mw->height - 100) / height; xoff = (mw->width - (float)width * factor) / 2; yoff = (mw->height - (float)height * factor) / 2; for(iter = mw->cod; iter; iter = iter->next) clientwin_move((ClientWin*)iter->data, factor, xoff, yoff); /* Get the currently focused window and select which mini-window to focus */ iter = dlist_find(mw->cod, clientwin_cmp_func, (void *)focus); if(! iter) iter = mw->cod; mw->focus = (ClientWin*)iter->data; mw->focus->focused = 1; /* Save the stacking tree */ XQueryTree(mw->dpy, mw->root, &dummy_w, &dummy_w, &tree_windows, &tree_count); mw->stack_touched = False; /* Map the client windows */ for(iter = mw->cod; iter; iter = iter->next) clientwin_map((ClientWin*)iter->data, force); XWarpPointer(mw->dpy, None, mw->focus->mini.window, 0, 0, 0, 0, mw->focus->mini.width / 2, mw->focus->mini.height / 2); /* Restore the stacking order (using XRestackWindows seems like a bad idea) */ if(mw->stack_touched) for(u = 0; u < tree_count; ++u) XRaiseWindow(mw->dpy, tree_windows[u]); XFree(tree_windows); /* Map the main window and run our event loop */ mainwin_map(mw); while(! die) { XNextEvent(mw->dpy, &ev); if(ev.type == KeyRelease && ev.xkey.keycode == mw->key_q) { DIE_NOW = 1; break; } else if(ev.type == DestroyNotify || ev.type == UnmapNotify) { dlist *iter = dlist_find(clients, clientwin_cmp_func, (void *)ev.xany.window); if(iter) { ClientWin *cw = (ClientWin *)iter->data; clients = dlist_first(dlist_remove(iter)); iter = dlist_find(mw->cod, clientwin_cmp_func, (void *)ev.xany.window); if(iter) mw->cod = dlist_first(dlist_remove(iter)); clientwin_destroy(cw); if(! mw->cod) { die = 1; break; } } } else if(ev.xany.window == mw->window) die = mainwin_handle(mw, &ev); else if(ev.type == PropertyNotify && (ev.xproperty.atom == ESETROOT_PMAP_ID || ev.xproperty.atom == _XROOTPMAP_ID)) mainwin_update_background(mw); else if(mw->tooltip && ev.xany.window == mw->tooltip->window) tooltip_handle(mw->tooltip, &ev); else if(ev.type == KeyRelease && ev.xkey.keycode == mw->key_escape) { refocus = True; break; } else { dlist *iter; for(iter = mw->cod; iter; iter = iter->next) { ClientWin *cw = (ClientWin *)iter->data; if(cw->mini.window == ev.xany.window) { die = clientwin_handle(cw, &ev); break; } } } } /* Unmap the main window and clean up */ mainwin_unmap(mw); XFlush(mw->dpy); REDUCE(clientwin_unmap((ClientWin*)iter->data), mw->cod); dlist_free(mw->cod); mw->cod = 0; if(die == 2) DIE_NOW = 1; if(refocus) XSetInputFocus(mw->dpy, focus, RevertToPointerRoot, CurrentTime); return clients; }
int main (void) { dlist list; int i, v; dlist_init (&list, sizeof(int)); printf ("Add 10 elements\n"); for (i = 1; i <= 10; i++) { dlist_insert (&list, &i, TRUE); } printf ("Reads 5 elements from the last one:"); dlist_rewind (&list, FALSE); for (i = 1; i <= 5; i++) { dlist_read (&list, &v); printf (" %02d", v); dlist_move (&list, FALSE); } printf ("\n"); printf ("List length: %02d\n", dlist_length (&list)); printf ("Deletes the current\n"); dlist_delete (&list, TRUE); printf ("Pos from first: %02d List length: %02d\n", dlist_get_pos (&list, TRUE), dlist_length (&list)); printf ("Reads 7 elements from the first one:"); dlist_rewind (&list, TRUE); for (i = 1; i <= 7; i++) { dlist_read (&list, &v); printf (" %02d", v); dlist_move (&list, TRUE); } printf ("\n"); printf ("Adds the element 50 before current position and read: "); v = 50; dlist_insert (&list, &v, FALSE); dlist_read (&list, &v); printf ("%02d\n", v); printf ("List length: %02d\n", dlist_length (&list)); printf ("Reads all elements from the first one:"); dlist_rewind (&list, TRUE); for (;;) { dlist_read (&list, &v); printf (" %02d", v); if (dlist_get_pos (&list, FALSE) == 1) break; dlist_move (&list, TRUE); } printf ("\n"); printf ("Sort: "); dlist_sort (&list, less_than); for (;;) { dlist_read (&list, &v); printf (" %02d", v); if (dlist_get_pos (&list, FALSE) == 1) break; dlist_move (&list, TRUE); } printf ("\n"); printf ("Delete all\n"); dlist_delete_all (&list); printf ("List length: %02d\n", dlist_length (&list)); exit (0); }