Commit d1344d2c authored by Alberts Muktupāvels's avatar Alberts Muktupāvels

panel: create launcher applet from drag data

parent 25700790
......@@ -1077,56 +1077,6 @@ ask_about_launcher (const char *file,
gtk_widget_show (dialog);
}
void
panel_launcher_create_from_info (PanelToplevel *toplevel,
PanelObjectPackType pack_type,
int pack_index,
gboolean exec_info,
const char *exec_or_uri,
const char *name,
const char *comment,
const char *icon)
{
GKeyFile *key_file;
char *location;
GError *error;
key_file = panel_key_file_new_desktop ();
/* set current language and the "C" locale to this name,
* this is kind of evil... */
panel_key_file_set_string (key_file, "Name", name);
panel_key_file_set_string (key_file, "Comment", comment);
panel_key_file_set_string (key_file, "Icon", icon);
panel_key_file_set_locale_string (key_file, "Name", name);
panel_key_file_set_locale_string (key_file, "Comment", comment);
panel_key_file_set_locale_string (key_file, "Icon", icon);
if (exec_info) {
panel_key_file_set_string (key_file, "Exec", exec_or_uri);
panel_key_file_set_string (key_file, "Type", "Application");
} else {
panel_key_file_set_string (key_file, "URL", exec_or_uri);
panel_key_file_set_string (key_file, "Type", "Link");
}
location = panel_make_unique_desktop_uri (NULL, exec_or_uri);
error = NULL;
if (panel_key_file_to_file (key_file, location, &error)) {
panel_launcher_create (toplevel, pack_type, pack_index, location);
} else {
panel_error_dialog (GTK_WINDOW (toplevel),
gtk_window_get_screen (GTK_WINDOW (toplevel)),
"cannot_save_launcher", TRUE,
_("Could not save launcher"),
error->message);
g_error_free (error);
}
g_key_file_free (key_file);
}
static void
panel_launcher_create_with_id (const char *toplevel_id,
PanelObjectPackType pack_type,
......
......@@ -33,14 +33,6 @@ void panel_launcher_create (PanelToplevel *toplevel,
PanelObjectPackType pack_type,
int pack_index,
const char *location);
void panel_launcher_create_from_info (PanelToplevel *toplevel,
PanelObjectPackType pack_type,
int pack_index,
gboolean exec_info,
const char *exec_or_uri,
const char *name,
const char *comment,
const char *icon);
void launcher_launch (Launcher *launcher,
GtkWidget *widget);
......
......@@ -384,6 +384,211 @@ reset_background (PanelToplevel *toplevel)
return TRUE;
}
typedef struct
{
PanelWidget *panel;
PanelObjectPackType pack_type;
int pack_index;
char *iid;
} InitialSetupData;
static InitialSetupData *
initial_setup_data_new (PanelWidget *panel,
PanelObjectPackType pack_type,
int pack_index,
const gchar *iid)
{
InitialSetupData *data;
data = g_new0 (InitialSetupData, 1);
data->panel = panel;
data->pack_type = pack_type;
data->pack_index = pack_index;
data->iid = g_strdup (iid);
return data;
}
static void
initial_setup_data_free (gpointer user_data)
{
InitialSetupData *data;
data = (InitialSetupData *) user_data;
g_free (data->iid);
g_free (data);
}
static void
initial_setup_dialog_cb (GpInitialSetupDialog *dialog,
gboolean canceled,
gpointer user_data)
{
InitialSetupData *data;
GVariant *initial_settings;
data = (InitialSetupData *) user_data;
if (canceled)
return;
initial_settings = gp_initital_setup_dialog_get_settings (dialog);
panel_applet_frame_create (data->panel->toplevel,
data->pack_type,
data->pack_index,
data->iid,
initial_settings);
g_variant_unref (initial_settings);
}
static void
ask_about_custom_launcher (const char *file,
PanelWidget *panel,
PanelObjectPackType pack_type)
{
int pack_index;
const char *iid;
InitialSetupData *initial_setup_data;
GVariantBuilder builder;
GVariant *variant;
GVariant *settings;
if (panel_lockdown_get_disable_command_line_s ())
return;
iid = "org.gnome.gnome-panel.launcher::custom-launcher";
pack_index = panel_widget_get_new_pack_index (panel, pack_type);
initial_setup_data = initial_setup_data_new (panel, pack_type, pack_index, iid);
g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
variant = g_variant_new_string ("Application");
g_variant_builder_add (&builder, "{sv}", "type", variant);
if (file != NULL)
{
variant = g_variant_new_string (file);
g_variant_builder_add (&builder, "{sv}", "command", variant);
}
settings = g_variant_builder_end (&builder);
g_variant_ref_sink (settings);
panel_applets_manager_open_initial_setup_dialog (iid,
settings,
NULL,
initial_setup_dialog_cb,
initial_setup_data,
initial_setup_data_free);
g_variant_unref (settings);
}
static void
create_launcher_from_info (PanelToplevel *toplevel,
PanelObjectPackType pack_type,
int pack_index,
gboolean exec_info,
const char *exec_or_uri,
const char *name,
const char *comment,
const char *icon)
{
GVariantBuilder builder;
GVariant *variant;
GVariant *settings;
g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
variant = g_variant_new_string (name);
g_variant_builder_add (&builder, "{sv}", "name", variant);
variant = g_variant_new_string (exec_or_uri);
g_variant_builder_add (&builder, "{sv}", "command", variant);
variant = g_variant_new_string (comment);
g_variant_builder_add (&builder, "{sv}", "comment", variant);
variant = g_variant_new_string (icon);
g_variant_builder_add (&builder, "{sv}", "icon", variant);
if (exec_info)
{
variant = g_variant_new_string ("Application");
g_variant_builder_add (&builder, "{sv}", "type", variant);
}
else
{
variant = g_variant_new_string ("Link");
g_variant_builder_add (&builder, "{sv}", "type", variant);
}
settings = g_variant_builder_end (&builder);
g_variant_ref_sink (settings);
panel_applet_frame_create (toplevel,
pack_type,
pack_index,
"org.gnome.gnome-panel.launcher::launcher",
settings);
g_variant_unref (settings);
}
static void
create_launcher_from_uri (PanelToplevel *toplevel,
PanelObjectPackType pack_type,
int pack_index,
const char *location)
{
char *no_uri;
char *new_location;
GVariantBuilder builder;
GVariant *variant;
GVariant *settings;
g_return_if_fail (location != NULL);
no_uri = NULL;
/* if we have an URI, it might contain escaped characters (? : etc)
* that might get unescaped on disk */
if (!g_ascii_strncasecmp (location, "file:", strlen ("file:")))
no_uri = g_filename_from_uri (location, NULL, NULL);
if (no_uri == NULL)
no_uri = g_strdup (location);
new_location = panel_launcher_get_filename (no_uri);
if (new_location == NULL)
new_location = no_uri;
else
g_free (no_uri);
g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
variant = g_variant_new_string (new_location);
g_variant_builder_add (&builder, "{sv}", "location", variant);
g_free (new_location);
settings = g_variant_builder_end (&builder);
g_variant_ref_sink (settings);
panel_applet_frame_create (toplevel,
pack_type,
pack_index,
"org.gnome.gnome-panel.launcher::launcher",
settings);
g_variant_unref (settings);
}
static gboolean
drop_url (PanelWidget *panel,
PanelObjectPackType pack_type,
......@@ -418,10 +623,14 @@ drop_url (PanelWidget *panel,
else
name = netscape_url[NETSCAPE_URL_NAME];
panel_launcher_create_from_info (panel->toplevel, pack_type, pack_index,
FALSE,
netscape_url[NETSCAPE_URL_URL],
name, comment, PANEL_ICON_REMOTE);
create_launcher_from_info (panel->toplevel,
pack_type,
pack_index,
FALSE,
netscape_url[NETSCAPE_URL_URL],
name,
comment,
PANEL_ICON_REMOTE);
g_free (comment);
g_strfreev (netscape_url);
......@@ -464,8 +673,14 @@ drop_uri (PanelWidget *panel,
comment = g_strdup_printf (_("Open '%s'"), buf);
g_free (buf);
panel_launcher_create_from_info (panel->toplevel, pack_type, pack_index,
FALSE, uri, name, comment, icon);
create_launcher_from_info (panel->toplevel,
pack_type,
pack_index,
FALSE,
uri,
name,
comment,
icon);
g_free (name);
g_free (comment);
......@@ -504,31 +719,34 @@ drop_nautilus_desktop_uri (PanelWidget *panel,
g_free (uri_tmp);
g_object_unref (file);
panel_launcher_create_from_info (panel->toplevel,
pack_type, pack_index,
TRUE, /* is_exec? */
"nautilus", /* exec */
name, /* name */
_("Open your personal folder"), /* comment */
PANEL_ICON_HOME); /* icon name */
create_launcher_from_info (panel->toplevel,
pack_type,
pack_index,
TRUE, /* is_exec? */
"nautilus", /* exec */
name, /* name */
_("Open your personal folder"), /* comment */
PANEL_ICON_HOME); /* icon name */
g_free (name);
} else if (strncmp (basename, "computer", strlen ("computer")) == 0)
panel_launcher_create_from_info (panel->toplevel,
pack_type, pack_index,
TRUE, /* is_exec? */
"nautilus computer://", /* exec */
_("Computer"), /* name */
_("Browse all local and remote disks and folders accessible from this computer"), /* comment */
PANEL_ICON_COMPUTER); /* icon name */
create_launcher_from_info (panel->toplevel,
pack_type,
pack_index,
TRUE, /* is_exec? */
"nautilus computer://", /* exec */
_("Computer"), /* name */
_("Browse all local and remote disks and folders accessible from this computer"), /* comment */
PANEL_ICON_COMPUTER); /* icon name */
else if (strncmp (basename, "network", strlen ("network")) == 0)
panel_launcher_create_from_info (panel->toplevel,
pack_type, pack_index,
TRUE, /* is_exec? */
"nautilus network://", /* exec */
_("Network"), /* name */
_("Browse bookmarked and local network locations"), /* comment */
PANEL_ICON_NETWORK); /* icon name */
create_launcher_from_info (panel->toplevel,
pack_type,
pack_index,
TRUE, /* is_exec? */
"nautilus network://", /* exec */
_("Network"), /* name */
_("Browse bookmarked and local network locations"), /* comment */
PANEL_ICON_NETWORK); /* icon name */
else
success = FALSE;
......@@ -641,9 +859,10 @@ drop_urilist (PanelWidget *panel,
!strcmp (mime, "application/x-desktop") ||
!strcmp (mime, "application/x-kde-app-info"))) {
if (panel_layout_is_writable ())
panel_launcher_create (panel->toplevel,
pack_type, pack_index,
uri);
create_launcher_from_uri (panel->toplevel,
pack_type,
pack_index,
uri);
else
success = FALSE;
} else if (type != G_FILE_TYPE_DIRECTORY && can_exec) {
......@@ -652,10 +871,8 @@ drop_urilist (PanelWidget *panel,
filename = g_file_get_path (file);
if (panel_layout_is_writable ())
/* executable and local, so add a
* launcher with it */
ask_about_launcher (filename, panel,
pack_type);
/* executable and local, so add a launcher with it */
ask_about_custom_launcher (filename, panel, pack_type);
else
success = FALSE;
g_free (filename);
......@@ -896,69 +1113,6 @@ drag_leave_cb (GtkWidget *widget,
panel_toplevel_queue_auto_hide (toplevel);
}
typedef struct
{
PanelWidget *panel;
PanelObjectPackType pack_type;
int pack_index;
gchar *iid;
} InitialSetupData;
static InitialSetupData *
initial_setup_data_new (PanelWidget *panel,
PanelObjectPackType pack_type,
int pack_index,
const gchar *iid)
{
InitialSetupData *data;
data = g_new0 (InitialSetupData, 1);
data->panel = panel;
data->pack_type = pack_type;
data->pack_index = pack_index;
data->iid = g_strdup (iid);
return data;
}
static void
initial_setup_data_free (gpointer user_data)
{
InitialSetupData *data;
data = (InitialSetupData *) user_data;
g_free (data->iid);
g_free (data);
}
static void
initial_setup_dialog_cb (GpInitialSetupDialog *dialog,
gboolean canceled,
gpointer user_data)
{
InitialSetupData *data;
GVariant *initial_settings;
data = (InitialSetupData *) user_data;
if (canceled)
return;
initial_settings = gp_initital_setup_dialog_get_settings (dialog);
panel_applet_frame_create (data->panel->toplevel,
data->pack_type,
data->pack_index,
data->iid,
initial_settings);
g_variant_unref (initial_settings);
}
static void
panel_receive_dnd_data (PanelWidget *panel,
guint info,
......
......@@ -208,6 +208,7 @@ gp_custom_launcher_applet_initial_setup_dialog (GpInitialSetupDialog *dialog)
{
GtkWidget *editor;
LauncherData *data;
GVariant *variant;
editor = gp_editor_new (FALSE);
......@@ -220,6 +221,13 @@ gp_custom_launcher_applet_initial_setup_dialog (GpInitialSetupDialog *dialog)
g_signal_connect (editor, "command-changed", G_CALLBACK (command_changed_cb), data);
g_signal_connect (editor, "comment-changed", G_CALLBACK (comment_changed_cb), data);
variant = gp_initital_setup_dialog_get_setting (dialog, "command");
if (variant != NULL)
{
gp_editor_set_command (GP_EDITOR (editor),
g_variant_get_string (variant, NULL));
}
icon_changed_cb (data->editor, data);
type_changed_cb (data->editor, data);
......
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