summaryrefslogtreecommitdiff
path: root/src/split.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/split.c')
-rw-r--r--src/split.c194
1 files changed, 120 insertions, 74 deletions
diff --git a/src/split.c b/src/split.c
index f63412d..7c542d3 100644
--- a/src/split.c
+++ b/src/split.c
@@ -25,9 +25,6 @@
#include "ratpoison.h"
-rp_window_frame *rp_window_frame_sentinel;
-rp_window_frame *rp_current_frame;
-
static void
update_last_access (rp_window_frame *frame)
{
@@ -50,6 +47,26 @@ set_frames_window (rp_window_frame *frame, rp_window *win)
return last_win;
}
+static screen_info *
+frames_screen (rp_window_frame *frame)
+{
+ int i;
+ rp_window_frame *cur;
+
+ for (i=0; i<num_screens; i++)
+ for (cur = screens[i].rp_window_frame_sentinel->next;
+ cur !=screens[i]. rp_window_frame_sentinel;
+ cur = cur->next)
+ {
+ if (frame == cur)
+ return &screens[i];
+ }
+
+ /* This SHOULD be impossible to get to. FIXME: It'll crash higher up if we
+ return NULL. */
+ return NULL;
+}
+
void
maximize_all_windows_in_frame (rp_window_frame *frame)
{
@@ -77,54 +94,64 @@ delete_frame_from_list (rp_window_frame *frame)
static void
maximize_frame (rp_window_frame *frame)
{
+ screen_info *s = frames_screen (frame);
+
frame->x = defaults.padding_left;
frame->y = defaults.padding_top;
- /* FIXME: what about multiple screens? */
- frame->width = DisplayWidth (dpy, 0) - defaults.padding_right - defaults.padding_left;
- frame->height = DisplayHeight (dpy, 0) - defaults.padding_bottom - defaults.padding_top;
+ frame->width = DisplayWidth (dpy, s->screen_num) - defaults.padding_right - defaults.padding_left;
+ frame->height = DisplayHeight (dpy, s->screen_num) - defaults.padding_bottom - defaults.padding_top;
}
/* Create a full screen frame */
static void
-create_initial_frame ()
+create_initial_frame (screen_info *screen)
{
- rp_current_frame = xmalloc (sizeof (rp_window_frame));
+ screen->rp_current_frame = xmalloc (sizeof (rp_window_frame));
- update_last_access (rp_current_frame);
+ update_last_access (screen->rp_current_frame);
- rp_window_frame_sentinel->next = rp_current_frame;
- rp_window_frame_sentinel->prev = rp_current_frame;
- rp_current_frame->next = rp_window_frame_sentinel;
- rp_current_frame->prev = rp_window_frame_sentinel;
+ screen->rp_window_frame_sentinel->next = screen->rp_current_frame;
+ screen->rp_window_frame_sentinel->prev = screen->rp_current_frame;
+ screen->rp_current_frame->next = screen->rp_window_frame_sentinel;
+ screen->rp_current_frame->prev = screen->rp_window_frame_sentinel;
- maximize_frame (rp_current_frame);
+ maximize_frame (screen->rp_current_frame);
- set_frames_window (rp_current_frame, NULL);
+ set_frames_window (screen->rp_current_frame, NULL);
}
void
-init_frame_list ()
+init_frame_lists ()
{
- rp_window_frame_sentinel = xmalloc (sizeof (rp_window_frame));
+ int i;
- rp_window_frame_sentinel->next = rp_window_frame_sentinel;
- rp_window_frame_sentinel->prev = rp_window_frame_sentinel;
+ for (i=0; i<num_screens; i++)
+ init_frame_list (&screens[i]);
+}
- create_initial_frame();
+void
+init_frame_list (screen_info *screen)
+{
+ screen->rp_window_frame_sentinel = xmalloc (sizeof (rp_window_frame));
+
+ screen->rp_window_frame_sentinel->next = screen->rp_window_frame_sentinel;
+ screen->rp_window_frame_sentinel->prev = screen->rp_window_frame_sentinel;
+
+ create_initial_frame(screen);
}
rp_window_frame *
-find_last_frame ()
+find_last_frame (screen_info *s)
{
rp_window_frame *cur, *last = NULL;
int last_access = -1;
- for (cur = rp_window_frame_sentinel->next;
- cur != rp_window_frame_sentinel;
+ for (cur = s->rp_window_frame_sentinel->next;
+ cur != s->rp_window_frame_sentinel;
cur = cur->next)
{
- if (cur != rp_current_frame
+ if (cur != s->rp_current_frame
&& cur->last_access > last_access)
{
last_access = cur->last_access;
@@ -139,10 +166,13 @@ find_last_frame ()
rp_window_frame *
find_windows_frame (rp_window *win)
{
+ screen_info *s;
rp_window_frame *cur;
- for (cur = rp_window_frame_sentinel->next;
- cur != rp_window_frame_sentinel;
+ s = win->scr;
+
+ for (cur = s->rp_window_frame_sentinel->next;
+ cur != s->rp_window_frame_sentinel;
cur = cur->next)
{
if (cur->win == win) return cur;
@@ -159,7 +189,7 @@ find_frame_next (rp_window_frame *frame)
if (frame == NULL) return NULL;
cur = frame;
- if (cur->next == rp_window_frame_sentinel)
+ if (cur->next == frames_screen (frame)->rp_window_frame_sentinel)
{
cur = cur->next;
if (cur->next == frame) return NULL;
@@ -176,7 +206,7 @@ find_frame_prev (rp_window_frame *frame)
if (frame == NULL) return NULL;
cur = frame;
- if (cur->prev == rp_window_frame_sentinel)
+ if (cur->prev == frames_screen (frame)->rp_window_frame_sentinel)
{
cur = cur->prev;
if (cur->prev == frame) return NULL;
@@ -188,10 +218,7 @@ find_frame_prev (rp_window_frame *frame)
rp_window *
current_window ()
{
- if (rp_current_frame) return rp_current_frame->win;
-
- PRINT_ERROR ("BUG: There should always be a current frame\n");
- return NULL;
+ return screens[rp_current_screen].rp_current_frame->win;
}
static int
@@ -217,6 +244,7 @@ window_fits_in_frame (rp_window *win, rp_window_frame *frame)
rp_window *
find_window_for_frame (rp_window_frame *frame)
{
+ screen_info *s = frames_screen (frame);
int last_access = 0;
rp_window *most_recent = NULL;
rp_window *cur;
@@ -225,7 +253,8 @@ find_window_for_frame (rp_window_frame *frame)
cur != rp_mapped_window_sentinel;
cur = cur->next)
{
- if (cur != current_window()
+ if (cur->scr == s
+ && cur != current_window()
&& !find_windows_frame (cur)
&& cur->last_access >= last_access
&& window_fits_in_frame (cur, frame)
@@ -244,9 +273,12 @@ find_window_for_frame (rp_window_frame *frame)
static void
split_frame (rp_window_frame *frame, int way)
{
+ screen_info *s;
rp_window *win;
rp_window_frame *new_frame;
+ s = frames_screen (frame);
+
new_frame = xmalloc (sizeof (rp_window_frame));
/* It seems intuitive to make the last frame the newly created
@@ -254,10 +286,10 @@ split_frame (rp_window_frame *frame, int way)
update_last_access (new_frame);
/* append the new frame to the list */
- new_frame->prev = rp_window_frame_sentinel->prev;
- rp_window_frame_sentinel->prev->next = new_frame;
- rp_window_frame_sentinel->prev = new_frame;
- new_frame->next = rp_window_frame_sentinel;
+ new_frame->prev = s->rp_window_frame_sentinel->prev;
+ s->rp_window_frame_sentinel->prev->next = new_frame;
+ s->rp_window_frame_sentinel->prev = new_frame;
+ new_frame->next = s->rp_window_frame_sentinel;
set_frames_window (new_frame, NULL);
@@ -325,18 +357,19 @@ h_split_frame (rp_window_frame *frame)
void
remove_all_splits ()
{
+ screen_info *s = &screens[rp_current_screen];
rp_window *cur_window;
rp_window_frame *frame, *cur_frame;
rp_window *win;
cur_window = current_window();
- cur_frame = rp_current_frame;
+ cur_frame = s->rp_current_frame;
- while (rp_window_frame_sentinel->next != rp_window_frame_sentinel)
+ while (s->rp_window_frame_sentinel->next != s->rp_window_frame_sentinel)
{
- frame = rp_window_frame_sentinel->next;
+ frame = s->rp_window_frame_sentinel->next;
delete_frame_from_list (frame);
- if (frame != rp_current_frame)
+ if (frame != s->rp_current_frame)
{
for (win = rp_mapped_window_sentinel->next;
win != rp_mapped_window_sentinel;
@@ -349,7 +382,7 @@ remove_all_splits ()
free (frame);
}
- create_initial_frame ();
+ create_initial_frame (s);
/* Maximize all the windows that were in the current frame. */
for (win = rp_mapped_window_sentinel->next;
@@ -358,12 +391,12 @@ remove_all_splits ()
{
if (win->frame == cur_frame)
{
- set_frames_window (rp_current_frame, win);
+ set_frames_window (win->scr->rp_current_frame, win);
maximize (win);
}
}
- set_frames_window (rp_current_frame, cur_window);
+ set_frames_window (s->rp_current_frame, cur_window);
}
static int
@@ -395,13 +428,13 @@ frame_is_right (rp_window_frame *src, rp_window_frame *frame)
}
static int
-total_frame_area ()
+total_frame_area (screen_info *s)
{
int area = 0;
rp_window_frame *cur;
- for (cur = rp_window_frame_sentinel->next;
- cur != rp_window_frame_sentinel;
+ for (cur = s->rp_window_frame_sentinel->next;
+ cur != s->rp_window_frame_sentinel;
cur = cur->next)
{
area += cur->width * cur->height;
@@ -411,13 +444,13 @@ total_frame_area ()
}
static int
-num_frames ()
+num_frames (screen_info *s)
{
int count = 0;
rp_window_frame *cur;
- for (cur = rp_window_frame_sentinel->next;
- cur != rp_window_frame_sentinel;
+ for (cur = s->rp_window_frame_sentinel->next;
+ cur != s->rp_window_frame_sentinel;
cur = cur->next)
{
count++;
@@ -444,10 +477,13 @@ frames_overlap (rp_window_frame *f1, rp_window_frame *f2)
static int
frame_overlaps (rp_window_frame *frame)
{
+ screen_info *s;
rp_window_frame *cur;
- for (cur = rp_window_frame_sentinel->next;
- cur != rp_window_frame_sentinel;
+ s = frames_screen (frame);
+
+ for (cur = s->rp_window_frame_sentinel->next;
+ cur != s->rp_window_frame_sentinel;
cur = cur->next)
{
if (cur != frame && frames_overlap (cur, frame))
@@ -461,20 +497,23 @@ frame_overlaps (rp_window_frame *frame)
void
remove_frame (rp_window_frame *frame)
{
+ screen_info *s;
int area;
rp_window_frame *cur;
if (frame == NULL) return;
- area = total_frame_area();
+ s = frames_screen (frame);
+
+ area = total_frame_area(s);
PRINT_DEBUG ("Total Area: %d\n", area);
delete_frame_from_list (frame);
hide_window (frame->win);
hide_others (frame->win);
- for (cur = rp_window_frame_sentinel->next;
- cur != rp_window_frame_sentinel;
+ for (cur = s->rp_window_frame_sentinel->next;
+ cur != s->rp_window_frame_sentinel;
cur = cur->next)
{
rp_window_frame tmp_frame;
@@ -501,7 +540,7 @@ remove_frame (rp_window_frame *frame)
}
PRINT_DEBUG ("Attempting vertical Frame y=%d height=%d\n", cur->y, cur->height);
- PRINT_DEBUG ("New Total Area: %d\n", total_frame_area());
+ PRINT_DEBUG ("New Total Area: %d\n", total_frame_area(s));
/* If the area is bigger than before, the frame takes up too
much space. If the current frame and the deleted frame DON'T
@@ -510,7 +549,7 @@ remove_frame (rp_window_frame *frame)
deleted window. If any active frames overlap, it could have
taken up the right amount of space, overlaps with the deleted
frame but obviously didn't fit. */
- if (total_frame_area() > area || !frames_overlap (cur, frame) || frame_overlaps (cur))
+ if (total_frame_area(s) > area || !frames_overlap (cur, frame) || frame_overlaps (cur))
{
PRINT_DEBUG ("Didn't fit vertically\n");
@@ -535,10 +574,10 @@ remove_frame (rp_window_frame *frame)
}
PRINT_DEBUG ("Attempting horizontal Frame x=%d width=%d\n", cur->x, cur->width);
- PRINT_DEBUG ("New Total Area: %d\n", total_frame_area());
+ PRINT_DEBUG ("New Total Area: %d\n", total_frame_area(s));
/* Same test as the vertical test, above. */
- if (total_frame_area() > area || !frames_overlap (cur, frame) || frame_overlaps (cur))
+ if (total_frame_area(s) > area || !frames_overlap (cur, frame) || frame_overlaps (cur))
{
PRINT_DEBUG ("Didn't fit horizontally\n");
@@ -574,13 +613,14 @@ remove_frame (rp_window_frame *frame)
void
set_active_frame (rp_window_frame *frame)
{
- rp_window_frame *old = rp_current_frame;
+ screen_info *s = frames_screen (frame);
+ rp_window_frame *old = s->rp_current_frame;
- give_window_focus (frame->win, rp_current_frame->win);
+ give_window_focus (frame->win, s->rp_current_frame->win);
update_last_access (frame);
- rp_current_frame = frame;
+ s->rp_current_frame = frame;
- if (old != rp_current_frame && num_frames() > 1)
+ if (old != s->rp_current_frame && num_frames(s) > 1)
{
show_frame_indicator();
}
@@ -589,7 +629,7 @@ set_active_frame (rp_window_frame *frame)
focus. */
if( !frame->win )
{
- XSetInputFocus (dpy, current_screen()->key_window,
+ XSetInputFocus (dpy, s->key_window,
RevertToPointerRoot, CurrentTime);
}
}
@@ -625,8 +665,10 @@ show_frame_indicator ()
height = (FONT_HEIGHT (defaults.font) + defaults.bar_y_padding * 2);
XMoveResizeWindow (dpy, current_screen()->frame_window,
- rp_current_frame->x + rp_current_frame->width / 2 - width / 2,
- rp_current_frame->y + rp_current_frame->height / 2 - height / 2,
+ current_screen()->rp_current_frame->x
+ + current_screen()->rp_current_frame->width / 2 - width / 2,
+ current_screen()->rp_current_frame->y
+ + current_screen()->rp_current_frame->height / 2 - height / 2,
width, height);
XMapRaised (dpy, current_screen()->frame_window);
@@ -644,10 +686,11 @@ show_frame_indicator ()
rp_window_frame *
find_frame_up (rp_window_frame *frame)
{
+ screen_info *s = frames_screen (frame);
rp_window_frame *cur;
- for (cur = rp_window_frame_sentinel->next;
- cur != rp_window_frame_sentinel;
+ for (cur = s->rp_window_frame_sentinel->next;
+ cur != s->rp_window_frame_sentinel;
cur = cur->next)
{
if (frame->y == cur->y + cur->height)
@@ -663,10 +706,11 @@ find_frame_up (rp_window_frame *frame)
rp_window_frame *
find_frame_down (rp_window_frame *frame)
{
+ screen_info *s = frames_screen (frame);
rp_window_frame *cur;
- for (cur = rp_window_frame_sentinel->next;
- cur != rp_window_frame_sentinel;
+ for (cur = s->rp_window_frame_sentinel->next;
+ cur != s->rp_window_frame_sentinel;
cur = cur->next)
{
if (frame->y + frame->height == cur->y)
@@ -682,10 +726,11 @@ find_frame_down (rp_window_frame *frame)
rp_window_frame *
find_frame_left (rp_window_frame *frame)
{
+ screen_info *s = frames_screen (frame);
rp_window_frame *cur;
- for (cur = rp_window_frame_sentinel->next;
- cur != rp_window_frame_sentinel;
+ for (cur = s->rp_window_frame_sentinel->next;
+ cur != s->rp_window_frame_sentinel;
cur = cur->next)
{
if (frame->x == cur->x + cur->width)
@@ -701,10 +746,11 @@ find_frame_left (rp_window_frame *frame)
rp_window_frame *
find_frame_right (rp_window_frame *frame)
{
+ screen_info *s = frames_screen (frame);
rp_window_frame *cur;
- for (cur = rp_window_frame_sentinel->next;
- cur != rp_window_frame_sentinel;
+ for (cur = s->rp_window_frame_sentinel->next;
+ cur != s->rp_window_frame_sentinel;
cur = cur->next)
{
if (frame->x + frame->width == cur->x)