aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/commands.c8
-rw-r--r--src/status-bar.c114
-rw-r--r--src/status-bar.h36
-rw-r--r--src/uzbl-core.c115
-rw-r--r--src/uzbl-core.h5
-rw-r--r--src/variables.c10
6 files changed, 203 insertions, 85 deletions
diff --git a/src/commands.c b/src/commands.c
index c4f63af..1af351c 100644
--- a/src/commands.c
+++ b/src/commands.c
@@ -106,13 +106,9 @@ void
toggle_status (WebKitWebView* page, GArray *argv, GString *result) {
(void)page; (void)argv; (void)result;
- if (uzbl.behave.show_status) {
- gtk_widget_hide(uzbl.gui.mainbar);
- } else {
- gtk_widget_show(uzbl.gui.mainbar);
- }
uzbl.behave.show_status = !uzbl.behave.show_status;
- update_title();
+
+ cmd_set_status();
}
/*
diff --git a/src/status-bar.c b/src/status-bar.c
new file mode 100644
index 0000000..6365505
--- /dev/null
+++ b/src/status-bar.c
@@ -0,0 +1,114 @@
+#include "status-bar.h"
+
+G_DEFINE_TYPE (UzblStatusBar, uzbl_status_bar, GTK_TYPE_HBOX)
+
+static void uzbl_status_bar_size_allocate (GtkWidget *widget,
+ GtkAllocation *allocation);
+
+static void
+uzbl_status_bar_class_init (UzblStatusBarClass *class) {
+ GtkWidgetClass *widget_class;
+
+ widget_class = (GtkWidgetClass*) class;
+
+ /* override the size_allocate method */
+ widget_class->size_allocate = uzbl_status_bar_size_allocate;
+}
+
+static void
+uzbl_status_bar_init (UzblStatusBar *status_bar) {
+ gtk_box_set_homogeneous (GTK_BOX(status_bar), FALSE);
+ gtk_box_set_spacing (GTK_BOX(status_bar), 0);
+
+ /* create left panel */
+ status_bar->left_label = gtk_label_new ("");
+ gtk_label_set_selectable (GTK_LABEL(status_bar->left_label), TRUE);
+ gtk_misc_set_alignment (GTK_MISC(status_bar->left_label), 0, 0);
+ gtk_misc_set_padding (GTK_MISC(status_bar->left_label), 2, 2);
+ gtk_label_set_ellipsize(GTK_LABEL(status_bar->left_label), PANGO_ELLIPSIZE_END);
+
+ /* create right panel */
+ status_bar->right_label = gtk_label_new ("");
+ gtk_label_set_selectable(GTK_LABEL(status_bar->right_label), TRUE);
+ gtk_misc_set_alignment (GTK_MISC(status_bar->right_label), 1, 0);
+ gtk_misc_set_padding (GTK_MISC(status_bar->right_label), 2, 2);
+ gtk_label_set_ellipsize(GTK_LABEL(status_bar->right_label), PANGO_ELLIPSIZE_START);
+
+ /* add the labels to the status bar */
+ gtk_box_pack_start (GTK_BOX (status_bar), status_bar->left_label, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (status_bar), status_bar->right_label, TRUE, TRUE, 0);
+}
+
+static void
+uzbl_status_bar_size_allocate (GtkWidget *widget,
+ GtkAllocation *allocation) {
+ GtkRequisition left_requisition, right_requisition;
+ GtkAllocation left_allocation, right_allocation;
+ UzblStatusBar *status_bar = UZBL_STATUS_BAR(widget);
+
+ int left_natural_width;
+
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkRequisition left_requisition_nat;
+
+ gtk_widget_get_preferred_size (status_bar->left_label, &left_requisition, &left_requisition_nat);
+ gtk_widget_get_preferred_size (status_bar->right_label, &right_requisition, NULL);
+
+ left_natural_width = left_requisition_nat.width;
+#else
+ gtk_widget_size_request(status_bar->left_label, &left_requisition);
+ gtk_widget_size_request(status_bar->left_label, &right_requisition);
+
+ PangoLayout *left_layout = gtk_label_get_layout(GTK_LABEL(status_bar->left_label));
+ pango_layout_get_pixel_size(left_layout, &left_natural_width, NULL);
+#endif
+
+ gtk_widget_set_allocation (widget, allocation);
+
+ /* the entire allocation, minus the space needed for the right label's ellipsis */
+ int left_max_width = allocation->width - right_requisition.width;
+
+ /* the left label gets max(as much space as it needs, the status bar's allocation) */
+ left_allocation.width = (left_max_width > left_natural_width) ? left_natural_width : left_max_width;
+
+ /* the right label gets whatever is left over. it gets at least enough space
+ * for an ellipsis, it seems that it will just display everything if you give
+ * it 0. */
+ right_allocation.width = allocation->width - left_allocation.width;
+
+ /* don't fight guys, you can both have as much vertical space as you want! */
+ left_allocation.height = right_allocation.height = allocation->height;
+
+ left_allocation.x = 0;
+ right_allocation.x = left_allocation.width;
+
+ left_allocation.y = right_allocation.y = allocation->y;
+
+ gtk_widget_size_allocate (status_bar->left_label, &left_allocation);
+ gtk_widget_size_allocate (status_bar->right_label, &right_allocation);
+}
+
+void
+uzbl_status_bar_update_left(GtkWidget *widget, const gchar *format) {
+ UzblStatusBar *status_bar = UZBL_STATUS_BAR(widget);
+
+ if(!format || !GTK_IS_LABEL(status_bar->left_label))
+ return;
+
+ gtk_label_set_markup(GTK_LABEL(status_bar->left_label), format);
+}
+
+void
+uzbl_status_bar_update_right(GtkWidget *widget, const gchar *format) {
+ UzblStatusBar *status_bar = UZBL_STATUS_BAR(widget);
+
+ if(!format || !GTK_IS_LABEL(status_bar->right_label))
+ return;
+
+ gtk_label_set_markup(GTK_LABEL(status_bar->right_label), format);
+}
+
+GtkWidget *
+uzbl_status_bar_new() {
+ return g_object_new (UZBL_TYPE_STATUS_BAR, NULL);
+}
diff --git a/src/status-bar.h b/src/status-bar.h
new file mode 100644
index 0000000..e972701
--- /dev/null
+++ b/src/status-bar.h
@@ -0,0 +1,36 @@
+#ifndef __UZBL_STATUS_BAR_H__
+#define __UZBL_STATUS_BAR_H__
+
+#include <gtk/gtk.h>
+
+#define UZBL_TYPE_STATUS_BAR (uzbl_status_bar_get_type ())
+#define UZBL_STATUS_BAR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), UZBL_TYPE_STATUS_BAR, UzblStatusBar))
+#define UZBL_STATUS_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), UZBL_TYPE_STATUS_BAR, UZblStatusBarClass))
+#define UZBL_IS_STATUS_BAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), UZBL_TYPE_STATUS_BAR))
+#define UZBL_IS_STATUS_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), UZBL_TYPE_STATUS_BAR))
+#define UZBL_STATUS_BAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), UZBL_TYPE_STATUS_BAR, UzblStatusBarClass))
+
+typedef struct _UzblStatusBar UzblStatusBar;
+typedef struct _UzblStatusBarClass UzblStatusBarClass;
+
+struct _UzblStatusBar {
+ GtkHBox hbox;
+
+ GtkWidget *left_label;
+ GtkWidget *right_label;
+};
+
+struct _UzblStatusBarClass {
+ GtkHBoxClass parent_class;
+};
+
+GType uzbl_status_bar_get_type (void) G_GNUC_CONST;
+GtkWidget * uzbl_status_bar_new ();
+
+void
+uzbl_status_bar_update_left(GtkWidget *widget, const gchar *format);
+
+void
+uzbl_status_bar_update_right(GtkWidget *widget, const gchar *format);
+
+#endif
diff --git a/src/uzbl-core.c b/src/uzbl-core.c
index 6d2b7b1..598abdf 100644
--- a/src/uzbl-core.c
+++ b/src/uzbl-core.c
@@ -710,27 +710,27 @@ parse_command(const char *cmd, const char *params, GString *result) {
void
move_statusbar() {
- if (!uzbl.gui.scrolled_win && !uzbl.gui.mainbar)
+ if (!uzbl.gui.scrolled_win && !uzbl.gui.status_bar)
return;
g_object_ref(uzbl.gui.scrolled_win);
- g_object_ref(uzbl.gui.mainbar);
+ g_object_ref(uzbl.gui.status_bar);
gtk_container_remove(GTK_CONTAINER(uzbl.gui.vbox), uzbl.gui.scrolled_win);
- gtk_container_remove(GTK_CONTAINER(uzbl.gui.vbox), uzbl.gui.mainbar);
+ gtk_container_remove(GTK_CONTAINER(uzbl.gui.vbox), uzbl.gui.status_bar);
if(uzbl.behave.status_top) {
- gtk_box_pack_start (GTK_BOX (uzbl.gui.vbox), uzbl.gui.mainbar, FALSE, TRUE, 0);
- gtk_box_pack_start (GTK_BOX (uzbl.gui.vbox), uzbl.gui.scrolled_win, TRUE, TRUE, 0);
- }
- else {
- gtk_box_pack_start (GTK_BOX (uzbl.gui.vbox), uzbl.gui.scrolled_win, TRUE, TRUE, 0);
- gtk_box_pack_start (GTK_BOX (uzbl.gui.vbox), uzbl.gui.mainbar, FALSE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX (uzbl.gui.vbox), uzbl.gui.status_bar, FALSE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX (uzbl.gui.vbox), uzbl.gui.scrolled_win, TRUE, TRUE, 0);
+ } else {
+ gtk_box_pack_start (GTK_BOX (uzbl.gui.vbox), uzbl.gui.scrolled_win, TRUE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX (uzbl.gui.vbox), uzbl.gui.status_bar, FALSE, TRUE, 0);
}
+
g_object_unref(uzbl.gui.scrolled_win);
- g_object_unref(uzbl.gui.mainbar);
+ g_object_unref(uzbl.gui.status_bar);
+
if (!uzbl.state.plug_mode)
gtk_widget_grab_focus (GTK_WIDGET (uzbl.gui.web_view));
- return;
}
gboolean
@@ -769,19 +769,13 @@ update_title(void) {
if (b->show_status) {
title_format = b->title_format_short;
- /* Left side */
- if (b->status_format && GTK_IS_LABEL(uzbl.gui.mainbar_label_left)) {
- gchar *parsed = expand(b->status_format, 0);
- gtk_label_set_markup(GTK_LABEL(uzbl.gui.mainbar_label_left), parsed);
- g_free(parsed);
- }
+ gchar *parsed = expand(b->status_format, 0);
+ uzbl_status_bar_update_left(uzbl.gui.status_bar, parsed);
+ g_free(parsed);
- /* Right side */
- if (b->status_format_right && GTK_IS_LABEL(uzbl.gui.mainbar_label_right)) {
- gchar *parsed = expand(b->status_format_right, 0);
- gtk_label_set_markup(GTK_LABEL(uzbl.gui.mainbar_label_right), parsed);
- g_free(parsed);
- }
+ parsed = expand(b->status_format_right, 0);
+ uzbl_status_bar_update_right(uzbl.gui.status_bar, parsed);
+ g_free(parsed);
}
/* Update window title */
@@ -849,49 +843,6 @@ create_scrolled_win() {
GtkWidget*
-create_mainbar() {
- GUI *g = &uzbl.gui;
-
- g->mainbar = gtk_hbox_new (FALSE, 0);
-
- /* create left panel */
- g->mainbar_label_left = gtk_label_new ("");
- gtk_label_set_selectable(GTK_LABEL(g->mainbar_label_left), TRUE);
- gtk_misc_set_alignment (GTK_MISC(g->mainbar_label_left), 0, 0);
- gtk_misc_set_padding (GTK_MISC(g->mainbar_label_left), 2, 2);
-
- /* create right panel */
- g->mainbar_label_right = gtk_label_new ("");
- gtk_label_set_selectable(GTK_LABEL(g->mainbar_label_right), TRUE);
- gtk_misc_set_alignment (GTK_MISC(g->mainbar_label_right), 1, 0);
- gtk_misc_set_padding (GTK_MISC(g->mainbar_label_right), 2, 2);
- gtk_label_set_ellipsize(GTK_LABEL(g->mainbar_label_right), PANGO_ELLIPSIZE_START);
-
- /* add the labels to the mainbar */
- gtk_box_pack_start (GTK_BOX (g->mainbar), g->mainbar_label_left, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (g->mainbar), g->mainbar_label_right, TRUE, TRUE, 0);
-
- /* set up signal handlers */
- g_object_connect((GObject*)g->mainbar,
- "signal::key-press-event", (GCallback)key_press_cb, NULL,
- "signal::key-release-event", (GCallback)key_release_cb, NULL,
- NULL);
-
- g_object_connect((GObject*)g->mainbar_label_left,
- "signal::key-press-event", (GCallback)key_press_cb, NULL,
- "signal::key-release-event", (GCallback)key_release_cb, NULL,
- NULL);
-
- g_object_connect((GObject*)g->mainbar_label_right,
- "signal::key-press-event", (GCallback)key_press_cb, NULL,
- "signal::key-release-event", (GCallback)key_release_cb, NULL,
- NULL);
-
- return g->mainbar;
-}
-
-
-GtkWidget*
create_window() {
GtkWidget* window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
@@ -1071,25 +1022,47 @@ initialize(int argc, char** argv) {
fprintf(stderr, "uzbl: error hooking %d: %s\n", SIGALRM, strerror(errno));
event_buffer_timeout(10);
-
/* HTTP client */
uzbl.net.soup_session = webkit_get_default_session();
uzbl.net.soup_cookie_jar = uzbl_cookie_jar_new();
soup_session_add_feature(uzbl.net.soup_session, SOUP_SESSION_FEATURE(uzbl.net.soup_cookie_jar));
-
commands_hash();
variables_hash();
/* GUI */
gtk_init(&argc, &argv);
- create_mainbar();
+
+ /* set up the status bar */
+ uzbl.gui.status_bar = uzbl_status_bar_new();
+
+ /* set up signal handlers (it's not great to have this here...) */
+ g_object_connect((GObject*)uzbl.gui.status_bar,
+ "signal::key-press-event", (GCallback)key_press_cb, NULL,
+ "signal::key-release-event", (GCallback)key_release_cb, NULL,
+ NULL);
+
+ /*
+ g_object_connect((GObject*)UZBL_STATUS_BAR(uzbl.gui.status_bar)->label_left,
+ "signal::key-press-event", (GCallback)key_press_cb, NULL,
+ "signal::key-release-event", (GCallback)key_release_cb, NULL,
+ NULL);
+
+ g_object_connect((GObject*)(UZBL_STATUS_BAR(uzbl.gui.status_bar)->label_right),
+ "signal::key-press-event", (GCallback)key_press_cb, NULL,
+ "signal::key-release-event", (GCallback)key_release_cb, NULL,
+ NULL);
+ */
+
+ /* create the main window itself */
create_scrolled_win();
+ /* pack the window and the status bar */
uzbl.gui.vbox = gtk_vbox_new(FALSE, 0);
+
gtk_box_pack_start(GTK_BOX(uzbl.gui.vbox), uzbl.gui.scrolled_win, TRUE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX(uzbl.gui.vbox), uzbl.gui.mainbar, FALSE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(uzbl.gui.vbox), uzbl.gui.status_bar, FALSE, TRUE, 0);
}
@@ -1177,7 +1150,7 @@ main (int argc, char* argv[]) {
/* Update status bar */
if (!uzbl.behave.show_status)
- gtk_widget_hide(uzbl.gui.mainbar);
+ gtk_widget_hide(uzbl.gui.status_bar);
else
update_title();
diff --git a/src/uzbl-core.h b/src/uzbl-core.h
index 892c779..ae0fe49 100644
--- a/src/uzbl-core.h
+++ b/src/uzbl-core.h
@@ -49,6 +49,7 @@
#include "cookie-jar.h"
#include "commands.h"
+#include "status-bar.h"
#define LENGTH(x) (sizeof x / sizeof x[0])
@@ -63,9 +64,7 @@ typedef struct {
GtkWidget* vbox;
/* Mainbar */
- GtkWidget* mainbar;
- GtkWidget* mainbar_label_left;
- GtkWidget* mainbar_label_right;
+ GtkWidget* status_bar;
/* Scrolling */
GtkAdjustment* bar_v; /* Information about document length */
diff --git a/src/variables.c b/src/variables.c
index a3621dd..5b717d9 100644
--- a/src/variables.c
+++ b/src/variables.c
@@ -505,11 +505,11 @@ cmd_set_geometry() {
void
cmd_set_status() {
- if (!uzbl.behave.show_status) {
- gtk_widget_hide(uzbl.gui.mainbar);
- } else {
- gtk_widget_show(uzbl.gui.mainbar);
- }
+ if (!uzbl.behave.show_status)
+ gtk_widget_hide(uzbl.gui.status_bar);
+ else
+ gtk_widget_show(uzbl.gui.status_bar);
+
update_title();
}