gplugin/gplugin
Clone
Summary
Browse
Changes
Graph
Prepare for the next round of development
3 months ago, Gary Kramlich
f0930af845ef
Prepare for the next round of development
Testing Done:
Ran `ninja turtles` and `ninja dist`
Reviewed at https://reviews.imfreedom.org/r/3027/
/*
* Copyright (C) 2021 Elliott Sales de Andrade <quantum.analyst@gmail.com>
*
* 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 3 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
* 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, see <http://www.gnu.org/licenses/>.
*/
#include
<glib/gi18n.h>
#define G_SETTINGS_ENABLE_BACKEND
#include
<gio/gsettingsbackend.h>
#include
<gtk/gtk.h>
#include
<gplugin.h>
#include
<gplugin-gtk.h>
#include
"gplugin-gtk-viewer-window.h"
/******************************************************************************
* Globals
*****************************************************************************/
static
gboolean
show_internal
=
FALSE
;
static
char
*
show_plugin
=
NULL
;
/******************************************************************************
* Helpers
*****************************************************************************/
static
gint
handle_local_options_cb
(
G_GNUC_UNUSED
GApplication
*
app
,
GVariantDict
*
options
,
G_GNUC_UNUSED
gpointer
data
)
{
gboolean
option
=
FALSE
;
if
(
g_variant_dict_lookup
(
options
,
"version"
,
"b"
,
&
option
,
NULL
))
{
/* Handle --version and exit with success. */
printf
(
"gplugin-gtk-viewer %s
\n
"
,
GPLUGIN_VERSION
);
return
0
;
}
return
-1
;
}
static
void
startup_cb
(
G_GNUC_UNUSED
GApplication
*
app
,
G_GNUC_UNUSED
gpointer
data
)
{
GPluginManager
*
manager
=
NULL
;
gplugin_init
(
GPLUGIN_CORE_FLAGS_NONE
);
manager
=
gplugin_manager_get_default
();
gplugin_manager_prepend_paths_from_environment
(
manager
,
"GPLUGIN_PLUGIN_PATH"
);
gplugin_manager_refresh
(
manager
);
}
static
void
shutdown_cb
(
G_GNUC_UNUSED
GApplication
*
app
,
G_GNUC_UNUSED
gpointer
data
)
{
gplugin_uninit
();
}
static
void
activate_cb
(
GApplication
*
app
)
{
GtkWindow
*
window
=
NULL
;
GPluginPlugin
*
plugin
=
NULL
;
g_return_if_fail
(
GTK_IS_APPLICATION
(
app
));
if
(
show_plugin
!=
NULL
)
{
GPluginManager
*
manager
=
NULL
;
manager
=
gplugin_manager_get_default
();
plugin
=
gplugin_manager_find_plugin
(
manager
,
show_plugin
);
if
(
!
GPLUGIN_IS_PLUGIN
(
plugin
))
{
g_error
(
"Failed to find plugin with ID %s"
,
show_plugin
);
}
}
window
=
gtk_application_get_active_window
(
GTK_APPLICATION
(
app
));
if
(
window
==
NULL
)
{
GPluginGtkView
*
view
=
NULL
;
GSettingsBackend
*
backend
=
NULL
;
/* clang-format off */
window
=
g_object_new
(
GPLUGIN_GTK_VIEWER_TYPE_WINDOW
,
"application"
,
app
,
NULL
);
/* clang-format on */
view
=
gplugin_gtk_viewer_window_get_view
(
GPLUGIN_GTK_VIEWER_WINDOW
(
window
));
gplugin_gtk_view_set_manager
(
view
,
gplugin_manager_get_default
());
gplugin_gtk_view_set_show_internal
(
view
,
show_internal
);
backend
=
g_memory_settings_backend_new
();
gplugin_gtk_view_set_settings_backend
(
view
,
backend
);
g_object_unref
(
backend
);
if
(
plugin
!=
NULL
)
{
gplugin_gtk_view_show_plugin
(
view
,
plugin
);
}
}
gtk_window_present
(
window
);
}
/******************************************************************************
* Main Stuff
*****************************************************************************/
/* clang-format off */
static
GOptionEntry
entries
[]
=
{
{
.
long_name
=
"internal"
,
.
short_name
=
'i'
,
.
flags
=
G_OPTION_FLAG_NONE
,
.
arg
=
G_OPTION_ARG_NONE
,
.
arg_data
=
&
show_internal
,
.
description
=
"Show internal plugins"
,
},
{
.
long_name
=
"show-plugin"
,
.
short_name
=
'p'
,
.
flags
=
G_OPTION_FLAG_NONE
,
.
arg
=
G_OPTION_ARG_STRING
,
.
arg_data
=
&
show_plugin
,
.
description
=
"Show page for a plugin on start"
,
},
{
.
long_name
=
"version"
,
.
short_name
=
'V'
,
.
flags
=
G_OPTION_FLAG_NONE
,
.
arg
=
G_OPTION_ARG_NONE
,
.
description
=
"Display the version and exit"
,
},
G_OPTION_ENTRY_NULL
};
/* clang-format on */
gint
main
(
gint
argc
,
gchar
**
argv
)
{
GtkApplication
*
app
=
NULL
;
gint
ret
;
/* Set up gettext translations. */
bindtextdomain
(
GETTEXT_PACKAGE
,
LOCALEDIR
);
bind_textdomain_codeset
(
GETTEXT_PACKAGE
,
"UTF-8"
);
textdomain
(
GETTEXT_PACKAGE
);
/* Prepare application and options. */
app
=
gtk_application_new
(
NULL
,
G_APPLICATION_DEFAULT_FLAGS
);
g_application_add_main_option_entries
(
G_APPLICATION
(
app
),
entries
);
g_application_add_option_group
(
G_APPLICATION
(
app
),
gplugin_get_option_group
());
g_signal_connect
(
app
,
"activate"
,
G_CALLBACK
(
activate_cb
),
NULL
);
g_signal_connect
(
app
,
"handle-local-options"
,
G_CALLBACK
(
handle_local_options_cb
),
NULL
);
g_signal_connect
(
app
,
"startup"
,
G_CALLBACK
(
startup_cb
),
NULL
);
g_signal_connect
(
app
,
"shutdown"
,
G_CALLBACK
(
shutdown_cb
),
NULL
);
/* Run and get exit code. */
ret
=
g_application_run
(
G_APPLICATION
(
app
),
argc
,
argv
);
g_object_unref
(
app
);
return
ret
;
}
#ifdef _WIN32
#include
<windows.h>
int
APIENTRY
WinMain
(
G_GNUC_UNUSED
HINSTANCE
hInstance
,
G_GNUC_UNUSED
HINSTANCE
hPrevInstance
,
G_GNUC_UNUSED
LPSTR
lpszCmdLine
,
G_GNUC_UNUSED
int
nCmdShow
)
{
/* NOTE: g_application_run ignores argc and argv on Windows. */
return
main
(
0
,
NULL
);
}
#endif