summaryrefslogtreecommitdiff
path: root/src/events.c
diff options
context:
space:
mode:
authorsabetts <sabetts>2001-04-01 01:17:53 +0000
committersabetts <sabetts>2001-04-01 01:17:53 +0000
commit299d16aa6ae37bd73ae92ee8a5d1c6715682ee35 (patch)
tree2361849e3956311464ab696132f35ed931946fd1 /src/events.c
parentf04f2c8483f144d20caa9ee7103a0eca8493545f (diff)
downloadratpoison-299d16aa6ae37bd73ae92ee8a5d1c6715682ee35.zip
* src/split.h (find_window_for_frame): new function prototype
(find_window_for_frame): likewise (find_window_for_frame): likewise (find_window_for_frame): likewise (find_window_for_frame): likewise * src/split.c (window_fits_in_frame): new function (find_window_for_frame): likewise (split_window): likewise (v_split_window): likewise (h_split_window): likewise (remove_all_frames): likewise (frame_is_below): likewise (frame_is_above): likewise (frame_is_left): likewise (frame_is_right): likewise (total_frame_area): likewise (num_frames): likewise (frames_overlap): likewise (frame_overlaps): likewise (remove_frame): likewise * src/ratpoison.h: includes "split.h" * src/manage.c (unmanage): calls free_window (maximize_transient): takes the window's frame into account (maximize_normal): likewise * src/list.h (find_window_prev_with_frame): new function prototype (find_window_next_with_frame): likewise (free_window): likewise * src/list.c (free_window): new function (add_to_window_list): initialize new window's frame to NULL. (find_window_prev): skips windows with frames (find_window_next): likewise (find_window_other): likewise (find_window_prev_with_frame): new function (find_window_next_with_frame): new function (set_active_window): returns if the specified window is already the current window. (set_active_window): If the new window has no frame it inherits the current window's frame. (set_active_window): maximize and raise the newly active window. * src/events.c (unmap_notify): handles window frames. (destroy_window): simplified * src/data.h (struct rp_window_frame): new struct (struct rp_window): add frame variable * src/conf.h (WINDOW_BORDER_WIDTH): set to 1 * src/actions.h (cmd_next_frame): new function prototype (cmd_prev_frame): likewise (cmd_h_split): likewise (cmd_v_split): likewise (cmd_only): likewise (cmd_remove): likewise * src/actions.c (initialize_default_keybindings): new default bindings for "split", "vsplit", "focus", "only", "remove" (user_commands): new user commands "split", "vsplit", "focus", "only", "remove" (cmd_prev_frame): new function (cmd_next_frame): likewise (cmd_h_split): likewise (cmd_v_split): likewise (cmd_only): likewise (cmd_remove): likewise * src/Makefile.am (ratpoison_SOURCES): new files split.c split.h
Diffstat (limited to 'src/events.c')
-rw-r--r--src/events.c86
1 files changed, 62 insertions, 24 deletions
diff --git a/src/events.c b/src/events.c
index 9d8f140..cbf6cd7 100644
--- a/src/events.c
+++ b/src/events.c
@@ -76,11 +76,59 @@ unmap_notify (XEvent *ev)
win->number = -1;
win->state = STATE_UNMAPPED;
+ ignore_badwindow++;
+
+ if (win->frame)
+ {
+ rp_window *new_window;
+
+ PRINT_DEBUG ("unmapping framed window.\n");
+
+ new_window = find_window_for_frame (win->frame);
+ if (new_window)
+ {
+ PRINT_DEBUG ("Found a window to fit the frame.\n");
+
+ new_window->frame = xmalloc (sizeof (rp_window_frame));
+ memcpy (new_window->frame, win->frame, sizeof (rp_window_frame));
+ maximize (new_window);
+ XRaiseWindow (dpy, new_window->w);
+
+ if (win == rp_current_window)
+ {
+ set_active_window (new_window);
+ }
+ }
+ else
+ {
+ PRINT_DEBUG ("No window to fit the frame.\n");
+
+ /* We coudn't find a window to occupy the frame, so get
+ rid of it. */
+ remove_frame (win);
+ new_window = find_window_next_with_frame (rp_current_window);
+ if (new_window)
+ {
+ set_active_window (new_window);
+ }
+ else
+ {
+ set_active_window (find_window_other());
+ }
+ }
+
+ free (win->frame);
+ win->frame = NULL;
+ }
+ else if (rp_current_window == win)
+ {
+ cmd_other (NULL);
+ }
+
remove_from_list (win);
append_to_list (win, rp_unmapped_window_sentinel);
/* Update the state of the actual window */
- ignore_badwindow = 1;
XRemoveFromSaveSet (dpy, win->w);
XChangeProperty(dpy, win->w, wm_state, wm_state, 32,
@@ -88,12 +136,7 @@ unmap_notify (XEvent *ev)
XSync(dpy, False);
- ignore_badwindow = 0;
-
- if (rp_current_window == win)
- {
- cmd_other (NULL);
- }
+ ignore_badwindow--;
update_window_names (s);
}
@@ -164,34 +207,29 @@ destroy_window (XDestroyWindowEvent *ev)
{
rp_window *win;
+ ignore_badwindow++;
+
win = find_window (ev->window);
if (win)
{
- /* Goto the last accessed window. */
- if (win == rp_current_window)
+ if (win == rp_current_window)
{
- PRINT_DEBUG ("Destroying current window.\n");
-
- unmanage (win);
+ PRINT_DEBUG ("Destroying the current window.\n");
- if (rp_mapped_window_sentinel->next == rp_mapped_window_sentinel
- && rp_mapped_window_sentinel->prev == rp_mapped_window_sentinel)
- {
- rp_current_window = NULL;
- }
- else
- {
- /* Switch to last viewed window */
- set_current_window( find_window_other() );
- }
+ rp_current_window = NULL;
+ set_active_window (find_window_other ());
+ unmanage (win);
}
else
{
PRINT_DEBUG ("Destroying some other window.\n");
+
unmanage (win);
}
}
+
+ ignore_badwindow--;
}
void
@@ -373,11 +411,11 @@ key_press (XEvent *ev)
{
if (rp_current_window)
{
- ignore_badwindow = 1;
+ ignore_badwindow++;
ev->xkey.window = rp_current_window->w;
XSendEvent (dpy, rp_current_window->w, False, KeyPressMask, ev);
XSync (dpy, False);
- ignore_badwindow = 0;
+ ignore_badwindow--;
}
}
}