Compare commits

..

14 Commits

Author SHA1 Message Date
Serge
d36cd409a4 XGM Config Flag 2023-09-07 15:37:09 +02:00
Serge
082eceed9a Update checker 2023-09-07 13:44:31 +02:00
Serge
46c91d1956 Merge branch 'main' of https://github.com/seerge/g-helper 2023-09-07 10:06:58 +02:00
Serge
edfb829988 XGM activation https://github.com/seerge/g-helper/issues/729 2023-09-07 10:06:56 +02:00
Serge
83cb28e99c Update README.md 2023-09-06 22:11:38 +02:00
Serge
957916bfdf XGM Special Activation 2023-09-06 21:51:09 +02:00
Serge
2f98606a7d XG Mobile tweaks 2023-09-06 19:58:14 +02:00
Serge
c791421c3e Merge pull request #1264 from seerge/G14-2021-Matrix
Anime Matrix tweaks
2023-09-06 19:04:55 +02:00
Serge
fa79a72247 Anime Matrix tweaks 2023-09-06 19:03:27 +02:00
Serge
831f7b8989 Merge branch 'main' of https://github.com/seerge/g-helper 2023-09-06 16:01:20 +02:00
Serge
77800475cb Matrix Clock 2023-09-06 16:01:18 +02:00
Serge
96553a162c Merge pull request #1262 from seerge/l10n_main
New Crowdin updates
2023-09-06 13:56:27 +02:00
Serge
d1e987f4da New translations Strings.resx (Polish) 2023-09-06 13:54:28 +02:00
Serge
a1fb740c27 TUF Backlight for new models https://github.com/seerge/g-helper/issues/1250 2023-09-06 13:50:48 +02:00
16 changed files with 203 additions and 159 deletions

View File

@@ -1,14 +1,11 @@
// Source thanks to https://github.com/vddCore/Starlight with some adjustments from me
using GHelper;
using GHelper.AnimeMatrix.Communication;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Drawing.Text;
using System.Globalization;
using System.Management;
using System.Text;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.Window;
namespace Starlight.AnimeMatrix
{
@@ -80,6 +77,7 @@ namespace Starlight.AnimeMatrix
}
public class AnimeMatrixDevice : Device
{
int UpdatePageLength = 490;
@@ -89,31 +87,36 @@ namespace Starlight.AnimeMatrix
List<byte[]> frames = new List<byte[]>();
public int MaxRows = 61;
//public int FullRows = 11;
//public int FullEvenRows = -1;
public int dx = 0;
public int MaxColumns = 34;
public int LedStart = 0;
public int TextShift = 8;
private int frameIndex = 0;
private static AnimeType _model = AnimeType.GA402;
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
private static extern IntPtr AddFontMemResourceEx(IntPtr pbFont, uint cbFont, IntPtr pdv, [System.Runtime.InteropServices.In] ref uint pcFonts);
private PrivateFontCollection fonts = new PrivateFontCollection();
public AnimeMatrixDevice()
: base(0x0B05, 0x193B, 640)
public AnimeMatrixDevice() : base(0x0B05, 0x193B, 640)
{
string model = GetModel();
if (model.Contains("401"))
{
_model = AnimeType.GA401;
MaxColumns = 33;
dx = 1;
MaxRows = 55;
LedCount = 1245;
UpdatePageLength = 410;
TextShift = 11;
LedStart = 1;
}
if (model.Contains("GU604"))
@@ -124,12 +127,35 @@ namespace Starlight.AnimeMatrix
MaxRows = 92;
LedCount = 1711;
UpdatePageLength = 630;
TextShift = 10;
}
_displayBuffer = new byte[LedCount];
/*
for (int i = 0; i < MaxRows; i++)
{
_model = AnimeType.GA401;
Logger.WriteLine(FirstX(i) + " " + Pitch(i));
}
*/
LoadMFont();
}
private void LoadMFont()
{
byte[] fontData = GHelper.Properties.Resources.MFont;
IntPtr fontPtr = System.Runtime.InteropServices.Marshal.AllocCoTaskMem(fontData.Length);
System.Runtime.InteropServices.Marshal.Copy(fontData, 0, fontPtr, fontData.Length);
uint dummy = 0;
fonts.AddMemoryFont(fontPtr, GHelper.Properties.Resources.MFont.Length);
AddFontMemResourceEx(fontPtr, (uint)GHelper.Properties.Resources.MFont.Length, IntPtr.Zero, ref dummy);
System.Runtime.InteropServices.Marshal.FreeCoTaskMem(fontPtr);
}
public string GetModel()
{
@@ -173,32 +199,7 @@ namespace Starlight.AnimeMatrix
}
public static int FirstX(int y)
{
switch (_model)
{
case AnimeType.GA401:
if (y < 5)
{
return 0;
}
else
{
return (y + 1) / 2 - 3;
}
case AnimeType.GU604:
if (y < 9 && y % 2 == 0)
{
return 1;
}
return (int)Math.Ceiling(Math.Max(0, y - 9) / 2F);
default:
return (int)Math.Ceiling(Math.Max(0, y - 11) / 2F);
}
}
public static int Width(int y)
public int Width()
{
switch (_model)
{
@@ -211,7 +212,30 @@ namespace Starlight.AnimeMatrix
}
}
public static int Pitch(int y)
public int FirstX(int y)
{
switch (_model)
{
case AnimeType.GA401:
if (y < 5 && y % 2 == 0)
{
return 1;
}
return (int)Math.Ceiling(Math.Max(0, y - 5) / 2F);
case AnimeType.GU604:
if (y < 9 && y % 2 == 0)
{
return 1;
}
return (int)Math.Ceiling(Math.Max(0, y - 9) / 2F);
default:
return (int)Math.Ceiling(Math.Max(0, y - 11) / 2F);
}
}
public int Pitch(int y)
{
switch (_model)
{
@@ -247,19 +271,19 @@ namespace Starlight.AnimeMatrix
return 39;
default:
return Width(y) - FirstX(y);
return Width() - FirstX(y);
}
default:
return Width(y) - FirstX(y);
return Width() - FirstX(y);
}
}
public int RowToLinearAddress(int y)
{
int ret = 0;
int ret = LedStart;
for (var i = 0; i < y; i++)
ret += Pitch(i);
@@ -270,8 +294,8 @@ namespace Starlight.AnimeMatrix
{
if (!IsRowInRange(y)) return;
if (x >= FirstX(y) && x < Width(y))
SetLedLinear(RowToLinearAddress(y) - FirstX(y) + x + dx, value);
if (x >= FirstX(y) && x < Width())
SetLedLinear(RowToLinearAddress(y) - FirstX(y) + x, value);
}
public void WakeUp()
@@ -369,20 +393,49 @@ namespace Starlight.AnimeMatrix
public void PresentClock()
{
int second = DateTime.Now.Second;
string time;
string second = (DateTime.Now.Second % 2 == 0) ? ":" : " ";
string time = DateTime.Now.ToString("HH" + second + "mm");
if (CultureInfo.CurrentCulture.DateTimeFormat.ShortTimePattern.Contains("H"))
time = DateTime.Now.ToString("H" + ((second % 2 == 0) ? ":" : " ") + "mm");
else
time = DateTime.Now.ToString("h" + ((second % 2 == 0) ? ":" : " ") + "mmtt");
Clear();
TextDiagonal(time, 15, 12, TextShift + 11);
TextDiagonal(DateTime.Now.ToString("yy'. 'MM'. 'dd"), 11.5F, 3, TextShift);
Present();
if (_model == AnimeType.GA401)
PresentText(time);
else
PresentTextDiagonal(time);
}
public void TextDiagonal(string text, float fontSize = 10, int deltaX = 0, int deltaY = 10)
{
int maxX = (int)Math.Sqrt(MaxRows * MaxRows + MaxColumns * MaxColumns);
int textHeight;
using (Bitmap bmp = new Bitmap(maxX, MaxRows))
{
using (Graphics g = Graphics.FromImage(bmp))
{
g.CompositingQuality = CompositingQuality.HighQuality;
g.SmoothingMode = SmoothingMode.AntiAlias;
g.TextRenderingHint = TextRenderingHint.SingleBitPerPixel;
using (Font font = new Font(fonts.Families[0], fontSize, FontStyle.Regular, GraphicsUnit.Pixel))
{
SizeF textSize = g.MeasureString(text, font);
textHeight = (int)textSize.Height;
g.DrawString(text, font, Brushes.White, 0, 0);
}
}
for (int y = 0; y < bmp.Height; y++)
{
for (int x = 0; x < bmp.Width; x++)
{
var pixel = bmp.GetPixel(x, y);
var color = (pixel.R + pixel.G + pixel.B) / 3;
if (color > 100) SetLedDiagonal(x, y, (byte)color, deltaX, deltaY);
}
}
}
}
public void PresentText(string text1, string text2 = "")
@@ -410,42 +463,25 @@ namespace Starlight.AnimeMatrix
}
bmp.Save("test.bmp", ImageFormat.Bmp);
GenerateFrame(bmp);
Present();
}
}
public void GenerateFrame(Image image, float zoom = 1, int panX = 0, int panY = 0, InterpolationMode quality = InterpolationMode.Default)
{
using (Bitmap bmp = GeneratePicture(image, zoom, panX, panY, quality))
{
for (int y = 0; y < bmp.Height; y++)
{
for (int x = 0; x < bmp.Width; x++)
if (x % 2 == (y + dx) % 2)
{
var pixel = bmp.GetPixel(x, y);
var color = (pixel.R + pixel.G + pixel.B) / 3;
if (color < 10) color = 0;
SetLedPlanar(x / 2, y, (byte)color);
}
}
}
}
public Bitmap GeneratePicture(Image image, float zoom = 100, int panX = 0, int panY = 0, InterpolationMode quality = InterpolationMode.Default)
public void GenerateFrame(Image image, float zoom = 100, int panX = 0, int panY = 0, InterpolationMode quality = InterpolationMode.Default)
{
int width = MaxColumns * 3;
int width = MaxColumns / 2 * 6;
int height = MaxRows;
int targetWidth = MaxColumns * 2;
float scale;
Bitmap bmp = new Bitmap(targetWidth, height);
using (Bitmap bmp = new Bitmap(targetWidth, height))
{
scale = Math.Min((float)width / (float)image.Width, (float)height / (float)image.Height) * zoom / 100;
@@ -459,61 +495,35 @@ namespace Starlight.AnimeMatrix
graph.SmoothingMode = SmoothingMode.AntiAlias;
graph.DrawImage(image, (float)Math.Round(targetWidth - (scaleWidth + panX) * targetWidth / width), -panY, (float)Math.Round(scaleWidth * targetWidth / width), scaleHeight);
return bmp;
}
}
}
public void SetLedDiagonal(int x, int y, byte color, int delta = 10)
{
//x += delta;
y -= delta;
int dx = (x - y) / 2;
int dy = x + y;
SetLedPlanar(dx, dy, color);
}
public void PresentTextDiagonal(string text)
{
Clear();
int maxX = (int)Math.Sqrt(MaxRows * MaxRows + MaxColumns * MaxColumns);
int textHeight;
using (Bitmap bmp = new Bitmap(maxX, MaxRows))
{
using (Graphics g = Graphics.FromImage(bmp))
{
g.CompositingQuality = CompositingQuality.HighQuality;
g.SmoothingMode = SmoothingMode.AntiAlias;
g.TextRenderingHint = TextRenderingHint.SingleBitPerPixel;
using (Font font = new Font("Consolas", 11, FontStyle.Regular, GraphicsUnit.Pixel))
{
SizeF textSize = g.MeasureString(text, font);
textHeight = (int)textSize.Height;
g.DrawString(text, font, Brushes.White, 4, 0);
}
}
for (int y = 0; y < bmp.Height; y++)
{
for (int x = 0; x < bmp.Width; x++)
{
var pixel = bmp.GetPixel(x, y);
var color = (pixel.R + pixel.G + pixel.B) / 3;
SetLedDiagonal(x, y, (byte)color, textHeight - 8);
}
if (x % 2 == y % 2)
{
var pixel = bmp.GetPixel(x, y);
var color = (pixel.R + pixel.G + pixel.B) / 3;
if (color < 10) color = 0;
SetLedPlanar(x / 2, y, (byte)color);
}
}
}
Present();
}
public void SetLedDiagonal(int x, int y, byte color, int deltaX = 0, int deltaY = 10)
{
x += deltaX;
y -= deltaY;
int plX = (x - y) / 2;
int plY = x + y;
SetLedPlanar(plX, plY, color);
}
private bool IsRowInRange(int row)
{
return (row >= 0 && row < MaxRows);

View File

@@ -383,7 +383,7 @@ public static class AppConfig
public static bool IsNoGPUModes()
{
return ContainsModel("GV301RA") || ContainsModel("GV302XA");
return ContainsModel("GV301RA") || ContainsModel("GV302XA") || IsAlly();
}
}

View File

@@ -60,7 +60,6 @@ public class AsusACPI
public const uint GPUEco = 0x00090020;
public const uint GPUXGInit = 0x00090017;
public const uint GPUXGConnected = 0x00090018;
public const uint GPUXG = 0x00090019;
@@ -94,6 +93,7 @@ public class AsusACPI
public const int TUF_KB_BRIGHTNESS = 0x00050021;
public const int TUF_KB = 0x00100056;
public const int TUF_KB2 = 0x0010005a;
public const int TUF_KB_STATE = 0x00100057;
public const int MICMUTE_LED = 0x00040017;
@@ -520,14 +520,8 @@ public class AsusACPI
setting[4] = color.B;
setting[5] = (byte)speed;
DeviceSet(TUF_KB, setting, "TUF RGB");
/*
setting[0] = (byte)0xb4;
DeviceSet(TUF_KB, setting, "TUF RGB");
*/
//Debug.WriteLine(BitConverter.ToString(setting));
int result = DeviceSet(TUF_KB, setting, "TUF RGB");
if (result != 1) DeviceSet(TUF_KB2, setting, "TUF RGB");
}

View File

@@ -9,8 +9,8 @@
if (limit < 0) limit = AppConfig.Get("charge_limit");
if (limit < 40 || limit > 100) return;
Program.settingsForm.VisualiseBattery(limit);
Program.acpi.DeviceSet(AsusACPI.BatteryLimit, limit, "BatteryLimit");
Program.settingsForm.VisualiseBattery(limit);
AppConfig.Set("charge_limit", limit);

View File

@@ -15,7 +15,7 @@
<PlatformTarget>AnyCPU</PlatformTarget>
<ProduceReferenceAssembly>False</ProduceReferenceAssembly>
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
<AssemblyVersion>0.119</AssemblyVersion>
<AssemblyVersion>0.120</AssemblyVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">

View File

@@ -307,7 +307,11 @@ namespace GHelper.Gpu
}
else
{
Program.acpi.DeviceSet(AsusACPI.GPUXG, 1, "GPU XGM");
if (AppConfig.Is("xgm_special"))
Program.acpi.DeviceSet(AsusACPI.GPUXG, 0x101, "GPU XGM");
else
Program.acpi.DeviceSet(AsusACPI.GPUXG, 1, "GPU XGM");
InitXGM();

View File

@@ -610,6 +610,16 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
internal static byte[] MFont {
get {
object obj = ResourceManager.GetObject("MFont", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
/// </summary>

View File

@@ -289,4 +289,7 @@
<data name="icons8_rocket_32" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-rocket-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="MFont" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Font.otf;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
</root>

View File

@@ -235,7 +235,7 @@
<value>Automatycznie ustaw odświeżanie 60 Hz w czasie pracy na baterii</value>
</data>
<data name="Awake" xml:space="preserve">
<value>Aktywność</value>
<value>Włączone</value>
</data>
<data name="BacklightTimeout" xml:space="preserve">
<value>Limit czasu podłączonego / na baterii (0 - Włączony)</value>
@@ -256,7 +256,7 @@
<value>Aktualizacje BIOS i sterowników</value>
</data>
<data name="Boot" xml:space="preserve">
<value>Podczas uruchamiania</value>
<value>Uruchamianie</value>
</data>
<data name="Brightness" xml:space="preserve">
<value>Jasność</value>

BIN
app/Resources/Font.otf Normal file

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -10,7 +10,6 @@ using GHelper.Peripherals;
using GHelper.Peripherals.Mouse;
using GHelper.UI;
using System.Diagnostics;
using System.Drawing.Imaging;
using System.Timers;
namespace GHelper
@@ -544,6 +543,7 @@ namespace GHelper
Invoke(delegate
{
comboMatrixRunning.SelectedIndex = mode;
if (comboMatrix.SelectedIndex == 0) comboMatrix.SelectedIndex = 3;
});
}

View File

@@ -54,16 +54,17 @@ namespace GHelper
//
tableBios.AutoSize = true;
tableBios.AutoSizeMode = AutoSizeMode.GrowAndShrink;
tableBios.ColumnCount = 3;
tableBios.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));
tableBios.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
tableBios.ColumnCount = 4;
tableBios.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 20F));
tableBios.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 40F));
tableBios.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 15F));
tableBios.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));
tableBios.Dock = DockStyle.Top;
tableBios.Location = new Point(20, 20);
tableBios.Margin = new Padding(4);
tableBios.MinimumSize = new Size(1100, 0);
tableBios.MinimumSize = new Size(1300, 0);
tableBios.Name = "tableBios";
tableBios.Size = new Size(1216, 0);
tableBios.Size = new Size(1300, 0);
tableBios.TabIndex = 0;
//
// labelBIOS
@@ -105,7 +106,7 @@ namespace GHelper
//
labelUpdates.Anchor = AnchorStyles.Top | AnchorStyles.Right;
labelUpdates.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelUpdates.Location = new Point(941, 23);
labelUpdates.Location = new Point(810, 23);
labelUpdates.Name = "labelUpdates";
labelUpdates.Size = new Size(245, 32);
labelUpdates.TabIndex = 4;
@@ -156,16 +157,17 @@ namespace GHelper
//
tableDrivers.AutoSize = true;
tableDrivers.AutoSizeMode = AutoSizeMode.GrowAndShrink;
tableDrivers.ColumnCount = 3;
tableDrivers.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));
tableDrivers.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
tableDrivers.ColumnCount = 4;
tableDrivers.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 20F));
tableDrivers.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 40F));
tableDrivers.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 15F));
tableDrivers.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));
tableDrivers.Dock = DockStyle.Top;
tableDrivers.Location = new Point(20, 20);
tableDrivers.Margin = new Padding(4);
tableDrivers.MinimumSize = new Size(1100, 0);
tableDrivers.MinimumSize = new Size(1300, 0);
tableDrivers.Name = "tableDrivers";
tableDrivers.Size = new Size(1216, 0);
tableDrivers.Size = new Size(1300, 0);
tableDrivers.TabIndex = 0;
//
// panelDriversTitle

View File

@@ -9,6 +9,9 @@ namespace GHelper
public partial class Updates : RForm
{
const int DRIVER_NOT_FOUND = 2;
const int DRIVER_NEWER = 1;
//static int rowCount = 0;
static string model;
static string bios;
@@ -21,6 +24,7 @@ namespace GHelper
public string title;
public string version;
public string downloadUrl;
public string date;
public JsonElement hardwares;
}
private void LoadUpdates(bool force = false)
@@ -156,7 +160,8 @@ namespace GHelper
table.RowStyles.Add(new RowStyle(SizeType.AutoSize));
table.Controls.Add(new Label { Text = driver.categoryName, Anchor = AnchorStyles.Left, Dock = DockStyle.Fill, Padding = new Padding(5, 5, 5, 5) }, 0, table.RowCount);
table.Controls.Add(new Label { Text = driver.title, Anchor = AnchorStyles.Left, Dock = DockStyle.Fill, Padding = new Padding(5, 5, 5, 5) }, 1, table.RowCount);
table.Controls.Add(versionLabel, 2, table.RowCount);
table.Controls.Add(new Label { Text = driver.date, Anchor = AnchorStyles.Left, Dock = DockStyle.Fill, Padding = new Padding(5, 5, 5, 5) }, 2, table.RowCount);
table.Controls.Add(versionLabel, 3, table.RowCount);
table.RowCount++;
});
}
@@ -171,15 +176,21 @@ namespace GHelper
});
}
public void VisualiseNewDriver(int position, TableLayoutPanel table)
public void VisualiseNewDriver(int position, int newer, TableLayoutPanel table)
{
var label = table.GetControlFromPosition(2, position) as Label;
var label = table.GetControlFromPosition(3, position) as Label;
if (label != null)
{
Invoke(delegate
{
label.Font = new Font(label.Font, FontStyle.Underline | FontStyle.Bold);
label.ForeColor = colorTurbo;
if (newer == DRIVER_NEWER)
{
label.Font = new Font(label.Font, FontStyle.Underline | FontStyle.Bold);
label.ForeColor = colorTurbo;
}
if (newer == DRIVER_NOT_FOUND) label.ForeColor = Color.Gray;
});
}
}
@@ -237,6 +248,7 @@ namespace GHelper
driver.version = file.GetProperty("Version").ToString().Replace("V", "");
driver.downloadUrl = file.GetProperty("DownloadUrl").GetProperty("Global").ToString();
driver.hardwares = file.GetProperty("HardwareInfoList");
driver.date = file.GetProperty("ReleaseDate").ToString();
drivers.Add(driver);
VisualiseDriver(driver, table);
@@ -257,26 +269,28 @@ namespace GHelper
int count = 0;
foreach (var driver in drivers)
{
int newer = -2;
int newer = DRIVER_NOT_FOUND;
if (type == 0 && driver.hardwares.ToString().Length > 0)
for (int k = 0; k < driver.hardwares.GetArrayLength(); k++)
{
var deviceID = driver.hardwares[k].GetProperty("hardwareid").ToString();
var localVersion = devices.Where(p => p.Key.Contains(deviceID)).Select(p => p.Value).FirstOrDefault();
if (localVersion is not null)
var localVersions = devices.Where(p => p.Key.Contains(deviceID)).Select(p => p.Value);
foreach (var localVersion in localVersions)
{
newer = new Version(driver.version).CompareTo(new Version(localVersion));
break;
newer = Math.Min(newer, new Version(driver.version).CompareTo(new Version(localVersion)));
Logger.WriteLine(driver.title + " " + driver.version + " vs " + localVersion + " = " + newer);
}
}
if (type == 1)
newer = Int32.Parse(driver.version) > Int32.Parse(bios) ? 1 : -1;
if (newer > 0)
VisualiseNewDriver(count, newer, table);
if (newer == DRIVER_NEWER)
{
updatesCount++;
VisualiseNewDriver(count, table);
VisualiseNewCount(updatesCount, table);
}

View File

@@ -18,7 +18,7 @@
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing"">Blue</data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>

View File

@@ -249,6 +249,13 @@ Example (for default windows "balanced" power plan):
"scheme_2": "381b4222-f694-41f0-9685-ff5bb260df2e",
```
### Alternative Activation for XG Mobile 6850XT
If you experience situation when your XG Mobile doesn't work on full power when Activated. It's possible it needs "alternative" command to get activated.
To turn it on, add following line to config :
```
"xgm_special" : 1,
```
### Override UI theme
By default app would set UI theme from "app" theme in windows setting. You can override it to specific theme, or general windows theme