diff options
author | sabetts <sabetts> | 2001-04-01 01:17:53 +0000 |
---|---|---|
committer | sabetts <sabetts> | 2001-04-01 01:17:53 +0000 |
commit | 299d16aa6ae37bd73ae92ee8a5d1c6715682ee35 (patch) | |
tree | 2361849e3956311464ab696132f35ed931946fd1 /src/events.c | |
parent | f04f2c8483f144d20caa9ee7103a0eca8493545f (diff) | |
download | ratpoison-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.c | 86 |
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--; } } } |