Commit aa7d57c5 authored by Jan Djärv's avatar Jan Djärv

* nsterm.h (EmacsView): Add updateFrameSize.

* nsterm.m (ns_clip_to_row): Remove code that deals with drawing fringe
in the internal border.
(x_set_window_size): Remove static variables and their usage.
(ns_redraw_scroll_bars): Fix NSTRACE arg.
(ns_after_update_window_line, ns_draw_fringe_bitmap): Remove
fringe/internal border adjustment.
(ns_draw_fringe_bitmap): Make code more like other terms (xterm.c).
(ns_draw_window_cursor): Remove fringe/internal border adjustment.
(ns_fix_rect_ibw): Remove.
(ns_get_glyph_string_clip_rect): Remove call to ns_fix_rect_ibw.
(ns_dumpglyphs_box_or_relief): Ditto.
(ns_maybe_dumpglyphs_background): Remove fringe/internal border
adjustment.
(ns_dumpglyphs_image): Ditto.
(ns_dumpglyphs_stretch): Fix coding style. Remove fringe/internal
border adjustment.
(ns_set_vertical_scroll_bar): Remove variables barOnVeryLeft/Right and
their usage.  Add fringe_extended_p and its use as in other terms.
(ns_judge_scroll_bars): Code style fix.  Call updateFrameSize if
scroll bar was removed.
(updateFrameSize): New function.
(windowDidResize): Move code to updateFrameSize and call it.

