Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-1.1
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc-1.1
Commits
651be31c
Commit
651be31c
authored
May 18, 2003
by
Cyril Deguet
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
* added transparency in X11 skins
parent
035bbae4
Changes
7
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
77 additions
and
84 deletions
+77
-84
modules/gui/skins/x11/x11_bitmap.cpp
modules/gui/skins/x11/x11_bitmap.cpp
+20
-45
modules/gui/skins/x11/x11_bitmap.h
modules/gui/skins/x11/x11_bitmap.h
+3
-2
modules/gui/skins/x11/x11_font.cpp
modules/gui/skins/x11/x11_font.cpp
+3
-1
modules/gui/skins/x11/x11_graphics.cpp
modules/gui/skins/x11/x11_graphics.cpp
+4
-5
modules/gui/skins/x11/x11_run.cpp
modules/gui/skins/x11/x11_run.cpp
+2
-2
modules/gui/skins/x11/x11_theme.cpp
modules/gui/skins/x11/x11_theme.cpp
+24
-4
modules/gui/skins/x11/x11_window.cpp
modules/gui/skins/x11/x11_window.cpp
+21
-25
No files found.
modules/gui/skins/x11/x11_bitmap.cpp
View file @
651be31c
...
@@ -2,7 +2,7 @@
...
@@ -2,7 +2,7 @@
* x11_bitmap.cpp: X11 implementation of the Bitmap class
* x11_bitmap.cpp: X11 implementation of the Bitmap class
*****************************************************************************
*****************************************************************************
* Copyright (C) 2003 VideoLAN
* Copyright (C) 2003 VideoLAN
* $Id: x11_bitmap.cpp,v 1.
3 2003/05/18 11:25:00
asmax Exp $
* $Id: x11_bitmap.cpp,v 1.
4 2003/05/18 17:48:05
asmax Exp $
*
*
* Authors: Cyril Deguet <asmax@videolan.org>
* Authors: Cyril Deguet <asmax@videolan.org>
* Emmanuel Puig <karibu@via.ecp.fr>
* Emmanuel Puig <karibu@via.ecp.fr>
...
@@ -66,11 +66,13 @@ X11Bitmap::X11Bitmap( intf_thread_t *_p_intf, string FileName, int AColor )
...
@@ -66,11 +66,13 @@ X11Bitmap::X11Bitmap( intf_thread_t *_p_intf, string FileName, int AColor )
Width
=
0
;
Width
=
0
;
Height
=
0
;
Height
=
0
;
AlphaColor
=
AColor
;
// TODO: check for endianness issues
AlphaColor
=
(
AColor
&
0xff
)
<<
16
|
(
AColor
&
0xff00
)
|
(
AColor
&
0xff0000
)
>>
16
;
if
(
FileName
!=
""
)
if
(
FileName
!=
""
)
{
{
data
=
LoadFromFile
(
FileName
,
depth
,
Width
,
Height
);
data
=
LoadFromFile
(
FileName
,
depth
,
AlphaColor
,
Width
,
Height
);
}
}
// Create the image
// Create the image
...
@@ -78,45 +80,6 @@ X11Bitmap::X11Bitmap( intf_thread_t *_p_intf, string FileName, int AColor )
...
@@ -78,45 +80,6 @@ X11Bitmap::X11Bitmap( intf_thread_t *_p_intf, string FileName, int AColor )
Height
,
32
,
4
*
Width
);
Height
,
32
,
4
*
Width
);
XInitImage
(
Bmp
);
XInitImage
(
Bmp
);
// Load the bitmap image
/* if( rc != BitmapSuccess )
{
if( FileName != "" )
msg_Warn( p_intf, "Couldn't load bitmap: %s", FileName.c_str() );
Width = 0;
Height = 0;
}*/
/* else
{
Width = gdk_pixbuf_get_width( Bmp );
Height = gdk_pixbuf_get_height( Bmp );
if( AColor != 0 )
{
// Change black pixels to another color to avoid transparency
int rowstride = gdk_pixbuf_get_rowstride( Bmp );
guchar *pixel = gdk_pixbuf_get_pixels( Bmp );
int pix_size = ( gdk_pixbuf_get_has_alpha( Bmp ) ? 4 : 3 );
for( int y = 0; y < Height; y++ )
{
for( int x = 0; x < Width; x++ )
{
guint32 r = pixel[0];
guint32 g = pixel[1]<<8;
guint32 b = pixel[2]<<16;
if( r+g+b == 0 )
{
pixel[2] = 10; // slight blue
}
pixel += pix_size;
}
}
}
Bmp = gdk_pixbuf_add_alpha( Bmp, TRUE, AColor & 0xff, (AColor>>8) & 0xff,
(AColor>>16) & 0xff );
}*/
}
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
X11Bitmap
::
X11Bitmap
(
intf_thread_t
*
_p_intf
,
Graphics
*
from
,
int
x
,
int
y
,
X11Bitmap
::
X11Bitmap
(
intf_thread_t
*
_p_intf
,
Graphics
*
from
,
int
x
,
int
y
,
...
@@ -178,6 +141,7 @@ bool X11Bitmap::Hit( int x, int y)
...
@@ -178,6 +141,7 @@ bool X11Bitmap::Hit( int x, int y)
return false;
return false;
else
else
return true;*/
return true;*/
return
true
;
}
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
int
X11Bitmap
::
GetBmpPixel
(
int
x
,
int
y
)
int
X11Bitmap
::
GetBmpPixel
(
int
x
,
int
y
)
...
@@ -207,7 +171,8 @@ void X11Bitmap::SetBmpPixel( int x, int y, int color )
...
@@ -207,7 +171,8 @@ void X11Bitmap::SetBmpPixel( int x, int y, int color )
// SetPixelV( bmpDC, x, y, color );
// SetPixelV( bmpDC, x, y, color );
}
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
char
*
X11Bitmap
::
LoadFromFile
(
string
fileName
,
int
depth
,
int
&
width
,
int
&
height
)
char
*
X11Bitmap
::
LoadFromFile
(
string
fileName
,
int
depth
,
int
AColor
,
int
&
width
,
int
&
height
)
{
{
// BMP header fields
// BMP header fields
uint32_t
fileSize
;
uint32_t
fileSize
;
...
@@ -241,7 +206,7 @@ char *X11Bitmap::LoadFromFile( string fileName, int depth, int &width, int &heig
...
@@ -241,7 +206,7 @@ char *X11Bitmap::LoadFromFile( string fileName, int depth, int &width, int &heig
dataSize
=
U32
(
headers
+
34
);
dataSize
=
U32
(
headers
+
34
);
nColors
=
U32
(
headers
+
50
);
nColors
=
U32
(
headers
+
50
);
// fprintf(stderr,"image %d %d\n", width, height
);
fprintf
(
stderr
,
"image %s %x
\n
"
,
fileName
.
c_str
(),
AColor
);
switch
(
bpp
)
switch
(
bpp
)
{
{
case
24
:
case
24
:
...
@@ -259,7 +224,17 @@ char *X11Bitmap::LoadFromFile( string fileName, int depth, int &width, int &heig
...
@@ -259,7 +224,17 @@ char *X11Bitmap::LoadFromFile( string fileName, int depth, int &width, int &heig
// Read a pixel
// Read a pixel
uint32_t
pixel
=
0
;
uint32_t
pixel
=
0
;
fread
(
&
pixel
,
3
,
1
,
file
);
fread
(
&
pixel
,
3
,
1
,
file
);
*
(
ptr
++
)
=
U32
(
&
pixel
);
pixel
=
U32
(
&
pixel
);
// Handle transparency
if
(
pixel
==
0
&&
AColor
!=
0
)
{
pixel
=
10
;
// slight blue
}
else
if
(
pixel
==
AColor
)
{
pixel
=
0
;
// global alpha color is black
}
*
(
ptr
++
)
=
pixel
;
}
}
fseek
(
file
,
pad
,
SEEK_CUR
);
fseek
(
file
,
pad
,
SEEK_CUR
);
}
}
...
...
modules/gui/skins/x11/x11_bitmap.h
View file @
651be31c
...
@@ -2,7 +2,7 @@
...
@@ -2,7 +2,7 @@
* x11_bitmap.h: X11 implementation of the Bitmap class
* x11_bitmap.h: X11 implementation of the Bitmap class
*****************************************************************************
*****************************************************************************
* Copyright (C) 2003 VideoLAN
* Copyright (C) 2003 VideoLAN
* $Id: x11_bitmap.h,v 1.
2 2003/05/18 11:25:00
asmax Exp $
* $Id: x11_bitmap.h,v 1.
3 2003/05/18 17:48:05
asmax Exp $
*
*
* Authors: Cyril Deguet <asmax@videolan.org>
* Authors: Cyril Deguet <asmax@videolan.org>
*
*
...
@@ -64,7 +64,8 @@ class X11Bitmap : public Bitmap
...
@@ -64,7 +64,8 @@ class X11Bitmap : public Bitmap
virtual
void
SetBmpPixel
(
int
x
,
int
y
,
int
color
);
virtual
void
SetBmpPixel
(
int
x
,
int
y
,
int
color
);
protected:
protected:
char
*
LoadFromFile
(
string
fileName
,
int
depth
,
int
&
width
,
int
&
height
);
char
*
LoadFromFile
(
string
fileName
,
int
depth
,
int
AColor
,
int
&
width
,
int
&
height
);
};
};
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
...
...
modules/gui/skins/x11/x11_font.cpp
View file @
651be31c
...
@@ -2,7 +2,7 @@
...
@@ -2,7 +2,7 @@
* x11_font.cpp: X11 implementation of the Font class
* x11_font.cpp: X11 implementation of the Font class
*****************************************************************************
*****************************************************************************
* Copyright (C) 2003 VideoLAN
* Copyright (C) 2003 VideoLAN
* $Id: x11_font.cpp,v 1.
1 2003/04/28 14:32:57
asmax Exp $
* $Id: x11_font.cpp,v 1.
2 2003/05/18 17:48:05
asmax Exp $
*
*
* Authors: Cyril Deguet <asmax@videolan.org>
* Authors: Cyril Deguet <asmax@videolan.org>
* Emmanuel Puig <karibu@via.ecp.fr>
* Emmanuel Puig <karibu@via.ecp.fr>
...
@@ -91,6 +91,8 @@ void X11Font::AssignFont( Graphics *dest )
...
@@ -91,6 +91,8 @@ void X11Font::AssignFont( Graphics *dest )
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void
X11Font
::
GetSize
(
string
text
,
int
&
w
,
int
&
h
)
void
X11Font
::
GetSize
(
string
text
,
int
&
w
,
int
&
h
)
{
{
w
=
0
;
h
=
0
;
/* pango_layout_set_text( Layout, text.c_str(), text.length() );
/* pango_layout_set_text( Layout, text.c_str(), text.length() );
pango_layout_get_pixel_size( Layout, &w, &h );*/
pango_layout_get_pixel_size( Layout, &w, &h );*/
}
}
...
...
modules/gui/skins/x11/x11_graphics.cpp
View file @
651be31c
...
@@ -2,7 +2,7 @@
...
@@ -2,7 +2,7 @@
* x11_graphics.cpp: X11 implementation of the Graphics and Region classes
* x11_graphics.cpp: X11 implementation of the Graphics and Region classes
*****************************************************************************
*****************************************************************************
* Copyright (C) 2003 VideoLAN
* Copyright (C) 2003 VideoLAN
* $Id: x11_graphics.cpp,v 1.
2 2003/04/30 21:16:24
asmax Exp $
* $Id: x11_graphics.cpp,v 1.
3 2003/05/18 17:48:05
asmax Exp $
*
*
* Authors: Cyril Deguet <asmax@videolan.org>
* Authors: Cyril Deguet <asmax@videolan.org>
* Emmanuel Puig <karibu@via.ecp.fr>
* Emmanuel Puig <karibu@via.ecp.fr>
...
@@ -69,13 +69,12 @@ X11Graphics::X11Graphics( intf_thread_t *p_intf, int w, int h,
...
@@ -69,13 +69,12 @@ X11Graphics::X11Graphics( intf_thread_t *p_intf, int w, int h,
}
}
// Set the background color to black
// Set the background color to black
// gdk_draw_rectangle( Image, Gc, TRUE, 0, 0, w, h );
XFillRectangle
(
display
,
Image
,
Gc
,
0
,
0
,
w
,
h
);
}
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
X11Graphics
::~
X11Graphics
()
X11Graphics
::~
X11Graphics
()
{
{
/* g_object_unref( Gc );
XFreePixmap
(
display
,
Image
);
g_object_unref( Image );*/
}
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void
X11Graphics
::
CopyFrom
(
int
dx
,
int
dy
,
int
dw
,
int
dh
,
Graphics
*
Src
,
void
X11Graphics
::
CopyFrom
(
int
dx
,
int
dy
,
int
dw
,
int
dh
,
Graphics
*
Src
,
...
...
modules/gui/skins/x11/x11_run.cpp
View file @
651be31c
...
@@ -2,7 +2,7 @@
...
@@ -2,7 +2,7 @@
* x11_run.cpp:
* x11_run.cpp:
*****************************************************************************
*****************************************************************************
* Copyright (C) 2003 VideoLAN
* Copyright (C) 2003 VideoLAN
* $Id: x11_run.cpp,v 1.
4 2003/05/18 11:25:00
asmax Exp $
* $Id: x11_run.cpp,v 1.
5 2003/05/18 17:48:05
asmax Exp $
*
*
* Authors: Cyril Deguet <asmax@videolan.org>
* Authors: Cyril Deguet <asmax@videolan.org>
*
*
...
@@ -368,7 +368,7 @@ void OSRun( intf_thread_t *p_intf )
...
@@ -368,7 +368,7 @@ void OSRun( intf_thread_t *p_intf )
ProcessEvent
(
p_intf
,
proc
,
event
);
ProcessEvent
(
p_intf
,
proc
,
event
);
// kludge: add timer
// kludge: add timer
SkinManage
(
p_intf
);
//
SkinManage( p_intf );
}
}
}
}
...
...
modules/gui/skins/x11/x11_theme.cpp
View file @
651be31c
...
@@ -2,7 +2,7 @@
...
@@ -2,7 +2,7 @@
* x11_theme.cpp: X11 implementation of the Theme class
* x11_theme.cpp: X11 implementation of the Theme class
*****************************************************************************
*****************************************************************************
* Copyright (C) 2003 VideoLAN
* Copyright (C) 2003 VideoLAN
* $Id: x11_theme.cpp,v 1.
1 2003/04/28 14:32:57
asmax Exp $
* $Id: x11_theme.cpp,v 1.
2 2003/05/18 17:48:05
asmax Exp $
*
*
* Authors: Cyril Deguet <asmax@videolan.org>
* Authors: Cyril Deguet <asmax@videolan.org>
*
*
...
@@ -165,17 +165,37 @@ void X11Theme::AddWindow( string name, int x, int y, bool visible,
...
@@ -165,17 +165,37 @@ void X11Theme::AddWindow( string name, int x, int y, bool visible,
gdk_window_show( gwnd );*/
gdk_window_show( gwnd );*/
// Create the window
Window
root
=
DefaultRootWindow
(
display
);
Window
root
=
DefaultRootWindow
(
display
);
Window
wnd
=
XCreateSimpleWindow
(
display
,
root
,
0
,
0
,
200
,
100
,
0
,
0
,
0
);
Window
wnd
=
XCreateSimpleWindow
(
display
,
root
,
0
,
0
,
1
,
1
,
0
,
0
,
0
);
XSelectInput
(
display
,
wnd
,
ExposureMask
|
XSelectInput
(
display
,
wnd
,
ExposureMask
|
KeyPressMask
|
KeyReleaseMask
|
ButtonPressMask
|
PointerMotionMask
|
KeyPressMask
|
KeyReleaseMask
|
ButtonPressMask
|
PointerMotionMask
|
PointerMotionHintMask
|
EnterWindowMask
|
LeaveWindowMask
);
PointerMotionHintMask
|
EnterWindowMask
|
LeaveWindowMask
);
// Changing decorations
struct
{
unsigned
long
flags
;
unsigned
long
functions
;
unsigned
long
decorations
;
long
input_mode
;
unsigned
long
status
;
}
motifWmHints
;
Atom
hints_atom
=
XInternAtom
(
display
,
"_MOTIF_WM_HINTS"
,
False
);
motifWmHints
.
flags
=
2
;
// MWM_HINTS_DECORATIONS;
motifWmHints
.
decorations
=
0
;
XChangeProperty
(
display
,
wnd
,
hints_atom
,
hints_atom
,
32
,
PropModeReplace
,
(
unsigned
char
*
)
&
motifWmHints
,
sizeof
(
motifWmHints
)
/
sizeof
(
long
)
);
// Display the window
XMapRaised
(
display
,
wnd
);
XMapRaised
(
display
,
wnd
);
XFlush
(
display
);
XFlush
(
display
);
WindowList
.
push_back
(
(
SkinWindow
*
)
new
OSWindow
(
p_intf
,
wnd
,
x
,
y
,
visible
,
WindowList
.
push_back
(
(
SkinWindow
*
)
new
OSWindow
(
p_intf
,
wnd
,
x
,
y
,
fadetime
,
alpha
,
movealpha
,
dragdrop
,
name
)
)
;
visible
,
fadetime
,
alpha
,
movealpha
,
dragdrop
,
name
)
)
;
}
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void
X11Theme
::
ChangeTray
()
void
X11Theme
::
ChangeTray
()
...
...
modules/gui/skins/x11/x11_window.cpp
View file @
651be31c
...
@@ -2,7 +2,7 @@
...
@@ -2,7 +2,7 @@
* x11_window.cpp: X11 implementation of the Window class
* x11_window.cpp: X11 implementation of the Window class
*****************************************************************************
*****************************************************************************
* Copyright (C) 2003 VideoLAN
* Copyright (C) 2003 VideoLAN
* $Id: x11_window.cpp,v 1.
3 2003/05/18 11:25:00
asmax Exp $
* $Id: x11_window.cpp,v 1.
4 2003/05/18 17:48:05
asmax Exp $
*
*
* Authors: Cyril Deguet <asmax@videolan.org>
* Authors: Cyril Deguet <asmax@videolan.org>
*
*
...
@@ -32,6 +32,7 @@
...
@@ -32,6 +32,7 @@
//--- X11 -------------------------------------------------------------------
//--- X11 -------------------------------------------------------------------
#include <X11/Xlib.h>
#include <X11/Xlib.h>
#include <X11/extensions/shape.h>
//--- SKIN ------------------------------------------------------------------
//--- SKIN ------------------------------------------------------------------
#include "../os_api.h"
#include "../os_api.h"
...
@@ -276,51 +277,45 @@ void X11Window::SetTransparency( int Value )
...
@@ -276,51 +277,45 @@ void X11Window::SetTransparency( int Value )
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void
X11Window
::
RefreshFromImage
(
int
x
,
int
y
,
int
w
,
int
h
)
void
X11Window
::
RefreshFromImage
(
int
x
,
int
y
,
int
w
,
int
h
)
{
{
// Initialize painting
/* HDC DC = GetWindowDC( hWnd );
// Draw image on window
BitBlt( DC, x, y, w, h, ( (X11Graphics *)Image )->GetImageHandle(),
x, y, SRCCOPY );
// Release window device context
ReleaseDC( hWnd, DC );
*/
Drawable
drawable
=
((
X11Graphics
*
)
Image
)
->
GetImage
();
Drawable
drawable
=
((
X11Graphics
*
)
Image
)
->
GetImage
();
XCopyArea
(
display
,
drawable
,
Wnd
,
Gc
,
x
,
y
,
w
,
h
,
x
,
y
);
XCopyArea
(
display
,
drawable
,
Wnd
,
Gc
,
x
,
y
,
w
,
h
,
x
,
y
);
XSync
(
display
,
0
);
/*
XImage
*
image
=
XGetImage
(
display
,
drawable
,
0
,
0
,
Width
,
Height
,
AllPlanes
,
ZPixmap
);
// Mask for transparency
// Mask for transparency
GdkRegion *region = gdk_region_new
();
Region
region
=
XCreateRegion
();
for
(
int
line
=
0
;
line
<
Height
;
line
++
)
for
(
int
line
=
0
;
line
<
Height
;
line
++
)
{
{
int
start
=
0
,
end
=
0
;
int
start
=
0
,
end
=
0
;
while
(
start
<
Width
)
while
(
start
<
Width
)
{
{
while( start < Width &&
gdk_image_get_p
ixel( image, start, line ) == 0 )
while
(
start
<
Width
&&
XGetP
ixel
(
image
,
start
,
line
)
==
0
)
{
{
start
++
;
start
++
;
}
}
end
=
start
;
end
=
start
;
while( end < Width &&
gdk_image_get_p
ixel( image, end, line ) != 0)
while
(
end
<
Width
&&
XGetP
ixel
(
image
,
end
,
line
)
!=
0
)
{
{
end
++
;
end
++
;
}
}
Gdk
Rectangle rect;
X
Rectangle
rect
;
rect
.
x
=
start
;
rect
.
x
=
start
;
rect
.
y
=
line
;
rect
.
y
=
line
;
rect
.
width
=
end
-
start
+
1
;
rect
.
width
=
end
-
start
+
1
;
rect
.
height
=
1
;
rect
.
height
=
1
;
GdkRegion *rectReg = gdk_region_rectangle( &rect );
Region
newRegion
=
XCreateRegion
();
gdk_region_union( region, rectReg );
XUnionRectWithRegion
(
&
rect
,
region
,
newRegion
);
gdk_region_destroy( rectReg );
XDestroyRegion
(
region
);
region
=
newRegion
;
start
=
end
+
1
;
start
=
end
+
1
;
}
}
}
}
gdk_window_shape_combine_region( gWnd, region, 0, 0 );
XShapeCombineRegion
(
display
,
Wnd
,
ShapeBounding
,
0
,
0
,
region
,
ShapeSet
);
gdk_region_destroy( region );*/
XDestroyRegion
(
region
);
XSync
(
display
,
0
);
}
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void
X11Window
::
WindowManualMove
()
void
X11Window
::
WindowManualMove
()
...
@@ -347,14 +342,15 @@ void X11Window::Move( int left, int top )
...
@@ -347,14 +342,15 @@ void X11Window::Move( int left, int top )
{
{
Left
=
left
;
Left
=
left
;
Top
=
top
;
Top
=
top
;
/* gdk_window_move( gWnd, left, top );*/
XMoveWindow
(
display
,
Wnd
,
left
,
top
);
}
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void
X11Window
::
Size
(
int
width
,
int
height
)
void
X11Window
::
Size
(
int
width
,
int
height
)
{
{
Width
=
width
;
Width
=
width
;
Height
=
height
;
Height
=
height
;
/* gdk_window_resize( gWnd, width, height );*/
XResizeWindow
(
display
,
Wnd
,
width
,
height
);
}
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void
X11Window
::
ChangeToolTipText
(
string
text
)
void
X11Window
::
ChangeToolTipText
(
string
text
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment