aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Brendan Taylor <whateley@gmail.com>2011-07-02 10:55:29 +0000
committerGravatar Brendan Taylor <whateley@gmail.com>2011-07-03 03:31:51 +0000
commit88055228d2cd8780d281eb31bf688170c23254ce (patch)
treeb1dad729d64ddba9ebfd02fd53a2f695e9de1e8d /src
parent79270bf7f392e1a11f9b61bb94473d6751707fca (diff)
the status bar is now a custom gtk widget
it gives the left side of the status bar as much space as it needs (but importantly, no more than the size of the window. this should put the window resize bug to rest for good...
Diffstat (limited to 'src')
-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();
}