diff options
author | Mathieu OTHACEHE <m.othacehe@gmail.com> | 2016-11-29 20:00:49 +0100 |
---|---|---|
committer | Jérémie Courrèges-Anglas <jca@wxcvbn.org> | 2016-12-01 21:30:28 +0100 |
commit | 8e1316eba8d734b2f167a5a39fa93f7ecffa9c6a (patch) | |
tree | 2b030d8083d20fa8c7f11360269df7dc7392958e /src | |
parent | 55a5ed452a7e1b6c581164e2dad15d528198eb40 (diff) | |
download | ratpoison-8e1316eba8d734b2f167a5a39fa93f7ecffa9c6a.zip |
Assign a number to each screen using a numset
A number is added to rp_screen to identify every screen.
The screen numbers are affected at ratpoison start, when screens are
sorted.
On screen addition, a new number is requested.
On screen deletion, the screen number is released.
Diffstat (limited to 'src')
-rw-r--r-- | src/data.h | 6 | ||||
-rw-r--r-- | src/screen.c | 21 |
2 files changed, 26 insertions, 1 deletions
@@ -153,6 +153,9 @@ struct rp_group struct rp_global_screen { unsigned long fg_color, bg_color, fw_color, bw_color; /* The pixel color. */ + + /* This numset is responsible for giving out numbers for each screen */ + struct numset *numset; }; struct xrandr_info { @@ -170,6 +173,9 @@ struct rp_screen Colormap def_cmap; Cursor rat; + /* Screen number, handled by rp_global_screen numset */ + int number; + struct xrandr_info xrandr; /* Here to abstract over the Xrandr vs X screens difference */ diff --git a/src/screen.c b/src/screen.c index 240b876..e629419 100644 --- a/src/screen.c +++ b/src/screen.c @@ -218,11 +218,24 @@ screen_sort (void) } static void +screen_set_numbers (void) +{ + rp_screen *cur; + + list_for_each_entry (cur, &rp_screens, node) + { + cur->number = numset_request (rp_glob_screen.numset); + } +} + +static void init_global_screen (rp_global_screen *s) { int screen_num; screen_num = DefaultScreen (dpy); + + s->numset = numset_new (); s->fg_color = BlackPixel (dpy, screen_num); s->bg_color = WhitePixel (dpy, screen_num); s->fw_color = BlackPixel (dpy, screen_num); @@ -264,6 +277,7 @@ init_screens (void) } screen_sort (); + screen_set_numbers (); free (rr_outputs); } @@ -474,7 +488,7 @@ screen_dump (rp_screen *screen) sbuf_printf(s, "%s ", sbuf_get (screen->xrandr.name)); sbuf_printf_concat (s, "%d %d %d %d %d %d", - (rp_have_xrandr) ? screen->xrandr.output : screen->screen_num, + screen->number, screen->left, screen->top, screen->width, @@ -569,6 +583,8 @@ screen_add (int rr_output) screen = xmalloc (sizeof(*screen)); list_add (&screen->node, &rp_screens); + screen->number = numset_request (rp_glob_screen.numset); + if (!rp_current_screen) rp_current_screen = screen; @@ -602,6 +618,8 @@ screen_del (rp_screen *s) hide_window (cur_win); } + numset_release (rp_glob_screen.numset, s->number); + change_windows_screen (s, rp_current_screen); screen_free (s); @@ -656,4 +674,5 @@ screen_free_final (void) /* Relinquish our hold on the root window. */ XSelectInput(dpy, RootWindow (dpy, DefaultScreen (dpy)), 0); + numset_free (rp_glob_screen.numset); } |