summaryrefslogtreecommitdiff
path: root/panel-plugin
diff options
context:
space:
mode:
authorMikhail Osipov <mike.osipov@gmail.com>2020-06-07 01:22:21 +0300
committerMikhail Osipov <mike.osipov@gmail.com>2020-06-19 22:36:41 +0300
commit1e14e4aa2d90afb8a877767c1e6f247e4a8eceb9 (patch)
treecf626cf9ef6e5169dd8eb1152a7ad02e5433119d /panel-plugin
Update windowheader plugin
- sync with updates of wnck - sync with updates of xfce - add build scripts
Diffstat (limited to 'panel-plugin')
-rw-r--r--panel-plugin/Makefile.am49
-rw-r--r--panel-plugin/title.c230
-rw-r--r--panel-plugin/title.desktop10
3 files changed, 289 insertions, 0 deletions
diff --git a/panel-plugin/Makefile.am b/panel-plugin/Makefile.am
new file mode 100644
index 0000000..fe8fc8a
--- /dev/null
+++ b/panel-plugin/Makefile.am
@@ -0,0 +1,49 @@
+AM_CPPFLAGS = \
+ -I$(top_srcdir) \
+ -DG_LOG_DOMAIN=\"xfce4-title-plugin\" \
+ -DPACKAGE_LOCALE_DIR=\"$(localedir)\" \
+ -DWNCK_I_KNOW_THIS_IS_UNSTABLE \
+ $(PLATFORM_CPPFLAGS)
+
+#
+# Title plugin
+#
+plugin_LTLIBRARIES = \
+ libtitle.la
+
+plugindir = \
+ $(libdir)/xfce4/panel/plugins
+
+libtitle_la_SOURCES = \
+ title.c
+
+libtitle_la_CFLAGS = \
+ $(LIBXFCE4UTIL_CFLAGS) \
+ $(LIBXFCE4UI_CFLAGS) \
+ $(LIBXFCE4PANEL_CFLAGS) \
+ $(LIBWNCK_CFLAGS) \
+ $(PLATFORM_CFLAGS)
+
+libtitle_la_LDFLAGS = \
+ -avoid-version \
+ -module \
+ -no-undefined \
+ -export-symbols-regex '^xfce_panel_module_(preinit|init|construct)' \
+ $(PLATFORM_LDFLAGS)
+
+libtitle_la_LIBADD = \
+ $(LIBXFCE4UTIL_LIBS) \
+ $(LIBXFCE4UI_LIBS) \
+ $(LIBWNCK_LIBS) \
+ $(LIBXFCE4PANEL_LIBS)
+
+#
+# Desktop file
+#
+desktopdir = \
+ $(datadir)/xfce4/panel/plugins
+
+desktop_DATA = \
+ title.desktop
+
+# vi:set ts=8 sw=8 noet ai nocindent syntax=automake:
diff --git a/panel-plugin/title.c b/panel-plugin/title.c
new file mode 100644
index 0000000..2252271
--- /dev/null
+++ b/panel-plugin/title.c
@@ -0,0 +1,230 @@
+#include <gtk/gtk.h>
+
+#include <libxfce4panel/xfce-panel-plugin.h>
+#include <libxfce4panel/libxfce4panel.h>
+
+#include <libwnck/libwnck.h>
+
+#include <glib.h>
+#include <glib-object.h>
+
+typedef struct {
+ XfcePanelPlugin *plugin;
+
+ GtkWidget *button;
+ GtkWidget *label;
+ GtkWidget *menu;
+
+ WnckScreen *screen;
+ WnckWindow *window;
+
+ gint screen_id;
+ gint wnck_screen_id;
+ gint wnck_window_id;
+} TitlePlugin;
+
+static void title_construct(XfcePanelPlugin *plugin);
+
+XFCE_PANEL_PLUGIN_REGISTER(title_construct);
+
+static void title_free(XfcePanelPlugin *plugin, TitlePlugin *title)
+{
+ if (title->screen_id != 0)
+ g_signal_handler_disconnect(plugin, title->screen_id);
+
+ if (title->wnck_screen_id != 0)
+ g_signal_handler_disconnect(title->screen, title->wnck_screen_id);
+
+ if (title->wnck_window_id != 0)
+ g_signal_handler_disconnect(title->window, title->wnck_window_id);
+
+ if (title->menu != NULL)
+ gtk_widget_destroy(title->menu);
+
+ title->screen_id = 0;
+ title->wnck_screen_id = 0;
+ title->wnck_window_id = 0;
+
+ gtk_widget_destroy(title->button);
+ panel_slice_free(TitlePlugin, title);
+}
+
+static gboolean title_size_changed(XfcePanelPlugin *plugin,
+ gint size,
+ G_GNUC_UNUSED TitlePlugin *title)
+{
+ GtkOrientation orientation;
+
+ orientation = xfce_panel_plugin_get_orientation(plugin);
+
+ if (orientation == GTK_ORIENTATION_HORIZONTAL)
+ gtk_widget_set_size_request(GTK_WIDGET(plugin), -1, size);
+ else
+ gtk_widget_set_size_request(GTK_WIDGET(plugin), size, -1);
+
+ return TRUE;
+}
+
+static void title_update_label(TitlePlugin *title, const char *label)
+{
+ gtk_label_set_label(GTK_LABEL(title->label), label);
+ gtk_widget_set_tooltip_text(title->button, label);
+}
+
+static void title_window_name_changed(WnckWindow *window,
+ TitlePlugin *title)
+{
+ const gchar *name = wnck_window_get_name(window);
+ title_update_label(title, name);
+}
+
+static int title_check_type(WnckWindow *window)
+{
+ WnckWindowType type = wnck_window_get_window_type(window);
+
+ switch (type) {
+ case WNCK_WINDOW_NORMAL:
+ case WNCK_WINDOW_DIALOG:
+ return 0;
+
+ default:
+ break;
+ }
+
+ return 1;
+}
+
+static void title_window_changed(WnckScreen *screen,
+ G_GNUC_UNUSED WnckWindow *window_,
+ TitlePlugin *title)
+{
+ WnckWindow *window;
+ const gchar *name = NULL;
+
+ if (title->wnck_window_id != 0) {
+ g_signal_handler_disconnect(title->window, title->wnck_window_id);
+ title->wnck_window_id = 0;
+ title->window = NULL;
+ }
+
+ window = wnck_screen_get_active_window(screen);
+
+ if (window == NULL || title_check_type(window))
+ gtk_widget_hide(title->button);
+ else {
+ title->window = window;
+
+ name = wnck_window_get_name(window);
+
+ title->wnck_window_id = g_signal_connect(
+ window, "name-changed",
+ G_CALLBACK(title_window_name_changed), title
+ );
+
+ gtk_widget_show(title->button);
+ }
+
+ title_update_label(title, name);
+}
+
+static void title_screen_changed(XfcePanelPlugin *plugin,
+ GdkScreen *screen,
+ TitlePlugin *title)
+{
+ if (title->wnck_screen_id != 0) {
+ g_signal_handler_disconnect(title->screen, title->wnck_screen_id);
+ title->wnck_screen_id = 0;
+ }
+
+ if (title->wnck_window_id != 0) {
+ g_signal_handler_disconnect(title->window, title->wnck_window_id);
+ title->wnck_window_id = 0;
+ title->window = NULL;
+ }
+
+ screen = gtk_widget_get_screen(GTK_WIDGET(plugin));
+ if (screen != NULL) {
+ G_GNUC_BEGIN_IGNORE_DEPRECATIONS
+ title->screen = wnck_screen_get(gdk_screen_get_number(screen));
+ G_GNUC_END_IGNORE_DEPRECATIONS
+
+ title->wnck_screen_id = g_signal_connect(
+ title->screen, "active-window-changed",
+ G_CALLBACK(title_window_changed), title
+ );
+
+ title_window_changed(title->screen, NULL, title);
+ }
+}
+
+static void title_menu_destroy(GtkWidget *menu, TitlePlugin *title)
+{
+ gtk_widget_destroy(menu);
+ title->menu = NULL;
+}
+
+static void title_pressed(GtkButton *button, TitlePlugin *title)
+{
+ if (title->menu != NULL)
+ gtk_widget_destroy(title->menu);
+
+ if (title->window != NULL) {
+ GtkWidget *menu = wnck_action_menu_new(title->window);
+
+ title->menu = menu;
+
+ g_signal_connect(G_OBJECT(menu), "selection-done", G_CALLBACK(title_menu_destroy), title);
+ gtk_menu_attach_to_widget(GTK_MENU(menu), GTK_WIDGET(button), NULL);
+ gtk_menu_popup_at_pointer(GTK_MENU(menu), NULL);
+ }
+}
+
+static TitlePlugin *title_new(XfcePanelPlugin *plugin)
+{
+ TitlePlugin *title;
+
+ title = g_slice_new0(TitlePlugin);
+
+ title->plugin = plugin;
+
+ title->button = xfce_create_panel_button();
+ gtk_widget_show(title->button);
+
+ title->label = gtk_label_new(NULL);
+ gtk_label_set_ellipsize(GTK_LABEL(title->label), PANGO_ELLIPSIZE_END);
+ gtk_widget_show(title->label);
+
+ gtk_container_add(GTK_CONTAINER(title->button), title->label);
+
+ return title;
+}
+
+static void title_construct(XfcePanelPlugin *plugin)
+{
+ TitlePlugin *title;
+
+ title = title_new(plugin);
+
+ gtk_container_add(GTK_CONTAINER(plugin), title->button);
+
+ xfce_panel_plugin_add_action_widget(plugin, title->button);
+ xfce_panel_plugin_set_expand(plugin, TRUE);
+
+ g_signal_connect(plugin, "free-data",
+ G_CALLBACK(title_free), title);
+
+ g_signal_connect(plugin, "size-changed",
+ G_CALLBACK(title_size_changed), NULL);
+
+ g_signal_connect(title->button, "pressed",
+ G_CALLBACK(title_pressed), title);
+
+ title_screen_changed(plugin, gtk_widget_get_screen(title->button),
+ title);
+
+ title->screen_id = g_signal_connect(
+ plugin, "screen-changed",
+ G_CALLBACK(title_screen_changed), title
+ );
+}
+
diff --git a/panel-plugin/title.desktop b/panel-plugin/title.desktop
new file mode 100644
index 0000000..eeaf6dc
--- /dev/null
+++ b/panel-plugin/title.desktop
@@ -0,0 +1,10 @@
+[Xfce Panel]
+Type=X-XFCE-PanelPlugin
+Encoding=UTF-8
+Name=Title Plugin
+Comment=Show title of active window
+Icon=xfce4-title-plugin
+X-XFCE-Module=title
+X-XFCE-Internal=false
+X-XFCE-Unique=false
+X-XFCE-API=2.0