aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog16
-rw-r--r--data/GNOME_Epiphany_Automation.server.in2
-rwxr-xr-xdata/mime-types-permissions.xml1
-rw-r--r--lib/ephy-gui.c133
-rw-r--r--lib/ephy-gui.h6
5 files changed, 148 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index 18f8b9999..33119422e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+2005-08-15 Christian Persch <chpe@cvs.gnome.org>
+
+ * data/GNOME_Epiphany_Automation.server.in:
+
+ Remove "-s" argument which hasn't been supported for ages.
+
+ * data/mime-types-permissions.xml:
+
+ Add more mime types.
+
+ * lib/ephy-gui.c: (ephy_gui_menu_position_under_widget),
+ (ephy_gui_menu_position_on_toolbar):
+ * lib/ephy-gui.h:
+
+ Improve menu positioning on toolbar buttons.
+
2005-08-13 Christian Persch <chpe@cvs.gnome.org>
* embed/mozilla/ContentHandler.cpp:
diff --git a/data/GNOME_Epiphany_Automation.server.in b/data/GNOME_Epiphany_Automation.server.in
index ab04cb821..05b831039 100644
--- a/data/GNOME_Epiphany_Automation.server.in
+++ b/data/GNOME_Epiphany_Automation.server.in
@@ -1,6 +1,6 @@
<oaf_info>
-<oaf_server iid="OAFIID:GNOME_Epiphany_Automation_Factory" type="exe" location="epiphany -s">
+<oaf_server iid="OAFIID:GNOME_Epiphany_Automation_Factory" type="exe" location="epiphany">
<oaf_attribute name="repo_ids" type="stringv">
<item value="IDL:GNOME/ObjectFactory:1.0"/>
</oaf_attribute>
diff --git a/data/mime-types-permissions.xml b/data/mime-types-permissions.xml
index 320d3e1fe..76049eee3 100755
--- a/data/mime-types-permissions.xml
+++ b/data/mime-types-permissions.xml
@@ -151,6 +151,7 @@
<mime-type type="application/x-nautilus-link"/>
<mime-type type="application/x-netcdf"/>
<mime-type type="application/x-netscape-bookmarks"/>
+<mime-type type="application/x-ogg"/>
<mime-type type="application/x-oleo"/>
<mime-type type="application/x-palm-database"/>
<mime-type type="application/x-pdf"/>
diff --git a/lib/ephy-gui.c b/lib/ephy-gui.c
index 21c3bced2..cb80b89c5 100644
--- a/lib/ephy-gui.c
+++ b/lib/ephy-gui.c
@@ -37,6 +37,7 @@
#include <gtk/gtkstock.h>
#include <gtk/gtkmain.h>
#include <gtk/gtktreeselection.h>
+#include <gtk/gtktoolbar.h>
#include <unistd.h>
@@ -107,6 +108,14 @@ ephy_gui_menu_position_tree_selection (GtkMenu *menu,
/**
* ephy_gui_menu_position_under_widget:
+ * @menu:
+ * @x:
+ * @y:
+ * @push_in:
+ * @user_data: a #GtkWidget
+ *
+ * Positions @menu under (or over, depending on space available) the widget
+ * @user_data.
*/
void
ephy_gui_menu_position_under_widget (GtkMenu *menu,
@@ -115,24 +124,130 @@ ephy_gui_menu_position_under_widget (GtkMenu *menu,
gboolean *push_in,
gpointer user_data)
{
- GtkWidget *w = GTK_WIDGET (user_data);
- GtkRequisition requisition;
+ /* Adapted from gtktoolbar.c */
+ GtkWidget *widget = GTK_WIDGET (user_data);
+ GtkWidget *container;
+ GtkRequisition req;
+ GtkRequisition menu_req;
+ GdkRectangle monitor;
+ int monitor_num;
+ GdkScreen *screen;
+
+ g_return_if_fail (GTK_IS_WIDGET (widget));
- gdk_window_get_origin (w->window, x, y);
- gtk_widget_size_request (GTK_WIDGET (menu), &requisition);
+ container = gtk_widget_get_ancestor (widget, GTK_TYPE_CONTAINER);
+ g_return_if_fail (container != NULL);
- if (gtk_widget_get_direction (w) == GTK_TEXT_DIR_RTL)
+ gtk_widget_size_request (widget, &req);
+ gtk_widget_size_request (GTK_WIDGET (menu), &menu_req);
+
+ screen = gtk_widget_get_screen (GTK_WIDGET (menu));
+ monitor_num = gdk_screen_get_monitor_at_window (screen, widget->window);
+ if (monitor_num < 0)
+ monitor_num = 0;
+ gdk_screen_get_monitor_geometry (screen, monitor_num, &monitor);
+
+ gdk_window_get_origin (widget->window, x, y);
+ if (GTK_WIDGET_NO_WINDOW (widget))
{
- *x += w->allocation.x + w->allocation.width - requisition.width;
+ *x += widget->allocation.x;
+ *y += widget->allocation.y;
}
+
+ if (gtk_widget_get_direction (container) == GTK_TEXT_DIR_LTR)
+ *x += widget->allocation.width - req.width;
+ else
+ *x += req.width - menu_req.width;
+
+ if ((*y + widget->allocation.height + menu_req.height) <= monitor.y + monitor.height)
+ *y += widget->allocation.height;
+ else if ((*y - menu_req.height) >= monitor.y)
+ *y -= menu_req.height;
+ else if (monitor.y + monitor.height - (*y + widget->allocation.height) > *y)
+ *y += widget->allocation.height;
else
+ *y -= menu_req.height;
+
+ *push_in = FALSE;
+}
+
+/**
+ * ephy_gui_menu_position_under_widget:
+ * @menu:
+ * @x:
+ * @y:
+ * @push_in:
+ * @user_data: a #GtkWidget which has to be contained in (a widget on) a #GtkToolbar
+ *
+ * Positions @menu under (or over, depending on space available) the
+ * @user_data.
+ */
+void
+ephy_gui_menu_position_on_toolbar (GtkMenu *menu,
+ gint *x,
+ gint *y,
+ gboolean *push_in,
+ gpointer user_data)
+{
+ /* Adapted from gtktoolbar.c */
+ GtkWidget *widget = GTK_WIDGET (user_data);
+ GtkToolbar *toolbar;
+ GtkRequisition req;
+ GtkRequisition menu_req;
+ GdkRectangle monitor;
+ int monitor_num;
+ GdkScreen *screen;
+
+ g_return_if_fail (GTK_IS_WIDGET (widget));
+
+ toolbar = gtk_widget_get_ancestor (widget, GTK_TYPE_TOOLBAR);
+ g_return_if_fail (toolbar != NULL);
+
+ gtk_widget_size_request (widget, &req);
+ gtk_widget_size_request (GTK_WIDGET (menu), &menu_req);
+
+ screen = gtk_widget_get_screen (GTK_WIDGET (menu));
+ monitor_num = gdk_screen_get_monitor_at_window (screen, widget->window);
+ if (monitor_num < 0)
+ monitor_num = 0;
+ gdk_screen_get_monitor_geometry (screen, monitor_num, &monitor);
+
+ gdk_window_get_origin (widget->window, x, y);
+ if (GTK_WIDGET_NO_WINDOW (widget))
{
- *x += w->allocation.x;
+ *x += widget->allocation.x;
+ *y += widget->allocation.y;
}
- *y += w->allocation.y + w->allocation.height;
+ if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
+ {
+ if (gtk_widget_get_direction (GTK_WIDGET (toolbar)) == GTK_TEXT_DIR_LTR)
+ *x += widget->allocation.width - req.width;
+ else
+ *x += req.width - menu_req.width;
+
+ if ((*y + widget->allocation.height + menu_req.height) <= monitor.y + monitor.height)
+ *y += widget->allocation.height;
+ else if ((*y - menu_req.height) >= monitor.y)
+ *y -= menu_req.height;
+ else if (monitor.y + monitor.height - (*y + widget->allocation.height) > *y)
+ *y += widget->allocation.height;
+ else
+ *y -= menu_req.height;
+ }
+ else
+ {
+ if (gtk_widget_get_direction (GTK_WIDGET (toolbar)) == GTK_TEXT_DIR_LTR)
+ *x += widget->allocation.width;
+ else
+ *x -= menu_req.width;
+
+ if (*y + menu_req.height > monitor.y + monitor.height &&
+ *y + widget->allocation.height - monitor.y > monitor.y + monitor.height - *y)
+ *y += widget->allocation.height - menu_req.height;
+ }
- ephy_gui_sanitise_popup_position (menu, w, x, y);
+ *push_in = FALSE;
}
void
diff --git a/lib/ephy-gui.h b/lib/ephy-gui.h
index 6668a4598..6a7e6ab30 100644
--- a/lib/ephy-gui.h
+++ b/lib/ephy-gui.h
@@ -47,6 +47,12 @@ void ephy_gui_menu_position_under_widget (GtkMenu *menu,
gboolean *push_in,
gpointer user_data);
+void ephy_gui_menu_position_on_toolbar (GtkMenu *menu,
+ gint *x,
+ gint *y,
+ gboolean *push_in,
+ gpointer user_data);
+
void ephy_gui_menu_position_on_panel (GtkMenu *menu,
gint *x,
gint *y,