summaryrefslogtreecommitdiffstats
path: root/equipment.c
diff options
context:
space:
mode:
authorGravatar Lubomir I. Ivanov <neolit123@gmail.com>2012-09-29 21:13:05 +0300
committerGravatar Lubomir I. Ivanov <neolit123@gmail.com>2012-09-30 03:47:10 +0300
commit45d6d6ac7175cf0720e39937abac0d4088814cb8 (patch)
tree90c8191a057d3474fe303f6a55bced45b2b5ddaa /equipment.c
parentcfb1baa030c0fd0d20e3d47e03940b7e7f3f7809 (diff)
downloadsubsurface-45d6d6ac7175cf0720e39937abac0d4088814cb8.tar.gz
Keep the "Add/Edit Cylinder & Weight" dialogs on top
This is the same issue as 882cb159a46d5d9dbd0 (although now we don't have "Import XML Files" within a dialog). It applies when in the "Dive info" dialog. There is some sort of a GTK bug on Ubuntu 12.04 with GTK 2.24.10 that prevents us from using the gtk_window_set_accept_focus() and similar API to make the window behind fully inactive. The proposed portable solution is to completely disable the background window (NOTE: unless its the main window), disabling child controls (gtk_widget_set_sensitive) and making the top window "transient for" or putting it on top (gtk_window_set_transient_for). Still we do not want to hide the background window titlebar with gtk_window_set_decorated(), which makes it still clickable. Make this change to older code in gtk-gui.c as well. Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
Diffstat (limited to 'equipment.c')
-rw-r--r--equipment.c46
1 files changed, 30 insertions, 16 deletions
diff --git a/equipment.c b/equipment.c
index ccdee6268..503f238c5 100644
--- a/equipment.c
+++ b/equipment.c
@@ -1038,10 +1038,10 @@ static void ws_widget(GtkWidget *vbox, struct ws_widget *ws_widget, GtkListStore
ws_widget->weight = GTK_SPIN_BUTTON(widget);
}
-static int edit_cylinder_dialog(int index, cylinder_t *cyl, int w_idx)
+static int edit_cylinder_dialog(GtkWidget *w, int index, cylinder_t *cyl, int w_idx)
{
int success;
- GtkWidget *dialog, *vbox;
+ GtkWidget *dialog, *vbox, *parent;
struct cylinder_widget cylinder;
struct dive *dive;
@@ -1064,6 +1064,12 @@ static int edit_cylinder_dialog(int index, cylinder_t *cyl, int w_idx)
GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
NULL);
+ parent = gtk_widget_get_ancestor(w, GTK_TYPE_DIALOG);
+ if (parent) {
+ gtk_widget_set_sensitive(parent, FALSE);
+ gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(parent));
+ }
+
vbox = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
cylinder_widget(vbox, &cylinder, cylinder_model);
@@ -1082,14 +1088,15 @@ static int edit_cylinder_dialog(int index, cylinder_t *cyl, int w_idx)
}
gtk_widget_destroy(dialog);
-
+ if (parent)
+ gtk_widget_set_sensitive(parent, TRUE);
return success;
}
-static int edit_weightsystem_dialog(int index, weightsystem_t *ws, int w_idx)
+static int edit_weightsystem_dialog(GtkWidget *w, int index, weightsystem_t *ws, int w_idx)
{
int success;
- GtkWidget *dialog, *vbox;
+ GtkWidget *dialog, *vbox, *parent;
struct ws_widget weightsystem_widget;
struct dive *dive;
@@ -1112,6 +1119,12 @@ static int edit_weightsystem_dialog(int index, weightsystem_t *ws, int w_idx)
GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
NULL);
+ parent = gtk_widget_get_ancestor(w, GTK_TYPE_DIALOG);
+ if (parent) {
+ gtk_widget_set_sensitive(parent, FALSE);
+ gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(parent));
+ }
+
vbox = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
ws_widget(vbox, &weightsystem_widget, weightsystem_model);
@@ -1129,7 +1142,8 @@ static int edit_weightsystem_dialog(int index, weightsystem_t *ws, int w_idx)
}
gtk_widget_destroy(dialog);
-
+ if (parent)
+ gtk_widget_set_sensitive(parent, TRUE);
return success;
}
@@ -1145,7 +1159,7 @@ static int get_model_index(GtkListStore *model, GtkTreeIter *iter)
return index;
}
-static void edit_cb(GtkButton *button, int w_idx)
+static void edit_cb(GtkWidget *w, int w_idx)
{
int index;
GtkTreeIter iter;
@@ -1161,14 +1175,14 @@ static void edit_cb(GtkButton *button, int w_idx)
return;
index = get_model_index(model, &iter);
- if (!edit_cylinder_dialog(index, &cyl, w_idx))
+ if (!edit_cylinder_dialog(w, index, &cyl, w_idx))
return;
set_one_cylinder(&cyl, model, &iter);
repaint_dive();
}
-static void add_cb(GtkButton *button, int w_idx)
+static void add_cb(GtkWidget *w, int w_idx)
{
int index = cylinder_list[w_idx].max_index;
GtkTreeIter iter;
@@ -1177,7 +1191,7 @@ static void add_cb(GtkButton *button, int w_idx)
GtkTreeSelection *selection;
cylinder_t cyl;
- if (!edit_cylinder_dialog(index, &cyl, w_idx))
+ if (!edit_cylinder_dialog(w, index, &cyl, w_idx))
return;
gtk_list_store_append(model, &iter);
@@ -1231,7 +1245,7 @@ static void del_cb(GtkButton *button, int w_idx)
gtk_widget_set_sensitive(cylinder_list[w_idx].add, 1);
}
-static void ws_edit_cb(GtkButton *button, int w_idx)
+static void ws_edit_cb(GtkWidget *w, int w_idx)
{
int index;
GtkTreeIter iter;
@@ -1247,14 +1261,14 @@ static void ws_edit_cb(GtkButton *button, int w_idx)
return;
index = get_model_index(model, &iter);
- if (!edit_weightsystem_dialog(index, &ws, w_idx))
+ if (!edit_weightsystem_dialog(w, index, &ws, w_idx))
return;
set_one_weightsystem(&ws, model, &iter);
repaint_dive();
}
-static void ws_add_cb(GtkButton *button, int w_idx)
+static void ws_add_cb(GtkWidget *w, int w_idx)
{
int index = weightsystem_list[w_idx].max_index;
GtkTreeIter iter;
@@ -1263,7 +1277,7 @@ static void ws_add_cb(GtkButton *button, int w_idx)
GtkTreeSelection *selection;
weightsystem_t ws;
- if (!edit_weightsystem_dialog(index, &ws, w_idx))
+ if (!edit_weightsystem_dialog(w, index, &ws, w_idx))
return;
gtk_list_store_append(model, &iter);
@@ -1436,7 +1450,7 @@ static void row_activated_cb(GtkTreeView *tree_view,
GtkTreeViewColumn *column,
int w_idx)
{
- edit_cb(NULL, w_idx);
+ edit_cb(GTK_WIDGET(tree_view), w_idx);
}
static void ws_row_activated_cb(GtkTreeView *tree_view,
@@ -1444,7 +1458,7 @@ static void ws_row_activated_cb(GtkTreeView *tree_view,
GtkTreeViewColumn *column,
int w_idx)
{
- ws_edit_cb(NULL, w_idx);
+ ws_edit_cb(GTK_WIDGET(tree_view), w_idx);
}
GtkWidget *cylinder_list_widget(int w_idx)