Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions RetroBar/App.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
using System.Reflection;
using ManagedShell.Common.Logging;
using System.Linq;
using System.Windows.Controls;
using System.Windows.Input;

namespace RetroBar
{
Expand Down Expand Up @@ -57,11 +59,39 @@ private void App_OnStartup(object sender, StartupEventArgs e)
RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly;
}

EventManager.RegisterClassHandler(typeof(ContextMenu), ContextMenu.OpenedEvent, new RoutedEventHandler(MenuOpened));
EventManager.RegisterClassHandler(typeof(ContextMenu), UIElement.KeyDownEvent, new KeyEventHandler(MenuOnKeyDown));
EventManager.RegisterClassHandler(typeof(MenuItem), MenuItem.ClickEvent, new RoutedEventHandler(MenuItemClicked));
EventManager.RegisterClassHandler(typeof(MenuItem), MenuItem.SubmenuOpenedEvent, new RoutedEventHandler(MenuOpened));
_dictionaryManager.SetLanguageFromSettings();
loadTheme();
_windowManager = new WindowManager(_dictionaryManager, _explorerMonitor, _shellManager, _startMenuMonitor, _updater, _hotkeyManager);
}

private void MenuOpened(object sender, RoutedEventArgs e)
{
SoundHelper.PlaySystemSound("MenuPopup");
}

private void MenuItemClicked(object sender, RoutedEventArgs e)
{
if (sender is MenuItem menuItem && menuItem.StaysOpenOnClick)
{
return;
}

SoundHelper.PlaySystemSound("MenuCommand");
}

private void MenuOnKeyDown(object sender, KeyEventArgs e)
{
// don't close if alt is pressed
if (e.SystemKey is Key.LeftAlt or Key.RightAlt)
{
e.Handled = true;
}
}

private void App_OnExit(object sender, ExitEventArgs e)
{
ExitApp();
Expand Down
55 changes: 2 additions & 53 deletions RetroBar/Controls/TaskButton.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@
ContextMenuOpening="AppButton_OnContextMenuOpening"
DragEnter="AppButton_OnDragEnter"
DragLeave="AppButton_OnDragLeave"
ToolTipService.ShowDuration="60000">
ToolTipService.ShowDuration="60000"
ContextMenu="{StaticResource TaskButtonContextMenu}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
Expand All @@ -44,58 +45,6 @@
</TextBlock.Text>
</TextBlock>
</Grid>
<Button.ContextMenu>
<ContextMenu Opened="ContextMenu_OpenedOrClosed"
Closed="ContextMenu_OpenedOrClosed">
<MenuItem Header="{DynamicResource restore}"
Click="RestoreMenuItem_OnClick"
Name="RestoreMenuItem">
<MenuItem.Icon>
<TextBlock FontFamily="Marlett"
Text="&#x32;"
HorizontalAlignment="Center"
VerticalAlignment="Center" />
</MenuItem.Icon>
</MenuItem>
<MenuItem Header="{DynamicResource move}"
Click="MoveMenuItem_OnClick"
Name="MoveMenuItem" />
<MenuItem Header="{DynamicResource size}"
Click="SizeMenuItem_OnClick"
Name="SizeMenuItem" />
<MenuItem Header="{DynamicResource minimize}"
Click="MinimizeMenuItem_OnClick"
Name="MinimizeMenuItem">
<MenuItem.Icon>
<TextBlock FontFamily="Marlett"
Text="&#x30;"
HorizontalAlignment="Center"
VerticalAlignment="Center" />
</MenuItem.Icon>
</MenuItem>
<MenuItem Header="{DynamicResource maximize}"
Click="MaximizeMenuItem_OnClick"
Name="MaximizeMenuItem">
<MenuItem.Icon>
<TextBlock FontFamily="Marlett"
Text="&#x31;"
HorizontalAlignment="Center"
VerticalAlignment="Center" />
</MenuItem.Icon>
</MenuItem>
<Separator />
<MenuItem Header="{DynamicResource close}"
Click="CloseMenuItem_OnClick"
Name="CloseMenuItem">
<MenuItem.Icon>
<TextBlock FontFamily="Marlett"
Text="&#x72;"
HorizontalAlignment="Center"
VerticalAlignment="Center" />
</MenuItem.Icon>
</MenuItem>
</ContextMenu>
</Button.ContextMenu>
<Button.ToolTip>
<ToolTip>
<ToolTip.Style>
Expand Down
94 changes: 77 additions & 17 deletions RetroBar/Controls/TaskButton.xaml.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using System.ComponentModel;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
Expand Down Expand Up @@ -103,6 +104,10 @@ private void TaskButton_OnLoaded(object sender, RoutedEventArgs e)
Animate();
}

