ratpoison-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[RP] gdelete command


From: Rupert Levene
Subject: [RP] gdelete command
Date: Tue Jun 24 03:15:07 2003
User-agent: Mutt/1.5.3i

Here's a patch that adds a gdelete command which deletes groups.

Index: actions.c
===================================================================
RCS file: /cvsroot/ratpoison/ratpoison/src/actions.c,v
retrieving revision 1.174
diff -u -r1.174 actions.c
--- actions.c   23 Jun 2003 01:39:43 -0000      1.174
+++ actions.c   24 Jun 2003 10:02:45 -0000
@@ -106,6 +106,7 @@
     {"groups",         cmd_groups,             arg_VOID},
     {"gmove",          cmd_gmove,              arg_VOID},
     {"gmerge",         cmd_gmerge,             arg_VOID},
+    {"gdelete",        cmd_gdelete,            arg_VOID},
 
     /* Commands to set default behavior. */
     {"defbargravity",          cmd_defbargravity,      arg_STRING},
@@ -3638,6 +3639,39 @@
     groups_merge (g, rp_current_group);
   else
     message (" gmerge: Cannot find group ");
+
+  return NULL;
+}
+
+char *
+cmd_gdelete (int interactive, char *data)
+{
+  rp_group *g; 
+
+  if (data == NULL) 
+    g = rp_current_group;
+  else
+    {
+      g = find_group (data);
+      if (!g)
+       {
+         message (" gdelete: cannot find group ");
+         return NULL;
+       }
+    }
+  
+  switch ( group_delete_group(g) ) {
+  case GROUP_DELETE_GROUP_OK:
+    break;
+  case GROUP_DELETE_GROUP_NONEMPTY:
+    message (" gdelete: non-empty group ");
+    break;
+  case GROUP_DELETE_GROUP_ONLY:
+    message (" gdelete: cannot delete only group ");
+    break;
+  default:
+    message (" gdelete: bizarre error (this shouldn't happen) ");
+    }
 
   return NULL;
 }
Index: actions.h
===================================================================
RCS file: /cvsroot/ratpoison/ratpoison/src/actions.h,v
retrieving revision 1.62
diff -u -r1.62 actions.h
--- actions.h   25 May 2003 11:01:25 -0000      1.62
+++ actions.h   24 Jun 2003 10:02:45 -0000
@@ -79,6 +79,7 @@
 char *cmd_fselect (int interactive, char *data);
 char *cmd_getenv (int interactive, char *data);
 char *cmd_gmerge (int interactive, char *data);
+char *cmd_gdelete (int interactive, char *data);
 char *cmd_gmove (int interactive, char *data);
 char *cmd_gnew (int interactive, char *data);
 char *cmd_gnewbg (int interactive, char *data);
Index: group.c
===================================================================
RCS file: /cvsroot/ratpoison/ratpoison/src/group.c,v
retrieving revision 1.6
diff -u -r1.6 group.c
--- group.c     2 Jun 2003 22:49:36 -0000       1.6
+++ group.c     24 Jun 2003 10:02:45 -0000
@@ -91,6 +91,32 @@
   return g;
 }
 
+int
+group_delete_group (rp_group *g)
+{
+  if ( list_empty (&(g->mapped_windows)) 
+       && list_empty (&(g->unmapped_windows)) )
+    {
+      int group_count = list_count (&rp_groups);
+      if (group_count > 1) 
+       {
+         /* we can safely delete the group */
+         if (g == rp_current_group) 
+           rp_current_group = group_next_group ();
+
+         list_del (&(g->node));
+         group_free (g);
+         return GROUP_DELETE_GROUP_OK;
+       }
+      else
+       return GROUP_DELETE_GROUP_ONLY;
+    }
+  else
+    {
+      return GROUP_DELETE_GROUP_NONEMPTY;
+    }
+}
+
 rp_group *
 group_next_group ()
 {
Index: group.h
===================================================================
RCS file: /cvsroot/ratpoison/ratpoison/src/group.h,v
retrieving revision 1.4
diff -u -r1.4 group.h
--- group.h     27 May 2003 18:46:34 -0000      1.4
+++ group.h     24 Jun 2003 10:02:45 -0000
@@ -1,12 +1,17 @@
 #ifndef GROUP_H
 #define GROUP_H
 
+#define GROUP_DELETE_GROUP_OK         0
+#define GROUP_DELETE_GROUP_NONEMPTY   1
+#define GROUP_DELETE_GROUP_ONLY       2
+
 void init_groups ();
 void free_groups();
 
 void group_add_window (rp_group *g, rp_window *w);
 void group_resort_window (rp_group *g, rp_window_elem *w);
 void group_free (rp_group *g);
+int group_delete_group (rp_group *g);
 rp_group *group_new (int number, char *name);
 
 void group_del_window (rp_group *g, rp_window *win);
Index: linkedlist.c
===================================================================
RCS file: /cvsroot/ratpoison/ratpoison/src/linkedlist.c,v
retrieving revision 1.1
diff -u -r1.1 linkedlist.c
--- linkedlist.c        20 May 2003 07:20:16 -0000      1.1
+++ linkedlist.c        24 Jun 2003 10:02:45 -0000
@@ -164,3 +164,20 @@
     INIT_LIST_HEAD(list);
   }
 }
+
+/**
+ * list_count - returns the number of items in a list
+ * @head: the list to test.
+ */
+int
+list_count(struct list_head *head)
+{
+  int i=0;
+  struct list_head *ptr = head->next;
+  while (ptr != head)
+    {
+      ++i;
+      ptr = ptr->next;
+    }
+  return i;
+}
Index: linkedlist.h
===================================================================
RCS file: /cvsroot/ratpoison/ratpoison/src/linkedlist.h,v
retrieving revision 1.5
diff -u -r1.5 linkedlist.h
--- linkedlist.h        27 May 2003 07:51:07 -0000      1.5
+++ linkedlist.h        24 Jun 2003 10:02:45 -0000
@@ -41,6 +41,7 @@
                   struct list_head *head);
 
 int list_empty(struct list_head *head);
+int list_count (struct list_head *head);
 
 void list_move_tail(struct list_head *list,
                    struct list_head *head);



reply via email to

[Prev in Thread] Current Thread [Next in Thread]