aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/interface-gtk/gtk-info-popup.gob5
-rw-r--r--src/interface-gtk/interface-gtk.cpp101
-rw-r--r--src/interface-gtk/interface-gtk.h20
3 files changed, 99 insertions, 27 deletions
diff --git a/src/interface-gtk/gtk-info-popup.gob b/src/interface-gtk/gtk-info-popup.gob
index 1df52a9..f172de6 100644
--- a/src/interface-gtk/gtk-info-popup.gob
+++ b/src/interface-gtk/gtk-info-popup.gob
@@ -25,7 +25,6 @@ requires 2.0.20
#include <math.h>
#include <glib/gprintf.h>
-#include <gio/gio.h>
#ifndef HAVE_GTK_FLOW_BOX_NEW
#include "gtkflowbox.h"
@@ -35,6 +34,8 @@ requires 2.0.20
%h{
#include <gtk/gtk.h>
#include <gdk/gdk.h>
+
+#include <gio/gio.h>
%}
enum GTK_INFO_POPUP {
@@ -206,7 +207,7 @@ class Gtk:Info:Popup from Gtk:Event:Box {
return GTK_WIDGET(widget);
}
- private GIcon *
+ public GIcon *
get_icon_for_path(const gchar *path, const gchar *fallback_name)
{
GFile *file;
diff --git a/src/interface-gtk/interface-gtk.cpp b/src/interface-gtk/interface-gtk.cpp
index d718deb..1babdff 100644
--- a/src/interface-gtk/interface-gtk.cpp
+++ b/src/interface-gtk/interface-gtk.cpp
@@ -39,6 +39,9 @@
#include <gdk-pixbuf/gdk-pixbuf.h>
#include <gtk/gtk.h>
+
+#include <gio/gio.h>
+
#include "gtk-info-popup.h"
#include <Scintilla.h>
@@ -133,7 +136,7 @@ InterfaceGtk::main_impl(int &argc, char **&argv)
{
static const Cmdline empty_cmdline;
GtkWidget *overlay_widget;
- GtkWidget *info_content;
+ GtkWidget *message_bar_content;
/*
* g_thread_init() is required prior to v2.32
@@ -153,13 +156,27 @@ InterfaceGtk::main_impl(int &argc, char **&argv)
event_queue = g_async_queue_new();
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- gtk_window_set_title(GTK_WINDOW(window), PACKAGE_NAME);
g_signal_connect(G_OBJECT(window), "delete-event",
G_CALLBACK(window_delete_cb), event_queue);
vbox = gtk_vbox_new(FALSE, 0);
- info_current = g_strdup(PACKAGE_NAME);
+ info_current = g_strdup("");
+
+ /*
+ * The info bar is tried to be made the title bar of the
+ * window which also disables the default window decorations
+ * (client-side decorations).
+ * FIXME: This could fail, leaving us with a standard title
+ * bar and the info bar with close buttons. In this case,
+ * we should at least disable the info bar close button.
+ * FIXME: At lease on Gtk 3.12 we could disable the subtitle.
+ */
+ info_bar_widget = gtk_header_bar_new();
+ gtk_header_bar_set_show_close_button(GTK_HEADER_BAR(info_bar_widget), TRUE);
+ info_image = gtk_image_new();
+ gtk_header_bar_pack_start(GTK_HEADER_BAR(info_bar_widget), info_image);
+ gtk_window_set_titlebar(GTK_WINDOW(window), info_bar_widget);
/*
* The event box is the parent of all Scintilla views
@@ -174,12 +191,12 @@ InterfaceGtk::main_impl(int &argc, char **&argv)
gtk_container_add(GTK_CONTAINER(overlay_widget), event_box_widget);
gtk_box_pack_start(GTK_BOX(vbox), overlay_widget, TRUE, TRUE, 0);
- info_widget = gtk_info_bar_new();
- info_content = gtk_info_bar_get_content_area(GTK_INFO_BAR(info_widget));
+ message_bar_widget = gtk_info_bar_new();
+ message_bar_content = gtk_info_bar_get_content_area(GTK_INFO_BAR(message_bar_widget));
message_widget = gtk_label_new("");
gtk_misc_set_alignment(GTK_MISC(message_widget), 0., 0.);
- gtk_container_add(GTK_CONTAINER(info_content), message_widget);
- gtk_box_pack_start(GTK_BOX(vbox), info_widget, FALSE, FALSE, 0);
+ gtk_container_add(GTK_CONTAINER(message_bar_content), message_widget);
+ gtk_box_pack_start(GTK_BOX(vbox), message_bar_widget, FALSE, FALSE, 0);
cmdline_widget = gtk_entry_new();
gtk_entry_set_has_frame(GTK_ENTRY(cmdline_widget), FALSE);
@@ -230,7 +247,7 @@ InterfaceGtk::vmsg_impl(MessageType type, const gchar *fmt, va_list ap)
gdk_threads_enter();
- gtk_info_bar_set_message_type(GTK_INFO_BAR(info_widget),
+ gtk_info_bar_set_message_type(GTK_INFO_BAR(message_bar_widget),
type2gtk[type]);
gtk_label_set_text(GTK_LABEL(message_widget), buf);
@@ -245,7 +262,7 @@ InterfaceGtk::msg_clear(void)
{
gdk_threads_enter();
- gtk_info_bar_set_message_type(GTK_INFO_BAR(info_widget),
+ gtk_info_bar_set_message_type(GTK_INFO_BAR(message_bar_widget),
GTK_MESSAGE_OTHER);
gtk_label_set_text(GTK_LABEL(message_widget), "");
@@ -259,23 +276,66 @@ InterfaceGtk::show_view_impl(ViewGtk *view)
}
void
-InterfaceGtk::info_update_impl(const QRegister *reg)
+InterfaceGtk::refresh_info(void)
{
- gchar *name = String::canonicalize_ctl(reg->name);
+ const gchar *info_type_str;
+ gchar *info_current_canon = String::canonicalize_ctl(info_current);
+ GIcon *icon;
+ gchar *title;
+
+ switch (info_type) {
+ case INFO_TYPE_QREGISTER:
+ info_type_str = PACKAGE_NAME " - <QRegister> ";
+ gtk_header_bar_set_title(GTK_HEADER_BAR(info_bar_widget),
+ info_current_canon);
+ gtk_header_bar_set_subtitle(GTK_HEADER_BAR(info_bar_widget),
+ "QRegister");
+
+ gtk_image_clear(GTK_IMAGE(info_image));
+ break;
+ case INFO_TYPE_BUFFER_DIRTY:
+ String::append(info_current_canon, "*");
+ /* fall through */
+ case INFO_TYPE_BUFFER:
+ info_type_str = PACKAGE_NAME " - <Buffer> ";
+ gtk_header_bar_set_title(GTK_HEADER_BAR(info_bar_widget),
+ info_current_canon);
+ gtk_header_bar_set_subtitle(GTK_HEADER_BAR(info_bar_widget),
+ "Buffer");
+
+ icon = gtk_info_popup_get_icon_for_path(info_current,
+ "text-x-generic");
+ if (!icon)
+ break;
+ gtk_image_set_from_gicon(GTK_IMAGE(info_image),
+ icon, GTK_ICON_SIZE_LARGE_TOOLBAR);
+ g_object_unref(icon);
+ break;
+ }
+
+ title = g_strconcat(info_type_str, info_current_canon, NIL);
+ gtk_window_set_title(GTK_WINDOW(window), title);
+ g_free(title);
+ g_free(info_current_canon);
+}
+
+void
+InterfaceGtk::info_update_impl(const QRegister *reg)
+{
g_free(info_current);
- info_current = g_strconcat(PACKAGE_NAME " - <QRegister> ",
- name, NIL);
- g_free(name);
+ info_type = INFO_TYPE_QREGISTER;
+ /* NOTE: will contain control characters */
+ info_current = g_strdup(reg->name);
}
void
InterfaceGtk::info_update_impl(const Buffer *buffer)
{
g_free(info_current);
- info_current = g_strconcat(PACKAGE_NAME " - <Buffer> ",
- buffer->filename ? : UNNAMED_FILE,
- buffer->dirty ? "*" : "", NIL);
+ info_type = buffer->dirty ? INFO_TYPE_BUFFER_DIRTY
+ : INFO_TYPE_BUFFER;
+ info_current = g_strdup(buffer->filename ? : UNNAMED_FILE);
}
void
@@ -431,6 +491,8 @@ InterfaceGtk::event_loop_impl(void)
if (icon_list)
g_list_free_full(icon_list, g_object_unref);
+ refresh_info();
+
/*
* When changing views, the new widget is not
* added immediately to avoid flickering in the GUI.
@@ -447,7 +509,6 @@ InterfaceGtk::event_loop_impl(void)
gtk_container_add(GTK_CONTAINER(event_box_widget),
current_view_widget);
}
- gtk_window_set_title(GTK_WINDOW(window), info_current);
gtk_widget_show_all(window);
/* don't show popup by default */
@@ -629,6 +690,8 @@ InterfaceGtk::handle_key_press(bool is_shift, bool is_ctl, guint keyval)
*/
gdk_threads_enter();
+ refresh_info();
+
if (current_view != last_view) {
/*
* The last view's object is not guaranteed to
@@ -646,8 +709,6 @@ InterfaceGtk::handle_key_press(bool is_shift, bool is_ctl, guint keyval)
gtk_widget_show(current_view_widget);
}
- gtk_window_set_title(GTK_WINDOW(window), info_current);
-
gdk_window_thaw_updates(view_window);
gdk_threads_leave();
diff --git a/src/interface-gtk/interface-gtk.h b/src/interface-gtk/interface-gtk.h
index b5200ea..a3a0af6 100644
--- a/src/interface-gtk/interface-gtk.h
+++ b/src/interface-gtk/interface-gtk.h
@@ -78,12 +78,20 @@ typedef class InterfaceGtk : public Interface<InterfaceGtk, ViewGtk> {
GtkWidget *window;
GtkWidget *vbox;
- GtkWidget *event_box_widget;
-
+ enum {
+ INFO_TYPE_BUFFER = 0,
+ INFO_TYPE_BUFFER_DIRTY,
+ INFO_TYPE_QREGISTER
+ } info_type;
gchar *info_current;
- GtkWidget *info_widget;
+ GtkWidget *info_bar_widget;
+ GtkWidget *info_image;
+ GtkWidget *event_box_widget;
+
+ GtkWidget *message_bar_widget;
GtkWidget *message_widget;
+
GtkWidget *cmdline_widget;
GtkWidget *popup_widget;
@@ -96,9 +104,10 @@ public:
InterfaceGtk() : Interface(),
window(NULL),
vbox(NULL),
+ info_type(INFO_TYPE_BUFFER), info_current(NULL),
+ info_bar_widget(NULL), info_image(NULL),
event_box_widget(NULL),
- info_current(NULL), info_widget(NULL),
- message_widget(NULL),
+ message_bar_widget(NULL), message_widget(NULL),
cmdline_widget(NULL),
popup_widget(NULL),
current_view_widget(NULL),
@@ -163,6 +172,7 @@ public:
private:
static void widget_set_font(GtkWidget *widget, const gchar *font_name);
+ void refresh_info(void);
void cmdline_insert_chr(gint &pos, gchar chr);
} InterfaceCurrent;