Changeset View
Changeset View
Standalone View
Standalone View
shell_client.cpp
Show First 20 Lines • Show All 832 Lines • ▼ Show 20 Line(s) | 832 | if (!isResizable()) { | |||
---|---|---|---|---|---|
833 | return; | 833 | return; | ||
834 | } | 834 | } | ||
835 | 835 | | |||
836 | const QRect clientArea = isElectricBorderMaximizing() ? | 836 | const QRect clientArea = isElectricBorderMaximizing() ? | ||
837 | workspace()->clientArea(MaximizeArea, Cursor::pos(), desktop()) : | 837 | workspace()->clientArea(MaximizeArea, Cursor::pos(), desktop()) : | ||
838 | workspace()->clientArea(MaximizeArea, this); | 838 | workspace()->clientArea(MaximizeArea, this); | ||
839 | 839 | | |||
840 | const MaximizeMode oldMode = m_requestedMaximizeMode; | 840 | const MaximizeMode oldMode = m_requestedMaximizeMode; | ||
841 | // FIXME: Ask for the currently requested geometry instead. Due to geometry | ||||
842 | // updates being asynchronous, geometry of the client might be restored to | ||||
843 | // an incorrect value. | ||||
841 | const QRect oldGeometry = geometry(); | 844 | const QRect oldGeometry = geometry(); | ||
842 | 845 | | |||
843 | StackingUpdatesBlocker blocker(workspace()); | 846 | StackingUpdatesBlocker blocker(workspace()); | ||
844 | RequestGeometryBlocker geometryBlocker(this); | 847 | RequestGeometryBlocker geometryBlocker(this); | ||
845 | // 'adjust == true' means to update the size only, e.g. after changing workspace size | 848 | // 'adjust == true' means to update the size only, e.g. after changing workspace size | ||
846 | if (!adjust) { | 849 | if (!adjust) { | ||
847 | if (vertical) | 850 | if (vertical) | ||
848 | m_requestedMaximizeMode = MaximizeMode(m_requestedMaximizeMode ^ MaximizeVertical); | 851 | m_requestedMaximizeMode = MaximizeMode(m_requestedMaximizeMode ^ MaximizeVertical); | ||
849 | if (horizontal) | 852 | if (horizontal) | ||
850 | m_requestedMaximizeMode = MaximizeMode(m_requestedMaximizeMode ^ MaximizeHorizontal); | 853 | m_requestedMaximizeMode = MaximizeMode(m_requestedMaximizeMode ^ MaximizeHorizontal); | ||
851 | } | 854 | } | ||
852 | // TODO: add more checks as in Client | 855 | // TODO: add more checks as in Client | ||
853 | 856 | | |||
854 | if (m_requestedMaximizeMode == oldMode) { | 857 | if (!adjust && m_requestedMaximizeMode == oldMode) { | ||
855 | return; | 858 | return; | ||
856 | } | 859 | } | ||
857 | 860 | | |||
858 | // call into decoration update borders | 861 | // call into decoration update borders | ||
859 | if (isDecorated() && decoration()->client() && !(options->borderlessMaximizedWindows() && m_requestedMaximizeMode == KWin::MaximizeFull)) { | 862 | if (isDecorated() && decoration()->client() && !(options->borderlessMaximizedWindows() && m_requestedMaximizeMode == KWin::MaximizeFull)) { | ||
860 | changeMaximizeRecursion = true; | 863 | changeMaximizeRecursion = true; | ||
861 | const auto c = decoration()->client().data(); | 864 | const auto c = decoration()->client().data(); | ||
862 | if ((m_requestedMaximizeMode & MaximizeVertical) != (oldMode & MaximizeVertical)) { | 865 | if ((m_requestedMaximizeMode & MaximizeVertical) != (oldMode & MaximizeVertical)) { | ||
Show All 11 Lines | |||||
874 | if (options->borderlessMaximizedWindows()) { | 877 | if (options->borderlessMaximizedWindows()) { | ||
875 | // triggers a maximize change. | 878 | // triggers a maximize change. | ||
876 | // The next setNoBorder interation will exit since there's no change but the first recursion pullutes the restore geometry | 879 | // The next setNoBorder interation will exit since there's no change but the first recursion pullutes the restore geometry | ||
877 | changeMaximizeRecursion = true; | 880 | changeMaximizeRecursion = true; | ||
878 | setNoBorder(rules()->checkNoBorder(m_requestedMaximizeMode == MaximizeFull)); | 881 | setNoBorder(rules()->checkNoBorder(m_requestedMaximizeMode == MaximizeFull)); | ||
879 | changeMaximizeRecursion = false; | 882 | changeMaximizeRecursion = false; | ||
880 | } | 883 | } | ||
881 | 884 | | |||
885 | if (quickTileMode() == QuickTileMode(QuickTileFlag::None)) { | ||||
886 | if (!adjust && !(oldMode & MaximizeVertical)) { | ||||
887 | m_geomMaximizeRestore.setTop(oldGeometry.top()); | ||||
888 | m_geomMaximizeRestore.setBottom(oldGeometry.bottom()); | ||||
889 | } | ||||
890 | if (!adjust && !(oldMode & MaximizeHorizontal)) { | ||||
891 | m_geomMaximizeRestore.setLeft(oldGeometry.left()); | ||||
892 | m_geomMaximizeRestore.setRight(oldGeometry.right()); | ||||
893 | } | ||||
894 | } | ||||
895 | | ||||
882 | // Conditional quick tiling exit points | 896 | // Conditional quick tiling exit points | ||
883 | const auto oldQuickTileMode = quickTileMode(); | 897 | // TODO: See if we can simplify this one. | ||
898 | const QuickTileMode oldQuickTileMode = quickTileMode(); | ||||
884 | if (quickTileMode() != QuickTileMode(QuickTileFlag::None)) { | 899 | if (quickTileMode() != QuickTileMode(QuickTileFlag::None)) { | ||
885 | if (oldMode == MaximizeFull && | 900 | if (oldMode == MaximizeFull && | ||
886 | !clientArea.contains(m_geomMaximizeRestore.center())) { | 901 | !clientArea.contains(m_geomMaximizeRestore.center())) { | ||
887 | // Not restoring on the same screen | 902 | // Not restoring on the same screen | ||
888 | // TODO: The following doesn't work for some reason | 903 | // TODO: The following doesn't work for some reason | ||
889 | //quick_tile_mode = QuickTileNone; // And exit quick tile mode manually | 904 | //quick_tile_mode = QuickTileFlag::None; // And exit quick tile mode manually | ||
890 | } else if ((oldMode == MaximizeVertical && m_requestedMaximizeMode == MaximizeRestore) || | 905 | } else if (oldMode == MaximizeFull || m_requestedMaximizeMode == MaximizeRestore) { | ||
891 | (oldMode == MaximizeFull && m_requestedMaximizeMode == MaximizeHorizontal)) { | | |||
892 | // Modifying geometry of a tiled window | 906 | // Modifying geometry of a tiled window | ||
893 | updateQuickTileMode(QuickTileFlag::None); // Exit quick tile mode without restoring geometry | 907 | updateQuickTileMode(QuickTileFlag::None); // Exit quick tile mode without restoring geometry | ||
894 | } | 908 | } | ||
895 | } | 909 | } | ||
896 | 910 | | |||
897 | // TODO: check rules | 911 | // We assume that the restore geometry is valid by the time it's used. | ||
898 | if (m_requestedMaximizeMode == MaximizeFull) { | 912 | const QRect originalGeometry = oldQuickTileMode ? oldGeometry : m_geomMaximizeRestore; | ||
899 | m_geomMaximizeRestore = oldGeometry; | 913 | | ||
900 | // TODO: Client has more checks | 914 | switch (m_requestedMaximizeMode) { | ||
901 | if (options->electricBorderMaximize()) { | 915 | case MaximizeRestore: { | ||
902 | updateQuickTileMode(QuickTileFlag::Maximize); | 916 | QRect targetGeometry = originalGeometry; | ||
917 | if (oldMode & MaximizeHorizontal) { | ||||
918 | targetGeometry.setLeft(m_geomMaximizeRestore.left()); | ||||
919 | targetGeometry.setRight(m_geomMaximizeRestore.right()); | ||||
920 | } | ||||
921 | if (oldMode & MaximizeVertical) { | ||||
922 | targetGeometry.setTop(m_geomMaximizeRestore.top()); | ||||
923 | targetGeometry.setBottom(m_geomMaximizeRestore.bottom()); | ||||
924 | } | ||||
925 | setGeometry(targetGeometry); | ||||
926 | break; | ||||
927 | } | ||||
928 | | ||||
929 | case MaximizeHorizontal: { | ||||
930 | QRect targetGeometry; | ||||
931 | if (oldMode & MaximizeVertical) { | ||||
932 | targetGeometry.setTop(m_geomMaximizeRestore.top()); | ||||
933 | targetGeometry.setBottom(m_geomMaximizeRestore.bottom()); | ||||
903 | } else { | 934 | } else { | ||
904 | updateQuickTileMode(QuickTileFlag::None); | 935 | targetGeometry.setTop(originalGeometry.top()); | ||
936 | targetGeometry.setBottom(originalGeometry.bottom()); | ||||
905 | } | 937 | } | ||
906 | if (quickTileMode() != oldQuickTileMode) { | 938 | targetGeometry.setLeft(clientArea.left()); | ||
907 | emit quickTileModeChanged(); | 939 | targetGeometry.setRight(clientArea.right()); | ||
940 | setGeometry(targetGeometry); | ||||
941 | break; | ||||
908 | } | 942 | } | ||
909 | setGeometry(workspace()->clientArea(MaximizeArea, this)); | 943 | | ||
910 | workspace()->raiseClient(this); | 944 | case MaximizeVertical: { | ||
945 | QRect targetGeometry; | ||||
946 | if (oldMode & MaximizeHorizontal) { | ||||
947 | targetGeometry.setLeft(m_geomMaximizeRestore.left()); | ||||
948 | targetGeometry.setRight(m_geomMaximizeRestore.right()); | ||||
911 | } else { | 949 | } else { | ||
912 | if (m_requestedMaximizeMode == MaximizeRestore) { | 950 | targetGeometry.setLeft(originalGeometry.left()); | ||
913 | updateQuickTileMode(QuickTileFlag::None); | 951 | targetGeometry.setRight(originalGeometry.right()); | ||
914 | } | 952 | } | ||
915 | if (quickTileMode() != oldQuickTileMode) { | 953 | targetGeometry.setTop(clientArea.top()); | ||
916 | emit quickTileModeChanged(); | 954 | targetGeometry.setBottom(clientArea.bottom()); | ||
955 | setGeometry(targetGeometry); | ||||
956 | break; | ||||
917 | } | 957 | } | ||
918 | 958 | | |||
919 | if (m_geomMaximizeRestore.isValid()) { | 959 | case MaximizeFull: | ||
920 | setGeometry(m_geomMaximizeRestore); | 960 | if (options->electricBorderMaximize()) { | ||
961 | updateQuickTileMode(QuickTileFlag::Maximize); | ||||
921 | } else { | 962 | } else { | ||
922 | setGeometry(workspace()->clientArea(PlacementArea, this)); | 963 | updateQuickTileMode(QuickTileFlag::None); | ||
964 | } | ||||
965 | setGeometry(clientArea); | ||||
966 | break; | ||||
923 | } | 967 | } | ||
968 | | ||||
969 | if (oldQuickTileMode != quickTileMode()) { | ||||
970 | emit quickTileModeChanged(); | ||||
924 | } | 971 | } | ||
925 | } | 972 | } | ||
926 | 973 | | |||
927 | MaximizeMode ShellClient::maximizeMode() const | 974 | MaximizeMode ShellClient::maximizeMode() const | ||
928 | { | 975 | { | ||
929 | return m_maximizeMode; | 976 | return m_maximizeMode; | ||
930 | } | 977 | } | ||
931 | 978 | | |||
▲ Show 20 Lines • Show All 1037 Lines • Show Last 20 Lines |