diff options
Diffstat (limited to 'src/group.c')
-rw-r--r-- | src/group.c | 661 |
1 files changed, 0 insertions, 661 deletions
diff --git a/src/group.c b/src/group.c deleted file mode 100644 index 5448006..0000000 --- a/src/group.c +++ /dev/null @@ -1,661 +0,0 @@ -/* Copyright (C) 2000, 2001, 2002, 2003, 2004 Shawn Betts <sabetts@vcn.bc.ca> - * - * This file is part of ratpoison. - * - * ratpoison is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * ratpoison is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, - * Boston, MA 02111-1307 USA - */ - -#include "ratpoison.h" - -#include <string.h> - -/* XXX Should be static */ -struct numset *group_numset; - -static void -set_current_group_1 (rp_group *g) -{ - static int counter = 1; - rp_current_group = g; - if (g) - g->last_access = counter++; -} - -void -init_groups(void) -{ - rp_group *g; - - group_numset = numset_new(); - INIT_LIST_HEAD (&rp_groups); - - /* Create the first group in the list (We always need at least - one). */ - g = group_new (numset_request (group_numset), DEFAULT_GROUP_NAME); - set_current_group_1 (g); - list_add_tail (&g->node, &rp_groups); -} - -void -free_groups(void) -{ - rp_group *cur; - struct list_head *iter, *tmp; - - list_for_each_safe_entry (cur, iter, tmp, &rp_groups, node) - { - group_free (cur); - } -} - -rp_group * -group_new (int number, char *name) -{ - rp_group *g; - - g = xmalloc (sizeof (rp_group)); - - if (name) - g->name = xstrdup (name); - else - g->name = NULL; - g->last_access = 0; - g->number = number; - g->numset = numset_new(); - INIT_LIST_HEAD (&g->unmapped_windows); - INIT_LIST_HEAD (&g->mapped_windows); - - return g; -} - -void -group_free (rp_group *g) -{ - if (g->name) - free (g->name); - numset_free (g->numset); - numset_release (group_numset, g->number); - free (g); -} - -rp_group * -group_add_new_group (char *name) -{ - rp_group *g; - rp_group *cur; - - g = group_new (numset_request (group_numset), name); - - list_for_each_entry (cur, &rp_groups, node) - { - if(cur->number > g->number) - { - list_add_tail (&g->node, &cur->node); - return g; - } - } - - list_add_tail (&g->node, &rp_groups); - - return g; -} - -void -group_resort_group (rp_group *g) -{ - rp_group *cur; - struct list_head *last = &rp_groups; - - list_del (&g->node); - list_for_each_entry (cur, &rp_groups, node) - { - if(cur->number > g->number) - { - list_add (&g->node, last); - return; - } - last = &cur->node; - } - list_add (&g->node, last); -} - -void -group_rename (rp_group *g, char *name) -{ - if (g->name) - free (g->name); - g->name = xstrdup (name); -} - -rp_group * -group_next_group (void) -{ - return list_next_entry (rp_current_group, &rp_groups, node); -} - -rp_group * -group_prev_group (void) -{ - return list_prev_entry (rp_current_group, &rp_groups, node); -} - -rp_group * -group_last_group (void) -{ - int last_access = 0; - rp_group *most_recent = NULL; - rp_group *cur; - - list_for_each_entry (cur, &rp_groups, node) - { - if (cur != rp_current_group && cur->last_access > last_access) { - most_recent = cur; - last_access = cur->last_access; - } - } - return most_recent; -} - -rp_group * -groups_find_group_by_name (char *s, int exact_match) -{ - rp_group *cur; - - list_for_each_entry (cur, &rp_groups, node) - { - if (cur->name) - { - if ((!exact_match && str_comp (s, cur->name, strlen (s))) || - (exact_match && !strcmp (cur->name, s))) - return cur; - } - } - - return NULL; -} - -rp_group * -groups_find_group_by_number (int n) -{ - rp_group *cur; - - list_for_each_entry (cur, &rp_groups, node) - { - if (cur->number == n) - return cur; - } - - return NULL; -} - -/* Return the first group that contains the window. */ -rp_group * -groups_find_group_by_window (rp_window *win) -{ - rp_group *cur; - rp_window_elem *elem; - - list_for_each_entry (cur, &rp_groups, node) - { - elem = group_find_window (&cur->mapped_windows, win); - if (elem) - return cur; - } - - return NULL; -} - - -/* Return the first group that is g. */ -rp_group * -groups_find_group_by_group (rp_group *g) -{ - rp_group *cur; - - list_for_each_entry (cur, &rp_groups, node) - { - if (cur == g) - return cur; - } - - return NULL; -} - -rp_window_elem * -group_find_window (struct list_head *list, rp_window *win) -{ - rp_window_elem *cur; - - list_for_each_entry (cur, list, node) - { - if (cur->win == win) - return cur; - } - - return NULL; -} - -rp_window_elem * -group_find_window_by_number (rp_group *g, int num) -{ - rp_window_elem *cur; - - list_for_each_entry (cur, &g->mapped_windows, node) - { - if (cur->number == num) - return cur; - } - - return NULL; - -} - - -/* Insert a window_elem into the correct spot in the group's window - list to preserve window number ordering. */ -static void -group_insert_window (struct list_head *h, rp_window_elem *w) -{ - rp_window_elem *cur; - - list_for_each_entry (cur, h, node) - { - if (cur->number > w->number) - { - list_add_tail (&w->node, &cur->node); - return; - } - } - - list_add_tail(&w->node, h); -} - -static int -group_in_list (struct list_head *h, rp_window_elem *w) -{ - rp_window_elem *cur; - - list_for_each_entry (cur, h, node) - { - if (cur == w) - return 1; - } - - return 0; -} - -/* If a window_elem's number has changed then the list has to be - resorted. */ -void -group_resort_window (rp_group *g, rp_window_elem *w) -{ - /* Only a mapped window can be resorted. */ - if (!group_in_list (&g->mapped_windows, w)) - { - PRINT_DEBUG (("Attempting to restort an unmapped window!\n")); - return; - } - - list_del (&w->node); - group_insert_window (&g->mapped_windows, w); -} - -void -group_add_window (rp_group *g, rp_window *w) -{ - rp_window_elem *we; - - /* Create our container structure for the window. */ - we = malloc (sizeof (rp_window_elem)); - we->win = w; - we->number = -1; - - /* Finally, add it to our list. */ - list_add_tail (&we->node, &g->unmapped_windows); -} - -void -group_map_window (rp_group *g, rp_window *win) -{ - rp_window_elem *we; - - we = group_find_window (&g->unmapped_windows, win); - - if (we) - { - we->number = numset_request (g->numset); - list_del (&we->node); - group_insert_window (&g->mapped_windows, we); - } -} - -void -groups_map_window (rp_window *win) -{ - rp_group *cur; - - list_for_each_entry (cur, &rp_groups, node) - { - group_map_window (cur, win); - } -} - -void -group_unmap_window (rp_group *g, rp_window *win) -{ - rp_window_elem *we; - - we = group_find_window (&g->mapped_windows, win); - - if (we) - { - numset_release (g->numset, we->number); - list_move_tail (&we->node, &g->unmapped_windows); - } -} - -void -groups_unmap_window (rp_window *win) -{ - rp_group *cur; - - list_for_each_entry (cur, &rp_groups, node) - { - group_unmap_window (cur, win); - } -} - -void -group_del_window (rp_group *g, rp_window *win) -{ - rp_window_elem *cur; - struct list_head *iter, *tmp; - - /* The assumption is that a window is unmapped before it's deleted. */ - list_for_each_safe_entry (cur, iter, tmp, &g->unmapped_windows, node) - { - if (cur->win == win) - { - list_del (&cur->node); - free (cur); - } - } - - /* Make sure the window isn't in the list of mapped windows. This - would mean there is a bug. */ -#ifdef DEBUG - list_for_each_entry (cur, &g->mapped_windows, node) - { - if (cur->win == win) - PRINT_DEBUG (("This window wasn't removed from the mapped window list.\n")); - } -#endif -} - -/* Remove the window from any groups in resides in. */ -void -groups_del_window (rp_window *win) -{ - rp_group *cur; - - list_for_each_entry (cur, &rp_groups, node) - { - group_del_window (cur, win); - } -} - -rp_window * -group_last_window (rp_group *g, rp_screen *s) -{ - int last_access = 0; - rp_window_elem *most_recent = NULL; - rp_window_elem *cur; - - list_for_each_entry (cur, &g->mapped_windows, node) - { - if (cur->win->last_access >= last_access - && cur->win != current_window() - && !find_windows_frame (cur->win) - && (cur->win->scr == s || rp_have_xinerama)) - { - most_recent = cur; - last_access = cur->win->last_access; - } - } - - if (most_recent) - return most_recent->win; - - return NULL; -} - -rp_window * -group_next_window (rp_group *g, rp_window *win) -{ - rp_window_elem *cur, *we; - - /* If there is no window, then get the last accessed one. */ - if (win == NULL) - return group_last_window (g, current_screen()); - - /* If we can't find the window, then it's in a different group, so - get the last accessed one in this group. */ - we = group_find_window (&g->mapped_windows, win); - if (we == NULL) - return group_last_window (g, win->scr); - - /* The window is in this group, so find the next one in the list - that isn't already displayed. */ - for (cur = list_next_entry (we, &g->mapped_windows, node); - cur != we; - cur = list_next_entry (cur, &g->mapped_windows, node)) - { - if (!find_windows_frame (cur->win) && (cur->win->scr == win->scr || rp_have_xinerama)) - { - return cur->win; - } - } - - return NULL; -} - -rp_window * -group_prev_window (rp_group *g, rp_window *win) -{ - rp_window_elem *cur, *we; - - /* If there is no window, then get the last accessed one. */ - if (win == NULL) - return group_last_window (g, current_screen()); - - /* If we can't find the window, then it's in a different group, so - get the last accessed one in this group. */ - we = group_find_window (&g->mapped_windows, win); - if (we == NULL) - return group_last_window (g, win->scr); - - /* The window is in this group, so find the previous one in the list - that isn't already displayed. */ - for (cur = list_prev_entry (we, &g->mapped_windows, node); - cur != we; - cur = list_prev_entry (cur, &g->mapped_windows, node)) - { - if (!find_windows_frame (cur->win) && (cur->win->scr == win->scr || rp_have_xinerama)) - { - return cur->win; - } - } - - return NULL; - -} - -void -group_move_window (rp_group *to, rp_window *win) -{ - rp_group *cur, *from = NULL; - rp_window_elem *we = NULL; - - /* Find the group that the window belongs to. FIXME: If the window - exists in multiple groups, then we're going to find the first - group with this window in it. */ - list_for_each_entry (cur, &rp_groups, node) - { - we = group_find_window (&cur->mapped_windows, win); - if (we) - { - from = cur; - break; - } - } - - if (we == NULL || from == NULL) - { - PRINT_DEBUG (("Unable to find window in mapped window lists.\n")); - return; - } - - /* Manually remove the window from one group...*/ - numset_release (from->numset, we->number); - list_del (&we->node); - - /* and shove it into the other one. */ - we->number = numset_request (to->numset); - group_insert_window (&to->mapped_windows, we); -} - -void -groups_merge (rp_group *from, rp_group *to) -{ - rp_window_elem *cur; - struct list_head *iter, *tmp; - - /* Merging a group with itself makes no sense. */ - if (from == to) - return; - - /* Move the unmapped windows. */ - list_for_each_safe_entry (cur, iter, tmp, &from->unmapped_windows, node) - { - list_del (&cur->node); - list_add_tail (&cur->node, &to->unmapped_windows); - } - - /* Move the mapped windows. */ - list_for_each_safe_entry (cur, iter, tmp, &from->mapped_windows, node) - { - numset_release (from->numset, cur->number); - list_del (&cur->node); - - cur->number = numset_request (to->numset); - group_insert_window (&to->mapped_windows, cur); - } -} - -void -set_current_group (rp_group *g) -{ - if (rp_current_group == g || g == NULL) - return; - - set_current_group_1 (g); - - /* Call the switch group hook. */ - hook_run (&rp_switch_group_hook); -} - -int -group_delete_group (rp_group *g) -{ - if (list_empty (&(g->mapped_windows)) - && list_empty (&(g->unmapped_windows))) - { - /* don't delete the last group */ - if (list_size (&rp_groups) == 1) - return GROUP_DELETE_LAST_GROUP; - - /* we can safely delete the group */ - if (g == rp_current_group) - { - rp_group *next = group_last_group (); - set_current_group (next ? next : group_next_group ()); - } - - list_del (&(g->node)); - group_free (g); - return GROUP_DELETE_GROUP_OK; - } - else - { - return GROUP_DELETE_GROUP_NONEMPTY; - } -} - -/* Used by :cother / :iother */ -rp_window * -group_last_window_by_class (rp_group *g, char *class) -{ - int last_access = 0; - rp_window_elem *most_recent = NULL; - rp_window_elem *cur; - rp_screen *s = current_screen(); - - list_for_each_entry (cur, &g->mapped_windows, node) - { - if (cur->win->last_access >= last_access - && cur->win != current_window() - && !find_windows_frame (cur->win) - && (cur->win->scr == s || rp_have_xinerama) - && strcmp(class, cur->win->res_class)) - { - most_recent = cur; - last_access = cur->win->last_access; - } - } - - if (most_recent) - return most_recent->win; - - return NULL; -} - -/* Used by :cother / :iother */ -rp_window * -group_last_window_by_class_complement (rp_group *g, char *class) -{ - int last_access = 0; - rp_window_elem *most_recent = NULL; - rp_window_elem *cur; - rp_screen *s = current_screen(); - - list_for_each_entry (cur, &g->mapped_windows, node) - { - if (cur->win->last_access >= last_access - && cur->win != current_window() - && !find_windows_frame (cur->win) - && (cur->win->scr == s || rp_have_xinerama) - && !strcmp(class, cur->win->res_class)) - { - most_recent = cur; - last_access = cur->win->last_access; - } - } - - if (most_recent) - return most_recent->win; - - return NULL; -} |