diff --git a/defaults/defaults b/defaults/defaults index 2b1ba5b5..59ec0e10 100644 --- a/defaults/defaults +++ b/defaults/defaults @@ -59,6 +59,7 @@ title_alignment=center title_font=Sans Bold 9 title_horizontal_offset=0 titleless_maximize=false +titleless_tile=false title_shadow_active=false title_shadow_inactive=false title_vertical_offset_active=0 diff --git a/settings-dialogs/tweaks-settings.c b/settings-dialogs/tweaks-settings.c index b6691afb..bea75199 100644 --- a/settings-dialogs/tweaks-settings.c +++ b/settings-dialogs/tweaks-settings.c @@ -188,6 +188,7 @@ wm_tweaks_dialog_configure_widgets (GtkBuilder *builder) GtkWidget *raise_with_any_button_check = GTK_WIDGET (gtk_builder_get_object (builder, "raise_with_any_button_check")); GtkWidget *borderless_maximize_check = GTK_WIDGET (gtk_builder_get_object (builder, "borderless_maximize_check")); GtkWidget *titleless_maximize_check = GTK_WIDGET (gtk_builder_get_object (builder, "titleless_maximize_check")); + GtkWidget *titleless_tile_check = GTK_WIDGET (gtk_builder_get_object (builder, "titleless_tile_check")); GtkWidget *tile_on_move_check = GTK_WIDGET (gtk_builder_get_object (builder, "tile_on_move_check")); GtkWidget *snap_resist_check = GTK_WIDGET (gtk_builder_get_object (builder, "snap_resist_check")); GtkWidget *urgent_blink = GTK_WIDGET (gtk_builder_get_object (builder, "urgent_blink")); @@ -278,6 +279,10 @@ wm_tweaks_dialog_configure_widgets (GtkBuilder *builder) "toggled", G_CALLBACK (cb_borderless_maximize_button_toggled), titleless_maximize_check); + g_signal_connect (G_OBJECT (borderless_maximize_check), + "toggled", + G_CALLBACK (cb_borderless_maximize_button_toggled), + titleless_tile_check); g_signal_connect (G_OBJECT (placement_center_option), "toggled", G_CALLBACK (cb_activate_placement_center_radio_toggled), @@ -345,6 +350,10 @@ wm_tweaks_dialog_configure_widgets (GtkBuilder *builder) "/general/titleless_maximize", G_TYPE_BOOLEAN, (GObject *)titleless_maximize_check, "active"); + xfconf_g_property_bind (xfwm4_channel, + "/general/titleless_tile", + G_TYPE_BOOLEAN, + (GObject *)titleless_tile_check, "active"); xfconf_g_property_bind (xfwm4_channel, "/general/tile_on_move", G_TYPE_BOOLEAN, @@ -369,7 +378,8 @@ wm_tweaks_dialog_configure_widgets (GtkBuilder *builder) gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (urgent_blink))); gtk_widget_set_sensitive (titleless_maximize_check, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (borderless_maximize_check))); - + gtk_widget_set_sensitive (titleless_tile_check, + gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (borderless_maximize_check))); /* Workspaces tab */ xfconf_g_property_bind (xfwm4_channel, "/general/toggle_workspaces", diff --git a/settings-dialogs/xfwm4-tweaks-dialog.glade b/settings-dialogs/xfwm4-tweaks-dialog.glade index af8c3738..2ed418c5 100644 --- a/settings-dialogs/xfwm4-tweaks-dialog.glade +++ b/settings-dialogs/xfwm4-tweaks-dialog.glade @@ -453,6 +453,21 @@ or "skip taskbar" properties set 3 + + + Hide title of windows when tiled + True + True + False + True + True + + + False + False + 3 + + Automatically _tile windows when moving toward the screen edge diff --git a/src/client.c b/src/client.c index 5282f263..a7d63768 100644 --- a/src/client.c +++ b/src/client.c @@ -304,6 +304,16 @@ clientUpdateAllFrames (ScreenInfo *screen_info, int mask) { clientRecomputeMaximizeSize (c); + configure_flags |= CFG_FORCE_REDRAW; + mask &= ~UPDATE_FRAME; + } + /* Recompute size and position of tiled windows */ + else if (c->tile_position) + { + clientTile (c, frameX (c) + frameWidth (c) / 2, + frameY (c) + frameHeight (c) / 2, + c->tile_position, FALSE, FALSE); + configure_flags |= CFG_FORCE_REDRAW; mask &= ~UPDATE_FRAME; } @@ -911,6 +921,11 @@ clientMoveResizeWindow (Client *c, XWindowChanges * wc, unsigned long mask) clientRemoveMaximizeFlag (c); flags |= CFG_FORCE_REDRAW; } + if (c->tile_position) + { + clientRemoveTilePosition (c); + flags |= CFG_FORCE_REDRAW; + } flags |= CFG_REQUEST | CFG_CONSTRAINED; } @@ -1075,6 +1090,11 @@ clientApplyMWMHints (Client *c, gboolean update) frameY (c) + (frameHeight (c) / 2), &rect); clientNewMaxSize (c, &wc, &rect); } + /* If client is tiled, we need to update its coordonates and size as well */ + else if (c->tile_position) + { + clientUpdateTileSize (c); + } clientConfigure (c, &wc, CWX | CWY | CWWidth | CWHeight, CFG_FORCE_REDRAW); @@ -1243,6 +1263,10 @@ clientGetWMNormalHints (Client *c, gboolean update) { clientRemoveMaximizeFlag (c); } + if (c->tile_position) + { + clientRemoveTilePosition (c); + } clientConfigure (c, &wc, CWX | CWY | CWWidth | CWHeight, CFG_CONSTRAINED | CFG_FORCE_REDRAW); } else if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_IS_RESIZABLE) != previous_value) @@ -1668,6 +1692,7 @@ clientFrame (DisplayInfo *display_info, Window w, gboolean recapture) c->y = attr.y; c->width = attr.width; c->height = attr.height; + c->tile_position = TILE_NONE; #ifdef HAVE_LIBSTARTUP_NOTIFICATION c->startup_id = NULL; @@ -2777,7 +2802,7 @@ clientShade (Client *c) TRACE ("entering clientToggleShaded"); TRACE ("shading client \"%s\" (0x%lx)", c->name, c->window); - if (!CLIENT_HAS_FRAME(c)) + if (!CLIENT_HAS_TITLE (c)) { TRACE ("cowardly refusing to shade \"%s\" (0x%lx) because it has no title", c->name, c->window); return; @@ -3148,6 +3173,22 @@ void clientSetLayerNormal (Client *c) } } +void +clientUpdateTileSize (Client *c) +{ + g_return_if_fail (c != NULL); + TRACE ("entering clientUpdateTileSize"); + TRACE ("Update tiled size for client \"%s\" (0x%lx)", c->name, c->window); + + /* Recompute size and position of tiled windows */ + if (c->tile_position) + { + clientTile (c, frameX (c) + frameWidth (c) / 2, + frameY (c) + frameHeight (c) / 2, + c->tile_position, FALSE, TRUE); + } +} + void clientUpdateMaximizeSize (Client *c) { @@ -3163,6 +3204,21 @@ clientUpdateMaximizeSize (Client *c) } } +void +clientRemoveTilePosition (Client *c) +{ + g_return_if_fail (c != NULL); + TRACE ("entering clientRemoveTileFlag"); + TRACE ("Removing tile position on client \"%s\" (0x%lx)", c->name, + c->window); + + c->tile_position = TILE_NONE; + FLAG_UNSET (c->flags, CLIENT_FLAG_RESTORE_SIZE_POS); + frameQueueDraw (c, FALSE); + clientSetNetActions (c); + clientSetNetState (c); +} + void clientRemoveMaximizeFlag (Client *c) { @@ -3427,6 +3483,7 @@ clientToggleMaximizedAtPoint (Client *c, gint cx, gint cy, int mode, gboolean re c->y = wc.y; c->height = wc.height; c->width = wc.width; + c->tile_position = TILE_NONE; /* Maximizing may remove decoration on the side, update NET_FRAME_EXTENTS accordingly */ setNetFrameExtents (display_info, @@ -3464,6 +3521,7 @@ clientTile (Client *c, gint cx, gint cy, tilePositionType tile, gboolean send_co XWindowChanges wc; GdkRectangle rect; unsigned long old_flags; + tilePositionType old_tile; g_return_val_if_fail (c != NULL, FALSE); @@ -3490,10 +3548,13 @@ clientTile (Client *c, gint cx, gint cy, tilePositionType tile, gboolean send_co } old_flags = c->flags; + old_tile = c->tile_position; FLAG_UNSET (c->flags, CLIENT_FLAG_MAXIMIZED); + c->tile_position = tile; if (!clientNewTileSize (c, &wc, &rect, tile)) { c->flags = old_flags; + c->tile_position = old_tile; return FALSE; } FLAG_SET (c->flags, CLIENT_FLAG_RESTORE_SIZE_POS); @@ -3503,6 +3564,11 @@ clientTile (Client *c, gint cx, gint cy, tilePositionType tile, gboolean send_co c->height = wc.height; c->width = wc.width; + /* Tiled windows w/out border cannot be resized, update allowed actions */ + if (FLAG_TEST (c->flags, CLIENT_FLAG_SHADED)) + { + clientUnshade (c); + } if (send_configure) { setNetFrameExtents (display_info, @@ -3710,6 +3776,10 @@ clientScreenResize(ScreenInfo *screen_info, gboolean fully_visible) { clientUpdateMaximizeSize (c); } + else if (c->tile_position) + { + clientUpdateTileSize (c); + } else { configure_flags = CFG_CONSTRAINED | CFG_REQUEST; diff --git a/src/client.h b/src/client.h index 19ef69c9..68cf0ed6 100644 --- a/src/client.h +++ b/src/client.h @@ -243,6 +243,11 @@ !((FLAG_TEST (c->flags, CLIENT_FLAG_HIDE_TITLEBAR) || \ (c->screen_info->params->titleless_maximize)) && \ (c->screen_info->params->borderless_maximize)))) +#define CLIENT_HAS_TITLE(c) (CLIENT_HAS_FRAME (c) && \ + (!(c->tile_position) || \ + !((c->screen_info->params->titleless_tile) && \ + (c->screen_info->params->borderless_maximize)))) + typedef enum { @@ -263,14 +268,14 @@ netWindowType; typedef enum { TILE_NONE = 0, - TILE_LEFT, - TILE_RIGHT, - TILE_DOWN, - TILE_UP, - TILE_DOWN_LEFT, - TILE_DOWN_RIGHT, - TILE_UP_LEFT, - TILE_UP_RIGHT + TILE_LEFT = (1 << 0), + TILE_RIGHT = (1 << 1), + TILE_DOWN = (1 << 2), + TILE_UP = (1 << 3), + TILE_DOWN_LEFT = TILE_DOWN | TILE_LEFT, + TILE_DOWN_RIGHT = TILE_DOWN | TILE_RIGHT, + TILE_UP_LEFT = TILE_UP | TILE_LEFT, + TILE_UP_RIGHT = TILE_UP | TILE_RIGHT } tilePositionType; @@ -340,6 +345,7 @@ struct _Client unsigned long xfwm_flags; gint fullscreen_monitors[4]; gint frame_extents[SIDE_COUNT]; + tilePositionType tile_position; /* Termination dialog */ gint dialog_pid; @@ -464,7 +470,9 @@ void clientSetFullscreenMonitor (Client *, void clientToggleLayerAbove (Client *); void clientToggleLayerBelow (Client *); void clientSetLayerNormal (Client *); +void clientRemoveTilePosition (Client *); void clientRemoveMaximizeFlag (Client *); +void clientUpdateTileSize (Client *); void clientUpdateMaximizeSize (Client *); gboolean clientToggleMaximized (Client *, int, diff --git a/src/frame.c b/src/frame.c index b5a917fb..7bc6cbed 100644 --- a/src/frame.c +++ b/src/frame.c @@ -87,14 +87,15 @@ frameLeft (Client * c) TRACE ("entering frameLeft"); g_return_val_if_fail (c != NULL, 0); - if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_HAS_BORDER) - && !FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN) - && (!FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED) - || !(c->screen_info->params->borderless_maximize))) + if (!FLAG_TEST (c->xfwm_flags, XFWM_FLAG_HAS_BORDER) + || FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN) + || (c->screen_info->params->borderless_maximize && + (FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED) + || FLAG_TEST (c->tile_position, TILE_LEFT)))) { - return c->screen_info->sides[SIDE_LEFT][ACTIVE].width; + return 0; } - return 0; + return c->screen_info->sides[SIDE_LEFT][ACTIVE].width; } int @@ -103,14 +104,15 @@ frameRight (Client * c) TRACE ("entering frameRight"); g_return_val_if_fail (c != NULL, 0); - if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_HAS_BORDER) - && !FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN) - && (!FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED) - || !(c->screen_info->params->borderless_maximize))) + if (!FLAG_TEST (c->xfwm_flags, XFWM_FLAG_HAS_BORDER) + || FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN) + || (c->screen_info->params->borderless_maximize && + (FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED) + || FLAG_TEST (c->tile_position, TILE_RIGHT)))) { - return c->screen_info->sides[SIDE_RIGHT][ACTIVE].width; + return 0; } - return 0; + return c->screen_info->sides[SIDE_RIGHT][ACTIVE].width; } int @@ -119,10 +121,18 @@ frameTop (Client * c) TRACE ("entering frameTop"); g_return_val_if_fail (c != NULL, 0); - if (CLIENT_HAS_FRAME (c)) + if (CLIENT_HAS_TITLE (c)) { return c->screen_info->title[TITLE_3][ACTIVE].height; } + else if (c->screen_info->params->borderless_maximize + && c->screen_info->params->titleless_tile + && FLAG_TEST (c->tile_position, TILE_DOWN)) + { + /* We display top border with BOTTOM height + because there is no small TOP height border */ + return c->screen_info->sides[SIDE_BOTTOM][ACTIVE].height; + } return 0; } @@ -132,14 +142,16 @@ frameBottom (Client * c) TRACE ("entering frameBottom"); g_return_val_if_fail (c != NULL, 0); - if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_HAS_BORDER) - && !FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN) - && (!FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED) - || !(c->screen_info->params->borderless_maximize))) + if (!FLAG_TEST (c->xfwm_flags, XFWM_FLAG_HAS_BORDER) + || FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN) + || (c->screen_info->params->borderless_maximize && + (FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED) + || (c->tile_position + && !FLAG_TEST (c->tile_position, TILE_UP))))) { - return c->screen_info->sides[SIDE_BOTTOM][ACTIVE].height; + return 0; } - return 0; + return c->screen_info->sides[SIDE_BOTTOM][ACTIVE].height; } int @@ -148,14 +160,15 @@ frameX (Client * c) TRACE ("entering frameX"); g_return_val_if_fail (c != NULL, 0); - if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_HAS_BORDER) - && !FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN) - && (!FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED) - || !(c->screen_info->params->borderless_maximize))) + if (!FLAG_TEST (c->xfwm_flags, XFWM_FLAG_HAS_BORDER) + || FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN) + || (c->screen_info->params->borderless_maximize && + (FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED) + || FLAG_TEST (c->tile_position, TILE_LEFT)))) { - return c->x - frameLeft (c); + return c->x; } - return c->x; + return c->x - frameLeft (c); } int @@ -164,12 +177,12 @@ frameY (Client * c) TRACE ("entering frameY"); g_return_val_if_fail (c != NULL, 0); - if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_HAS_BORDER) - && !FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN)) + if (!FLAG_TEST (c->xfwm_flags, XFWM_FLAG_HAS_BORDER) + || FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN)) { - return c->y - frameTop (c); + return c->y; } - return c->y; + return c->y - frameTop (c); } int @@ -178,14 +191,12 @@ frameWidth (Client * c) TRACE ("entering frameWidth"); g_return_val_if_fail (c != NULL, 0); - if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_HAS_BORDER) - && !FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN) - && (!FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED) - || !(c->screen_info->params->borderless_maximize))) + if (!FLAG_TEST (c->xfwm_flags, XFWM_FLAG_HAS_BORDER) + || FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN)) { - return c->width + frameLeft (c) + frameRight (c); + return c->width; } - return c->width; + return c->width + frameLeft (c) + frameRight (c); } int @@ -349,8 +360,9 @@ frameButtonOffset (Client *c) TRACE ("entering frameButtonOffset"); g_return_val_if_fail (c != NULL, 0); - if (FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED) - && c->screen_info->params->borderless_maximize) + if (c->screen_info->params->borderless_maximize + && (FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED) + || c->tile_position)) { return MAX (0, c->screen_info->params->maximized_offset); } @@ -552,32 +564,35 @@ frameCreateTitlePixmap (Client * c, int state, int left, int right, xfwmPixmap * if (w3 > 0) { frameFillTitlePixmap (c, state, TITLE_3, x, w3, top_height, title_pm, top_pm); - title_x = hoffset + x; - cairo_translate (cr, title_x, title_y); - if (screen_info->params->title_shadow[state]) + if (CLIENT_HAS_TITLE (c)) { - gdk_cairo_set_source_rgba (cr, &screen_info->title_shadow_colors[state]); - if (screen_info->params->title_shadow[state] == TITLE_SHADOW_UNDER) + title_x = hoffset + x; + cairo_translate (cr, title_x, title_y); + if (screen_info->params->title_shadow[state]) { - cairo_translate (cr, 1, 1); - pango_cairo_show_layout (cr, layout); - cairo_translate (cr, -1, -1); - } - else - { - cairo_translate (cr, -1, 0); - pango_cairo_show_layout (cr, layout); - cairo_translate (cr, 1, -1); - pango_cairo_show_layout (cr, layout); - cairo_translate (cr, 1, 1); - pango_cairo_show_layout (cr, layout); - cairo_translate (cr, -1, 1); - pango_cairo_show_layout (cr, layout); - cairo_translate (cr, 0, -1); + gdk_cairo_set_source_rgba (cr, &screen_info->title_shadow_colors[state]); + if (screen_info->params->title_shadow[state] == TITLE_SHADOW_UNDER) + { + cairo_translate (cr, 1, 1); + pango_cairo_show_layout (cr, layout); + cairo_translate (cr, -1, -1); + } + else + { + cairo_translate (cr, -1, 0); + pango_cairo_show_layout (cr, layout); + cairo_translate (cr, 1, -1); + pango_cairo_show_layout (cr, layout); + cairo_translate (cr, 1, 1); + pango_cairo_show_layout (cr, layout); + cairo_translate (cr, -1, 1); + pango_cairo_show_layout (cr, layout); + cairo_translate (cr, 0, -1); + } } + gdk_cairo_set_source_rgba (cr, &screen_info->title_colors[state]); + pango_cairo_show_layout (cr, layout); } - gdk_cairo_set_source_rgba (cr, &screen_info->title_colors[state]); - pango_cairo_show_layout (cr, layout); x = x + w3; } @@ -1066,105 +1081,119 @@ frameDrawWin (Client * c) if (CLIENT_HAS_FRAME (c)) { - /* First, hide the buttons that we don't have... */ - for (i = 0; i < BUTTON_COUNT; i++) + /* Initialize variables and pixmaps */ + top_width = frameWidth (c) - frameTopLeftWidth (c, state) - frameTopRightWidth (c, state); + bottom_width = frameWidth (c) - + screen_info->corners[CORNER_BOTTOM_LEFT][state].width - + screen_info->corners[CORNER_BOTTOM_RIGHT][state].width; + left_height = frameHeight (c) - frameTop (c) - + screen_info->corners[CORNER_BOTTOM_LEFT][state].height; + right_height = frameHeight (c) - frameTop (c) - + screen_info->corners[CORNER_BOTTOM_RIGHT][state].height; + + xfwmPixmapInit (screen_info, &frame_pix.pm_title); + xfwmPixmapInit (screen_info, &frame_pix.pm_sides[SIDE_TOP]); + xfwmPixmapInit (screen_info, &frame_pix.pm_sides[SIDE_BOTTOM]); + xfwmPixmapInit (screen_info, &frame_pix.pm_sides[SIDE_LEFT]); + xfwmPixmapInit (screen_info, &frame_pix.pm_sides[SIDE_RIGHT]); + + /* Configure top buttons */ + if (CLIENT_HAS_TITLE (c)) { - char b = getLetterFromButton (i, c); - if ((!b) || !strchr (screen_info->params->button_layout, b)) + /* First, hide the buttons that we don't have... */ + for (i = 0; i < BUTTON_COUNT; i++) { - xfwmWindowHide (&c->buttons[i]); + char b = getLetterFromButton (i, c); + if ((!b) || !strchr (screen_info->params->button_layout, b)) + { + xfwmWindowHide (&c->buttons[i]); + } } - } - /* Then, show the ones that we do have on left... */ - x = frameLeft (c) + frameButtonOffset (c); - if (x < 0) - { - x = 0; - } - right = frameWidth (c) - frameRight (c) - frameButtonOffset (c); - for (i = 0; i < strlen (screen_info->params->button_layout); i++) - { - button = getButtonFromLetter (screen_info->params->button_layout[i], c); - if (button == TITLE_SEPARATOR) + /* Then, show the ones that we do have on left... */ + x = frameLeft (c) + frameButtonOffset (c); + if (x < 0) { - break; + x = 0; } - else if (button >= 0) + right = frameWidth (c) - frameRight (c) - frameButtonOffset (c); + for (i = 0; i < strlen (screen_info->params->button_layout); i++) { - if (x + screen_info->buttons[button][state].width + screen_info->params->button_spacing < right) + button = getButtonFromLetter (screen_info->params->button_layout[i], c); + if (button == TITLE_SEPARATOR) { - my_pixmap = clientGetButtonPixmap (c, button, clientGetButtonState (c, button, state)); - if (!xfwmPixmapNone(my_pixmap)) - { - xfwmWindowSetBG (&c->buttons[button], my_pixmap); - } - xfwmWindowShow (&c->buttons[button], x, - (frameTop (c) - screen_info->buttons[button][state].height + 1) / 2, - screen_info->buttons[button][state].width, - screen_info->buttons[button][state].height, TRUE); - button_x[button] = x; - x = x + screen_info->buttons[button][state].width + - screen_info->params->button_spacing; + break; } - else + else if (button >= 0) { - xfwmWindowHide (&c->buttons[button]); + if (x + screen_info->buttons[button][state].width + screen_info->params->button_spacing < right) + { + my_pixmap = clientGetButtonPixmap (c, button, clientGetButtonState (c, button, state)); + if (!xfwmPixmapNone(my_pixmap)) + { + xfwmWindowSetBG (&c->buttons[button], my_pixmap); + } + xfwmWindowShow (&c->buttons[button], x, + (frameTop (c) - screen_info->buttons[button][state].height + 1) / 2, + screen_info->buttons[button][state].width, + screen_info->buttons[button][state].height, TRUE); + button_x[button] = x; + x = x + screen_info->buttons[button][state].width + + screen_info->params->button_spacing; + } + else + { + xfwmWindowHide (&c->buttons[button]); + } } } - } - left = x + screen_info->params->button_spacing; + left = x + screen_info->params->button_spacing; - /* and those that we do have on right... */ - x = frameWidth (c) - frameRight (c) + screen_info->params->button_spacing - - frameButtonOffset (c); - for (j = strlen (screen_info->params->button_layout) - 1; j >= i; j--) - { - button = getButtonFromLetter (screen_info->params->button_layout[j], c); - if (button == TITLE_SEPARATOR) - { - break; - } - else if (button >= 0) + /* and those that we do have on right... */ + x = frameWidth (c) - frameRight (c) + screen_info->params->button_spacing - + frameButtonOffset (c); + for (j = strlen (screen_info->params->button_layout) - 1; j >= i; j--) { - if (x - screen_info->buttons[button][state].width - screen_info->params->button_spacing > left) + button = getButtonFromLetter (screen_info->params->button_layout[j], c); + if (button == TITLE_SEPARATOR) { - my_pixmap = clientGetButtonPixmap (c, button, clientGetButtonState (c, button, state)); - if (!xfwmPixmapNone(my_pixmap)) - { - xfwmWindowSetBG (&c->buttons[button], my_pixmap); - } - x = x - screen_info->buttons[button][state].width - - screen_info->params->button_spacing; - xfwmWindowShow (&c->buttons[button], x, - (frameTop (c) - screen_info->buttons[button][state].height + 1) / 2, - screen_info->buttons[button][state].width, - screen_info->buttons[button][state].height, TRUE); - button_x[button] = x; + break; } - else + else if (button >= 0) { - xfwmWindowHide (&c->buttons[button]); + if (x - screen_info->buttons[button][state].width - screen_info->params->button_spacing > left) + { + my_pixmap = clientGetButtonPixmap (c, button, clientGetButtonState (c, button, state)); + if (!xfwmPixmapNone(my_pixmap)) + { + xfwmWindowSetBG (&c->buttons[button], my_pixmap); + } + x = x - screen_info->buttons[button][state].width - + screen_info->params->button_spacing; + xfwmWindowShow (&c->buttons[button], x, + (frameTop (c) - screen_info->buttons[button][state].height + 1) / 2, + screen_info->buttons[button][state].width, + screen_info->buttons[button][state].height, TRUE); + button_x[button] = x; + } + else + { + xfwmWindowHide (&c->buttons[button]); + } } } + left = left - 2 * screen_info->params->button_spacing; + right = x; + } + else + { + left = frameLeft (c) + frameButtonOffset (c); + right = frameWidth (c) - frameRight (c) - frameButtonOffset (c); + for (i = 0; i < BUTTON_COUNT; i++) + { + xfwmWindowHide (&c->buttons[i]); + } } - left = left - 2 * screen_info->params->button_spacing; - right = x; - - top_width = frameWidth (c) - frameTopLeftWidth (c, state) - frameTopRightWidth (c, state); - bottom_width = frameWidth (c) - - screen_info->corners[CORNER_BOTTOM_LEFT][state].width - - screen_info->corners[CORNER_BOTTOM_RIGHT][state].width; - left_height = frameHeight (c) - frameTop (c) - - screen_info->corners[CORNER_BOTTOM_LEFT][state].height; - right_height = frameHeight (c) - frameTop (c) - - screen_info->corners[CORNER_BOTTOM_RIGHT][state].height; - - xfwmPixmapInit (screen_info, &frame_pix.pm_title); - xfwmPixmapInit (screen_info, &frame_pix.pm_sides[SIDE_TOP]); - xfwmPixmapInit (screen_info, &frame_pix.pm_sides[SIDE_BOTTOM]); - xfwmPixmapInit (screen_info, &frame_pix.pm_sides[SIDE_LEFT]); - xfwmPixmapInit (screen_info, &frame_pix.pm_sides[SIDE_RIGHT]); /* The title is always visible */ frameCreateTitlePixmap (c, state, left, right, &frame_pix.pm_title, &frame_pix.pm_sides[SIDE_TOP]); @@ -1387,4 +1416,3 @@ frameQueueDraw (Client * c, gboolean clear_all) update_frame_idle_cb, c, NULL); } } - diff --git a/src/moveresize.c b/src/moveresize.c index 8a23e763..8ca3ceaa 100644 --- a/src/moveresize.c +++ b/src/moveresize.c @@ -1846,6 +1846,11 @@ clientResize (Client * c, int handle, XfwmEventButton *event) clientRemoveMaximizeFlag (c); passdata.configure_flags = CFG_FORCE_REDRAW; } + if (c->tile_position) + { + clientRemoveTilePosition (c); + passdata.configure_flags = CFG_FORCE_REDRAW; + } if (FLAG_TEST (c->flags, CLIENT_FLAG_RESTORE_SIZE_POS)) { FLAG_UNSET (c->flags, CLIENT_FLAG_RESTORE_SIZE_POS); diff --git a/src/settings.c b/src/settings.c index e0284277..311cad91 100644 --- a/src/settings.c +++ b/src/settings.c @@ -708,6 +708,7 @@ loadSettings (ScreenInfo *screen_info) {"title_font", NULL, G_TYPE_STRING, FALSE}, {"title_horizontal_offset", NULL, G_TYPE_INT, TRUE}, {"titleless_maximize", NULL, G_TYPE_BOOLEAN, TRUE}, + {"titleless_tile", NULL, G_TYPE_BOOLEAN, FALSE}, {"title_shadow_active", NULL, G_TYPE_STRING, TRUE}, {"title_shadow_inactive", NULL, G_TYPE_STRING, TRUE}, {"title_vertical_offset_active", NULL, G_TYPE_INT, TRUE}, @@ -739,6 +740,8 @@ loadSettings (ScreenInfo *screen_info) getBoolValue ("borderless_maximize", rc); screen_info->params->titleless_maximize = getBoolValue ("titleless_maximize", rc); + screen_info->params->titleless_tile = + getBoolValue ("titleless_tile", rc); screen_info->params->box_resize = getBoolValue ("box_resize", rc); screen_info->params->box_move = @@ -1272,6 +1275,11 @@ cb_xfwm4_channel_property_changed(XfconfChannel *channel, const gchar *property_ screen_info->params->titleless_maximize = g_value_get_boolean (value); reloadScreenSettings (screen_info, UPDATE_MAXIMIZE); } + else if (!strcmp (name, "titleless_tile")) + { + screen_info->params->titleless_tile = g_value_get_boolean (value); + reloadScreenSettings (screen_info, UPDATE_MAXIMIZE); + } else if (!strcmp (name, "cycle_minimum")) { screen_info->params->cycle_minimum = g_value_get_boolean (value); diff --git a/src/settings.h b/src/settings.h index 9d4994d4..a00261c4 100644 --- a/src/settings.h +++ b/src/settings.h @@ -196,6 +196,7 @@ struct _XfwmParams int wrap_resistance; gboolean borderless_maximize; gboolean titleless_maximize; + gboolean titleless_tile; gboolean box_move; gboolean box_resize; gboolean click_to_focus;