diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/commands.c | 8 | ||||
-rw-r--r-- | src/status-bar.c | 114 | ||||
-rw-r--r-- | src/status-bar.h | 36 | ||||
-rw-r--r-- | src/uzbl-core.c | 115 | ||||
-rw-r--r-- | src/uzbl-core.h | 5 | ||||
-rw-r--r-- | src/variables.c | 10 |
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(); } |