From 0fb2ec29e31294858ebe034a3ed71dd04fa04697 Mon Sep 17 00:00:00 2001 From: Olivier Fourdan <fourdan.olivier@wanadoo.fr> Date: Thu, 1 Sep 2005 21:00:53 +0000 Subject: [PATCH] Add class name, rearrange layout of tabwin, fix warnings when app window vanishes (Old svn revision: 17258) --- src/tabwin.c | 75 +++++++++++++++++++++++++++++++++++++++------------- src/tabwin.h | 3 +++ 2 files changed, 59 insertions(+), 19 deletions(-) diff --git a/src/tabwin.c b/src/tabwin.c index 956d12b5e..4dac82ae0 100644 --- a/src/tabwin.c +++ b/src/tabwin.c @@ -55,15 +55,41 @@ paint_selected(GtkWidget *w, GdkEventExpose *event, gpointer data) return FALSE; } +/* Efficiency is definitely *not* the goal here! */ +static gchar * +pretty_string (const gchar *s) +{ + gchar *canonical; + + if (s) + { + canonical = g_strdup (s); + g_strcanon (canonical, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", ' '); + g_strstrip (canonical); + *canonical = g_ascii_toupper (*canonical); + } + else + { + canonical = g_strdup(_("Unknown application!")); + } + + return canonical; +} + static void -tabwinSetLabel(Tabwin *t, gchar *label) +tabwinSetLabel(Tabwin *t, gchar *class, gchar *label) { gchar *markup; + gchar *message; + + message = pretty_string (class); + gtk_label_set_use_markup (GTK_LABEL (t->class), TRUE); + markup = g_strconcat ("<span weight=\"bold\">[ ", message, " ]</span>", NULL); + gtk_label_set_markup(GTK_LABEL (t->class), markup); + gtk_label_set_text (GTK_LABEL (t->label), label); - markup = g_strconcat ("<span weight=\"bold\">", label, "</span>", NULL); - gtk_label_set_markup(GTK_LABEL(t->label), markup); - - g_free(markup); + g_free (message); + g_free(markup); } static void @@ -78,7 +104,7 @@ tabwinSetSelected(Tabwin *t, GtkWidget *w) t->selected_callback=g_signal_connect(G_OBJECT(w), "expose-event", G_CALLBACK(paint_selected), NULL); c = g_object_get_data(G_OBJECT(w), "client-ptr-val"); - tabwinSetLabel(t, c->name); + tabwinSetLabel(t, c->class.res_class, c->name); } static GtkWidget * @@ -163,8 +189,7 @@ tabwinCreate(GdkScreen *scr, Client *c, unsigned int cycle_range) GtkWidget *vbox, *header_hbox; GtkWidget *windowlist; - tabwin = g_new (Tabwin, 1); - memset(tabwin, 0, sizeof(Tabwin)); + tabwin = g_new0 (Tabwin, 1); if (!logo) { logo = xfce_inline_icon_at_size (tabwin_icon_data, 32, 32); @@ -174,8 +199,8 @@ tabwinCreate(GdkScreen *scr, Client *c, unsigned int cycle_range) tabwin->window = gtk_window_new(GTK_WINDOW_POPUP); gtk_window_set_screen(GTK_WINDOW(tabwin->window), scr); gtk_container_set_border_width(GTK_CONTAINER(tabwin->window), 0); - gtk_window_set_position (GTK_WINDOW (tabwin->window), - GTK_WIN_POS_CENTER_ALWAYS); + gtk_window_set_position (GTK_WINDOW (tabwin->window), GTK_WIN_POS_CENTER_ALWAYS); + frame = gtk_frame_new (NULL); gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_OUT); gtk_container_set_border_width (GTK_CONTAINER (frame), 0); @@ -194,21 +219,29 @@ tabwinCreate(GdkScreen *scr, Client *c, unsigned int cycle_range) gtk_container_set_border_width (GTK_CONTAINER (frame), 0); gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0); - tabwin->label = gtk_label_new(" "); - windowlist = createWindowlist(scr, c, cycle_range, tabwin); - tabwin->container = windowlist; - gtk_container_add(GTK_CONTAINER(frame), windowlist); + tabwin->class = gtk_label_new (""); + gtk_label_set_use_markup (GTK_LABEL (tabwin->class), TRUE); + gtk_misc_set_alignment (GTK_MISC (tabwin->class), 0.5, 0.5); + gtk_box_pack_start (GTK_BOX (vbox), tabwin->class, TRUE, TRUE, 0); + tabwin->label = gtk_label_new (""); + gtk_label_set_use_markup (GTK_LABEL (tabwin->label), FALSE); gtk_misc_set_alignment (GTK_MISC (tabwin->label), 0.5, 0.5); - gtk_widget_set_size_request (GTK_WIDGET(tabwin->label), 240, -1); gtk_box_pack_start (GTK_BOX (vbox), tabwin->label, TRUE, TRUE, 0); + gtk_widget_set_size_request (GTK_WIDGET(tabwin->label), 240, -1); + + windowlist = createWindowlist(scr, c, cycle_range, tabwin); + tabwin->container = windowlist; + gtk_container_add(GTK_CONTAINER(frame), windowlist); if ((gtk_major_version == 2 && gtk_minor_version >= 6) || gtk_major_version > 2) { #ifdef PANGO_ELLIPSIZE_END g_object_set (G_OBJECT (tabwin->label), "ellipsize", PANGO_ELLIPSIZE_END, NULL); + g_object_set (G_OBJECT (tabwin->class), "ellipsize", PANGO_ELLIPSIZE_END, NULL); #else g_object_set (G_OBJECT (tabwin->label), "ellipsize", 3, NULL); + g_object_set (G_OBJECT (tabwin->class), "ellipsize", 3, NULL); #endif } @@ -226,12 +259,16 @@ tabwinRemoveClient(Tabwin *t, Client *c) if (((Client *)g_object_get_data(tmp->data, "client-ptr-val")) == c) { if (tmp == t->current) + { tabwinSelectNext(t); - gtk_container_remove(GTK_CONTAINER(t->container), tmp->data); - t->head = g_list_delete_link(t->head, tmp); + } + gtk_container_remove (GTK_CONTAINER(t->container), tmp->data); + t->head = g_list_delete_link (t->head, tmp); + /* No need to look any further */ + return; } /* since this is a circular list, hitting head signals end, not hitting NULL */ - } while ((tmp=tmp->next) && (tmp!=t->head)); + } while ((tmp = tmp->next) && (tmp != t->head)); } @@ -259,6 +296,6 @@ tabwinDestroy (Tabwin * tabwin) /* un-circlify the list so we don't infinitely loop while freeing */ tabwin->head->prev->next = NULL; tabwin->head->prev = NULL; - g_list_free(tabwin->head); + g_list_free (tabwin->head); gtk_widget_destroy (tabwin->window); } diff --git a/src/tabwin.h b/src/tabwin.h index ac9fbf477..b2f88c7e3 100644 --- a/src/tabwin.h +++ b/src/tabwin.h @@ -35,11 +35,14 @@ struct _Tabwin /* The below must be freed when destroying */ GtkWidget *window; GList *head; + /* these don't have to be */ + GtkWidget *class; GtkWidget *label; GtkWidget *container; GList *current; gulong selected_callback; + int grid_cols; int grid_rows; }; -- GitLab