summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog17
-rw-r--r--NEWS4
-rw-r--r--doc/ratpoison.texi7
-rw-r--r--src/actions.c7
-rw-r--r--src/data.h20
-rw-r--r--src/frame.c18
-rw-r--r--src/frame.h3
-rw-r--r--src/main.c2
-rw-r--r--src/split.c43
9 files changed, 104 insertions, 17 deletions
diff --git a/ChangeLog b/ChangeLog
index 74a1085..b9276e3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+2003-03-17 Shawn Betts <sabetts@sfu.ca>
+
+ * src/actions.c (initialize_default_keybindings): add keybindings
+ for fselect and resize. Move keybinding for curframe.
+
+ * src/split.c (create_initial_frame): call frame_new to allocate a frame.
+ (split_frame): likewise
+
+ * src/main.c (free_screen): call frame_free to free the screen
+ frames.
+
+ * src/frame.h (frame_new): new prototype
+ (frame_free): likewise
+
+ * src/frame.c (frame_new): new function.
+ (frame_free): likewise
+
2003-03-07 Shawn Betts <sabetts@sfu.ca>
* src/Makefile.am (ratpoison_SOURCES): add frame.c and frame.h
diff --git a/NEWS b/NEWS
index 8a23bd1..0ff7c52 100644
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,10 @@
ratpoison NEWS --- history of user-visible changes. -*- outline -*-
* Changes since 1.1.1
+** keybinding changes
+fselect is bound to C-t C-f and C-t f, curframe is now bound to C-t F,
+and resize is bound to C-t C-r and C-t r.
+
** new command fselect
select a frame by its number.
diff --git a/doc/ratpoison.texi b/doc/ratpoison.texi
index 9bee72e..6713534 100644
--- a/doc/ratpoison.texi
+++ b/doc/ratpoison.texi
@@ -343,6 +343,10 @@ Kill all frames but the current one.
@item C-t R
Kill the current frame. This is a no-op if there is only one frame.
+@item C-t r
+@item C-t C-r
+Resize the current frame.
+
@item C-t b
@item C-t C-b
Banish the mouse to the lower right corner of the screen.
@@ -352,6 +356,9 @@ Display a help screen.
@item C-t f
@item C-t C-f
+select a frame by number.
+
+@item C-t F
Indicate which frame is the current frame.
@end table
diff --git a/src/actions.c b/src/actions.c
index cfce0aa..82fac46 100644
--- a/src/actions.c
+++ b/src/actions.c
@@ -340,8 +340,11 @@ initialize_default_keybindings (void)
add_keybinding (XK_Tab, RP_META_MASK, "focuslast");
add_keybinding (XK_Q, 0, "only");
add_keybinding (XK_R, 0, "remove");
- add_keybinding (XK_f, 0, "curframe");
- add_keybinding (XK_f, RP_CONTROL_MASK, "curframe");
+ add_keybinding (XK_f, 0, "fselect");
+ add_keybinding (XK_f, RP_CONTROL_MASK, "fselect");
+ add_keybinding (XK_F, 0, "curframe");
+ add_keybinding (XK_r, 0, "resize");
+ add_keybinding (XK_r, RP_CONTROL_MASK, "resize");
add_keybinding (XK_question, 0, "help");
}
diff --git a/src/data.h b/src/data.h
index e87d63e..9f0d2fd 100644
--- a/src/data.h
+++ b/src/data.h
@@ -106,9 +106,8 @@ struct screen_info
char *display_string;
- /* A list of frames that may or may not contain windows. There should
- always be one in the list. */
- struct list_head rp_window_frames;
+ /* A tree of frame splits. */
+ rp_split_tree *split_tree;
/* Keep track of which numbers have been given to frames. */
struct numset *frames_numset;
@@ -118,6 +117,21 @@ struct screen_info
rp_window_frame *rp_current_frame;
};
+rp_split_tree
+{
+ /* The width and height of this node. */
+ int width, height;
+
+ /* The frame occupying this split. If this is a leaf node, then
+ frame will not be a pointer to an actual frame, otherwise it'll
+ be NULL. */
+ rp_window_frame *frame;
+
+ /* A list of rp_split_tree children. By convention this list is
+ always has 0 or 2 elements in it. */
+ struct list_head children;
+}
+
struct rp_action
{
KeySym key;
diff --git a/src/frame.c b/src/frame.c
index 3af78f3..6faf26e 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -106,3 +106,21 @@ frame_move_down (rp_window_frame *frame, int amount)
{
frame->y += amount;
}
+
+rp_window_frame *
+frame_new (screen_info *s)
+{
+ rp_window_frame *f;
+
+ f = xmalloc (sizeof (rp_window_frame));
+ f->number = numset_request (s->frames_numset);
+
+ return f;
+}
+
+void
+frame_free (screen_info *s, rp_window_frame *f)
+{
+ numset_release (s->frames_numset, f->number);
+ free (f);
+}
diff --git a/src/frame.h b/src/frame.h
index 6194bb0..f2e1e4b 100644
--- a/src/frame.h
+++ b/src/frame.h
@@ -36,4 +36,7 @@ int frame_right (rp_window_frame *frame);
int frame_top (rp_window_frame *frame);
int frame_left (rp_window_frame *frame);
+rp_window_frame *frame_new (screen_info *s);
+void frame_free (screen_info *s, rp_window_frame *f);
+
#endif
diff --git a/src/main.c b/src/main.c
index ce854b0..ed89e3a 100644
--- a/src/main.c
+++ b/src/main.c
@@ -709,7 +709,7 @@ free_screen (screen_info *s)
list_for_each_safe_entry (frame, iter, tmp, &s->rp_window_frames, node)
{
- free (frame);
+ frame_free (s, frame);
}
XDestroyWindow (dpy, s->bar_window);
diff --git a/src/split.c b/src/split.c
index c39c1ce..29cb1a9 100644
--- a/src/split.c
+++ b/src/split.c
@@ -144,11 +144,10 @@ maximize_frame (rp_window_frame *frame)
static void
create_initial_frame (screen_info *screen)
{
- screen->rp_current_frame = xmalloc (sizeof (rp_window_frame));
+ screen->rp_current_frame = frame_new (screen);
list_add_tail (&screen->rp_current_frame->node, &screen->rp_window_frames);
- screen->rp_current_frame->number = numset_request (screen->frames_numset);
update_last_access (screen->rp_current_frame);
maximize_frame (screen->rp_current_frame);
@@ -284,10 +283,8 @@ split_frame (rp_window_frame *frame, int way, int pixels)
s = frames_screen (frame);
- new_frame = xmalloc (sizeof (rp_window_frame));
-
- /* Give the frame a unique number. */
- new_frame->number = numset_request (s->frames_numset);
+ /* Make our new frame. */
+ new_frame = frame_new (s);
/* It seems intuitive to make the last frame the newly created
frame. */
@@ -384,9 +381,7 @@ remove_all_splits ()
if (frame != s->rp_current_frame)
{
list_del (&frame->node);
-
- numset_release (s->frames_numset, frame->number);
- free (frame);
+ frame_free (s, frame);
}
}
@@ -726,7 +721,6 @@ remove_frame (rp_window_frame *frame)
area = total_frame_area(s);
PRINT_DEBUG (("Total Area: %d\n", area));
- numset_release (s->frames_numset, frame->number);
list_del (&frame->node);
hide_window (frame->win);
hide_others (frame->win);
@@ -824,7 +818,7 @@ remove_frame (rp_window_frame *frame)
}
}
- free (frame);
+ frame_free (s, frame);
}
/* Switch the input focus to another frame, and therefore a different
@@ -994,3 +988,30 @@ find_frame_number (screen_info *s, int num)
return NULL;
}
+
+/* Frame split tree code. */
+
+rp_frame_split *
+find_frame_parent (screen_info *s, rp_window_frame *frame)
+{
+ return find_frame_parent_helper (s->split_tree, frame);
+}
+
+rp_frame_split *
+find_frame_parent_helper (rp_frame_split *split, rp_window_frame *frame)
+{
+ rp_frame_split *cur;
+
+ if (split->frame == frame)
+ return split;
+
+ /* Look for the frame in each child. If find_frame_parent_helper
+ returns not NULL, then we found it. */
+ list_for_each_entry (cur, &split->children, node)
+ {
+ if (find_frame_parent_helper (cur, frame);)
+ return split;
+ }
+
+ return NULL;
+}