ratpoison-devel
[Top][All Lists]
Advanced

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

Re: [RP] Try to implement next-in-frame feature


From: antoine . brand
Subject: Re: [RP] Try to implement next-in-frame feature
Date: Tue, 29 Jun 2010 22:26:09 +0200
User-agent: Mutt/1.5.20 (2009-06-14)

diff --git a/src/actions.c b/src/actions.c
index b3baadb..8edb4ec 100644
--- a/src/actions.c
+++ b/src/actions.c
@@ -387,6 +387,9 @@ init_user_commands(void)
                "Text: ", arg_RAW);
   add_command ("getsel",        cmd_getsel,     0, 0, 0);
   add_command ("compat",        cmd_compat,     0, 0, 0);
+  /*NEW*/
+  add_command ("nextframe",     cmd_nextframe, 0, 0, 0);
+  /*NEW*/
   /address@hidden (tag required for genrpbindings) */
 
   /* Commands to help debug ratpoison. */
@@ -1263,7 +1266,6 @@ cmd_other (int interactive UNUSED, struct cmdarg **args 
UNUSED)
     return cmdret_new (RET_FAILURE, "%s", MESSAGE_NO_OTHER_WINDOW);
   else
     set_active_window_force (w);
-
   return cmdret_new (RET_SUCCESS, NULL);
 }
 
@@ -5565,6 +5567,49 @@ set_maxundos (struct cmdarg **args)
   return cmdret_new (RET_SUCCESS, NULL);
 }
 
+/*NEW*/
+cmdret *
+cmd_nextframe (int interactive, struct cmdarg **args)
+{
+  rp_window *cur, *last, *win;
+
+  cur = current_window();
+  
+  if (!cur)
+    return cmd_next (interactive, args);
+
+  /*NEW*/
+  //see cmd_undo
+  if(cur->in_frame==-1)
+    return cmd_next (interactive, args);
+  /*NEW*/
+
+  int current_frame=current_screen()->current_frame;
+
+  /* CUR !in cycle list, so LAST marks last node. */
+  last = group_prev_window (rp_current_group, cur);
+
+  if (last)
+    for (win = group_next_window (rp_current_group, cur);
+         win;
+         win = group_next_window (rp_current_group, win))
+      {
+        if (current_frame == win->in_frame)
+          {
+           set_active_window_force (win);
+            return cmdret_new (RET_SUCCESS, NULL);
+          }
+
+        if (win == last) break;
+      }
+
+  //need if you make a nextframe on window, which in_frame isn't equals to
+  //the current frame number, and if the windows is the only one in the frame
+  cur->in_frame=current_frame;
+  return cmdret_new (RET_FAILURE, "%s", MESSAGE_NO_OTHER_WINDOW);
+}
+/*NEW*/
+
 cmdret *
 cmd_cnext (int interactive, struct cmdarg **args)
 {
@@ -5732,6 +5777,16 @@ cmd_undo (int interactive UNUSED, struct cmdarg **args 
UNUSED)
       cmdret *ret;
 
       ret = frestore (cur->frames, cur->screen);
+      /*NEW*/
+      //unability to store "in_frame" information, so they are set to -1
+      //to avoid lost a windows if tou use just "nextframe"
+      //but all "in_frame" layout is lost.
+      rp_window_elem *win;
+      list_for_each_entry (win, &rp_current_group->mapped_windows, node)
+       {
+         win->win->in_frame=-1;
+       }
+      /*NEW*/
       return ret;
     }
 }
diff --git a/src/actions.h b/src/actions.h
index 5db4a56..04d91e1 100644
--- a/src/actions.h
+++ b/src/actions.h
@@ -218,6 +218,9 @@ RP_CMD (undo);
 RP_CMD (redo);
 RP_CMD (putsel);
 RP_CMD (getsel);
+/*NEW*/
+RP_CMD (nextframe);
+/*NEW*/
 
 void del_frame_undo (rp_frame_undo *u);
 
diff --git a/src/data.h b/src/data.h
index 541ca9e..648de0b 100644
--- a/src/data.h
+++ b/src/data.h
@@ -111,6 +111,12 @@ struct rp_window
      is mapped and this is >0 then use the frame (if it exists). */
   int intended_frame_number;
 
+  /*NEW*/
+  //refer to the frame where the window is supposed to be displayed in
+  int in_frame;
+  /*NEW*/
+
+
   struct list_head node;
 };
 
diff --git a/src/format.c b/src/format.c
index 0706f21..82e7e79 100644
--- a/src/format.c
+++ b/src/format.c
@@ -169,12 +169,12 @@ format_string (char *fmt, rp_window_elem *win_elem, 
struct sbuf *buffer)
 static void
 fmt_framenum (rp_window_elem *win_elem, struct sbuf *buf)
 {
-  if (win_elem->win->frame_number != EMPTY)
+  //if (win_elem->win->frame_number != EMPTY)
     {
-      sbuf_printf_concat (buf, "%d", win_elem->win->frame_number);
+      sbuf_printf_concat (buf, "%d", win_elem->win->in_frame);
     }
-  else
-    sbuf_copy (buf, " ");
+    //  else
+    //    sbuf_copy (buf, " ");
 }
 
 static void
diff --git a/src/split.c b/src/split.c
index 480fca1..12d2a60 100644
--- a/src/split.c
+++ b/src/split.c
@@ -390,8 +390,12 @@ remove_all_splits (void)
   /* Hide all the windows not in the current frame. */
   list_for_each_entry (win, &rp_mapped_window, node)
     {
-      if (win->frame_number != s->current_frame && win->scr == s)
-        hide_window (win);
+      if (win->frame_number != s->current_frame && win->scr == s){
+       hide_window (win);
+        /*NEW*/
+         win->in_frame=s->current_frame;
+       /*NEW*/
+      }
     }
 
   /* Delete all the frames except the current one. */
@@ -716,8 +720,16 @@ remove_frame (rp_frame *frame)
   area = total_frame_area(s);
   PRINT_DEBUG (("Total Area: %d\n", area));
 
+  /*NEW*/
+  int tmp_in_frame=find_frame_prev(frame)->number;
+  /*NEW*/
+  
   list_del (&frame->node);
   win = find_window_number (frame->win_number);
+  /*NEW*/
+  if(win)
+    win->in_frame=tmp_in_frame;
+  /*NEW*/
   hide_window (win);
   hide_others (win);
 
diff --git a/src/window.c b/src/window.c
index 889772c..209f8c8 100644
--- a/src/window.c
+++ b/src/window.c
@@ -231,6 +231,11 @@ add_to_window_list (rp_screen *s, Window w)
   if (frame_num >= 0)
     new_window->intended_frame_number = frame_num;
 
+  /*NEW*/
+  //a window created gets the current frame number
+  if (frame_num >= 0)
+    new_window->in_frame = frame_num;
+  /*NEW*/
   return new_window;
 }
 
@@ -665,6 +670,15 @@ set_active_window_body (rp_window *win, int force)
 
   last_win = set_frames_window (frame, win);
 
+  /*NEW*/
+  //when a window is displayed in a frame, it gets the current frame number
+  //as in_frame number.
+  win->in_frame=frame->number;
+  if(last_win)
+    last_win->in_frame=frame->number;
+  /*NEW*/
+
+
   if (last_win) PRINT_DEBUG (("last window: %s\n", window_name (last_win)));
   PRINT_DEBUG (("new window: %s\n", window_name (win)));
 




reply via email to

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