AppButton.ContextMenu.Opened += ContextMenu_OpenedOrClosed;
AppButton.ContextMenu.Closed += ContextMenu_OpenedOrClosed;
AppButton.ContextMenu.KeyDown += ContextMenu_KeyDown;

_isLoaded = true;
}

Expand Down Expand Up @@ -158,51 +163,106 @@ private void AppButton_OnContextMenuOpening(object sender, ContextMenuEventArgs
NativeMethods.WindowShowStyle wss = Window.ShowStyle;
int ws = Window.WindowStyles;

// disable window operations depending on current window state. originally tried implementing via bindings but found there is no notification we get regarding maximized state
MaximizeMenuItem.IsEnabled = wss != NativeMethods.WindowShowStyle.ShowMaximized && (ws & (int)NativeMethods.WindowStyles.WS_MAXIMIZEBOX) != 0;
MinimizeMenuItem.IsEnabled = wss != NativeMethods.WindowShowStyle.ShowMinimized && Window.CanMinimize;
if (RestoreMenuItem.IsEnabled = wss != NativeMethods.WindowShowStyle.ShowNormal)
var menuItems = AppButton.ContextMenu.Items.OfType<MenuItem>().ToDictionary(item => item.Name);

if (menuItems.TryGetValue("RestoreMenuItem", out var restoreMenuItem))
{
restoreMenuItem.Click += RestoreMenuItem_OnClick;
restoreMenuItem.StaysOpenOnClick = wss == NativeMethods.WindowShowStyle.ShowNormal;
}

if (menuItems.TryGetValue("MoveMenuItem", out var moveMenuItem))
{
moveMenuItem.Click += MoveMenuItem_OnClick;
moveMenuItem.StaysOpenOnClick = !(wss == NativeMethods.WindowShowStyle.ShowNormal);
}

if (menuItems.TryGetValue("SizeMenuItem", out var sizeMenuItem))
{
sizeMenuItem.Click += SizeMenuItem_OnClick;
sizeMenuItem.StaysOpenOnClick = !(wss == NativeMethods.WindowShowStyle.ShowNormal && (ws & (int)NativeMethods.WindowStyles.WS_MAXIMIZEBOX) != 0);
}

if (menuItems.TryGetValue("MinimizeMenuItem", out var minimizeMenuItem))
{
minimizeMenuItem.Click += MinimizeMenuItem_OnClick;
minimizeMenuItem.StaysOpenOnClick = !(wss != NativeMethods.WindowShowStyle.ShowMinimized && (ws & (int)NativeMethods.WindowStyles.WS_MINIMIZEBOX) != 0);
}

if (menuItems.TryGetValue("MaximizeMenuItem", out var maximizeMenuItem))
{
CloseMenuItem.FontWeight = FontWeights.Normal;
RestoreMenuItem.FontWeight = FontWeights.Bold;
maximizeMenuItem.Click += MaximizeMenuItem_OnClick;
maximizeMenuItem.StaysOpenOnClick = !(wss != NativeMethods.WindowShowStyle.ShowMaximized && (ws & (int)NativeMethods.WindowStyles.WS_MAXIMIZEBOX) != 0);
}
if (!RestoreMenuItem.IsEnabled || RestoreMenuItem.IsEnabled && !MaximizeMenuItem.IsEnabled)

if (menuItems.TryGetValue("CloseMenuItem", out var closeMenuItem))
{
closeMenuItem.Click += CloseMenuItem_OnClick;
}
}

private void ContextMenu_KeyDown(object sender, KeyEventArgs e)
{
// Check if Alt+F4 is pressed
if (Keyboard.Modifiers == ModifierKeys.Alt && Keyboard.IsKeyDown(Key.F4))
{
CloseMenuItem.FontWeight = FontWeights.Bold;
RestoreMenuItem.FontWeight = FontWeights.Normal;
e.Handled = true;
Window?.Close();
if (AppButton.ContextMenu is { IsOpen: true })
{
AppButton.ContextMenu.IsOpen = false;
}
}
MoveMenuItem.IsEnabled = wss == NativeMethods.WindowShowStyle.ShowNormal;
SizeMenuItem.IsEnabled = wss == NativeMethods.WindowShowStyle.ShowNormal && (ws & (int)NativeMethods.WindowStyles.WS_MAXIMIZEBOX) != 0;
}

private static bool MenuItemEnabled(object sender) => !((MenuItem)sender).StaysOpenOnClick;

private void CloseMenuItem_OnClick(object sender, RoutedEventArgs e)
{
Window?.Close();
if (MenuItemEnabled(sender))
{
Window?.Close();
}
}

private void RestoreMenuItem_OnClick(object sender, RoutedEventArgs e)
{
Window?.Restore();
if (MenuItemEnabled(sender))
{
Window?.Restore();
}
}

private void MoveMenuItem_OnClick(object sender, RoutedEventArgs e)
{
Window?.Move();
if (MenuItemEnabled(sender))
{
Window?.Move();
}
}

private void SizeMenuItem_OnClick(object sender, RoutedEventArgs e)
{
Window?.Size();
if (MenuItemEnabled(sender))
{
Window?.Size();
}
}

private void MinimizeMenuItem_OnClick(object sender, RoutedEventArgs e)
{
Window?.Minimize();
if (MenuItemEnabled(sender))
{
Window?.Minimize();
}
}

private void MaximizeMenuItem_OnClick(object sender, RoutedEventArgs e)
{
Window?.Maximize();
if (MenuItemEnabled(sender))
{
Window?.Maximize();
}
}

private void AppButton_OnClick(object sender, RoutedEventArgs e)
Expand Down
10 changes: 8 additions & 2 deletions RetroBar/Controls/TaskList.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -262,10 +262,16 @@ private void SetScrollable(bool canScroll)

private void TasksScrollViewer_PreviewMouseWheel(object sender, System.Windows.Input.MouseWheelEventArgs e)
{
if (!isScrollable)
if (e.Delta > 0)
{
e.Handled = true;
TasksScrollViewer.PageUp();
}
if (e.Delta < 0)
{
TasksScrollViewer.PageDown();
}

e.Handled = true;
}
}
}
5 changes: 5 additions & 0 deletions RetroBar/Taskbar.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,11 @@ protected override IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lP
{
windowManager.NotifyWorkAreaChange();
}
else if (msg == (int)NativeMethods.WM.SYSCOMMAND && wParam == (IntPtr)NativeMethods.SC_CLOSE)
{
IntPtr progmanHwnd = NativeMethods.FindWindow("Progman", "Program Manager");
NativeMethods.SendMessage(progmanHwnd, (int)NativeMethods.WM.CLOSE, IntPtr.Zero, IntPtr.Zero);
}

return IntPtr.Zero;
}
Expand Down
15 changes: 14 additions & 1 deletion RetroBar/Themes/System XP.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,20 @@
</Style>

<Style TargetType="MenuItem"
x:Key="TaskManMenuItem">
x:Key="{x:Type MenuItem}"
BasedOn="{StaticResource {x:Type MenuItem}}">
<Style.Triggers>
<Trigger Property="Role"
Value="SubmenuItem">
<Setter Property="Padding"
Value="4,1,1,3" />
</Trigger>
</Style.Triggers>
</Style>

<Style TargetType="MenuItem"
x:Key="TaskManMenuItem"
BasedOn="{StaticResource {x:Type MenuItem}}">
<Setter Property="Header"
Value="{DynamicResource show_taskman}" />
</Style>
Expand Down
Loading