diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/actions.c | 258 | ||||
-rw-r--r-- | src/actions.h | 14 | ||||
-rw-r--r-- | src/bar.c | 8 | ||||
-rw-r--r-- | src/communications.c | 40 | ||||
-rw-r--r-- | src/communications.h | 2 | ||||
-rw-r--r-- | src/data.h | 30 | ||||
-rw-r--r-- | src/events.c | 36 | ||||
-rw-r--r-- | src/list.c | 23 | ||||
-rw-r--r-- | src/list.h | 2 | ||||
-rw-r--r-- | src/main.c | 42 | ||||
-rw-r--r-- | src/manage.c | 42 | ||||
-rw-r--r-- | src/split.c | 76 | ||||
-rw-r--r-- | src/split.h | 5 |
13 files changed, 307 insertions, 271 deletions
diff --git a/src/actions.c b/src/actions.c index ed91c8d..e08e493 100644 --- a/src/actions.c +++ b/src/actions.c @@ -42,6 +42,10 @@ static user_command user_commands[] = {"escape", cmd_escape, arg_STRING}, {"exec", cmd_exec, arg_STRING}, {"focus", cmd_next_frame, arg_VOID}, + {"focusup", cmd_focusup, arg_VOID}, + {"focusdown", cmd_focusdown, arg_VOID}, + {"focusleft", cmd_focusleft, arg_VOID}, + {"focusright", cmd_focusright, arg_VOID}, {"meta", cmd_meta, arg_STRING}, {"help", cmd_help, arg_VOID}, {"hsplit", cmd_h_split, arg_VOID}, @@ -52,7 +56,7 @@ static user_command user_commands[] = {"number", cmd_number, arg_STRING}, {"only", cmd_only, arg_VOID}, {"other", cmd_other, arg_VOID}, - {"pos", cmd_pos, arg_STRING}, + {"gravity", cmd_gravity, arg_STRING}, {"prev", cmd_prev, arg_VOID}, {"quit", cmd_quit, arg_VOID}, {"remove", cmd_remove, arg_VOID}, @@ -70,22 +74,24 @@ static user_command user_commands[] = {"unsetenv", cmd_unsetenv, arg_STRING}, {"info", cmd_info, arg_VOID}, {"lastmsg", cmd_lastmsg, arg_VOID}, + {"restart", cmd_restart, arg_VOID}, + {"startup_message", cmd_startup_message, arg_STRING}, /* Commands to set default behavior. */ - {"defbarloc", cmd_defbarloc, arg_STRING}, - {"msgwait", cmd_msgwait, arg_STRING}, - {"defborder", cmd_defborder, arg_STRING}, - {"deffont", cmd_deffont, arg_STRING}, - {"definputwidth", cmd_definputwidth, arg_STRING}, - {"defmaxsizepos", cmd_defmaxsizepos, arg_STRING}, - {"defpadding", cmd_defpadding, arg_STRING}, - {"deftranspos", cmd_deftranspos, arg_STRING}, - {"defwaitcursor", cmd_defwaitcursor, arg_STRING}, - {"defwinfmt", cmd_defwinfmt, arg_STRING}, - {"defwinname", cmd_defwinname, arg_STRING}, - {"defwinpos", cmd_defwinpos, arg_STRING}, - {"deffgcolor", cmd_deffgcolor, arg_STRING}, - {"defbgcolor", cmd_defbgcolor, arg_STRING}, + {"defbarloc", cmd_defbarloc, arg_STRING}, + {"msgwait", cmd_msgwait, arg_STRING}, + {"defborder", cmd_defborder, arg_STRING}, + {"deffont", cmd_deffont, arg_STRING}, + {"definputwidth", cmd_definputwidth, arg_STRING}, + {"defmaxsizegravity", cmd_defmaxsizegravity, arg_STRING}, + {"defpadding", cmd_defpadding, arg_STRING}, + {"deftransgravity", cmd_deftransgravity, arg_STRING}, + {"defwaitcursor", cmd_defwaitcursor, arg_STRING}, + {"defwinfmt", cmd_defwinfmt, arg_STRING}, + {"defwinname", cmd_defwinname, arg_STRING}, + {"defwingravity", cmd_defwingravity, arg_STRING}, + {"deffgcolor", cmd_deffgcolor, arg_STRING}, + {"defbgcolor", cmd_defbgcolor, arg_STRING}, /* Commands to help debug ratpoison. */ #ifdef DEBUG @@ -917,16 +923,10 @@ cmd_newwm(int interactive, void *data) return NULL; } -/* Quit ratpoison. Thanks to -"Chr. v. Stuckrad" <stucki@math.fu-berlin.de> for the patch. */ char * cmd_quit(int interactive, void *data) { - PRINT_DEBUG ("Exiting\n"); - clean_up (); - exit (EXIT_SUCCESS); - - /* Never gets here. */ + kill_signalled = 1; return NULL; } @@ -1309,85 +1309,41 @@ cmd_rudeness (int interactive, void *data) } static int -parse_winpos (char *data) -{ - int ret = 0; - char *x, *y; - - x = xmalloc (strlen (data) + 1); - y = xmalloc (strlen (data) + 1); - - if (sscanf (data, "%s %s", x , y) < 2) - { - message (" pos: Two arguments needed "); - free (x); - free (y); - return -3; - } - - PRINT_DEBUG ("%s %s\n", x, y); - - switch (y[0]) - { - case 't': - case 'T': - ret = TOP_LEFT; - break; - - case 'c': - case 'C': - ret = CENTER_LEFT; - break; - - case 'b': - case 'B': - ret = BOTTOM_LEFT; - break; - - default: - ret = -1; - goto done; - break; - } - - switch (x[0]) - { - case 'l': - case 'L': - break; - - case 'c': - case 'C': - ret += TOP_CENTER; - break; - - case 'r': - case 'R': - ret += TOP_RIGHT; - break; - - default: - ret = -2; - goto done; - break; - } - - done: - free (x); - free (y); +parse_wingravity (char *data) +{ + int ret = -1; + + if (!strcasecmp (data, "northwest") || !strcasecmp (data, "nw")) + ret = NorthWestGravity; + if (!strcasecmp (data, "north") || !strcasecmp (data, "n")) + ret = NorthGravity; + if (!strcasecmp (data, "northeast") || !strcasecmp (data, "ne")) + ret = NorthEastGravity; + if (!strcasecmp (data, "west") || !strcasecmp (data, "w")) + ret = WestGravity; + if (!strcasecmp (data, "center") || !strcasecmp (data, "c")) + ret = CenterGravity; + if (!strcasecmp (data, "East") || !strcasecmp (data, "e")) + ret = EastGravity; + if (!strcasecmp (data, "southwest") || !strcasecmp (data, "sw")) + ret = SouthWestGravity; + if (!strcasecmp (data, "South") || !strcasecmp (data, "s")) + ret = SouthGravity; + if (!strcasecmp (data, "southeast") || !strcasecmp (data, "se")) + ret = SouthEastGravity; return ret; } char * -cmd_pos (int interactive, void *data) +cmd_gravity (int interactive, void *data) { - int pos; + int gravity; rp_window *win; if (data == NULL) { - message (" pos: Two arguments needed "); + message (" gravity: Two arguments needed "); return NULL; } @@ -1395,13 +1351,13 @@ cmd_pos (int interactive, void *data) win = current_window(); - if ((pos = parse_winpos (data)) < 0) + if ((gravity = parse_wingravity (data)) < 0) { - message (" pos: Unknown position "); + message (" gravity: Unknown gravity "); } else { - win->position = pos; + win->gravity = gravity; maximize (win); } @@ -1409,69 +1365,69 @@ cmd_pos (int interactive, void *data) } char * -cmd_defwinpos (int interactive, void *data) +cmd_defwingravity (int interactive, void *data) { - int pos; + int gravity; if (data == NULL) { - message (" defwinpos: Two arguments needed "); + message (" defwingravity: Two arguments needed "); return NULL; } - if ((pos = parse_winpos (data)) < 0) + if ((gravity = parse_wingravity (data)) < 0) { - message (" defwinpos: Unknown position "); + message (" defwingravity: Unknown gravity "); } else { - defaults.win_pos = pos; + defaults.win_gravity = gravity; } return NULL; } char * -cmd_deftranspos (int interactive, void *data) +cmd_deftransgravity (int interactive, void *data) { - int pos; + int gravity; if (data == NULL) { - message (" deftranspos: Two arguments needed "); + message (" deftransgravity: Two arguments needed "); return NULL; } - if ((pos = parse_winpos (data)) < 0) + if ((gravity = parse_wingravity (data)) < 0) { - message (" pos: Unknown position "); + message (" gravity: Unknown gravity "); } else { - defaults.trans_pos = pos; + defaults.trans_gravity = gravity; } return NULL; } char * -cmd_defmaxsizepos (int interactive, void *data) +cmd_defmaxsizegravity (int interactive, void *data) { - int pos; + int gravity; if (data == NULL) { - message (" defmaxsizepos: Two arguments needed "); + message (" defmaxsizegravity: Two arguments needed "); return NULL; } - if ((pos = parse_winpos (data)) < 0) + if ((gravity = parse_wingravity (data)) < 0) { - message (" defmaxsizepos: Unknown position "); + message (" defmaxsizegravity: Unknown gravity "); } else { - defaults.maxsize_pos = pos; + defaults.maxsize_gravity = gravity; } return NULL; @@ -1512,16 +1468,16 @@ cmd_defbarloc (int interactive, void *data) switch (loc) { case 0: - defaults.bar_location = TOP_LEFT; + defaults.bar_location = NorthWestGravity; break; case 1: - defaults.bar_location = TOP_RIGHT; + defaults.bar_location = NorthEastGravity; break; case 2: - defaults.bar_location = BOTTOM_RIGHT; + defaults.bar_location = SouthEastGravity; break; case 3: - defaults.bar_location = BOTTOM_LEFT; + defaults.bar_location = SouthWestGravity; break; default: @@ -1897,3 +1853,73 @@ cmd_lastmsg (int interactive, void *data) show_last_message(); return NULL; } + +char * +cmd_focusup (int interactive, void *data) +{ + rp_window_frame *frame; + + if ((frame = find_frame_up (rp_current_frame))) + set_active_frame (frame); + + return NULL; +} + +char * +cmd_focusdown (int interactive, void *data) +{ + rp_window_frame *frame; + + if ((frame = find_frame_down (rp_current_frame))) + set_active_frame (frame); + + return NULL; +} + +char * +cmd_focusleft (int interactive, void *data) +{ + rp_window_frame *frame; + + if ((frame = find_frame_left (rp_current_frame))) + set_active_frame (frame); + + return NULL; +} + +char * +cmd_focusright (int interactive, void *data) +{ + rp_window_frame *frame; + + if ((frame = find_frame_right (rp_current_frame))) + set_active_frame (frame); + + return NULL; +} + +char * +cmd_restart (int interactive, void *data) +{ + hup_signalled = 1; + return NULL; +} + +char * +cmd_startup_message (int interactive, void *data) +{ + if (data == NULL) + { + message (" startup_message; One argument is required "); + return NULL; + } + + if (!strcasecmp (data, "on")) + defaults.startup_message = 1; + else if (!strcasecmp (data, "off")) + defaults.startup_message = 0; + else + message (" startup_message; Invalid argument "); + + return NULL; +} diff --git a/src/actions.h b/src/actions.h index d64cf87..cdbd410 100644 --- a/src/actions.h +++ b/src/actions.h @@ -75,10 +75,10 @@ char * cmd_quit(int interactive, void *data); char * cmd_number (int interactive, void *data); char * cmd_rudeness (int interactive, void *data); char * cmd_unbind (int interactive, void *data); -char * cmd_pos (int interactive, void *data); -char * cmd_defwinpos (int interactive, void *data); -char * cmd_deftranspos (int interactive, void *data); -char * cmd_defmaxsizepos (int interactive, void *data); +char * cmd_gravity (int interactive, void *data); +char * cmd_defwingravity (int interactive, void *data); +char * cmd_deftransgravity (int interactive, void *data); +char * cmd_defmaxsizegravity (int interactive, void *data); char * cmd_msgwait (int interactive, void *data); char * cmd_defbarloc (int interactive, void *data); char * cmd_deffont (int interactive, void *data); @@ -95,6 +95,12 @@ char * cmd_chdir (int interactive, void *data); char * cmd_unsetenv (int interactive, void *data); char * cmd_info (int interactive, void *data); char * cmd_lastmsg (int interactive, void *data); +char * cmd_focusup (int interactive, void *data); +char * cmd_focusdown (int interactive, void *data); +char * cmd_focusleft (int interactive, void *data); +char * cmd_focusright (int interactive, void *data); +char * cmd_restart (int interactive, void *data); +char * cmd_startup_message (int interactive, void *data); /* void cmd_xterm (void *data); */ @@ -83,8 +83,8 @@ show_bar (screen_info *s) int bar_x (screen_info *s, int width) { - if (defaults.bar_location == BOTTOM_RIGHT - || defaults.bar_location == TOP_RIGHT) + if (defaults.bar_location == SouthEastGravity + || defaults.bar_location == NorthEastGravity) return s->root_attr.width - width - 2; else return 0; @@ -93,8 +93,8 @@ bar_x (screen_info *s, int width) int bar_y (screen_info *s) { - if (defaults.bar_location == TOP_LEFT - || defaults.bar_location == TOP_RIGHT ) + if (defaults.bar_location == NorthWestGravity + || defaults.bar_location == NorthEastGravity ) return 0; else return s->root_attr.height - (FONT_HEIGHT (defaults.font) + defaults.bar_y_padding * 2) - 2; diff --git a/src/communications.c b/src/communications.c index a4f97a0..ee01205 100644 --- a/src/communications.c +++ b/src/communications.c @@ -27,48 +27,8 @@ #include "ratpoison.h" -void -send_restart () -{ - XEvent ev; - int status; - - ev.xclient.type = ClientMessage; - ev.xclient.window = DefaultRootWindow (dpy); - ev.xclient.message_type = rp_restart; - ev.xclient.format = 32; - ev.xclient.data.l[0] = rp_restart; - ev.xclient.data.l[1] = CurrentTime; - - status = XSendEvent (dpy, DefaultRootWindow (dpy), False, SubstructureRedirectMask, &ev); - if (status == 0) - { - PRINT_ERROR ("failed to send restart event\n"); - } -} - -void -send_kill () -{ - XEvent ev; - int status; - - ev.xclient.type = ClientMessage; - ev.xclient.window = DefaultRootWindow (dpy); - ev.xclient.message_type = rp_kill; - ev.xclient.format = 32; - ev.xclient.data.l[0] = rp_kill; - ev.xclient.data.l[1] = CurrentTime; - - status = XSendEvent (dpy, DefaultRootWindow (dpy), False, SubstructureRedirectMask, &ev); - if (status == 0) - { - PRINT_ERROR ("failed to send kill event\n"); - } -} /* Sending commands to ratpoison */ - static void recieve_command_result (Window w) { diff --git a/src/communications.h b/src/communications.h index ade37ac..0fd7937 100644 --- a/src/communications.h +++ b/src/communications.h @@ -22,8 +22,6 @@ #ifndef _RATPOISON_COMMUNICATIONS_H #define _RATPOISON_COMMUNICATIONS_H 1 -void send_kill (); -void send_restart (); int send_command (unsigned char *cmd); #endif /* ! _RATPOISON_COMMUNICATIONS_H */ @@ -43,20 +43,6 @@ struct rp_window_frame rp_window_frame *prev, *next; }; - -/* Possible positions for a window. */ -#define TOP_LEFT 0 -#define TOP_CENTER 1 -#define TOP_RIGHT 2 - -#define CENTER_LEFT 3 -#define CENTER_CENTER 4 -#define CENTER_RIGHT 5 - -#define BOTTOM_LEFT 6 -#define BOTTOM_CENTER 7 -#define BOTTOM_RIGHT 8 - struct rp_window { screen_info *scr; @@ -88,9 +74,9 @@ struct rp_window /* Saved mouse position */ int mouse_x, mouse_y; - /* The alignment of the window. To what side or corner should the - window stick to. */ - int position; + /* The alignment of the window. Decides to what side or corner the + window sticks to. */ + int gravity; /* A window can be visible inside a frame but not the frame's current window. This keeps track of what frame the window was @@ -130,9 +116,9 @@ struct rp_defaults { /* Default positions for new normal windows, transient windows, and normal windows with maxsize hints. */ - int win_pos; - int trans_pos; - int maxsize_pos; + int win_gravity; + int trans_gravity; + int maxsize_gravity; int input_window_size; int window_border_width; @@ -157,6 +143,8 @@ struct rp_defaults /* Which name to use: wm_name, res_name, res_class. */ int win_name; + + int startup_message; }; extern struct rp_defaults defaults; @@ -195,8 +183,6 @@ extern int num_screens; extern XEvent rp_current_event; extern Display *dpy; -extern Atom rp_restart; -extern Atom rp_kill; extern Atom rp_command; extern Atom rp_command_request; extern Atom rp_command_result; diff --git a/src/events.c b/src/events.c index bcf1631..dfd4f0b 100644 --- a/src/events.c +++ b/src/events.c @@ -336,29 +336,29 @@ client_msg (XClientMessageEvent *ev) { PRINT_DEBUG ("Received client message.\n"); - if (ev->message_type == rp_restart) - { - PRINT_DEBUG ("Restarting\n"); - clean_up (); - execvp(myargv[0], myargv); - } - else if (ev->message_type == rp_kill) - { - PRINT_DEBUG ("Exiting\n"); - clean_up (); - exit (EXIT_SUCCESS); - } - else if (ev->message_type == wm_change_state) + if (ev->message_type == wm_change_state) { rp_window *win; + PRINT_DEBUG ("WM_CHANGE_STATE\n") + win = find_window (ev->window); if (win == NULL) return; if (ev->format == 32 && ev->data.l[0] == IconicState) { + /* FIXME: This means clients can hide themselves without the + user's intervention. This is bad, but Emacs is the only + program I know of that iconifies itself and this is + generally from the user pressing C-z. */ + PRINT_DEBUG ("Iconify Request.\n"); if (win->state == NormalState) { - /* TODO: Handle iconify events */ + rp_window *w = find_window_other(); + + if (w) + set_active_window (w); + else + blank_frame (rp_current_frame); } } else @@ -811,15 +811,15 @@ get_event (XEvent *ev) if (hup_signalled > 0) { - PRINT_DEBUG ("Restarting with a fresh plate.\n"); - send_restart (); + clean_up (); + execvp(myargv[0], myargv); } if (kill_signalled > 0) { - fprintf (stderr, "ratpoison: Agg! I've been SHOT!\n"); + PRINT_DEBUG ("Exiting\n"); clean_up (); - exit (EXIT_FAILURE); + exit (EXIT_SUCCESS); } /* Is there anything in the event qeue? */ @@ -56,14 +56,21 @@ free_window (rp_window *w) } void -update_window_position (rp_window *win) +update_window_gravity (rp_window *win) { - if (win->transient) - win->position = defaults.trans_pos; - else if (win->hints->flags & PMaxSize) - win->position = defaults.maxsize_pos; - else - win->position = defaults.win_pos; +/* if (win->hints->win_gravity == ForgetGravity) */ +/* { */ + if (win->transient) + win->gravity = defaults.trans_gravity; + else if (win->hints->flags & PMaxSize) + win->gravity = defaults.maxsize_gravity; + else + win->gravity = defaults.win_gravity; +/* } */ +/* else */ +/* { */ +/* win->gravity = win->hints->win_gravity; */ +/* } */ } char * @@ -118,7 +125,7 @@ add_to_window_list (screen_info *s, Window w) new_window->transient = XGetTransientForHint (dpy, new_window->w, &new_window->transient_for); PRINT_DEBUG ("transient %d\n", new_window->transient); - update_window_position (new_window); + update_window_gravity (new_window); get_mouse_root_position (new_window, &new_window->mouse_x, &new_window->mouse_y); @@ -37,7 +37,7 @@ void give_window_focus (rp_window *win, rp_window *last_win); void set_active_window (rp_window *win); void goto_window (rp_window *win); void set_current_window (rp_window *win); -void update_window_position (rp_window *win); +void update_window_gravity (rp_window *win); char *window_name (rp_window *win); #if 0 @@ -52,8 +52,6 @@ Atom wm_delete; Atom wm_take_focus; Atom wm_colormaps; -Atom rp_restart; -Atom rp_kill; Atom rp_command; Atom rp_command_request; Atom rp_command_result; @@ -82,8 +80,6 @@ int rp_honour_normal_map = 1; static struct option ratpoison_longopts[] = { {"help", no_argument, 0, 'h'}, {"version", no_argument, 0, 'v'}, - {"restart", no_argument, 0, 'r'}, - {"kill", no_argument, 0, 'k'}, {"command", required_argument, 0, 'c'}, {0, 0, 0, 0} }; @@ -211,8 +207,6 @@ print_help () printf ("Help for %s %s\n\n", PACKAGE, VERSION); printf ("-h, --help Display this help screen\n"); printf ("-v, --version Display the version\n"); - printf ("-r, --restart Restart ratpoison\n"); - printf ("-k, --kill Kill ratpoison\n"); printf ("-c, --command Send ratpoison a colon-command\n\n"); printf ("Report bugs to ratpoison-devel@lists.sourceforge.net\n\n"); @@ -356,15 +350,15 @@ show_welcome_message () static void init_defaults () { - defaults.win_pos = TOP_LEFT; - defaults.trans_pos = CENTER_CENTER; - defaults.maxsize_pos = CENTER_CENTER; + defaults.win_gravity = NorthWestGravity; + defaults.trans_gravity = CenterGravity; + defaults.maxsize_gravity = CenterGravity; defaults.input_window_size = 200; defaults.window_border_width = 1; defaults.bar_x_padding = 0; defaults.bar_y_padding = 0; - defaults.bar_location = TOP_RIGHT; + defaults.bar_location = NorthEastGravity; defaults.bar_timeout = 5; defaults.frame_indicator_timeout = 1; @@ -386,6 +380,7 @@ init_defaults () defaults.window_fmt = xstrdup ("%n%s%t"); defaults.win_name = 0; + defaults.startup_message = 1; } int @@ -393,8 +388,6 @@ main (int argc, char *argv[]) { int i; int c; - int do_kill = 0; - int do_restart = 0; char **command = NULL; int cmd_count = 0; @@ -416,12 +409,6 @@ main (int argc, char *argv[]) case 'v': print_version (); break; - case 'k': - do_kill = 1; - break; - case 'r': - do_restart = 1; - break; case 'c': if (!command) { @@ -448,26 +435,10 @@ main (int argc, char *argv[]) } /* Set ratpoison specific Atoms. */ - rp_restart = XInternAtom (dpy, "RP_RESTART", False); - rp_kill = XInternAtom (dpy, "RP_KILL", False); rp_command = XInternAtom (dpy, "RP_COMMAND", False); rp_command_request = XInternAtom (dpy, "RP_COMMAND_REQUEST", False); rp_command_result = XInternAtom (dpy, "RP_COMMAND_RESULT", False); - if (do_kill) - { - send_kill (); - XSync (dpy, False); - XCloseDisplay (dpy); - return EXIT_SUCCESS; - } - if (do_restart) - { - send_restart (); - XSync (dpy, False); - XCloseDisplay (dpy); - return EXIT_SUCCESS; - } if (cmd_count > 0) { int i; @@ -520,7 +491,8 @@ main (int argc, char *argv[]) read_startup_files (); /* Indicate to the user that ratpoison has booted. */ - show_welcome_message(); + if (defaults.startup_message) + show_welcome_message(); /* If no window has focus, give the key_window focus. */ if (current_window() == NULL) diff --git a/src/manage.c b/src/manage.c index 60f7971..c389e22 100644 --- a/src/manage.c +++ b/src/manage.c @@ -263,7 +263,7 @@ update_window_information (rp_window *win) /* Transient status */ win->transient = XGetTransientForHint (dpy, win->w, &win->transient_for); - update_window_position (win); + update_window_gravity (win); } void @@ -370,41 +370,41 @@ move_window (rp_window *win) return; /* X coord. */ - switch (win->position) + switch (win->gravity) { - case TOP_LEFT: - case CENTER_LEFT: - case BOTTOM_LEFT: + case NorthWestGravity: + case WestGravity: + case SouthWestGravity: win->x = win->frame->x; break; - case TOP_CENTER: - case BOTTOM_CENTER: - case CENTER_CENTER: + case NorthGravity: + case CenterGravity: + case SouthGravity: win->x = win->frame->x + (win->frame->width - win->border * 2) / 2 - win->width / 2; break; - case TOP_RIGHT: - case CENTER_RIGHT: - case BOTTOM_RIGHT: + case NorthEastGravity: + case EastGravity: + case SouthEastGravity: win->x = win->frame->x + win->frame->width - win->width - win->border; break; } /* Y coord. */ - switch (win->position) + switch (win->gravity) { - case TOP_LEFT: - case TOP_CENTER: - case TOP_RIGHT: + case NorthEastGravity: + case NorthGravity: + case NorthWestGravity: win->y = win->frame->y; break; - case CENTER_LEFT: - case CENTER_CENTER: - case CENTER_RIGHT: + case EastGravity: + case CenterGravity: + case WestGravity: win->y = win->frame->y + (win->frame->height - win->border * 2) / 2 - win->height / 2; break; - case BOTTOM_LEFT: - case BOTTOM_CENTER: - case BOTTOM_RIGHT: + case SouthEastGravity: + case SouthGravity: + case SouthWestGravity: win->y = win->frame->y + win->frame->height - win->height - win->border; break; } diff --git a/src/split.c b/src/split.c index 9fdeb66..e92f19d 100644 --- a/src/split.c +++ b/src/split.c @@ -583,3 +583,79 @@ show_frame_indicator () alarm (defaults.frame_indicator_timeout); } + +rp_window_frame * +find_frame_up (rp_window_frame *frame) +{ + rp_window_frame *cur; + + for (cur = rp_window_frame_sentinel->next; + cur != rp_window_frame_sentinel; + cur = cur->next) + { + if (frame->y == cur->y + cur->height) + { + if (frame->x >= cur->x && frame->x < cur->x + cur->width) + return cur; + } + } + + return NULL; +} + +rp_window_frame * +find_frame_down (rp_window_frame *frame) +{ + rp_window_frame *cur; + + for (cur = rp_window_frame_sentinel->next; + cur != rp_window_frame_sentinel; + cur = cur->next) + { + if (frame->y + frame->height == cur->y) + { + if (frame->x >= cur->x && frame->x < cur->x + cur->width) + return cur; + } + } + + return NULL; +} + +rp_window_frame * +find_frame_left (rp_window_frame *frame) +{ + rp_window_frame *cur; + + for (cur = rp_window_frame_sentinel->next; + cur != rp_window_frame_sentinel; + cur = cur->next) + { + if (frame->x == cur->x + cur->width) + { + if (frame->y >= cur->y && frame->y < cur->y + cur->height) + return cur; + } + } + + return NULL; +} + +rp_window_frame * +find_frame_right (rp_window_frame *frame) +{ + rp_window_frame *cur; + + for (cur = rp_window_frame_sentinel->next; + cur != rp_window_frame_sentinel; + cur = cur->next) + { + if (frame->x + frame->width == cur->x) + { + if (frame->y >= cur->y && frame->y < cur->y + cur->height) + return cur; + } + } + + return NULL; +} diff --git a/src/split.h b/src/split.h index afc8c27..a2d8978 100644 --- a/src/split.h +++ b/src/split.h @@ -39,4 +39,9 @@ void blank_frame (rp_window_frame *frame); void show_frame_indicator (); void hide_frame_indicator (); +rp_window_frame *find_frame_right (rp_window_frame *frame); +rp_window_frame *find_frame_left (rp_window_frame *frame); +rp_window_frame *find_frame_down (rp_window_frame *frame); +rp_window_frame *find_frame_up (rp_window_frame *frame); + #endif |