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
d1208fa6
Commit
d1208fa6
authored
May 30, 2003
by
Eric Petit
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
modules/gui/beos/* : misc fixes & enhancements
parent
f574db49
Changes
7
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
193 additions
and
146 deletions
+193
-146
modules/gui/beos/Interface.cpp
modules/gui/beos/Interface.cpp
+6
-6
modules/gui/beos/InterfaceWindow.cpp
modules/gui/beos/InterfaceWindow.cpp
+71
-50
modules/gui/beos/InterfaceWindow.h
modules/gui/beos/InterfaceWindow.h
+7
-4
modules/gui/beos/MediaControlView.cpp
modules/gui/beos/MediaControlView.cpp
+3
-3
modules/gui/beos/MsgVals.h
modules/gui/beos/MsgVals.h
+52
-48
modules/gui/beos/VlcWrapper.cpp
modules/gui/beos/VlcWrapper.cpp
+51
-31
modules/gui/beos/VlcWrapper.h
modules/gui/beos/VlcWrapper.h
+3
-4
No files found.
modules/gui/beos/Interface.cpp
View file @
d1208fa6
...
...
@@ -2,7 +2,7 @@
* intf_beos.cpp: beos interface
*****************************************************************************
* Copyright (C) 1999, 2000, 2001 VideoLAN
* $Id: Interface.cpp,v 1.1
2 2003/05/03 13:37:21
titer Exp $
* $Id: Interface.cpp,v 1.1
3 2003/05/30 17:30:54
titer Exp $
*
* Authors: Jean-Marc Dressler <polux@via.ecp.fr>
* Samuel Hocevar <sam@zoy.org>
...
...
@@ -126,11 +126,11 @@ static void Run( intf_thread_t *p_intf )
{
while
(
!
p_intf
->
b_die
)
{
if
(
p_intf
->
p_sys
->
p_wrapper
->
UpdateInput
()
)
{
/* Update VlcWrapper internals (p_input, etc) */
p_intf
->
p_sys
->
p_wrapper
->
UpdateInput
();
/* Manage the slider */
p_intf
->
p_sys
->
p_window
->
UpdateInterface
();
}
/* Wait a bit */
msleep
(
INTF_IDLE_SLEEP
);
...
...
modules/gui/beos/InterfaceWindow.cpp
View file @
d1208fa6
...
...
@@ -2,7 +2,7 @@
* InterfaceWindow.cpp: beos interface
*****************************************************************************
* Copyright (C) 1999, 2000, 2001 VideoLAN
* $Id: InterfaceWindow.cpp,v 1.
39 2003/05/27 13:22:45
titer Exp $
* $Id: InterfaceWindow.cpp,v 1.
40 2003/05/30 17:30:54
titer Exp $
*
* Authors: Jean-Marc Dressler <polux@via.ecp.fr>
* Samuel Hocevar <sam@zoy.org>
...
...
@@ -283,12 +283,20 @@ InterfaceWindow::InterfaceWindow( BRect frame, const char* name,
/* Add the Speed menu */
fSpeedMenu
=
new
BMenu
(
_
(
"Speed"
)
);
fSpeedMenu
->
SetRadioMode
(
true
);
fSpeedMenu
->
AddItem
(
fSlowerMI
=
new
BMenuItem
(
_
(
"Slower"
),
new
BMessage
(
SLOWER_PLAY
)
)
);
fNormalMI
=
new
BMenuItem
(
_
(
"Normal"
),
new
BMessage
(
NORMAL_PLAY
)
);
fNormalMI
->
SetMarked
(
true
);
// default to normal speed
fSpeedMenu
->
AddItem
(
fNormalMI
);
fSpeedMenu
->
AddItem
(
fFasterMI
=
new
BMenuItem
(
_
(
"Faster"
),
new
BMessage
(
FASTER_PLAY
)
)
);
fSpeedMenu
->
SetTargetForItems
(
this
);
fSpeedMenu
->
AddItem
(
fHeighthMI
=
new
BMenuItem
(
"1/8x"
,
new
BMessage
(
HEIGHTH_PLAY
)
)
);
fSpeedMenu
->
AddItem
(
fQuarterMI
=
new
BMenuItem
(
"1/4x"
,
new
BMessage
(
QUARTER_PLAY
)
)
);
fSpeedMenu
->
AddItem
(
fHalfMI
=
new
BMenuItem
(
"1/2x"
,
new
BMessage
(
HALF_PLAY
)
)
);
fSpeedMenu
->
AddItem
(
fNormalMI
=
new
BMenuItem
(
"1x"
,
new
BMessage
(
NORMAL_PLAY
)
)
);
fSpeedMenu
->
AddItem
(
fTwiceMI
=
new
BMenuItem
(
"2x"
,
new
BMessage
(
TWICE_PLAY
)
)
);
fSpeedMenu
->
AddItem
(
fFourMI
=
new
BMenuItem
(
"4x"
,
new
BMessage
(
FOUR_PLAY
)
)
);
fSpeedMenu
->
AddItem
(
fHeightMI
=
new
BMenuItem
(
"8x"
,
new
BMessage
(
HEIGHT_PLAY
)
)
);
fMenuBar
->
AddItem
(
fSpeedMenu
);
/* Add the Show menu */
...
...
@@ -436,28 +444,32 @@ void InterfaceWindow::MessageReceived( BMessage * p_message )
}
break
;
case
FASTER_PLAY
:
/* cycle the fast playback modes */
if
(
playback_status
>
UNDEF_S
)
{
p_wrapper
->
InputFaster
();
}
case
HEIGHTH_PLAY
:
p_wrapper
->
InputSetRate
(
DEFAULT_RATE
*
8
);
break
;
case
SLOW
ER_PLAY
:
/* cycle the slow playback modes */
if
(
playback_status
>
UNDEF_S
)
{
p_wrapper
->
InputSlower
();
}
case
QUART
ER_PLAY
:
p_wrapper
->
InputSetRate
(
DEFAULT_RATE
*
4
);
break
;
case
HALF_PLAY
:
p_wrapper
->
InputSetRate
(
DEFAULT_RATE
*
2
);
break
;
case
NORMAL_PLAY
:
/* restore speed to normal if already playing */
if
(
playback_status
>
UNDEF_S
)
{
p_wrapper
->
PlaylistPlay
();
}
p_wrapper
->
InputSetRate
(
DEFAULT_RATE
);
break
;
case
TWICE_PLAY
:
p_wrapper
->
InputSetRate
(
DEFAULT_RATE
/
2
);
break
;
case
FOUR_PLAY
:
p_wrapper
->
InputSetRate
(
DEFAULT_RATE
/
4
);
break
;
case
HEIGHT_PLAY
:
p_wrapper
->
InputSetRate
(
DEFAULT_RATE
/
8
);
break
;
case
SEEK_PLAYBACK
:
...
...
@@ -860,32 +872,41 @@ InterfaceWindow::_SetMenusEnabled(bool hasFile, bool hasChapters, bool hasTitles
void
InterfaceWindow
::
_UpdateSpeedMenu
(
int
rate
)
{
if
(
rate
==
DEFAULT_RATE
)
{
if
(
!
fNormalMI
->
IsMarked
()
)
fNormalMI
->
SetMarked
(
true
);
}
else
if
(
rate
<
DEFAULT_RATE
)
{
if
(
!
fFasterMI
->
IsMarked
()
)
fFasterMI
->
SetMarked
(
true
);
}
else
BMenuItem
*
toMark
=
NULL
;
switch
(
rate
)
{
if
(
!
fSlowerMI
->
IsMarked
()
)
fSlowerMI
->
SetMarked
(
true
);
case
(
DEFAULT_RATE
*
8
):
toMark
=
fHeighthMI
;
break
;
case
(
DEFAULT_RATE
*
4
):
toMark
=
fQuarterMI
;
break
;
case
(
DEFAULT_RATE
*
2
):
toMark
=
fHalfMI
;
break
;
case
(
DEFAULT_RATE
):
toMark
=
fNormalMI
;
break
;
case
(
DEFAULT_RATE
/
2
):
toMark
=
fTwiceMI
;
break
;
case
(
DEFAULT_RATE
/
4
):
toMark
=
fFourMI
;
break
;
case
(
DEFAULT_RATE
/
8
):
toMark
=
fHeightMI
;
break
;
}
}
/*****************************************************************************
* InterfaceWindow::_InputStreamChanged
*****************************************************************************/
void
InterfaceWindow
::
_InputStreamChanged
()
{
// TODO: move more stuff from updateInterface() here!
snooze
(
400000
);
p_wrapper
->
SetVolume
(
p_mediaControl
->
GetVolume
()
);
if
(
!
toMark
->
IsMarked
()
)
toMark
->
SetMarked
(
true
);
}
/*****************************************************************************
...
...
modules/gui/beos/InterfaceWindow.h
View file @
d1208fa6
...
...
@@ -2,7 +2,7 @@
* InterfaceWindow.h: BeOS interface window class prototype
*****************************************************************************
* Copyright (C) 1999, 2000, 2001 VideoLAN
* $Id: InterfaceWindow.h,v 1.1
3 2003/02/10 15:23:46
titer Exp $
* $Id: InterfaceWindow.h,v 1.1
4 2003/05/30 17:30:54
titer Exp $
*
* Authors: Jean-Marc Dressler <polux@via.ecp.fr>
* Tony Castley <tcastley@mail.powerup.com.au>
...
...
@@ -114,7 +114,6 @@ class InterfaceWindow : public BWindow
bool
hasChapters
=
false
,
bool
hasTitles
=
false
);
void
_UpdateSpeedMenu
(
int
rate
);
void
_InputStreamChanged
();
void
_ShowFilePanel
(
uint32
command
,
const
char
*
windowTitle
);
void
_RestoreSettings
();
...
...
@@ -134,9 +133,13 @@ class InterfaceWindow : public BWindow
BMenuItem
*
fNextChapterMI
;
BMenuItem
*
fPrevChapterMI
;
BMenuItem
*
fOnTopMI
;
BMenuItem
*
fSlowerMI
;
BMenuItem
*
fHeighthMI
;
BMenuItem
*
fQuarterMI
;
BMenuItem
*
fHalfMI
;
BMenuItem
*
fNormalMI
;
BMenuItem
*
fFasterMI
;
BMenuItem
*
fTwiceMI
;
BMenuItem
*
fFourMI
;
BMenuItem
*
fHeightMI
;
BMenu
*
fAudioMenu
;
BMenu
*
fNavigationMenu
;
BMenu
*
fTitleMenu
;
...
...
modules/gui/beos/MediaControlView.cpp
View file @
d1208fa6
...
...
@@ -2,7 +2,7 @@
* MediaControlView.cpp: beos interface
*****************************************************************************
* Copyright (C) 1999, 2000, 2001 VideoLAN
* $Id: MediaControlView.cpp,v 1.1
7 2003/05/25 23:08:4
4 titer Exp $
* $Id: MediaControlView.cpp,v 1.1
8 2003/05/30 17:30:5
4 titer Exp $
*
* Authors: Tony Castley <tony@castley.net>
* Stephan Aßmus <stippi@yellowbites.com>
...
...
@@ -86,8 +86,8 @@ MediaControlView::MediaControlView(BRect frame, intf_thread_t *p_interface)
BRect
frame
(
0.0
,
0.0
,
10.0
,
10.0
);
// Seek Slider
fSeekSlider
=
new
SeekSlider
(
frame
,
"seek slider"
,
this
,
0
,
SEEKSLIDER_RANGE
-
1
);
fSeekSlider
=
new
SeekSlider
(
frame
,
"seek slider"
,
this
,
0
,
SEEKSLIDER_RANGE
);
fSeekSlider
->
SetValue
(
0
);
fSeekSlider
->
ResizeToPreferred
();
AddChild
(
fSeekSlider
);
...
...
modules/gui/beos/MsgVals.h
View file @
d1208fa6
...
...
@@ -2,23 +2,23 @@
* MsgVals.h
*****************************************************************************
* Copyright (C) 2001 VideoLAN
* $Id: MsgVals.h,v 1.
8 2003/05/08 10:40:31
titer Exp $
* $Id: MsgVals.h,v 1.
9 2003/05/30 17:30:54
titer Exp $
*
* Authors: Tony Castley <tcastley@mail.powerup.com.au>
* Stephan Aßmus <stippi@yellowbites.com>
*
* This program is free software
;
you can redistribute it and/or modify
* This program is free software you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation
;
either version 2 of the License, or
* the Free Software Foundation either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY
;
without even the implied warranty of
* but WITHOUT ANY WARRANTY without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program
;
if not, write to the Free Software
* along with this program if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
...
...
@@ -28,49 +28,53 @@
#define PLAYING 0
#define PAUSED 1
const
uint32
OPEN_FILE
=
'
opfl
'
;
const
uint32
OPEN_DVD
=
'
opdv
'
;
const
uint32
LOAD_SUBFILE
=
'
losu
'
;
const
uint32
SUBFILE_RECEIVED
=
'
sure
'
;
const
uint32
OPEN_PLAYLIST
=
'
oppl
'
;
const
uint32
STOP_PLAYBACK
=
'
stpl
'
;
const
uint32
START_PLAYBACK
=
'
play
'
;
const
uint32
PAUSE_PLAYBACK
=
'
papl
'
;
const
uint32
FASTER_PLAY
=
'
fapl
'
;
const
uint32
SLOWER_PLAY
=
'
slpl
'
;
const
uint32
NORMAL_PLAY
=
'
nrpl
'
;
const
uint32
SEEK_PLAYBACK
=
'
seek
'
;
const
uint32
VOLUME_CHG
=
'
voch
'
;
const
uint32
VOLUME_MUTE
=
'
mute
'
;
const
uint32
SELECT_CHANNEL
=
'
chan
'
;
const
uint32
SELECT_SUBTITLE
=
'
subt
'
;
const
uint32
PREV_TITLE
=
'
prti
'
;
const
uint32
NEXT_TITLE
=
'
nxti
'
;
const
uint32
TOGGLE_TITLE
=
'
tgti
'
;
const
uint32
NAVIGATE_MENU
=
'
navm
'
;
const
uint32
PREV_CHAPTER
=
'
prch
'
;
const
uint32
NEXT_CHAPTER
=
'
nxch
'
;
const
uint32
TOGGLE_CHAPTER
=
'
tgch
'
;
const
uint32
PREV_FILE
=
'
prfl
'
;
const
uint32
NEXT_FILE
=
'
nxfl
'
;
const
uint32
NAVIGATE_PREV
=
'
navp
'
;
// could be chapter, title or file
const
uint32
NAVIGATE_NEXT
=
'
navn
'
;
// could be chapter, title or file
const
uint32
OPEN_PREFERENCES
=
'
pref
'
;
const
uint32
OPEN_MESSAGES
=
'
mess
'
;
const
uint32
TOGGLE_ON_TOP
=
'
ontp
'
;
const
uint32
SHOW_INTERFACE
=
'
shin
'
;
const
uint32
TOGGLE_FULL_SCREEN
=
'
tgfs
'
;
const
uint32
RESIZE_50
=
'
rshl
'
;
const
uint32
RESIZE_100
=
'
rsor
'
;
const
uint32
RESIZE_200
=
'
rsdb
'
;
const
uint32
RESIZE_TRUE
=
'
rstr
'
;
const
uint32
ASPECT_CORRECT
=
'
asco
'
;
const
uint32
VERT_SYNC
=
'
vsyn
'
;
const
uint32
WINDOW_FEEL
=
'
wfel
'
;
const
uint32
SCREEN_SHOT
=
'
scrn
'
;
const
uint32
MSG_UPDATE
=
'
updt
'
;
const
uint32
MSG_SOUNDPLAY
=
'
move
'
;
// drag'n'drop from soundplay playlist
const
uint32
INTERFACE_CREATED
=
'
ifcr
'
;
/* see VlcApplication::MessageReceived()
#define OPEN_FILE 'opfl'
#define OPEN_DVD 'opdv'
#define LOAD_SUBFILE 'losu'
#define SUBFILE_RECEIVED 'sure'
#define OPEN_PLAYLIST 'oppl'
#define STOP_PLAYBACK 'stpl'
#define START_PLAYBACK 'play'
#define PAUSE_PLAYBACK 'papl'
#define HEIGHTH_PLAY 'hhpl'
#define QUARTER_PLAY 'qupl'
#define HALF_PLAY 'hapl'
#define NORMAL_PLAY 'nrpl'
#define TWICE_PLAY 'twpl'
#define FOUR_PLAY 'fopl'
#define HEIGHT_PLAY 'hepl'
#define SEEK_PLAYBACK 'seek'
#define VOLUME_CHG 'voch'
#define VOLUME_MUTE 'mute'
#define SELECT_CHANNEL 'chan'
#define SELECT_SUBTITLE 'subt'
#define PREV_TITLE 'prti'
#define NEXT_TITLE 'nxti'
#define TOGGLE_TITLE 'tgti'
#define NAVIGATE_MENU 'navm'
#define PREV_CHAPTER 'prch'
#define NEXT_CHAPTER 'nxch'
#define TOGGLE_CHAPTER 'tgch'
#define PREV_FILE 'prfl'
#define NEXT_FILE 'nxfl'
#define NAVIGATE_PREV 'navp' // could be chapter, title or file
#define NAVIGATE_NEXT 'navn' // could be chapter, title or file
#define OPEN_PREFERENCES 'pref'
#define OPEN_MESSAGES 'mess'
#define TOGGLE_ON_TOP 'ontp'
#define SHOW_INTERFACE 'shin'
#define TOGGLE_FULL_SCREEN 'tgfs'
#define RESIZE_50 'rshl'
#define RESIZE_100 'rsor'
#define RESIZE_200 'rsdb'
#define RESIZE_TRUE 'rstr'
#define ASPECT_CORRECT 'asco'
#define VERT_SYNC 'vsyn'
#define WINDOW_FEEL 'wfel'
#define SCREEN_SHOT 'scrn'
#define MSG_UPDATE 'updt'
#define MSG_SOUNDPLAY 'move' // drag'n'drop from soundplay playlist
#define INTERFACE_CREATED 'ifcr'
/* see VlcApplication::MessageReceived()
* in src/misc/beos_specific.cpp */
#endif // BEOS_MESSAGE_VALUES_H
modules/gui/beos/VlcWrapper.cpp
View file @
d1208fa6
...
...
@@ -2,7 +2,7 @@
* VlcWrapper.cpp: BeOS plugin for vlc (derived from MacOS X port)
*****************************************************************************
* Copyright (C) 2001 VideoLAN
* $Id: VlcWrapper.cpp,v 1.3
0 2003/05/07 14:49:19
titer Exp $
* $Id: VlcWrapper.cpp,v 1.3
1 2003/05/30 17:30:54
titer Exp $
*
* Authors: Florian G. Pflug <fgp@phlo.org>
* Jon Lech Johansen <jon-vl@nanocrew.net>
...
...
@@ -62,35 +62,25 @@ VlcWrapper::VlcWrapper( intf_thread_t *p_interface )
VlcWrapper
::~
VlcWrapper
()
{
if
(
p_input
)
{
vlc_object_release
(
p_input
);
}
if
(
p_playlist
)
{
vlc_object_release
(
p_playlist
);
}
}
/* UpdateInput: updates p_input, returns true if the interface needs to
be updated */
bool
VlcWrapper
::
UpdateInput
()
/* UpdateInput: updates p_input */
void
VlcWrapper
::
UpdateInput
()
{
if
(
p_input
==
NULL
)
{
if
(
!
p_input
)
p_input
=
(
input_thread_t
*
)
vlc_object_find
(
p_intf
,
VLC_OBJECT_INPUT
,
FIND_ANYWHERE
);
}
if
(
p_input
!=
NULL
)
{
if
(
p_input
)
if
(
p_input
->
b_dead
)
{
vlc_object_release
(
p_input
);
p_input
=
NULL
;
}
return
true
;
}
return
false
;
}
...
...
@@ -106,34 +96,64 @@ bool VlcWrapper::HasInput()
int
VlcWrapper
::
InputStatus
()
{
if
(
!
p_input
)
{
return
UNDEF_S
;
}
return
p_input
->
stream
.
control
.
i_status
;
}
int
VlcWrapper
::
InputRate
()
{
if
(
!
p_input
)
{
return
DEFAULT_RATE
;
}
return
p_input
->
stream
.
control
.
i_rate
;
}
void
VlcWrapper
::
InputS
lower
(
)
void
VlcWrapper
::
InputS
etRate
(
int
rate
)
{
if
(
p_input
!=
NULL
)
if
(
!
p_input
)
return
;
int
times
=
0
;
int
oldrate
=
InputRate
();
switch
(
(
rate
>
oldrate
)
?
(
rate
/
oldrate
)
:
(
oldrate
/
rate
)
)
{
input_SetStatus
(
p_input
,
INPUT_STATUS_SLOWER
);
case
64
:
times
=
6
;
break
;
case
32
:
times
=
5
;
break
;
case
16
:
times
=
4
;
break
;
case
8
:
times
=
3
;
break
;
case
4
:
times
=
2
;
break
;
case
2
:
times
=
1
;
break
;
}
}
void
VlcWrapper
::
InputFaster
()
{
if
(
p_input
!=
NULL
)
int
newrate
=
oldrate
;
for
(
int
i
=
0
;
i
<
times
;
i
++
)
{
if
(
rate
>
oldrate
)
{
input_SetStatus
(
p_input
,
INPUT_STATUS_SLOWER
);
newrate
*=
2
;
}
else
{
input_SetStatus
(
p_input
,
INPUT_STATUS_FASTER
);
newrate
/=
2
;
}
/* Wait it's actually done */
while
(
InputRate
()
!=
newrate
)
msleep
(
10000
);
}
}
...
...
@@ -317,9 +337,9 @@ void VlcWrapper::SetTimeAsFloat( float f_position )
if
(
p_input
!=
NULL
)
{
input_Seek
(
p_input
,
(
long
long
int
)(
p_input
->
stream
.
p_selected_area
->
i_size
(
long
long
)(
p_input
->
stream
.
p_selected_area
->
i_size
*
f_position
/
SEEKSLIDER_RANGE
),
INPUT_SEEK_SET
);
INPUT_SEEK_SET
);
}
}
...
...
modules/gui/beos/VlcWrapper.h
View file @
d1208fa6
...
...
@@ -2,7 +2,7 @@
* VlcWrapper.h: BeOS plugin for vlc (derived from MacOS X port)
*****************************************************************************
* Copyright (C) 2001 VideoLAN
* $Id: VlcWrapper.h,v 1.2
3 2003/05/12 19:59:48
titer Exp $
* $Id: VlcWrapper.h,v 1.2
4 2003/05/30 17:30:54
titer Exp $
*
* Authors: Florian G. Pflug <fgp@phlo.org>
* Jon Lech Johansen <jon-vl@nanocrew.net>
...
...
@@ -66,14 +66,13 @@ public:
VlcWrapper
(
intf_thread_t
*
p_intf
);
~
VlcWrapper
();
bool
UpdateInput
();
void
UpdateInput
();
/* Input */
bool
HasInput
();
int
InputStatus
();
int
InputRate
();
void
InputSlower
();
void
InputFaster
();
void
InputSetRate
(
int
rate
);
BList
*
GetChannels
(
int
i_cat
);
void
ToggleLanguage
(
int
i_language
);
void
ToggleSubtitle
(
int
i_subtitle
);
...
...
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