Commit 0c921449 authored by Jiri (George) Lebl's avatar Jiri (George) Lebl Committed by George Lebl

new files, for drawers (not finished yet)

Wed Feb 18 01:19:58 1998  George Lebl  <jirka@5z.com>

        * drawer.[ch]: new files, for drawers (not finished yet)

        * panel.c, panel-widget.c, menu.c: changes mostly related
          to drawers.
parent 4538ba7b
Wed Feb 18 01:19:58 1998 George Lebl <jirka@5z.com>
* drawer.[ch]: new files, for drawers (not finished yet)
* panel.c, panel-widget.c, menu.c: changes mostly related
to drawers.
Tue Feb 17 21:12:45 1998 George Lebl <jirka@5z.com>
* panel-widget.c,panel.c,main.c: now saves drop zone
......
Wed Feb 18 01:19:58 1998 George Lebl <jirka@5z.com>
* drawer.[ch]: new files, for drawers (not finished yet)
* panel.c, panel-widget.c, menu.c: changes mostly related
to drawers.
Tue Feb 17 21:12:45 1998 George Lebl <jirka@5z.com>
* panel-widget.c,panel.c,main.c: now saves drop zone
......
......@@ -15,6 +15,8 @@ panel_SOURCES = \
panel.h \
menu.c \
menu.h \
drawer.c \
drawer.h \
panel-widget.c \
panel-widget.h \
panel_config_global.c \
......
/*
* GNOME panel drawer module.
* (C) 1997 The Free Software Foundation
*
* Authors: Miguel de Icaza
* Federico Mena
* George Lebl
*/
#include <config.h>
#include <stdio.h>
#include <sys/stat.h>
#include <dlfcn.h>
#include <unistd.h>
#include <dirent.h>
#include <string.h>
#include "gnome.h"
#include "panel-widget.h"
#include "panel.h"
#include "panel_config_global.h"
#include "drawer.h"
#define DRAWER_PANEL "drawer_panel"
static char *gnome_folder = NULL;
extern GlobalConfig global_config;
static gint
drawer_click(GtkWidget *widget, gpointer data)
{
Drawer *drawer = data;
gint x,y;
gint wx, wy;
if(PANEL_WIDGET(drawer->drawer)->state == PANEL_SHOWN) {
gtk_widget_hide(drawer->drawer);
PANEL_WIDGET(drawer->drawer)->state = PANEL_HIDDEN;
} else {
gdk_window_get_origin (widget->window, &wx, &wy);
switch(drawer->orient) {
case DRAWER_UP:
x = wx;
y = wy - drawer->drawer->allocation.height;
break;
case DRAWER_DOWN:
x = wx;
y = wy + drawer->drawer->allocation.height +
widget->allocation.height;
break;
case DRAWER_LEFT:
x = wx - drawer->drawer->allocation.width;
y = wy;
break;
case DRAWER_RIGHT:
x = wx + drawer->drawer->allocation.width +
widget->allocation.width;
y = wy;
break;
}
gtk_widget_set_uposition(drawer->drawer,x,y);
gtk_widget_show(drawer->drawer);
PANEL_WIDGET(drawer->drawer)->state = PANEL_SHOWN;
}
return TRUE;
}
static void
destroy_drawer(GtkWidget *widget, gpointer data)
{
Drawer *drawer = data;
g_free(drawer);
}
Drawer *
create_drawer_applet(GtkWidget *window, GtkWidget * drawer_panel,
DrawerOrient orient)
{
GtkWidget *pixmap;
Drawer *drawer;
char *pixmap_name;
drawer = g_new(Drawer,1);
/*FIXME: drawers should have their own pixmaps I guess*/
switch(orient) {
case DRAWER_DOWN:
pixmap_name = gnome_unconditional_pixmap_file ("gnome-menu-down.xpm");
break;
case DRAWER_UP:
pixmap_name = gnome_unconditional_pixmap_file ("gnome-menu-up.xpm");
break;
case DRAWER_RIGHT:
pixmap_name = gnome_unconditional_pixmap_file ("gnome-menu-right.xpm");
break;
case DRAWER_LEFT:
pixmap_name = gnome_unconditional_pixmap_file ("gnome-menu-left.xpm");
break;
}
drawer->orient = orient;
/* main button */
drawer->button = gtk_event_box_new ();
/*make the pixmap*/
pixmap = gnome_create_pixmap_widget (window, drawer->button, pixmap_name);
gtk_widget_show(pixmap);
/*FIXME:this is not right, but it's how we can get the buttons to
be 48x48 (given the icons are 48x48)*/
gtk_widget_set_usize (drawer->button, pixmap->requisition.width,
pixmap->requisition.height);
/* put pixmap in button */
gtk_container_add (GTK_CONTAINER(drawer->button), pixmap);
gtk_widget_show (drawer->button);
drawer->drawer = drawer_panel;
if(PANEL_WIDGET(drawer->drawer)->state == PANEL_SHOWN)
gtk_widget_show(drawer->drawer);
else
gtk_widget_hide(drawer->drawer);
gtk_signal_connect (GTK_OBJECT (drawer->button), "clicked",
GTK_SIGNAL_FUNC (drawer_click), drawer);
gtk_signal_connect (GTK_OBJECT (drawer->button), "destroy",
GTK_SIGNAL_FUNC (destroy_drawer), drawer);
gtk_object_set_user_data(GTK_OBJECT(drawer->button),drawer);
g_free (pixmap_name);
return drawer;
}
Drawer *
create_empty_drawer_applet(GtkWidget *window, DrawerOrient orient)
{
if(orient == DRAWER_UP)
return create_drawer_applet(window,panel_widget_new(0,
PANEL_VERTICAL,
PANEL_DRAWER,
PANEL_EXPLICIT_HIDE,
PANEL_HIDDEN,
global_config.explicit_hide_step_size,
0, 0, 0, 0,
DROP_ZONE_LEFT),
orient);
else if(orient == DRAWER_DOWN)
return create_drawer_applet(window,panel_widget_new(0,
PANEL_VERTICAL,
PANEL_DRAWER,
PANEL_EXPLICIT_HIDE,
PANEL_HIDDEN,
global_config.explicit_hide_step_size,
0, 0, 0, 0,
DROP_ZONE_RIGHT),
orient);
else if(orient == DRAWER_LEFT)
return create_drawer_applet(window,panel_widget_new(0,
PANEL_HORIZONTAL,
PANEL_DRAWER,
PANEL_EXPLICIT_HIDE,
PANEL_HIDDEN,
global_config.explicit_hide_step_size,
0, 0, 0, 0,
DROP_ZONE_LEFT),
orient);
else if(orient == DRAWER_RIGHT)
return create_drawer_applet(window,panel_widget_new(0,
PANEL_HORIZONTAL,
PANEL_DRAWER,
PANEL_EXPLICIT_HIDE,
PANEL_HIDDEN,
global_config.explicit_hide_step_size,
0, 0, 0, 0,
DROP_ZONE_RIGHT),
orient);
}
/*FIXME: change orientation!*/
#if 0
static void
set_orientation(GtkWidget *window, Menu *menu)
{
GtkWidget *pixmap;
char *pixmap_name;
if(!menu || !menu->path)
return;
if (strcmp (menu->path, ".") == 0)
switch (menu->orient) {
case MENU_DOWN:
pixmap_name = gnome_unconditional_pixmap_file(
"gnome-menu-down.xpm");
break;
case MENU_UP:
pixmap_name = gnome_unconditional_pixmap_file(
"gnome-menu-up.xpm");
break;
case MENU_RIGHT:
pixmap_name = gnome_unconditional_pixmap_file(
"gnome-menu-right.xpm");
break;
case MENU_LEFT:
pixmap_name = gnome_unconditional_pixmap_file(
"gnome-menu-left.xpm");
break;
}
else
/*FIXME: these guys need arrows as well*/
pixmap_name = gnome_unconditional_pixmap_file ("panel-folder.xpm");
pixmap=GTK_BUTTON(menu->button)->child;
gtk_container_remove(GTK_CONTAINER(menu->button),pixmap);
gtk_widget_destroy(pixmap);
/*make the pixmap*/
pixmap = gnome_create_pixmap_widget (window,menu->button,pixmap_name);
gtk_container_add (GTK_CONTAINER(menu->button), pixmap);
gtk_widget_show (pixmap);
g_free(pixmap_name);
}
#endif
#ifndef DRAWER_H
#define DRAWER_H
BEGIN_GNOME_DECLS
typedef enum {
DRAWER_UP,
DRAWER_LEFT,
DRAWER_RIGHT,
DRAWER_DOWN
} DrawerOrient;
typedef struct {
GtkWidget *button;
GtkWidget *drawer;
DrawerOrient orient;
} Drawer;
Drawer * create_drawer_applet(GtkWidget *window ,GtkWidget * drawer_panel,
DrawerOrient orient);
END_GNOME_DECLS
#endif
......@@ -12,9 +12,9 @@
#include "panel.h"
#include "panel_config_global.h"
#include "menu.h"
#include "drawer.h"
GList *panels = NULL;
GList *drawers = NULL;
GList *applets = NULL;
extern GtkWidget * root_menu;
......@@ -49,14 +49,15 @@ load_applet(char *id, char *params, int pos, int panel)
register_toy(menu->button,menu->menu,MENU_ID,params,pos,
panel,APPLET_HAS_PROPERTIES,APPLET_MENU);
}
}
} else if(strcmp(id,DRAWER_ID) == 0) {
Drawer *drawer;
void
load_drawer(char *name, char *iconopen, char *iconclosed, int step_size,
int pos, int panel)
{
/*FIXME: drawers*/
/*FIXME: create an applet, if params is NULL create a whole
new panel*/
register_toy(drawer->button,drawer->drawer,DRAWER_ID,params,
pos, panel,APPLET_HAS_PROPERTIES,APPLET_MENU);
}
}
static void
......@@ -72,47 +73,6 @@ load_default_applets(void)
/*FIXME: fix applet loading with corba*/
}
static void
init_user_drawers(void)
{
/*FIXME: DRAWERS*/
/*
char *drawer_name;
char *drawer_iconopen;
char *drawer_iconclosed;
int pos,panel;
int step_size;
char buf[256];
int count,num;
count=gnome_config_get_int("/panel/Config/drawer_count=0");
for(num=1;num<=count;num++) {
sprintf(buf,"/panel/Drawer_%d/name=Drawer",num);
drawer_name = gnome_config_get_string(buf);
sprintf(buf,"/panel/Drawer_%d/iconopen=",num);
drawer_iconopen = gnome_config_get_string(buf);
sprintf(buf,"/panel/Drawer_%d/iconclosed=",num);
drawer_iconclosed = gnome_config_get_string(buf);
sprintf(buf,"/panel/Drawer_%d/step_size=%d",num,
DEFAULT_STEP_SIZE);
step_size = gnome_config_get_int(buf);
sprintf(buf,"/panel/Drawer_%d/geometry=%d",num,
PANEL_UNKNOWN_APPLET_POSITION);
pos = gnome_config_get_int(buf);
sprintf(buf,"/panel/Drawer_%d/panel=0",num);
panel = gnome_config_get_int(buf);
load_drawer(drawer_name,drawer_iconopen,drawer_iconclosed,
step_size,pos,panel);
g_free(drawer_name);
g_free(drawer_iconopen);
g_free(drawer_iconclosed);
}
*/
}
static void
init_user_applets(void)
{
......@@ -300,7 +260,6 @@ main(int argc, char **argv)
global_config.minimized_size=gnome_config_get_int(buf);
init_user_panels();
init_user_drawers();
init_user_applets();
panel_tooltips = gtk_tooltips_new();
......
......@@ -31,8 +31,6 @@ int show_small_icons = TRUE;
extern GlobalConfig global_config;
static PanelCmdFunc panel_cmd_func;
typedef struct {
char *translated;
char *original_id;
......@@ -131,13 +129,6 @@ add_dir_to_panel (GtkWidget *widget, void *data)
add_to_panel (MENU_ID, data);
}
void
add_drawer (GtkWidget *widget, void *data)
{
/*FIXME: add drawer*/
}
static GtkWidget *
create_menu_at (GtkWidget *window, char *menudir, int create_app_menu)
{
......@@ -364,11 +355,16 @@ applet_item_destroy(AppletItem *ai)
g_free(ai);
}
static void
add_applet_to_panel_data(GtkWidget *widget, gpointer data)
{
add_to_panel((char *)data, NULL);
}
static void
add_applet_to_panel(GtkWidget *widget, gpointer data)
{
add_to_panel(gtk_object_get_user_data(GTK_OBJECT(widget)),
NULL); /* NULL means request default params */
add_to_panel(gtk_object_get_user_data(GTK_OBJECT(widget)), NULL);
}
static void
......@@ -435,13 +431,11 @@ create_applets_menu(void)
GList *applets_list;
return gtk_menu_new();
/*FIXME: somehow fix this*/
#if 0
/* Get list of applet types */
cmd.cmd = PANEL_CMD_GET_APPLET_TYPES;
list = (*panel_cmd_func) (&cmd);
/*FIXME: */
list = NULL;
/* Now translate and sort them */
......@@ -462,7 +456,6 @@ create_applets_menu(void)
g_list_free(applets_list);
return menu;
#endif
}
static GtkWidget *
......@@ -477,17 +470,28 @@ create_panel_submenu (GtkWidget *app_menu)
gtk_menu_append (GTK_MENU (menu), menuitem);
gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), app_menu);
menuitem = gtk_menu_item_new ();
/*FIXME: */
/*menuitem = gtk_menu_item_new ();
setup_menuitem (menuitem, 0, _("Add applet"));
gtk_menu_append (GTK_MENU (menu), menuitem);
gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem),
create_applets_menu());
create_applets_menu());*/
add_menu_separator(menu);
menuitem = gtk_menu_item_new ();
setup_menuitem (menuitem, 0, _("Add main menu"));
gtk_menu_append (GTK_MENU (menu), menuitem);
gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
(GtkSignalFunc) add_applet_to_panel_data,
MENU_ID);
menuitem = gtk_menu_item_new ();
setup_menuitem (menuitem, 0, _("Add drawer"));
gtk_menu_append (GTK_MENU (menu), menuitem);
gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
(GtkSignalFunc) add_drawer, 0);
gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
(GtkSignalFunc) add_applet_to_panel_data,
DRAWER_ID);
add_menu_separator(menu);
......@@ -543,7 +547,6 @@ static Menu *
create_panel_menu (GtkWidget *window, char *menudir, int main_menu,
MenuOrient orient)
{
GtkWidget *button;
GtkWidget *pixmap;
Menu *menu;
GtkWidget *app_menu;
......@@ -638,6 +641,10 @@ create_menu_applet(GtkWidget *window, char *arguments, MenuOrient orient)
char *menu_base = gnome_unconditional_datadir_file ("apps");
char *this_menu;
/*if null, let's put the main menu up*/
if (arguments == NULL)
arguments = ".";
if (*arguments == '/')
this_menu = g_strdup (arguments);
else
......
......@@ -52,7 +52,7 @@ panel_widget_init (PanelWidget *panel_widget)
panel_widget->leave_notify_timer_tag = 0;
panel_widget->currently_dragged_applet = NULL;
panel_widget->drawer_drop_zone = NULL;
panel_widget->drawer_drop_zone_pos = DRAWER_LEFT;
panel_widget->drawer_drop_zone_pos = DROP_ZONE_LEFT;
}
static void
......@@ -964,18 +964,6 @@ panel_widget_new (gint size,
gtk_widget_get_events(GTK_WIDGET(panel)) |
GDK_BUTTON_RELEASE_MASK);
panel->thick = PANEL_CELL_SIZE;
/*sanity sets, ignore settings that would cause bad behaviour*/
if(snapped == PANEL_FREE) {
panel->size = size;
panel->mode = PANEL_EXPLICIT_HIDE;
} else if(snapped == PANEL_DRAWER) {
panel->size = PANEL_DRAWER_DROP_TARGET_SIZE;
panel->mode = PANEL_EXPLICIT_HIDE;
} else {
panel->size = PANEL_MAX;
}
panel->table = gtk_table_new(3,3,FALSE);
gtk_container_add(GTK_CONTAINER(panel),panel->table);
......@@ -1049,6 +1037,25 @@ panel_widget_new (gint size,
panel->minimized_size = minimized_size;
panel->minimize_delay = minimize_delay;
panel->thick = PANEL_CELL_SIZE;
/*sanity sets, ignore settings that would/might cause bad behaviour*/
if(snapped == PANEL_FREE) {
panel->size = size;
panel->mode = PANEL_EXPLICIT_HIDE;
if(panel->state == PANEL_HIDDEN_LEFT ||
panel->state == PANEL_HIDDEN_RIGHT)
panel->state = PANEL_HIDDEN;
} else if(snapped == PANEL_DRAWER) {
panel->size = PANEL_DRAWER_DROP_TARGET_SIZE;
panel->mode = PANEL_EXPLICIT_HIDE;
if(panel->state == PANEL_HIDDEN_LEFT ||
panel->state == PANEL_HIDDEN_RIGHT)
panel->state = PANEL_HIDDEN;
} else {
panel->size = PANEL_MAX;
}
/*sanity check*/
if(panel->mode == PANEL_EXPLICIT_HIDE && panel->state == PANEL_HIDDEN)
panel->state = PANEL_SHOWN;
......@@ -1303,13 +1310,13 @@ panel_widget_add (PanelWidget *panel, GtkWidget *applet, gint pos)
if(panel->snapped == PANEL_DRAWER) {
if(pos >= panel->size &&
panel->drawer_drop_zone_pos == DRAWER_LEFT) {
panel->drawer_drop_zone_pos == DROP_ZONE_LEFT) {
i = panel->size++;
panel_widget_set_size(panel,panel->size);
} else {
if(pos >= panel->size)
pos = panel->size-1;
if(panel->drawer_drop_zone_pos == DRAWER_LEFT)
if(panel->drawer_drop_zone_pos == DROP_ZONE_LEFT)
while(pos<PANEL_MAX &&
panel->applets[pos].applet ==
panel->drawer_drop_zone)
......@@ -1496,7 +1503,6 @@ panel_widget_change_params(PanelWidget *panel,
{
/*FIXME: change drop_zone_pos!!!!!!!!*/
PanelOrientation oldorient;
int i;
g_return_if_fail(panel);
g_return_if_fail(GTK_WIDGET_REALIZED(GTK_WIDGET(panel)));
......@@ -1530,6 +1536,45 @@ panel_widget_change_params(PanelWidget *panel,
if(panel->mode == PANEL_EXPLICIT_HIDE && panel->state == PANEL_HIDDEN)
panel->state = PANEL_SHOWN;
if(panel->snapped == PANEL_DRAWER &&
drop_zone_pos != panel->drawer_drop_zone_pos) {
int i;
if(drop_zone_pos == DROP_ZONE_LEFT) {
for(i=PANEL_DRAWER_DROP_TARGET_SIZE;i<panel->size;i++) {
panel->applets[i-PANEL_DRAWER_DROP_TARGET_SIZE].
applet = panel->applets[i].applet;
panel->applets[i-PANEL_DRAWER_DROP_TARGET_SIZE].
cells = panel->applets[i].cells;
}
for(i=panel->size - PANEL_DRAWER_DROP_TARGET_SIZE;
i<panel->size;i++) {
panel->applets[i].applet =
panel->drawer_drop_zone;
panel->applets[i].cells =
PANEL_DRAWER_DROP_TARGET_SIZE;
}
} else {
for(i=panel->size-1-PANEL_DRAWER_DROP_TARGET_SIZE;
i>=0;i++) {
panel->applets[i].applet =
panel->applets[i+
PANEL_DRAWER_DROP_TARGET_SIZE].applet;
panel->applets[i].cells =
panel->applets[i+
PANEL_DRAWER_DROP_TARGET_SIZE].cells;
}
for(i=0;i<PANEL_DRAWER_DROP_TARGET_SIZE;i++) {
panel->applets[i].applet =
panel->drawer_drop_zone;
panel->applets[i].cells =
PANEL_DRAWER_DROP_TARGET_SIZE;
}
}
for(i=0;i<panel->size;i+=panel->applets[i].cells)
panel_widget_applet_put(panel,i);
}
panel->drawer_drop_zone_pos = drop_zone_pos;
panel_widget_set_size(panel,panel->size);
/*if(oldorient != panel->orient)
......
......@@ -50,8 +50,8 @@ typedef enum {
PANEL_HIDDEN_LEFT
} PanelState;
typedef enum {
DRAWER_LEFT,
DRAWER_RIGHT
DROP_ZONE_LEFT,
DROP_ZONE_RIGHT
} DrawerDropZonePos;
struct _AppletRecord
......
......@@ -34,7 +34,6 @@ static menu_count=0; /*how many "menu" applets we have ....*/
GDK_POINTER_MOTION_HINT_MASK)
extern GList *panels;
extern GList *drawers;
extern GList *applets;
extern GtkTooltips *panel_tooltips;
......@@ -197,43 +196,6 @@ save_panel_configuration(gpointer data, gpointer user_data)
g_free(path);
}
static void
save_drawer_configuration(gpointer data, gpointer user_data)
{
/*FIXME: drawers*/
/*char *path;
char *fullpath;
char buf[256];
GtkWidget *widget = data;
int *num = user_data;
sprintf(buf, "_%d/", (*num)++);
path = g_copy_strings("/panel/Drawer", buf, NULL);
fullpath = g_copy_strings(path,"name",NULL);
gnome_config_set_string(fullpath, drawer->name);
g_free(fullpath);
fullpath = g_copy_strings(path,"iconopen",NULL);
gnome_config_set_string(fullpath, drawer->iconopen);
g_free(fullpath);
fullpath = g_copy_strings(path,"iconclosed",NULL);
gnome_config_set_string(fullpath, drawer->iconclosed);
g_free(fullpath);
fullpath = g_copy_strings(path,"geometry",NULL);
gnome_config_set_int(fullpath, pos);
g_free(fullpath);
fullpath = g_copy_strings(path,"step_size",NULL);
gnome_config_set_int(fullpath, drawer->panel->step_size);
g_free(fullpath);
g_free(path);*/
}
static void
destroy_widget_list(gpointer data, gpointer user_data)
{
......@@ -277,9 +239,6 @@ panel_session_save (GnomeClient *client,
g_list_foreach(applets,save_applet_configuration,&num);
gnome_config_set_int("/panel/Config/applet_count",num-1);
num = 1;
/* g_list_foreach(drawers,save_drawer_configuration,&num); */
gnome_config_set_int("/panel/Config/drawer_count",num-1);
num = 1;
g_list_foreach(panels,save_panel_configuration,&num);
gnome_config_set_int("/panel/Config/panel_count",num-1);
......@@ -298,7 +257,6 @@ panel_session_save (GnomeClient *client,
if(is_shutdown) {
/*FIXME: tell applets to go kill themselves*/
g_list_foreach(drawers,destroy_widget_list,NULL);
g_list_foreach(panels,destroy_widget_list,NULL);
gtk_widget_unref(applet_menu);
......@@ -648,11 +606,3 @@ register_toy(GtkWidget *applet,
printf ("The window id for %s is: %d\n",id, GDK_WINDOW_XWINDOW (eventbox->window));
}
static void
create_drawer(char *name, char *iconopen, char* iconclosed, int step_size,
int pos, int drawer)
{
/*FIXME: add drawers*/
return;
}
......@@ -7,11 +7,11 @@
BEGIN_GNOME_DECLS
#define MENU_ID "Menu"
#define LAUNCHER_ID "Launcher"
/*FIXME: maybe add a temporary launcher but these will be provided by the
filemanager*/
/*#define LAUNCHER_ID "Launcher"*/
#define DRAWER_ID "Drawer"
/*FIXME: maintain two global step sizes, one for autohide, one for
drawers, and explicit (side) hide panels*/
#define DEFAULT_AUTO_HIDE_STEP_SIZE 10
#define DEFAULT_EXPLICIT_HIDE_STEP_SIZE 50
......@@ -19,7 +19,7 @@ BEGIN_GNOME_DECLS
#define DEFAULT_MINIMIZE_DELAY 300
/* number of pixels it'll stick up from the bottom when using
* PANEL_AUTO_HIDE */
PANEL_AUTO_HIDE */
#define DEFAULT_MINIMIZED_SIZE 6
#define DEFAULT_PANEL_NUM 0
......@@ -84,11 +84,6 @@ void apply_global_config(void);
/*these are in main.c*/
void load_applet(char *id, char *params, int pos, int panel);
void load_drawer(char *name, char *iconopen, char *iconclosed, int step_size,
int pos, int panel);
END_GNOME_DECLS
#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