(require 'prompt) (require 'menus) ;;; Utils (defun rotate (l) (cons (last l) (reverse (cdr (reverse l)))) ) (defun rotate-left (l) (reverse (cons (car l) (reverse (cdr l)))) ) (defun inlist (x l) (and l (or (= x (car l)) (inlist x (cdr l)) ) ) ) ;;;;;;; (defvar tasks ()) (defvar current-task ()) (defvar active-tasks ()) ;;;;;;; (defun create-new-task (w) (interactive "%f") (setq current-task (list (add-window-to-new-group w) (prompt "task name: "))) (setq tasks (cons current-task tasks)) (setq active-tasks (list current-task)) (add-to-current-task w) (refresh-active-tasks) ) (defun add-to-current-task (w) (interactive "%f") (when current-task (list (add-window-to-group w (car current-task))) (set-x-property w 'WM_TASK_NAME (last current-task) 'STRING 8) ) ) (defun remove-from-task (w) (interactive "%f") (add-window-to-group w (window-id w)) (delete-x-property w 'WM_TASK_NAME) ) (defun map-windows-task (f tsk) (mapcar f (windows-by-group (car tsk))) ) (defun map-windows-tasks (f ts) (mapcar (lambda (tsk) (map-windows-task f tsk)) ts) ) (defun update-tasks-after-cycle () (setq current-task (car tasks)) (setq active-tasks (list current-task)) ) (defun cycle-tasks () (interactive ) (setq tasks (rotate tasks)) (update-tasks-after-cycle) (refresh-active-tasks) ) (defun cycle-tasks-left () (interactive ) (setq tasks (rotate-left tasks)) (update-tasks-after-cycle) (refresh-active-tasks) ) (defun refresh-active-tasks () (map-windows-tasks (lambda (w) (when (window-appears-in-workspace-p w current-workspace) (show-window w))) active-tasks) (map-windows-tasks hide-window (filter (lambda (x) (not (inlist x active-tasks))) tasks)) ) (defun activate-tasks (ts) (setq current-task (car ts)) (setq active-tasks ts) (refresh-active-tasks) ) (defun activate-task (tsk) (activate-tasks (list tsk)) ) (defun toggle-task (tsk) (if (inlist tsk active-tasks) (list (setq active-tasks (filter (lambda (x) (/= x tsk)) active-tasks)) (when (= tsk current-task) (setq current-task (car active-tasks))) ) (list (setq current-task tsk) (setq active-tasks (cons tsk active-tasks)) ) ) (refresh-active-tasks) ) (defun change-task-menu () (interactive ) (popup-menu (mapcar (lambda (l) (list (last l) (lambda () (activate-task l)))) tasks ) ) ) (defun toggle-task-menu () (interactive ) (popup-menu (mapcar (lambda (l) (list (last l) (lambda () (toggle-task l)))) tasks ) ) ) ;(defvar tnames ()) (defun reload_tasks () (let ((tnames ())) (list ( map-windows (lambda (w) (let ( (p (last (get-x-property w 'WM_TASK_NAME))) ) (when p (if (inlist p tnames) (add-window-to-group w (car (car (filter (lambda (t) (= p (last t))) tasks)))) (list (setq tasks (cons (list (add-window-to-new-group w) p) tasks)) (setq tnames (cons p tnames)) ) ) ) ) ) ) (update-tasks-after-cycle) (refresh-active-tasks) ) ) ) (add-hook 'after-initialization-hook reload_tasks t) (add-hook 'after-add-window-hook add-to-current-task t ) (add-hook 'enter-workspace-hook (lambda (wkspace) (refresh-active-tasks)))