diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | NEWS | 3 | ||||
-rw-r--r-- | doc/ratpoison.texi | 4 | ||||
-rw-r--r-- | src/actions.c | 74 | ||||
-rw-r--r-- | src/actions.h | 1 |
5 files changed, 89 insertions, 0 deletions
@@ -1,3 +1,10 @@ +2006-04-20 Shawn Betts <sabetts@vcn.bc.ca> + + * src/actions.h: new command sfrestore + + * src/actions.c (init_user_commands): new command sfrestore + (cmd_sfrestore): new function + 2006-04-19 Shawn Betts <sabetts@vcn.bc.ca> * src/events.c (property_notify): Only map the first window in the launch frame. @@ -9,6 +9,9 @@ notice and this notice are preserved. * Changes since 1.4.0 ** support for i18n fonts +** new command sfrestore +restores frame configurations for multiple screens. + * Changes since 1.4.0-beta4 ** new parameters in frame dumps :screenh and :screenw specify the size of the screen the frame was diff --git a/doc/ratpoison.texi b/doc/ratpoison.texi index eb924df..619fc6f 100644 --- a/doc/ratpoison.texi +++ b/doc/ratpoison.texi @@ -896,6 +896,10 @@ Like fdump, but dump information about each screen instead of each frame. Dump all the screen number and the frames on all screens. @end deffn +@deffn Command sfrestore +restore a frame configuration created using @command{sfdump}. +@end deffn + @node Keystrokes, Hooks, Multiple Monitors, Top @chapter Keystrokes diff --git a/src/actions.c b/src/actions.c index 78736b1..8f57d7c 100644 --- a/src/actions.c +++ b/src/actions.c @@ -281,6 +281,8 @@ init_user_commands() "Variable: ", arg_STRING, "Value: ", arg_REST); add_command ("shrink", cmd_shrink, 0, 0, 0); + add_command ("sfrestore", cmd_sfrestore, 1, 1, 1, + "Frames: ", arg_REST); add_command ("source", cmd_source, 1, 1, 1, "File: ", arg_REST); add_command ("sselect", cmd_sselect, 1, 1, 1, @@ -4933,6 +4935,78 @@ cmd_sfdump (int interactively, struct cmdarg **args) } cmdret * +cmd_sfrestore (int interactively, struct cmdarg **args) +{ + int out_of_screen = 0; + int number_of_frames = 0; + int j; + long x; + char *dup; + char *token; + char *ptr; + struct sbuf *buffer[num_screens]; + + /* initialize frameset-buffer for each screen */ + for (j=0; j<num_screens; j++) { + buffer[j] = sbuf_new(0); + } + + /* now split the whole input to the corresponding screens */ + dup = xstrdup (ARG_STRING(0)); + + token = strtok (dup, ","); + if (token == NULL) { + free (dup); + return cmdret_new (RET_FAILURE, "sfrestore: invalid frame format"); + } + + while (token != NULL) { + /* search for end of frameset */ + ptr = token; + while (*ptr != ')') { + ptr++; + } + /* skip space */ + ptr++; + + /* convert to integer */ + x = strtol (ptr, NULL, 10); + + /* check that specified screen number is not bigger than current number of connected screens */ + if (x < num_screens) { + /* append frameset to buffer[x] */ + sbuf_concat(buffer[x], token); + sbuf_concat(buffer[x], ","); + number_of_frames++; + } + else { + out_of_screen++; + } + + /* continue with next frameset */ + token = strtok (NULL, ","); + } + + free (dup); + + /* now restore the frames for each screen */ + for (j=0; j<num_screens; j++) { + push_frame_undo (&screens[j]); /* fdump to stack */ + /* FIXME: store RET_SUCCESS || RET_FAILURE for each screen and output it later */ + frestore (sbuf_get(buffer[j]), &screens[j]); + /* clear buffer */ + sbuf_free(buffer[j]); + } + + if (!out_of_screen) { + return cmdret_new (RET_SUCCESS, "Restored %i Frame(s)", number_of_frames); + } + else { + return cmdret_new (RET_SUCCESS, "Restored %i Frame(s), %i Frame(s) out of Screen(s)", number_of_frames, out_of_screen); + } +} + +cmdret * cmd_sdump (int interactive, struct cmdarg **args) { cmdret *ret; diff --git a/src/actions.h b/src/actions.h index dae4935..34bf3cc 100644 --- a/src/actions.h +++ b/src/actions.h @@ -201,6 +201,7 @@ RP_CMD (iprev); RP_CMD (prompt); RP_CMD (sdump); RP_CMD (sfdump); +RP_CMD (sfrestore); RP_CMD (undo); RP_CMD (redo); RP_CMD (putsel); |