summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Koegel <eric.koegel@gmail.com>2013-08-31 04:37:11 +0300
committerEric Koegel <eric.koegel@gmail.com>2013-08-31 04:37:11 +0300
commitaff26e01b106738488060121557c52e16e70f645 (patch)
tree7bfb6a5386da97db72f9c255d70141cb52775cdb
parentaf35570486899140425227767e27385fb5b3fa70 (diff)
parentc551f08ab5c2a7e039285ff159b2fe00b12137b6 (diff)
downloadxfdesktop-aff26e01b106738488060121557c52e16e70f645.tar.gz
Merge branch 'eric/middle-click-menu'
-rw-r--r--src/windowlist.c144
1 files changed, 71 insertions, 73 deletions
diff --git a/src/windowlist.c b/src/windowlist.c
index e337a6ef..f228ca3a 100644
--- a/src/windowlist.c
+++ b/src/windowlist.c
@@ -52,36 +52,51 @@ static gboolean wl_submenus = FALSE;
static gboolean wl_sticky_once = FALSE;
static void
-set_num_workspaces(GtkWidget *w, gpointer num)
+set_num_workspaces(GtkWidget *w, gpointer data)
{
- static Atom xa_NET_NUMBER_OF_DESKTOPS = 0;
- XClientMessageEvent sev;
- gint n;
- GdkScreen *gscreen = gtk_widget_get_screen(w);
- GdkWindow *groot = gdk_screen_get_root_window(gscreen);
-
- if(!xa_NET_NUMBER_OF_DESKTOPS) {
- xa_NET_NUMBER_OF_DESKTOPS = XInternAtom(gdk_x11_get_default_xdisplay(),
- "_NET_NUMBER_OF_DESKTOPS", False);
- }
-
- n = GPOINTER_TO_INT(num);
-
- sev.type = ClientMessage;
- sev.display = gdk_x11_get_default_xdisplay();
- sev.format = 32;
- sev.window = GDK_WINDOW_XID(groot);
- sev.message_type = xa_NET_NUMBER_OF_DESKTOPS;
- sev.data.l[0] = n;
+ WnckScreen *wnck_screen = wnck_screen_get(gdk_screen_get_number(gtk_widget_get_screen(w)));
+ WnckWorkspace *wnck_workspace = wnck_screen_get_active_workspace(wnck_screen);
+ gint nworkspaces = wnck_screen_get_workspace_count(wnck_screen);
+ const gchar *ws_name = wnck_workspace_get_name(wnck_screen_get_workspace(wnck_screen, nworkspaces -1));
+ gint num = GPOINTER_TO_INT(data);
+ gchar *rm_label_short = NULL, *rm_label_long = NULL;
+ gint current_workspace = wnck_workspace_get_number(wnck_workspace);
+ const gchar *current_workspace_name = wnck_workspace_get_name(wnck_workspace);
+
+ g_return_if_fail(nworkspaces != num);
+
+ TRACE("entering");
+
+ if(num < nworkspaces) {
+ if(!ws_name || atoi(ws_name) == nworkspaces) {
+ rm_label_short = g_strdup_printf(_("Remove Workspace %d"), nworkspaces);
+ rm_label_long = g_strdup_printf(_("Do you really want to remove workspace %d?\nNote: You are currently on workspace %d."),
+ nworkspaces, current_workspace);
+ } else {
+ gchar *ws_name_esc = g_markup_escape_text(ws_name, strlen(ws_name));
+ rm_label_short = g_strdup_printf(_("Remove Workspace '%s'"), ws_name_esc);
+ rm_label_long = g_strdup_printf(_("Do you really want to remove workspace '%s'?\nNote: You are currently on workspace '%s'."),
+ ws_name_esc, current_workspace_name);
+ g_free(ws_name_esc);
+ }
- gdk_error_trap_push();
+ /* Popup a dialog box confirming that the user wants to remove a
+ * workspace */
+ if(!xfce_dialog_confirm(NULL, NULL, _("Remove"), rm_label_long,
+ "%s", rm_label_short))
+ {
+ g_free(rm_label_short);
+ g_free(rm_label_long);
+ return;
+ }
+ }
- XSendEvent(gdk_x11_get_default_xdisplay(), GDK_WINDOW_XID(groot), False,
- SubstructureNotifyMask | SubstructureRedirectMask,
- (XEvent *)&sev);
+ if(rm_label_short != NULL)
+ g_free(rm_label_short);
+ if(rm_label_long != NULL)
+ g_free(rm_label_long);
- gdk_flush();
- gdk_error_trap_pop();
+ wnck_screen_change_workspace_count(wnck_screen, num);
}
static void
@@ -153,11 +168,7 @@ menu_item_from_wnck_window(WnckWindow *wnck_window, gint icon_width,
g_string_prepend(label, "<i>");
g_string_append(label, "</i>");
}
- if(wnck_window_is_minimized(wnck_window)) {
- g_string_prepend(label, "[");
- g_string_append(label, "]");
- }
-
+
if(wl_show_icons) {
icon = wnck_window_get_icon(wnck_window);
w = gdk_pixbuf_get_width(icon);
@@ -165,12 +176,18 @@ menu_item_from_wnck_window(WnckWindow *wnck_window, gint icon_width,
if(w != icon_width || h != icon_height) {
tmp = gdk_pixbuf_scale_simple(icon, icon_width, icon_height,
GDK_INTERP_BILINEAR);
+
+ if(wnck_window_is_minimized(wnck_window)) {
+ /* minimized window, fade out app icon */
+ gdk_pixbuf_saturate_and_pixelate(tmp, tmp, 0.55, TRUE);
+ }
+
img = gtk_image_new_from_pixbuf(tmp);
g_object_unref(G_OBJECT(tmp));
} else
img = gtk_image_new_from_pixbuf(icon);
}
-
+
if(img) {
mi = gtk_image_menu_item_new_with_label(label->str);
gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mi), img);
@@ -203,7 +220,6 @@ windowlist_populate(XfceDesktop *desktop,
WnckWindow *wnck_window;
gint w, h;
PangoFontDescription *italic_font_desc;
- gboolean is_empty_workspace;
if(!show_windowlist)
return;
@@ -249,36 +265,29 @@ windowlist_populate(XfceDesktop *desktop,
if(wl_show_ws_names || wl_submenus) {
ws_name = wnck_workspace_get_name(wnck_workspace);
-
- if(wnck_workspace == active_workspace) {
- if(ws_name == NULL || *ws_name == '\0')
- ws_label = g_strdup_printf(_("<b>Workspace %d</b>"), i+1);
- else {
- gchar *ws_name_esc = g_markup_escape_text(ws_name, strlen(ws_name));
- ws_label = g_strdup_printf("<b>%s</b>", ws_name_esc);
- g_free(ws_name_esc);
- }
- } else { /* don't italicise if we're showing stuff in submenus */
- if(ws_name == NULL || *ws_name == '\0') {
- if(wl_submenus)
- ws_label = g_strdup_printf(_("Workspace %d"), i+1);
- else
- ws_label = g_strdup_printf(_("<i>Workspace %d</i>"), i+1);
- } else {
- gchar *ws_name_esc = g_markup_escape_text(ws_name, strlen(ws_name));
- if(wl_submenus)
- ws_label = ws_name_esc;
- else {
- ws_label = g_strdup_printf("<i>%s</i>", ws_name_esc);
- g_free(ws_name_esc);
- }
- }
+
+ /* Workspace header */
+ if(ws_name == NULL || *ws_name == '\0')
+ ws_label = g_strdup_printf(_("<b>Workspace %d</b>"), i+1);
+ else {
+ gchar *ws_name_esc = g_markup_escape_text(ws_name, strlen(ws_name));
+ ws_label = g_strdup_printf("<b>%s</b>", ws_name_esc);
+ g_free(ws_name_esc);
}
mi = gtk_menu_item_new_with_label(ws_label);
g_free(ws_label);
label = gtk_bin_get_child(GTK_BIN(mi));
gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
+ /* center the workspace header */
+ gtk_misc_set_alignment(GTK_MISC(label), 0.4f, 0);
+ /* If it's not the active workspace, make the color insensitive */
+ if(wnck_workspace != active_workspace)
+ {
+ GtkWidget *lbl = gtk_bin_get_child(GTK_BIN(mi));
+ gtk_widget_modify_fg(lbl, GTK_STATE_NORMAL,
+ &(style->fg[GTK_STATE_INSENSITIVE]));
+ }
gtk_widget_show(mi);
gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
if(!wl_submenus) {
@@ -290,15 +299,11 @@ windowlist_populate(XfceDesktop *desktop,
if(wl_submenus) {
submenu = gtk_menu_new();
gtk_menu_item_set_submenu(GTK_MENU_ITEM(mi), submenu);
- } else {
- mi = gtk_separator_menu_item_new();
- gtk_widget_show(mi);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
}
}
windows = wnck_screen_get_windows_stacked(wnck_screen);
- is_empty_workspace = TRUE;
+
for(l = windows; l; l = l->next) {
wnck_window = l->data;
@@ -321,16 +326,15 @@ windowlist_populate(XfceDesktop *desktop,
mi = menu_item_from_wnck_window(wnck_window, w, h);
if(!mi)
continue;
- is_empty_workspace = FALSE;
+
if(wnck_workspace != active_workspace
- && (!wnck_window_is_sticky(wnck_window)
- || wnck_workspace != active_workspace))
+ && (!wnck_window_is_sticky(wnck_window) || wnck_workspace != active_workspace))
{
GtkWidget *lbl = gtk_bin_get_child(GTK_BIN(mi));
gtk_widget_modify_fg(lbl, GTK_STATE_NORMAL,
&(style->fg[GTK_STATE_INSENSITIVE]));
- gtk_widget_modify_font(lbl, italic_font_desc);
}
+
gtk_widget_show(mi);
gtk_menu_shell_append(GTK_MENU_SHELL(submenu), mi);
g_object_weak_ref(G_OBJECT(wnck_window),
@@ -341,7 +345,7 @@ windowlist_populate(XfceDesktop *desktop,
G_CALLBACK(mi_destroyed_cb), wnck_window);
}
- if(!wl_submenus && !is_empty_workspace) {
+ if(!wl_submenus) {
mi = gtk_separator_menu_item_new();
gtk_widget_show(mi);
gtk_menu_shell_append(GTK_MENU_SHELL(submenu), mi);
@@ -350,12 +354,6 @@ windowlist_populate(XfceDesktop *desktop,
pango_font_description_free(italic_font_desc);
- if(wl_submenus) {
- mi = gtk_separator_menu_item_new();
- gtk_widget_show(mi);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
- }
-
/* 'add workspace' item */
if(wl_show_icons) {
img = gtk_image_new_from_stock(GTK_STOCK_ADD, GTK_ICON_SIZE_MENU);