aboutsummaryrefslogtreecommitdiffstats
path: root/devices.c
diff options
context:
space:
mode:
Diffstat (limited to 'devices.c')
-rw-r--r--devices.c78
1 files changed, 56 insertions, 22 deletions
diff --git a/devices.c b/devices.c
index 07de700..03316c7 100644
--- a/devices.c
+++ b/devices.c
@@ -10,13 +10,15 @@
/* ----------------------------------------------------------------- */
-static char mc_xml_start[] =
+static char media_xml[] =
"<ui>\n"
" <menubar name='MainMenu'>\n"
" <menu action='DevicesMenu'>\n"
-" <menu action='MediaChangeSubMenu'>\n";
-
-static char mc_xml_end[] =
+" <menu action='EjectMediaSubMenu'>\n"
+"%s"
+" </menu>\n"
+" <menu action='ChangeMediaSubMenu'>\n"
+"%s"
" </menu>\n"
" </menu>\n"
" </menubar>\n"
@@ -60,14 +62,30 @@ static void menu_cb_change_media(GtkAction *action, void *data)
gtk_widget_destroy(dialog);
}
+static void menu_cb_eject_media(GtkAction *action, void *data)
+{
+ struct qemu_window *win = data;
+ char name[32], cmd[128];
+
+ if (1 != sscanf(gtk_action_get_name(action), "EjectMedia_%31s", name))
+ return;
+ if (debug)
+ fprintf(stderr, "%s: %s\n", __FUNCTION__, name);
+
+ snprintf(cmd, sizeof(cmd), "eject %s", name);
+ monitor_append(win, cmd);
+ monitor_append(win, "info block");
+}
+
void devices_parse_info_block(struct qemu_window *win, char *str)
{
- char name[32], type[16], line[256], *file, *ptr;
+ char name[32], type[16], line[256], *file, *ptr, *xml;
char action[128], label[128];
- int removable, pos, xpos, len, rc;
- GtkActionEntry entry;
+ int removable, pos, len, rc, eject;
+ GtkActionEntry c_entry, e_entry;
+ char *c_xml = NULL, *e_xml = NULL;
+ int c_pos = 0, e_pos = 0;
GError *err = NULL;
- char *xml;
/* remove */
if (win->mc_id) {
@@ -81,12 +99,11 @@ void devices_parse_info_block(struct qemu_window *win, char *str)
}
/* start */
- memset(&entry, 0, sizeof(entry));
- entry.callback = G_CALLBACK(menu_cb_change_media);
- win->mc_ag = gtk_action_group_new("ChangeMediaActions");
-
- xpos = 0; xml = malloc(strlen(mc_xml_start)+1);
- xpos += sprintf(xml+xpos, "%s", mc_xml_start);
+ memset(&c_entry, 0, sizeof(c_entry));
+ c_entry.callback = G_CALLBACK(menu_cb_change_media);
+ memset(&e_entry, 0, sizeof(e_entry));
+ e_entry.callback = G_CALLBACK(menu_cb_eject_media);
+ win->mc_ag = gtk_action_group_new("MediaActions");
/* parse & build */
for (pos = 0;; pos += len) {
@@ -104,8 +121,10 @@ void devices_parse_info_block(struct qemu_window *win, char *str)
ptr = strchr(file, ' ');
if (ptr)
*ptr = 0;
+ eject = 1;
} else {
file = "<empty>";
+ eject = 0;
}
if (debug)
fprintf(stderr, "%s: %s (%s, %s) - [%s]\n",
@@ -113,16 +132,27 @@ void devices_parse_info_block(struct qemu_window *win, char *str)
snprintf(action, sizeof(action), "ChangeMedia_%s", name);
snprintf(label, sizeof(label), "%s (%s, %s)", name, type, file);
- xml = realloc(xml, xpos + 128);
- xpos += snprintf(xml+xpos, 128, " <menuitem action='%s'/>\n", action);
- entry.name = action;
- entry.label = label;
- gtk_action_group_add_actions(win->mc_ag, &entry, 1, win);
+ c_entry.name = action;
+ c_entry.label = label;
+ gtk_action_group_add_actions(win->mc_ag, &c_entry, 1, win);
+ c_xml = realloc(c_xml, c_pos + 128);
+ c_pos += snprintf(c_xml+c_pos, 128, " <menuitem action='%s'/>\n", action);
+
+ if (eject) {
+ snprintf(action, sizeof(action), "EjectMedia_%s", name);
+ snprintf(label, sizeof(label), "%s (%s, %s)", name, type, file);
+ e_entry.name = action;
+ e_entry.label = label;
+ gtk_action_group_add_actions(win->mc_ag, &e_entry, 1, win);
+ e_xml = realloc(e_xml, e_pos + 128);
+ e_pos += snprintf(e_xml+e_pos, 128, " <menuitem action='%s'/>\n", action);
+ }
}
- /* finish */
- xml = realloc(xml, xpos + strlen(mc_xml_end)+1);
- xpos += sprintf(xml+xpos, "%s", mc_xml_end);
+ xml = malloc(e_pos + c_pos + strlen(media_xml));
+ sprintf(xml, media_xml,
+ e_pos ? e_xml : "",
+ c_pos ? c_xml : "");
/* add */
if (debug)
@@ -133,4 +163,8 @@ void devices_parse_info_block(struct qemu_window *win, char *str)
g_message("building media change menu failed: %s", err->message);
g_error_free(err);
}
+
+ free(c_xml);
+ free(e_xml);
+ free(xml);
}