Fixes: debbugs:11052
parent a30cb5dd
2012-09-08 Jan Djärv <jan.h.d@swipnet.se>
* nsterm.m (ns_clip_to_row): Remove code that deals with drawing fringe
in the internal border.
(x_set_window_size): Remove static variables and their usage.
(ns_redraw_scroll_bars): Fix NSTRACE arg.
(ns_after_update_window_line, ns_draw_fringe_bitmap): Remove
fringe/internal border adjustment (Bug#11052).
(ns_draw_fringe_bitmap): Make code more like other terms (xterm.c).
(ns_draw_window_cursor): Remove fringe/internal border adjustment.
(ns_fix_rect_ibw): Remove.
(ns_get_glyph_string_clip_rect): Remove call to ns_fix_rect_ibw.
(ns_dumpglyphs_box_or_relief): Ditto.
(ns_maybe_dumpglyphs_background): Remove fringe/internal border
adjustment.
(ns_dumpglyphs_image): Ditto.
(ns_dumpglyphs_stretch): Fix coding style. Remove fringe/internal
border adjustment.
(ns_set_vertical_scroll_bar): Remove variables barOnVeryLeft/Right and
their usage. Add fringe_extended_p and its use as in other terms.
(ns_judge_scroll_bars): Code style fix. Call updateFrameSize if
scroll bar was removed.
(updateFrameSize): New function.
(windowDidResize): Move code to updateFrameSize and call it.
* nsterm.h (EmacsView): Add updateFrameSize.
2012-09-07 Chong Yidong <cyd@gnu.org>
* textprop.c (Fget_text_property): Minor doc fix (Bug#12323).
......
......@@ -103,6 +103,7 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
- (void) setWindowClosing: (BOOL)closing;
- (EmacsToolbar *) toolbar;
- (void) deleteWorkingText;
- (void) updateFrameSize;
#ifdef NS_IMPL_GNUSTEP
/* Not declared, but useful. */
......
......@@ -871,25 +871,12 @@ Free a pool and temporary objects it refers to (callable from C)
window_box (w, area, &window_x, &window_y, &window_width, 0);
clip_rect.origin.x = window_x - FRAME_INTERNAL_BORDER_WIDTH (f);
clip_rect.origin.x = window_x;
clip_rect.origin.y = WINDOW_TO_FRAME_PIXEL_Y (w, max (0, row->y));
clip_rect.origin.y = max (clip_rect.origin.y, window_y);
clip_rect.size.width = window_width + 2 * FRAME_INTERNAL_BORDER_WIDTH (f);
clip_rect.size.width = window_width;
clip_rect.size.height = row->visible_height;
/* allow a full-height row at the top when requested
(used to draw fringe all the way through internal border area) */
if (gc && clip_rect.origin.y < 5)
{
clip_rect.origin.y -= FRAME_INTERNAL_BORDER_WIDTH (f);
clip_rect.size.height += FRAME_INTERNAL_BORDER_WIDTH (f);
}
/* likewise at bottom */
if (gc &&
FRAME_PIXEL_HEIGHT (f) - (clip_rect.origin.y + clip_rect.size.height) < 5)
clip_rect.size.height += FRAME_INTERNAL_BORDER_WIDTH (f);
ns_focus (f, &clip_rect, 1);
}
......@@ -1237,18 +1224,10 @@ Free a pool and temporary objects it refers to (callable from C)
NSRect wr = [window frame];
int tb = FRAME_EXTERNAL_TOOL_BAR (f);
int pixelwidth, pixelheight;
static int oldRows, oldCols, oldFontWidth, oldFontHeight;
static int oldTB;
static struct frame *oldF;
NSTRACE (x_set_window_size);
if (view == nil ||
(f == oldF
&& rows == oldRows && cols == oldCols
&& oldFontWidth == FRAME_COLUMN_WIDTH (f)
&& oldFontHeight == FRAME_LINE_HEIGHT (f)
&& oldTB == tb))
if (view == nil)
return;
/*fprintf (stderr, "\tsetWindowSize: %d x %d, font size %d x %d\n", cols, rows, FRAME_COLUMN_WIDTH (f), FRAME_LINE_HEIGHT (f)); */
......@@ -1256,12 +1235,6 @@ Free a pool and temporary objects it refers to (callable from C)
BLOCK_INPUT;
check_frame_size (f, &rows, &cols);
oldF = f;
oldRows = rows;
oldCols = cols;
oldFontWidth = FRAME_COLUMN_WIDTH (f);
oldFontHeight = FRAME_LINE_HEIGHT (f);
oldTB = tb;
f->scroll_bar_actual_width = NS_SCROLL_BAR_WIDTH (f);
compute_fringe_widths (f, 0);
......@@ -1939,7 +1912,7 @@ Free a pool and temporary objects it refers to (callable from C)
int i;
id view;
NSArray *subviews = [[FRAME_NS_VIEW (f) superview] subviews];
NSTRACE (ns_judge_scroll_bars);
NSTRACE (ns_redraw_scroll_bars);
for (i =[subviews count]-1; i >= 0; i--)
{
view = [subviews objectAtIndex: i];
......@@ -2125,9 +2098,9 @@ Free a pool and temporary objects it refers to (callable from C)
desired_row->redraw_fringe_bitmaps_p = 1;
/* When a window has disappeared, make sure that no rest of
full-width rows stays visible in the internal border.
Under NS this is drawn inside the fringes. */
full-width rows stays visible in the internal border. */
if (windows_or_buffers_changed
&& desired_row->full_width_p
&& (f = XFRAME (w->frame),
width = FRAME_INTERNAL_BORDER_WIDTH (f),
width != 0)
......@@ -2136,24 +2109,11 @@ Free a pool and temporary objects it refers to (callable from C)
{
int y = WINDOW_TO_FRAME_PIXEL_Y (w, max (0, desired_row->y));
/* Internal border is drawn below the tool bar. */
if (WINDOWP (f->tool_bar_window)
&& w == XWINDOW (f->tool_bar_window))
y -= width;
/* end copy from other terms */
BLOCK_INPUT;
if (!desired_row->full_width_p)
{
int x1 = WINDOW_LEFT_SCROLL_BAR_AREA_WIDTH (w)
+ WINDOW_LEFT_FRINGE_WIDTH (w);
int x2 = WINDOW_LEFT_SCROLL_BAR_AREA_WIDTH (w)
+ FRAME_PIXEL_WIDTH (f) - NS_SCROLL_BAR_WIDTH (f)
- WINDOW_RIGHT_FRINGE_WIDTH (w)
- FRAME_INTERNAL_BORDER_WIDTH (f);
ns_clear_frame_area (f, x1, y, width, height);
ns_clear_frame_area (f, x2, y, width, height);
}
ns_clear_frame_area (f, 0, y, width, height);
ns_clear_frame_area (f,
FRAME_PIXEL_WIDTH (f) - width,
y, width, height);
UNBLOCK_INPUT;
}
}
......@@ -2238,17 +2198,6 @@ Free a pool and temporary objects it refers to (callable from C)
int rowY;
static EmacsImage **bimgs = NULL;
static int nBimgs = 0;
/* NS-specific: move internal border inside fringe */
int x = p->bx < 0 ? p->x : p->bx;
int wd = p->bx < 0 ? p->wd : p->nx;
BOOL fringeOnVeryLeft
= x - WINDOW_LEFT_SCROLL_BAR_COLS (w) * WINDOW_FRAME_COLUMN_WIDTH (w)
- FRAME_INTERNAL_BORDER_WIDTH (f) < 10;
BOOL fringeOnVeryRight
= FRAME_PIXEL_WIDTH (f) - x - wd - FRAME_INTERNAL_BORDER_WIDTH (f)
- WINDOW_RIGHT_SCROLL_BAR_COLS (w) * WINDOW_FRAME_COLUMN_WIDTH (w) < 10;
int xAdjust = FRAME_INTERNAL_BORDER_WIDTH (f) *
(fringeOnVeryLeft ? -1 : (fringeOnVeryRight ? 1 : 0));
/* grow bimgs if needed */
if (nBimgs < max_used_fringe_bitmap)
......@@ -2263,22 +2212,68 @@ Free a pool and temporary objects it refers to (callable from C)
rowY = WINDOW_TO_FRAME_PIXEL_Y (w, row->y);
ns_clip_to_row (w, row, -1, YES);
if (p->bx >= 0 && !p->overlay_p)
if (!p->overlay_p)
{
int yAdjust = rowY - FRAME_INTERNAL_BORDER_WIDTH (f) < 5 ?
-FRAME_INTERNAL_BORDER_WIDTH (f) : 0;
int yIncr = FRAME_PIXEL_HEIGHT (f) - (p->by+yAdjust + p->ny) < 5 ?
FRAME_INTERNAL_BORDER_WIDTH (f) : 0
+ (yAdjust ? FRAME_INTERNAL_BORDER_WIDTH (f) : 0);
NSRect r = NSMakeRect (p->bx+xAdjust, p->by+yAdjust, p->nx, p->ny+yIncr);
NSRectClip (r);
[ns_lookup_indexed_color(face->background, f) set];
NSRectFill (r);
int bx = p->bx, by = p->by, nx = p->nx, ny = p->ny;
/* If the fringe is adjacent to the left (right) scroll bar of a
leftmost (rightmost, respectively) window, then extend its
background to the gap between the fringe and the bar. */
if ((WINDOW_LEFTMOST_P (w)
&& WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_LEFT (w))
|| (WINDOW_RIGHTMOST_P (w)
&& WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT (w)))
{
int sb_width = WINDOW_CONFIG_SCROLL_BAR_WIDTH (w);
if (sb_width > 0)
{
int bar_area_x = WINDOW_SCROLL_BAR_AREA_X (w);
int bar_area_width = (WINDOW_CONFIG_SCROLL_BAR_COLS (w)
* FRAME_COLUMN_WIDTH (f));
if (bx < 0)
{
/* Bitmap fills the fringe. */
if (bar_area_x + bar_area_width == p->x)
bx = bar_area_x + sb_width;
else if (p->x + p->wd == bar_area_x)
bx = bar_area_x;
if (bx >= 0)
{
int header_line_height = WINDOW_HEADER_LINE_HEIGHT (w);
nx = bar_area_width - sb_width;
by = WINDOW_TO_FRAME_PIXEL_Y (w, max (header_line_height,
row->y));
ny = row->visible_height;
}
}
else
{
if (bar_area_x + bar_area_width == bx)
{
bx = bar_area_x + sb_width;
nx += bar_area_width - sb_width;
}
else if (bx + nx == bar_area_x)
nx += bar_area_width - sb_width;
}
}
}
if (bx >= 0 && nx > 0)
{
NSRect r = NSMakeRect (bx, by, nx, ny);
NSRectClip (r);
[ns_lookup_indexed_color (face->background, f) set];
NSRectFill (r);
}
}
if (p->which)
{
NSRect r = NSMakeRect (p->x+xAdjust, p->y, p->wd, p->h);
NSRect r = NSMakeRect (p->x, p->y, p->wd, p->h);
EmacsImage *img = bimgs[p->which - 1];
if (!img)
......@@ -2288,7 +2283,7 @@ Free a pool and temporary objects it refers to (callable from C)
int i;
unsigned char *cbits = xmalloc (len);
for (i =0; i<len; i++)
for (i = 0; i < len; i++)
cbits[i] = ~(bits[i] & 0xff);
img = [[EmacsImage alloc] initFromXBM: cbits width: 8 height: p->h
flip: NO];
......@@ -2386,14 +2381,6 @@ Note that CURSOR_WIDTH is meaningful only for (h)bar cursors.
r.size.height = h;
r.size.width = w->phys_cursor_width;
/* FIXME: if we overwrite the internal border area, it does not get erased;
fix by truncating cursor, but better would be to erase properly */
overspill = r.origin.x + r.size.width -
WINDOW_TEXT_TO_FRAME_PIXEL_X (w, WINDOW_BOX_RIGHT_EDGE_X (w)
- WINDOW_TOTAL_FRINGE_WIDTH (w) - FRAME_INTERNAL_BORDER_WIDTH (f));
if (overspill > 0)
r.size.width -= overspill;
/* TODO: only needed in rare cases with last-resort font in HELLO..
should we do this more efficiently? */
ns_clip_to_row (w, glyph_row, -1, NO); /* do ns_focus(f, &r, 1); if remove */
......@@ -2517,31 +2504,6 @@ Note that CURSOR_WIDTH is meaningful only for (h)bar cursors.
========================================================================== */
static inline NSRect
ns_fix_rect_ibw (NSRect r, int fibw, int frame_pixel_width)
/* --------------------------------------------------------------------------
Under NS we draw internal borders inside fringes, and want full-width
rendering to go all the way to edge. This function makes that correction.
-------------------------------------------------------------------------- */
{
if (r.origin.y <= fibw+1)
{
r.size.height += r.origin.y;
r.origin.y = 0;
}
if (r.origin.x <= fibw+1)
{
r.size.width += r.origin.x;
r.origin.x = 0;
}
if (frame_pixel_width - (r.origin.x+r.size.width) <= fibw+1)
r.size.width += fibw;
return r;
}
static int
ns_get_glyph_string_clip_rect (struct glyph_string *s, NativeRectangle *nr)
/* --------------------------------------------------------------------------
......@@ -2551,14 +2513,6 @@ Note that CURSOR_WIDTH is meaningful only for (h)bar cursors.
-------------------------------------------------------------------------- */
{
int n = get_glyph_string_clip_rects (s, nr, 2);
if (s->row->full_width_p)
{
*nr = ns_fix_rect_ibw (*nr, FRAME_INTERNAL_BORDER_WIDTH (s->f),
FRAME_PIXEL_WIDTH (s->f));
if (n == 2)
*nr = ns_fix_rect_ibw (*(nr+1), FRAME_INTERNAL_BORDER_WIDTH (s->f),
FRAME_PIXEL_WIDTH (s->f));
}
return n;
}
......@@ -2883,11 +2837,6 @@ Function modeled after x_draw_glyph_string_box ().
r = NSMakeRect (s->x, s->y, right_x - s->x + 1, s->height);
/* expand full-width row over internal borders */
if (s->row->full_width_p)
r = ns_fix_rect_ibw (r, FRAME_INTERNAL_BORDER_WIDTH (s->f),
FRAME_PIXEL_WIDTH (s->f));
/* TODO: Sometimes box_color is 0 and this seems wrong; should investigate. */
if (s->face->box == FACE_SIMPLE_BOX && s->face->box_color)
{
......@@ -2943,26 +2892,6 @@ Function modeled after x_draw_glyph_string_box ().
NSRect r = NSMakeRect (s->x, s->y + box_line_width,
s->background_width,
s->height-2*box_line_width);
/* expand full-width row over internal borders */
if (s->row->full_width_p)
{
int fibw = FRAME_INTERNAL_BORDER_WIDTH (s->f);
if (r.origin.y <= fibw+1 + box_line_width)
{
r.size.height += r.origin.y;
r.origin.y = 0;
}
if (r.origin.x <= fibw+1)
{
r.size.width += 2*r.origin.x;
r.origin.x = 0;
}
if (FRAME_PIXEL_WIDTH (s->f) - (r.origin.x + r.size.width)
<= fibw+1)
r.size.width += fibw;
}
NSRectFill (r);
}
......@@ -3028,24 +2957,6 @@ Function modeled after x_draw_glyph_string_box ().
br = NSMakeRect (x, y, s->slice.width, s->slice.height);
}
/* expand full-width row over internal borders */
if (s->row->full_width_p)
{
int fibw = FRAME_INTERNAL_BORDER_WIDTH (s->f);
if (br.origin.y <= fibw+1 + box_line_vwidth)
{
br.size.height += br.origin.y;
br.origin.y = 0;
}
if (br.origin.x <= fibw+1 + box_line_vwidth)
{
br.size.width += br.origin.x;
br.origin.x = 0;
}
if (FRAME_PIXEL_WIDTH (s->f) - (br.origin.x + br.size.width) <= fibw+1)
br.size.width += fibw;
}
NSRectFill (br);
/* Draw the image.. do we need to draw placeholder if img ==nil? */
......@@ -3143,7 +3054,7 @@ Function modeled after x_draw_glyph_string_box ().
bgCol = ns_lookup_indexed_color (NS_FACE_BACKGROUND (face), s->f);
fgCol = ns_lookup_indexed_color (NS_FACE_FOREGROUND (face), s->f);
for (i=0; i<n; i++)
for (i = 0; i < n; ++i)
{
if (!s->row->full_width_p)
{
......@@ -3173,13 +3084,6 @@ Function modeled after x_draw_glyph_string_box ().
r[i].size.height = min (s->height, s->row->visible_height);
}
/* expand full-width rows over internal borders */
else
{
r[i] = ns_fix_rect_ibw (r[i], FRAME_INTERNAL_BORDER_WIDTH (s->f),
FRAME_PIXEL_WIDTH (s->f));
}
[bgCol set];
/* NOTE: under NS this is NOT used to draw cursors, but we must avoid
......@@ -3639,9 +3543,9 @@ overwriting cursor (usually when cursor on a tab) */
struct frame *f = XFRAME (WINDOW_FRAME (window));
EmacsView *view = FRAME_NS_VIEW (f);
int window_y, window_height;
BOOL barOnVeryLeft, barOnVeryRight;
int top, left, height, width, sb_width, sb_left;
EmacsScroller *bar;
BOOL fringe_extended_p;
/* optimization; display engine sends WAY too many of these.. */
if (!NILP (window->vertical_scroll_bar))
......@@ -3668,26 +3572,27 @@ overwriting cursor (usually when cursor on a tab) */
width = WINDOW_CONFIG_SCROLL_BAR_COLS (window) * FRAME_COLUMN_WIDTH (f);
left = WINDOW_SCROLL_BAR_AREA_X (window);
if (top < 5) /* top scrollbar adjustment */
{
top -= FRAME_INTERNAL_BORDER_WIDTH (f);
height += FRAME_INTERNAL_BORDER_WIDTH (f);
}
/* allow for displaying a skinnier scrollbar than char area allotted */
sb_width = (WINDOW_CONFIG_SCROLL_BAR_WIDTH (window) > 0) ?
WINDOW_CONFIG_SCROLL_BAR_WIDTH (window) : width;
barOnVeryLeft = left < 5;
barOnVeryRight = FRAME_PIXEL_WIDTH (f) - left - width < 5;
sb_left = left + FRAME_INTERNAL_BORDER_WIDTH (f)
* (barOnVeryLeft ? -1 : (barOnVeryRight ? 1 : 0));
sb_left = left;
r = NSMakeRect (sb_left, top, sb_width, height);
/* the parent view is flipped, so we need to flip y value */
v = [view frame];
r.origin.y = (v.size.height - r.size.height - r.origin.y);
if (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_LEFT (window))
fringe_extended_p = (WINDOW_LEFTMOST_P (window)
&& WINDOW_LEFT_FRINGE_WIDTH (window)
&& (WINDOW_HAS_FRINGES_OUTSIDE_MARGINS (window)
|| WINDOW_LEFT_MARGIN_COLS (window) == 0));
else
fringe_extended_p = (WINDOW_RIGHTMOST_P (window)
&& WINDOW_RIGHT_FRINGE_WIDTH (window)
&& (WINDOW_HAS_FRINGES_OUTSIDE_MARGINS (window)
|| WINDOW_RIGHT_MARGIN_COLS (window) == 0));
XSETWINDOW (win, window);
BLOCK_INPUT;
......@@ -3707,7 +3612,14 @@ overwriting cursor (usually when cursor on a tab) */
if (NILP (window->vertical_scroll_bar))
{
ns_clear_frame_area (f, sb_left, top, width, height);
if (width > 0 && height > 0)
{
if (fringe_extended_p)
ns_clear_frame_area (f, sb_left, top, sb_width, height);
else
ns_clear_frame_area (f, left, top, width, height);
}
bar = [[EmacsScroller alloc] initFrame: r window: win];
wset_vertical_scroll_bar (window, make_save_value (bar, 0));
}
......@@ -3778,14 +3690,21 @@ overwriting cursor (usually when cursor on a tab) */
{
int i;
id view;
NSArray *subviews = [[FRAME_NS_VIEW (f) superview] subviews];
EmacsView *eview = FRAME_NS_VIEW (f);
NSArray *subviews = [[eview superview] subviews];
BOOL removed = NO;
NSTRACE (ns_judge_scroll_bars);
for (i =[subviews count]-1; i >= 0; i--)
for (i = [subviews count]-1; i >= 0; --i)
{
view = [subviews objectAtIndex: i];
if (![view isKindOfClass: [EmacsScroller class]]) continue;
[view judge];
removed = YES;
}
if (removed)
[eview updateFrameSize];
}
......@@ -5420,6 +5339,48 @@ - (BOOL)windowShouldClose: (id)sender
return NO;
}
- (void) updateFrameSize
{
NSWindow *window = [self window];
NSRect wr = [window frame];
#ifdef NS_IMPL_GNUSTEP
int extra = 3;
#else
int extra = 0;
#endif
int oldc = cols, oldr = rows;
int oldw = FRAME_PIXEL_WIDTH (emacsframe),
oldh = FRAME_PIXEL_HEIGHT (emacsframe);
int neww, newh;
cols = FRAME_PIXEL_WIDTH_TO_TEXT_COLS (emacsframe, wr.size.width + extra);
if (cols < MINWIDTH)
cols = MINWIDTH;
rows = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES
(emacsframe, wr.size.height
- FRAME_NS_TITLEBAR_HEIGHT (emacsframe) + extra
- FRAME_TOOLBAR_HEIGHT (emacsframe));
if (rows < MINHEIGHT)
rows = MINHEIGHT;
neww = (int)wr.size.width - emacsframe->border_width;
newh = ((int)wr.size.height
- FRAME_NS_TITLEBAR_HEIGHT (emacsframe)
- FRAME_TOOLBAR_HEIGHT (emacsframe));
if (oldr != rows || oldc != cols || neww != oldw || newh != oldh)
{
FRAME_PIXEL_WIDTH (emacsframe) = neww;
FRAME_PIXEL_HEIGHT (emacsframe) = newh;
change_frame_size (emacsframe, rows, cols, 0, 0, 1);
SET_FRAME_GARBAGED (emacsframe);
cancel_mouse_face (emacsframe);
}
}
- (NSSize)windowWillResize: (NSWindow *)sender toSize: (NSSize)frameSize
/* normalize frame to gridded text size */
......@@ -5517,16 +5478,7 @@ - (void)windowDidResize: (NSNotification *)notification
x_set_window_size (emacsframe, 0, cols, rows);
else
{
NSWindow *window = [self window];
NSRect wr = [window frame];
FRAME_PIXEL_WIDTH (emacsframe) = (int)wr.size.width
- emacsframe->border_width;
FRAME_PIXEL_HEIGHT (emacsframe) = (int)wr.size.height
- FRAME_NS_TITLEBAR_HEIGHT (emacsframe)
- FRAME_TOOLBAR_HEIGHT (emacsframe);
change_frame_size (emacsframe, rows, cols, 0, 0, 1);
SET_FRAME_GARBAGED (emacsframe);
cancel_mouse_face (emacsframe);
[self updateFrameSize];
}
}
#endif
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment