Only in src: Makefile diff -ru --exclude=*.o ../ratpoison-1.1.0/src/actions.c src/actions.c --- ../ratpoison-1.1.0/src/actions.c Thu Feb 14 20:24:23 2002 +++ src/actions.c Tue Mar 26 17:23:18 2002 @@ -82,6 +82,8 @@ {"startup_message", cmd_startup_message, arg_STRING}, {"link", cmd_link, arg_STRING}, {"alias", cmd_alias, arg_STRING}, + {"vscreen", cmd_vscreen, arg_STRING}, + {"vscreen_rel", cmd_vscreen_rel, arg_STRING}, /address@hidden (tag required for genrpbindings) */ /* Commands to set default behavior. */ @@ -2428,5 +2430,41 @@ alias_list_last++; } + return NULL; +} + +char * +cmd_vscreen (int interactive, void *data) +{ + int num; + + if (data == NULL) + { + message (" vscreen: One argument required "); + return NULL; + } + + if( sscanf( data, "%i", &num ) > 0 ) { + set_virtual_screen( num, 0 ); + } + show_frame_indicator(); + return NULL; +} + +char * +cmd_vscreen_rel (int interactive, void *data) +{ + int num; + + if (data == NULL) + { + message (" vscreen_rel: One argument required "); + return NULL; + } + + if( sscanf( data, "%i", &num ) > 0 ) { + set_virtual_screen( num, 1 ); + } + show_frame_indicator(); return NULL; } diff -ru --exclude=*.o ../ratpoison-1.1.0/src/actions.h src/actions.h --- ../ratpoison-1.1.0/src/actions.h Fri Feb 1 10:09:58 2002 +++ src/actions.h Tue Mar 26 12:09:55 2002 @@ -107,6 +107,8 @@ char * cmd_defbarpadding (int interactive, void *data); char * cmd_license (int interactive, void *data); char * cmd_alias (int interactive, void *data); +char * cmd_vscreen (int interactive, void *data); +char * cmd_vscreen_rel (int interactive, void *data); char *cmd_defbarborder (int interactive, void *data); void initialize_default_keybindings (void); diff -ru --exclude=*.o ../ratpoison-1.1.0/src/conf.h src/conf.h --- ../ratpoison-1.1.0/src/conf.h Fri Feb 1 10:08:58 2002 +++ src/conf.h Tue Mar 26 11:37:55 2002 @@ -68,4 +68,7 @@ /* Maximum depth of a link. Used in the 'link' command. */ #define MAX_LINK_DEPTH 16 +/* Number of virtual screens */ +#define NUM_VSCREENS 8 + #endif /* !_ _RATPOISON_CONF_H */ Only in src: config.h diff -ru --exclude=*.o ../ratpoison-1.1.0/src/data.h src/data.h --- ../ratpoison-1.1.0/src/data.h Thu Jan 24 22:54:37 2002 +++ src/data.h Tue Mar 26 11:44:16 2002 @@ -31,6 +31,7 @@ #define WIN_EVENTS (StructureNotifyMask | PropertyChangeMask | ColormapChangeMask | FocusChangeMask) typedef struct rp_window rp_window; +typedef struct vscreen_info vscreen_info; typedef struct screen_info screen_info; typedef struct rp_action rp_action; typedef struct rp_window_frame rp_window_frame; @@ -89,6 +90,17 @@ rp_window *next, *prev; }; +struct vscreen_info +{ + /* A list of frames that may or may not contain windows. There should + always be one in the list. */ + rp_window_frame *rp_window_frame_sentinel; + + /* Pointer to the currently focused frame. One for each screen so + when you switch screens the focus doesn't get frobbed. */ + rp_window_frame *rp_current_frame; +}; + struct screen_info { GC normal_gc; @@ -101,6 +113,11 @@ unsigned long fg_color, bg_color; /* The pixel color. */ char *display_string; + + int num_vscreens; + int current_vscreen; + vscreen_info *vscreens; + /* A list of frames that may or may not contain windows. There should always be one in the list. */ diff -ru --exclude=*.o ../ratpoison-1.1.0/src/main.c src/main.c --- ../ratpoison-1.1.0/src/main.c Sun Jan 27 01:57:55 2002 +++ src/main.c Tue Mar 26 11:41:04 2002 @@ -658,6 +658,10 @@ XSelectInput (dpy, s->help_window, KeyPressMask); XSync (dpy, 0); + + s->num_vscreens = NUM_VSCREENS; + s->current_vscreen = 0; + s->vscreens = (vscreen_info*) malloc( NUM_VSCREENS*sizeof( vscreen_info ) ); } void Only in src: ratpoison diff -ru --exclude=*.o ../ratpoison-1.1.0/src/split.c src/split.c --- ../ratpoison-1.1.0/src/split.c Wed Feb 20 02:08:26 2002 +++ src/split.c Tue Mar 26 15:23:51 2002 @@ -116,7 +116,7 @@ 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 (screen->rp_current_frame); set_frames_window (screen->rp_current_frame, NULL); @@ -134,12 +134,17 @@ void init_frame_list (screen_info *screen) { - screen->rp_window_frame_sentinel = xmalloc (sizeof (rp_window_frame)); + int i; + for( i = screen->num_vscreens - 1; i >= 0; i-- ) { + 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; + 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); + create_initial_frame(screen); + screen->vscreens[i].rp_window_frame_sentinel = screen->rp_window_frame_sentinel; + screen->vscreens[i].rp_current_frame = screen->rp_current_frame; + } } rp_window_frame * @@ -632,7 +637,7 @@ { XSetInputFocus (dpy, s->key_window, RevertToPointerRoot, CurrentTime); - } + } } void @@ -762,4 +767,46 @@ } return NULL; +} + +/* virtual screen stuff added by Stefan S */ + +void +set_virtual_screen (int vscreen_num, int rel) +{ + screen_info *s = current_screen(); + rp_window_frame *cur; + int num_vscreens = s->num_vscreens; + + if( rel ) vscreen_num = s->current_vscreen + vscreen_num; + + if( vscreen_num > num_vscreens ) vscreen_num = num_vscreens-1; + if( vscreen_num < 0 ) vscreen_num = 0; + + if( s->current_vscreen != vscreen_num ) { + /* Iconify visible windows */ + for( cur = s->rp_window_frame_sentinel->next; + cur != s->rp_window_frame_sentinel; + cur = cur->next ) { + + hide_window( cur->win ); + set_frames_window( cur, cur->win ); + hide_others( cur->win ); + } + + /* Change virtual screen */ + s->vscreens[s->current_vscreen].rp_current_frame = s->rp_current_frame; + s->current_vscreen = vscreen_num; + s->rp_current_frame = s->vscreens[vscreen_num].rp_current_frame; + s->rp_window_frame_sentinel = s->vscreens[vscreen_num].rp_window_frame_sentinel; + /* Deiconify all windows */ + for( cur = s->rp_window_frame_sentinel->next; + cur != s->rp_window_frame_sentinel; + cur = cur->next ) { + set_frames_window( cur, cur->win ); + maximize_all_windows_in_frame (cur); + unhide_window( cur->win ); + } + set_active_frame( s->rp_current_frame ); + } } diff -ru --exclude=*.o ../ratpoison-1.1.0/src/split.h src/split.h --- ../ratpoison-1.1.0/src/split.h Fri Feb 8 03:45:04 2002 +++ src/split.h Tue Mar 26 12:00:35 2002 @@ -46,4 +46,6 @@ rp_window_frame *find_frame_up (rp_window_frame *frame); rp_window_frame *find_last_frame (screen_info *s); +void set_virtual_screen (int vscreen_num, int rel); + #endif Only in src: stamp-h