diff --git a/V1/Launcheroid.sln b/V1/Launcheroid.sln
new file mode 100644
index 0000000..30efd3e
--- /dev/null
+++ b/V1/Launcheroid.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual C# Express 2008
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Launcheroid", "Launcheroid\Launcheroid.csproj", "{6403D9B8-17B0-45C8-B8B1-163A275EC3FB}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {6403D9B8-17B0-45C8-B8B1-163A275EC3FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6403D9B8-17B0-45C8-B8B1-163A275EC3FB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6403D9B8-17B0-45C8-B8B1-163A275EC3FB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6403D9B8-17B0-45C8-B8B1-163A275EC3FB}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/V1/Launcheroid/BlueLauncher.ico b/V1/Launcheroid/BlueLauncher.ico
new file mode 100644
index 0000000..ce77a12
--- /dev/null
+++ b/V1/Launcheroid/BlueLauncher.ico
Binary files differ
diff --git a/V1/Launcheroid/FConf.Designer.cs b/V1/Launcheroid/FConf.Designer.cs
new file mode 100644
index 0000000..eafcdbe
--- /dev/null
+++ b/V1/Launcheroid/FConf.Designer.cs
@@ -0,0 +1,88 @@
+namespace Launcheroid
+{
+ partial class FConf
+ {
+ ///
+ /// Variable del diseñador requerida.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Limpiar los recursos que se estén utilizando.
+ ///
+ /// true si los recursos administrados se deben eliminar; false en caso contrario, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Código generado por el Diseñador de Windows Forms
+
+ ///
+ /// Método necesario para admitir el Diseñador. No se puede modificar
+ /// el contenido del método con el editor de código.
+ ///
+ private void InitializeComponent()
+ {
+ this.label1 = new System.Windows.Forms.Label();
+ this.tbTitle = new System.Windows.Forms.TextBox();
+ this.btOk = new System.Windows.Forms.Button();
+ this.SuspendLayout();
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(12, 15);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(33, 13);
+ this.label1.TabIndex = 0;
+ this.label1.Text = "Titulo";
+ //
+ // tbTitle
+ //
+ this.tbTitle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.tbTitle.Location = new System.Drawing.Point(51, 12);
+ this.tbTitle.Name = "tbTitle";
+ this.tbTitle.Size = new System.Drawing.Size(322, 20);
+ this.tbTitle.TabIndex = 1;
+ //
+ // btOk
+ //
+ this.btOk.Location = new System.Drawing.Point(298, 38);
+ this.btOk.Name = "btOk";
+ this.btOk.Size = new System.Drawing.Size(75, 23);
+ this.btOk.TabIndex = 2;
+ this.btOk.Text = "Ok";
+ this.btOk.UseVisualStyleBackColor = true;
+ this.btOk.Click += new System.EventHandler(this.btOk_Click);
+ //
+ // FConf
+ //
+ this.AcceptButton = this.btOk;
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(385, 71);
+ this.Controls.Add(this.btOk);
+ this.Controls.Add(this.tbTitle);
+ this.Controls.Add(this.label1);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
+ this.Name = "FConf";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+ this.Text = "Propiedades";
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.TextBox tbTitle;
+ private System.Windows.Forms.Button btOk;
+ }
+}
\ No newline at end of file
diff --git a/V1/Launcheroid/FConf.cs b/V1/Launcheroid/FConf.cs
new file mode 100644
index 0000000..f130b42
--- /dev/null
+++ b/V1/Launcheroid/FConf.cs
@@ -0,0 +1,33 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Launcheroid
+{
+ public partial class FConf : Form
+ {
+ private FConf()
+ {
+ InitializeComponent();
+ }
+
+ public static void Execute()
+ {
+ FConf f = new FConf();
+ f.tbTitle.Text = Launcher.title;
+ f.ShowDialog();
+ f.Dispose();
+ }
+
+ private void btOk_Click(object sender, EventArgs e)
+ {
+ Launcher.title = tbTitle.Text;
+ Launcher.Save();
+ Close();
+ }
+ }
+}
diff --git a/V1/Launcheroid/FConf.resx b/V1/Launcheroid/FConf.resx
new file mode 100644
index 0000000..19dc0dd
--- /dev/null
+++ b/V1/Launcheroid/FConf.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/V1/Launcheroid/FItem.Designer.cs b/V1/Launcheroid/FItem.Designer.cs
new file mode 100644
index 0000000..046aa3d
--- /dev/null
+++ b/V1/Launcheroid/FItem.Designer.cs
@@ -0,0 +1,191 @@
+namespace Launcheroid
+{
+ partial class FItem
+ {
+ ///
+ /// Variable del diseñador requerida.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Limpiar los recursos que se estén utilizando.
+ ///
+ /// true si los recursos administrados se deben eliminar; false en caso contrario, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Código generado por el Diseñador de Windows Forms
+
+ ///
+ /// Método necesario para admitir el Diseñador. No se puede modificar
+ /// el contenido del método con el editor de código.
+ ///
+ private void InitializeComponent()
+ {
+ this.tbName = new System.Windows.Forms.TextBox();
+ this.label1 = new System.Windows.Forms.Label();
+ this.label2 = new System.Windows.Forms.Label();
+ this.tbPath = new System.Windows.Forms.TextBox();
+ this.label3 = new System.Windows.Forms.Label();
+ this.tbArgs = new System.Windows.Forms.TextBox();
+ this.pbIco = new System.Windows.Forms.PictureBox();
+ this.btOk = new System.Windows.Forms.Button();
+ this.cbNav = new System.Windows.Forms.CheckBox();
+ this.label4 = new System.Windows.Forms.Label();
+ this.tbDir = new System.Windows.Forms.TextBox();
+ ((System.ComponentModel.ISupportInitialize)(this.pbIco)).BeginInit();
+ this.SuspendLayout();
+ //
+ // tbName
+ //
+ this.tbName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.tbName.Location = new System.Drawing.Point(206, 12);
+ this.tbName.Name = "tbName";
+ this.tbName.Size = new System.Drawing.Size(293, 20);
+ this.tbName.TabIndex = 0;
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(147, 15);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(47, 13);
+ this.label1.TabIndex = 1;
+ this.label1.Text = "Nombre:";
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Location = new System.Drawing.Point(147, 41);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(33, 13);
+ this.label2.TabIndex = 3;
+ this.label2.Text = "Ruta:";
+ //
+ // tbPath
+ //
+ this.tbPath.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.tbPath.Location = new System.Drawing.Point(206, 38);
+ this.tbPath.Name = "tbPath";
+ this.tbPath.Size = new System.Drawing.Size(293, 20);
+ this.tbPath.TabIndex = 1;
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.Location = new System.Drawing.Point(147, 93);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(66, 13);
+ this.label3.TabIndex = 5;
+ this.label3.Text = "Argumentos:";
+ //
+ // tbArgs
+ //
+ this.tbArgs.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.tbArgs.Location = new System.Drawing.Point(219, 90);
+ this.tbArgs.Name = "tbArgs";
+ this.tbArgs.Size = new System.Drawing.Size(280, 20);
+ this.tbArgs.TabIndex = 3;
+ //
+ // pbIco
+ //
+ this.pbIco.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+ this.pbIco.Location = new System.Drawing.Point(12, 12);
+ this.pbIco.Name = "pbIco";
+ this.pbIco.Size = new System.Drawing.Size(128, 128);
+ this.pbIco.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
+ this.pbIco.TabIndex = 6;
+ this.pbIco.TabStop = false;
+ //
+ // btOk
+ //
+ this.btOk.Location = new System.Drawing.Point(434, 117);
+ this.btOk.Name = "btOk";
+ this.btOk.Size = new System.Drawing.Size(65, 23);
+ this.btOk.TabIndex = 5;
+ this.btOk.Text = "Ok";
+ this.btOk.UseVisualStyleBackColor = true;
+ this.btOk.Click += new System.EventHandler(this.btOk_Click);
+ //
+ // cbNav
+ //
+ this.cbNav.AutoSize = true;
+ this.cbNav.Location = new System.Drawing.Point(150, 117);
+ this.cbNav.Name = "cbNav";
+ this.cbNav.Size = new System.Drawing.Size(67, 17);
+ this.cbNav.TabIndex = 4;
+ this.cbNav.Text = "Navegar";
+ this.cbNav.UseVisualStyleBackColor = true;
+ //
+ // label4
+ //
+ this.label4.AutoSize = true;
+ this.label4.Location = new System.Drawing.Point(147, 67);
+ this.label4.Name = "label4";
+ this.label4.Size = new System.Drawing.Size(55, 13);
+ this.label4.TabIndex = 10;
+ this.label4.Text = "Directorio:";
+ //
+ // tbDir
+ //
+ this.tbDir.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.tbDir.Location = new System.Drawing.Point(206, 64);
+ this.tbDir.Name = "tbDir";
+ this.tbDir.Size = new System.Drawing.Size(293, 20);
+ this.tbDir.TabIndex = 2;
+ //
+ // FItem
+ //
+ this.AcceptButton = this.btOk;
+ this.AllowDrop = true;
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(511, 152);
+ this.Controls.Add(this.label4);
+ this.Controls.Add(this.tbDir);
+ this.Controls.Add(this.cbNav);
+ this.Controls.Add(this.btOk);
+ this.Controls.Add(this.pbIco);
+ this.Controls.Add(this.label3);
+ this.Controls.Add(this.tbArgs);
+ this.Controls.Add(this.label2);
+ this.Controls.Add(this.tbPath);
+ this.Controls.Add(this.label1);
+ this.Controls.Add(this.tbName);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
+ this.Name = "FItem";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+ this.Load += new System.EventHandler(this.FItem_Load);
+ this.DragDrop += new System.Windows.Forms.DragEventHandler(this.FItem_DragDrop);
+ this.DragEnter += new System.Windows.Forms.DragEventHandler(this.FItem_DragEnter);
+ ((System.ComponentModel.ISupportInitialize)(this.pbIco)).EndInit();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.TextBox tbName;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.TextBox tbPath;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.TextBox tbArgs;
+ private System.Windows.Forms.PictureBox pbIco;
+ private System.Windows.Forms.Button btOk;
+ private System.Windows.Forms.CheckBox cbNav;
+ private System.Windows.Forms.Label label4;
+ private System.Windows.Forms.TextBox tbDir;
+ }
+}
\ No newline at end of file
diff --git a/V1/Launcheroid/FItem.cs b/V1/Launcheroid/FItem.cs
new file mode 100644
index 0000000..586dfb8
--- /dev/null
+++ b/V1/Launcheroid/FItem.cs
@@ -0,0 +1,79 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using XWolf.Aero;
+
+namespace Launcheroid
+{
+ public partial class FItem : Form
+ {
+ private lLink lnk;
+ private FItem(lLink lnk)
+ {
+ this.lnk = lnk;
+ InitializeComponent();
+ ItemLoad();
+ }
+
+ private void ItemLoad()
+ {
+ Text = lnk.Name;
+ tbName.Text = lnk.Name;
+ tbPath.Text = lnk.Path;
+ tbArgs.Text = lnk.Args;
+ tbDir.Text = lnk.Dir;
+ pbIco.Image = lnk.Icon;
+ cbNav.Enabled = System.IO.Directory.Exists(lnk.Path);
+ if (cbNav.Enabled)
+ cbNav.Checked = lnk.Navigate;
+ else
+ cbNav.Checked = false;
+ }
+
+ private void ItemSave()
+ {
+ lnk.Name = tbName.Text;
+ lnk.Path = tbPath.Text;
+ lnk.Args = tbArgs.Text;
+ lnk.Dir = tbDir.Text;
+ lnk.Icon = (Bitmap) pbIco.Image;
+ lnk.Navigate = cbNav.Checked;
+ Launcher.Save();
+ }
+
+ public static void Execute(lLink lnk)
+ {
+ FItem f = new FItem(lnk);
+ f.ShowDialog();
+ f.Dispose();
+ }
+
+ private void btOk_Click(object sender, EventArgs e)
+ {
+ ItemSave();
+ Close();
+ }
+
+ private void FItem_DragEnter(object sender, DragEventArgs e)
+ {
+ if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.Copy;
+ }
+
+ private void FItem_DragDrop(object sender, DragEventArgs e)
+ {
+ string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
+ if (files.Length != 1)
+ return;
+ pbIco.Image = IconTool.GetFileJumbo(files[0]);
+ }
+
+ private void FItem_Load(object sender, EventArgs e)
+ {
+
+ }
+ }
+}
diff --git a/V1/Launcheroid/FItem.resx b/V1/Launcheroid/FItem.resx
new file mode 100644
index 0000000..19dc0dd
--- /dev/null
+++ b/V1/Launcheroid/FItem.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/V1/Launcheroid/FileAssociation.cs b/V1/Launcheroid/FileAssociation.cs
new file mode 100644
index 0000000..f54f7b5
--- /dev/null
+++ b/V1/Launcheroid/FileAssociation.cs
@@ -0,0 +1,280 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Microsoft.Win32;
+using System.Runtime.InteropServices;
+using System.Reflection;
+
+namespace xwolf
+{
+
+ public class FileAssociation
+ {
+ // Associate file extension with progID, description, icon and application
+ //public static void Associate(string extension,
+ // string progID, string description, string icon, string application)
+ //{
+ // Registry.ClassesRoot.CreateSubKey(extension).SetValue("", progID);
+ // if (progID != null && progID.Length > 0)
+ // using (RegistryKey key = Registry.ClassesRoot.CreateSubKey(progID))
+ // {
+ // if (description != null)
+ // key.SetValue("", description);
+ // if (icon != null)
+ // key.CreateSubKey("DefaultIcon").SetValue("", icon);
+ // if (application != null)
+ // key.CreateSubKey(@"Shell\Open\Command").SetValue("",
+ // application + " \"%1\"");
+ // }
+ //}
+
+ public static void AssociateMe(string extension, string progID, string description)
+ {
+ AssociateMe(extension, progID, description, 0, null);
+ }
+
+ public static void AssociateMe(string extension, string progID, string description, int iicon)
+ {
+ AssociateMe(extension, progID, description, iicon, null);
+ }
+
+ public static void AssociateMe(string extension, string progID, string description, int iicon, string applicationParams)
+ {
+ Assembly me = Assembly.GetExecutingAssembly();
+ string path=me.Location;
+ if (IsAssociatedWithMe(extension))
+ return;
+ if (applicationParams == null)
+ applicationParams = "\"%1\"";
+ string icon = path + "," + iicon;
+ string application = path + " " + applicationParams;
+ Registry.ClassesRoot.CreateSubKey(extension).SetValue("", progID);
+ if (progID != null && progID.Length > 0){
+ RegistryKey key = Registry.ClassesRoot.CreateSubKey(progID);
+ if (description != null)
+ key.SetValue("", description);
+ if (icon != null)
+ key.CreateSubKey("DefaultIcon").SetValue("", icon);
+ if (application != null)
+ key.CreateSubKey(@"Shell\Open\Command").SetValue("", application);
+ }
+ ShellNotification.NotifyOfChange();
+ }
+
+ // Return true if extension already associated in registry
+ public static bool IsAssociated(string extension)
+ {
+ return (Registry.ClassesRoot.OpenSubKey(extension, false) != null);
+ }
+
+ // Return true if extension already associated in registry
+ public static bool IsAssociatedWithMe(string extension)
+ {
+ Assembly me = Assembly.GetExecutingAssembly();
+ string path = me.Location;
+ try
+ {
+ RegistryKey rkey = Registry.ClassesRoot.OpenSubKey(extension, false);
+ if (rkey == null)
+ return false;
+ string appId=rkey.GetValue("").ToString();
+ rkey = Registry.ClassesRoot.OpenSubKey(appId, false);
+ rkey = rkey.OpenSubKey("Shell",false);
+ rkey = rkey.OpenSubKey("Open", false);
+ rkey = rkey.OpenSubKey("Command", false);
+ return (rkey.GetValue("").ToString().ToLower().StartsWith(path.ToLower()));
+ }
+ catch {
+ return false;
+ }
+ }
+
+ //[DllImport("Kernel32.dll")]
+ //private static extern uint GetShortPathName(string lpszLongPath,
+ // [Out] StringBuilder lpszShortPath, uint cchBuffer);
+
+ //// Return short path format of a file name
+ //private static string ToShortPathName(string longName)
+ //{
+ // StringBuilder s = new StringBuilder(1000);
+ // uint iSize = (uint)s.Capacity;
+ // uint iRet = GetShortPathName(longName, s, iSize);
+ // return s.ToString();
+ //}
+ }
+
+ class ShellNotification
+ {
+ ///
+ /// Notifies the system of an event that an application has performed. An application should use this function if it performs an action that may affect the Shell.
+ ///
+ /// Describes the event that has occurred. The ShellChangeNotificationEvents enum contains a list of options.
+ /// Flags that indicate the meaning of the dwItem1 and dwItem2 parameters.
+ /// First event-dependent value.
+ /// Second event-dependent value.
+ [DllImport("shell32.dll")]
+ private static extern void SHChangeNotify(
+ UInt32 wEventId,
+ UInt32 uFlags,
+ IntPtr dwItem1,
+ IntPtr dwItem2);
+
+ ///
+ /// Notify shell of change of file associations.
+ ///
+ public static void NotifyOfChange()
+ {
+ SHChangeNotify(
+ (uint)ShellChangeNotificationEvents.SHCNE_ASSOCCHANGED,
+ (uint)(ShellChangeNotificationFlags.SHCNF_IDLIST | ShellChangeNotificationFlags.SHCNF_FLUSHNOWAIT),
+ IntPtr.Zero,
+ IntPtr.Zero);
+ }
+
+
+ [Flags]
+ private enum ShellChangeNotificationEvents : uint
+ {
+ ///
+ /// The name of a nonfolder item has changed. SHCNF_IDLIST or SHCNF_PATH must be specified in uFlags. dwItem1 contains the previous PIDL or name of the item. dwItem2 contains the new PIDL or name of the item.
+ ///
+ SHCNE_RENAMEITEM = 0x00000001,
+ ///
+ /// A nonfolder item has been created. SHCNF_IDLIST or SHCNF_PATH must be specified in uFlags. dwItem1 contains the item that was created. dwItem2 is not used and should be NULL.
+ ///
+ SHCNE_CREATE = 0x00000002,
+ ///
+ /// A nonfolder item has been deleted. SHCNF_IDLIST or SHCNF_PATH must be specified in uFlags. dwItem1 contains the item that was deleted. dwItem2 is not used and should be NULL.
+ ///
+ SHCNE_DELETE = 0x00000004,
+ ///
+ /// A folder has been created. SHCNF_IDLIST or SHCNF_PATH must be specified in uFlags. dwItem1 contains the folder that was created. dwItem2 is not used and should be NULL.
+ ///
+ SHCNE_MKDIR = 0x00000008,
+ ///
+ /// A folder has been removed. SHCNF_IDLIST or SHCNF_PATH must be specified in uFlags. dwItem1 contains the folder that was removed. dwItem2 is not used and should be NULL.
+ ///
+ SHCNE_RMDIR = 0x00000010,
+ ///
+ /// Storage media has been inserted into a drive. SHCNF_IDLIST or SHCNF_PATH must be specified in uFlags. dwItem1 contains the root of the drive that contains the new media. dwItem2 is not used and should be NULL.
+ ///
+ SHCNE_MEDIAINSERTED = 0x00000020,
+ ///
+ /// Storage media has been removed from a drive. SHCNF_IDLIST or SHCNF_PATH must be specified in uFlags. dwItem1 contains the root of the drive from which the media was removed. dwItem2 is not used and should be NULL.
+ ///
+ SHCNE_MEDIAREMOVED = 0x00000040,
+ ///
+ /// A drive has been removed. SHCNF_IDLIST or SHCNF_PATH must be specified in uFlags. dwItem1 contains the root of the drive that was removed. dwItem2 is not used and should be NULL.
+ ///
+ SHCNE_DRIVEREMOVED = 0x00000080,
+ ///
+ /// A drive has been added. SHCNF_IDLIST or SHCNF_PATH must be specified in uFlags. dwItem1 contains the root of the drive that was added. dwItem2 is not used and should be NULL.
+ ///
+ SHCNE_DRIVEADD = 0x00000100,
+ ///
+ /// A folder on the local computer is being shared via the network. SHCNF_IDLIST or SHCNF_PATH must be specified in uFlags. dwItem1 contains the folder that is being shared. dwItem2 is not used and should be NULL.
+ ///
+ SHCNE_NETSHARE = 0x00000200,
+ ///
+ /// A folder on the local computer is no longer being shared via the network. SHCNF_IDLIST or SHCNF_PATH must be specified in uFlags. dwItem1 contains the folder that is no longer being shared. dwItem2 is not used and should be NULL.
+ ///
+ SHCNE_NETUNSHARE = 0x00000400,
+ ///
+ /// The attributes of an item or folder have changed. SHCNF_IDLIST or SHCNF_PATH must be specified in uFlags. dwItem1 contains the item or folder that has changed. dwItem2 is not used and should be NULL.
+ ///
+ SHCNE_ATTRIBUTES = 0x00000800,
+ ///
+ /// The contents of an existing folder have changed, but the folder still exists and has not been renamed. SHCNF_IDLIST or SHCNF_PATH must be specified in uFlags. dwItem1 contains the folder that has changed. dwItem2 is not used and should be NULL. If a folder has been created, deleted, or renamed, use SHCNE_MKDIR, SHCNE_RMDIR, or SHCNE_RENAMEFOLDER, respectively, instead.
+ ///
+ SHCNE_UPDATEDIR = 0x00001000,
+ ///
+ /// An existing nonfolder item has changed, but the item still exists and has not been renamed. SHCNF_IDLIST or SHCNF_PATH must be specified in uFlags. dwItem1 contains the item that has changed. dwItem2 is not used and should be NULL. If a nonfolder item has been created, deleted, or renamed, use SHCNE_CREATE, SHCNE_DELETE, or SHCNE_RENAMEITEM, respectively, instead.
+ ///
+ SHCNE_UPDATEITEM = 0x00002000,
+ ///
+ /// The computer has disconnected from a server. SHCNF_IDLIST or SHCNF_PATH must be specified in uFlags. dwItem1 contains the server from which the computer was disconnected. dwItem2 is not used and should be NULL.
+ ///
+ SHCNE_SERVERDISCONNECT = 0x00004000,
+ ///
+ /// An image in the system image list has changed. SHCNF_DWORD must be specified in uFlags. dwItem1 contains the index in the system image list that has changed. dwItem2 is not used and should be NULL.
+ ///
+ SHCNE_UPDATEIMAGE = 0x00008000,
+ ///
+ /// A drive has been added and the Shell should create a new window for the drive. SHCNF_IDLIST or SHCNF_PATH must be specified in uFlags. dwItem1 contains the root of the drive that was added. dwItem2 is not used and should be NULL.
+ ///
+ SHCNE_DRIVEADDGUI = 0x00010000,
+ ///
+ /// The name of a folder has changed. SHCNF_IDLIST or SHCNF_PATH must be specified in uFlags. dwItem1 contains the previous pointer to an item identifier list (PIDL) or name of the folder. dwItem2 contains the new PIDL or name of the folder.
+ ///
+ SHCNE_RENAMEFOLDER = 0x00020000,
+ ///
+ /// The amount of free space on a drive has changed. SHCNF_IDLIST or SHCNF_PATH must be specified in uFlags. dwItem1 contains the root of the drive on which the free space changed. dwItem2 is not used and should be NULL.
+ ///
+ SHCNE_FREESPACE = 0x00040000,
+ ///
+ /// Not currently used.
+ ///
+ SHCNE_EXTENDED_EVENT = 0x04000000,
+ ///
+ /// A file type association has changed. SHCNF_IDLIST must be specified in the uFlags parameter. dwItem1 and dwItem2 are not used and must be NULL.
+ ///
+ SHCNE_ASSOCCHANGED = 0x08000000,
+ ///
+ /// Specifies a combination of all of the disk event identifiers.
+ ///
+ SHCNE_DISKEVENTS = 0x0002381F,
+ ///
+ /// Specifies a combination of all of the global event identifiers.
+ ///
+ SHCNE_GLOBALEVENTS = 0x0C0581E0,
+ ///
+ /// All events have occurred.
+ ///
+ SHCNE_ALLEVENTS = 0x7FFFFFFF,
+ ///
+ /// The specified event occurred as a result of a system interrupt. As this value modifies other event values, it cannot be used alone.
+ ///
+ SHCNE_INTERRUPT = 0x80000000
+ }
+
+ private enum ShellChangeNotificationFlags
+ {
+ ///
+ /// dwItem1 and dwItem2 are the addresses of ITEMIDLIST structures that represent the item(s) affected by the change. Each ITEMIDLIST must be relative to the desktop folder.
+ ///
+ SHCNF_IDLIST = 0x0000,
+ ///
+ /// dwItem1 and dwItem2 are the addresses of null-terminated strings of maximum length MAX_PATH that contain the full path names of the items affected by the change.
+ ///
+ SHCNF_PATHA = 0x0001,
+ ///
+ /// dwItem1 and dwItem2 are the addresses of null-terminated strings that represent the friendly names of the printer(s) affected by the change.
+ ///
+ SHCNF_PRINTERA = 0x0002,
+ ///
+ /// The dwItem1 and dwItem2 parameters are DWORD values.
+ ///
+ SHCNF_DWORD = 0x0003,
+ ///
+ /// like SHCNF_PATHA but unicode string
+ ///
+ SHCNF_PATHW = 0x0005,
+ ///
+ /// like SHCNF_PRINTERA but unicode string
+ ///
+ SHCNF_PRINTERW = 0x0006,
+ ///
+ ///
+ ///
+ SHCNF_TYPE = 0x00FF,
+ ///
+ /// The function should not return until the notification has been delivered to all affected components. As this flag modifies other data-type flags, it cannot by used by itself.
+ ///
+ SHCNF_FLUSH = 0x1000,
+ ///
+ /// The function should begin delivering notifications to all affected components but should return as soon as the notification process has begun. As this flag modifies other data-type flags, it cannot by used by itself.
+ ///
+ SHCNF_FLUSHNOWAIT = 0x2000
+ }
+ }
+}
diff --git a/V1/Launcheroid/Form1.Designer.cs b/V1/Launcheroid/Form1.Designer.cs
new file mode 100644
index 0000000..64c0857
--- /dev/null
+++ b/V1/Launcheroid/Form1.Designer.cs
@@ -0,0 +1,146 @@
+namespace Launcheroid
+{
+ partial class Form1
+ {
+ ///
+ /// Variable del diseñador requerida.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Limpiar los recursos que se estén utilizando.
+ ///
+ /// true si los recursos administrados se deben eliminar; false en caso contrario, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Código generado por el Diseñador de Windows Forms
+
+ ///
+ /// Método necesario para admitir el Diseñador. No se puede modificar
+ /// el contenido del método con el editor de código.
+ ///
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ this.t1 = new System.Windows.Forms.Timer(this.components);
+ this.formMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
+ this.propiedadesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.borrarToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
+ this.configuraciónToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.navMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
+ this.abrirCarpetaContenedoraToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.formMenuStrip.SuspendLayout();
+ this.navMenuStrip.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // t1
+ //
+ this.t1.Interval = 1000;
+ this.t1.Tick += new System.EventHandler(this.t1_Tick);
+ //
+ // formMenuStrip
+ //
+ this.formMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.propiedadesToolStripMenuItem,
+ this.borrarToolStripMenuItem,
+ this.toolStripSeparator1,
+ this.configuraciónToolStripMenuItem});
+ this.formMenuStrip.Name = "formMenuStrip";
+ this.formMenuStrip.Size = new System.Drawing.Size(187, 76);
+ this.formMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(this.formMenuStrip_Opening);
+ //
+ // propiedadesToolStripMenuItem
+ //
+ this.propiedadesToolStripMenuItem.Name = "propiedadesToolStripMenuItem";
+ this.propiedadesToolStripMenuItem.Size = new System.Drawing.Size(186, 22);
+ this.propiedadesToolStripMenuItem.Text = "Propiedades";
+ this.propiedadesToolStripMenuItem.Click += new System.EventHandler(this.propiedadesToolStripMenuItem_Click);
+ //
+ // borrarToolStripMenuItem
+ //
+ this.borrarToolStripMenuItem.Name = "borrarToolStripMenuItem";
+ this.borrarToolStripMenuItem.Size = new System.Drawing.Size(186, 22);
+ this.borrarToolStripMenuItem.Text = "Borrar";
+ this.borrarToolStripMenuItem.Click += new System.EventHandler(this.borrarToolStripMenuItem_Click);
+ //
+ // toolStripSeparator1
+ //
+ this.toolStripSeparator1.Name = "toolStripSeparator1";
+ this.toolStripSeparator1.Size = new System.Drawing.Size(183, 6);
+ //
+ // configuraciónToolStripMenuItem
+ //
+ this.configuraciónToolStripMenuItem.Name = "configuraciónToolStripMenuItem";
+ this.configuraciónToolStripMenuItem.Size = new System.Drawing.Size(186, 22);
+ this.configuraciónToolStripMenuItem.Text = "Configuración del menú";
+ this.configuraciónToolStripMenuItem.Click += new System.EventHandler(this.configuraciónToolStripMenuItem_Click);
+ //
+ // navMenuStrip
+ //
+ this.navMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.abrirCarpetaContenedoraToolStripMenuItem});
+ this.navMenuStrip.Name = "navMenuStrip";
+ this.navMenuStrip.Size = new System.Drawing.Size(202, 26);
+ //
+ // abrirCarpetaContenedoraToolStripMenuItem
+ //
+ this.abrirCarpetaContenedoraToolStripMenuItem.Name = "abrirCarpetaContenedoraToolStripMenuItem";
+ this.abrirCarpetaContenedoraToolStripMenuItem.Size = new System.Drawing.Size(201, 22);
+ this.abrirCarpetaContenedoraToolStripMenuItem.Text = "Abrir carpeta contenedora";
+ this.abrirCarpetaContenedoraToolStripMenuItem.Click += new System.EventHandler(this.abrirCarpetaContenedoraToolStripMenuItem_Click);
+ //
+ // Form1
+ //
+ this.AllowDrop = true;
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
+ this.ClientSize = new System.Drawing.Size(0, 0);
+ this.ContextMenuStrip = this.formMenuStrip;
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+ this.GlassDrag = false;
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "Form1";
+ this.ShowIcon = false;
+ this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
+ this.Deactivate += new System.EventHandler(this.Form1_Deactivate);
+ this.Load += new System.EventHandler(this.Form1_Load);
+ this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);
+ this.MouseClick += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseClick);
+ this.Shown += new System.EventHandler(this.Form1_Shown);
+ this.Activated += new System.EventHandler(this.Form1_Activated);
+ this.DragDrop += new System.Windows.Forms.DragEventHandler(this.Form1_DragDrop);
+ this.DragEnter += new System.Windows.Forms.DragEventHandler(this.Form1_DragEnter);
+ this.KeyUp += new System.Windows.Forms.KeyEventHandler(this.Form1_KeyUp);
+ this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseMove);
+ this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Form1_KeyDown);
+ this.formMenuStrip.ResumeLayout(false);
+ this.navMenuStrip.ResumeLayout(false);
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Timer t1;
+ private System.Windows.Forms.ContextMenuStrip formMenuStrip;
+ private System.Windows.Forms.ToolStripMenuItem borrarToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem propiedadesToolStripMenuItem;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
+ private System.Windows.Forms.ToolStripMenuItem configuraciónToolStripMenuItem;
+ private System.Windows.Forms.ContextMenuStrip navMenuStrip;
+ private System.Windows.Forms.ToolStripMenuItem abrirCarpetaContenedoraToolStripMenuItem;
+
+
+
+
+ }
+}
+
diff --git a/V1/Launcheroid/Form1.cs b/V1/Launcheroid/Form1.cs
new file mode 100644
index 0000000..c436aea
--- /dev/null
+++ b/V1/Launcheroid/Form1.cs
@@ -0,0 +1,348 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using System.Drawing.Drawing2D;
+using System.Diagnostics;
+using XWolf.Aero;
+using System.Drawing.Imaging;
+
+namespace Launcheroid
+{
+ public partial class Form1 : XGlassForm
+ {
+ private int cols;
+ private int rows;
+ private lLink[] links;
+ private Point mPoint;
+ private lLink selected;
+ private bool inside = false;
+ private int scrollindex = 0, scrollheight = -1, scrollbarh = 0;
+ private Pen scrollPen = new Pen(Color.BurlyWood);
+
+ public Form1()
+ {
+ InitializeComponent();
+ if (Program.NavMode)
+ {
+ AllowDrop = false;
+ ContextMenuStrip = navMenuStrip;
+ }
+ MouseWheel += new MouseEventHandler(Form1_MouseWheel);
+ if (Glass.Composite)
+ {
+ FullGlass = true;
+ }
+ else
+ {
+ FormBorderStyle = FormBorderStyle.None;
+ }
+ }
+
+ #region NO AERO
+
+ private Bitmap GetNoaeroBG()
+ {
+ Point zeropoint = new Point(0, 0);
+ Point pos = PointToScreen(zeropoint);
+ Size sz = ClientSize;
+ Bitmap capture = new Bitmap(sz.Width, sz.Height);
+ using (Graphics g = Graphics.FromImage(capture))
+ {
+ g.CopyFromScreen(pos, zeropoint, sz);
+ }
+ Bitmap capture2 = new Bitmap(sz.Width / 2, sz.Height / 2);
+ using (Graphics g = Graphics.FromImage(capture2))
+ {
+ g.InterpolationMode = InterpolationMode.HighQualityBilinear;
+ g.SmoothingMode = SmoothingMode.HighQuality;
+ g.DrawImage(capture, 0, 0, sz.Width / 2, sz.Height / 2);
+ }
+ capture.Dispose();
+ Bitmap noaerobg = new Bitmap(sz.Width, sz.Height);
+ using (Graphics g = Graphics.FromImage(noaerobg))
+ {
+ ColorMatrix matrix = new ColorMatrix();
+ matrix.Matrix33 = 0.8f; //opacity 0 = completely transparent, 1 = completely opaque
+ ImageAttributes attr = new ImageAttributes();
+ attr.SetColorMatrix(matrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
+
+ g.InterpolationMode = InterpolationMode.HighQualityBilinear;
+ g.SmoothingMode = SmoothingMode.HighQuality;
+ g.DrawImage(capture2, new Rectangle(0, 0, sz.Width, sz.Height), 0, 0, sz.Width / 2, sz.Height / 2, GraphicsUnit.Pixel, attr);
+ }
+ capture2.Dispose();
+ return noaerobg;
+ }
+
+ #endregion
+
+ private void ReAlign()
+ {
+ links = Launcher.Links;
+ if (links.Length <= 1)
+ {
+ cols = 1;
+ rows = 1;
+ }
+ else
+ if (links.Length == 2)
+ {
+ cols = 2;
+ rows = 1;
+ }
+ else
+ {
+ cols = (int)Math.Ceiling(Math.Sqrt(links.Length)) + 1;
+ rows = links.Length / cols;
+ if (links.Length % cols > 0)
+ rows++;
+ }
+ Size cs = new Size(cols * 138, (rows * 150) + 10);
+ if (cs.Height > Screen.PrimaryScreen.WorkingArea.Height)
+ if (cols < 8)
+ {
+ cols = 8;
+ rows = links.Length / cols;
+ cs = new Size(cols * 138, (rows * 150) + 10);
+
+ }
+ if (cs.Height > Screen.PrimaryScreen.WorkingArea.Height)
+ {
+ cols = 8;
+ rows = links.Length / cols;
+ if (links.Length % cols > 0)
+ rows++;
+ scrollheight = (rows * 150) + 10;
+ cs = new Size((cols * 138) + 25, Screen.PrimaryScreen.WorkingArea.Height - 75);
+ scrollbarh = scrollheight - cs.Height;
+ if (scrollindex > scrollbarh)
+ scrollindex = scrollbarh;
+ }
+ else
+ scrollheight = -1;
+ ClientSize = cs;
+ if (Top + Height + 10 > Screen.PrimaryScreen.WorkingArea.Bottom)
+ Top = Screen.PrimaryScreen.WorkingArea.Bottom - (Height + 10);
+ }
+
+ private void Form1_Load(object sender, EventArgs e)
+ {
+ ReAlign();
+ int left = Cursor.Position.X - Width / 2;
+ int top = Cursor.Position.Y - Height / 2;
+ if (top < 10)
+ top = 10;
+ if (top + Height > Screen.PrimaryScreen.WorkingArea.Height - 10)
+ top = Screen.PrimaryScreen.WorkingArea.Height - (10 + Height);
+ Top = top;
+ if (left < 10)
+ left = 10;
+ if (left + Width > Screen.PrimaryScreen.WorkingArea.Width - 10)
+ left = Screen.PrimaryScreen.WorkingArea.Width - (10 + Width);
+ Left = left;
+ Text = Launcher.title;
+ }
+
+ private void Form1_Paint(object sender, PaintEventArgs e)
+ {
+ Graphics g = e.Graphics;
+ g.InterpolationMode = InterpolationMode.HighQualityBilinear;
+ g.SmoothingMode = SmoothingMode.HighQuality;
+ if (Glass.Composite) // VISTA AERO
+ {
+ g.Clear(Color.Transparent);
+ }
+ else
+ {// XP
+ g.Clear(Color.SkyBlue);
+ Bitmap bg = GetNoaeroBG();
+ if (bg != null)
+ g.DrawImage(bg, ClientRectangle);
+ }
+
+ int x = 0, y = 0;
+ int select = -1;
+ int index = 0;
+ foreach (lLink lnk in links)
+ {
+ Bitmap ico = lnk.Icon;
+ int px = (x * 138) + 5;
+ int py = (y * 150) + 5;
+ py -= scrollindex;
+ bool sel = false;
+ if (mPoint != null)
+ {
+ sel = ((mPoint.X > px) && (mPoint.X - 128 < px)) &&
+ ((mPoint.Y > py) && (mPoint.Y - 128 < py));
+ }
+ if (sel)
+ {
+ g.DrawImage(GfxTools.SelectionBG, px, py);
+ g.DrawImage(ico, px + 5, py + 5, 118, 118);
+ g.DrawImage(GfxTools.SelectionFG, px, py);
+ select = index;
+ }
+ else
+ g.DrawImage(ico, px + 1, py + 1, 128, 128);
+ GfxTools.DrawString(g, lnk.Name, px + 64, py + 128);
+ x++;
+ if (x >= cols)
+ {
+ x = 0;
+ y++;
+ }
+ index++;
+ }
+ if (select == -1)
+ selected = null;
+ else
+ selected = links[select];
+ if (scrollheight > -1)
+ {
+ GfxTools.DrawRoundRect(g, scrollPen, ClientSize.Width - 11, 1, 10, ClientSize.Height - 2, 3);
+ int sbh = (ClientSize.Height - 2) - scrollbarh;
+ int sbi = scrollindex;
+ if (sbh < 10)
+ {
+ sbh = 10;
+ sbi = (sbi * (ClientSize.Height - 12)) / scrollbarh;
+ }
+ GfxTools.FillRoundRect(g, scrollPen.Brush, ClientSize.Width - 11, 1 + sbi, 10, sbh, 3);
+ }
+ }
+
+ private void Form1_MouseWheel(object sender, MouseEventArgs e)
+ {
+ scrollindex -= e.Delta / 3;
+ if (scrollindex < 0)
+ scrollindex = 0;
+ if (scrollindex > scrollbarh)
+ scrollindex = scrollbarh;
+ Invalidate();
+ }
+
+ private void Form1_Deactivate(object sender, EventArgs e)
+ {
+ if (!inside)
+ t1.Enabled = true;
+ else
+ t1.Enabled = false;
+ }
+
+ private void Form1_KeyUp(object sender, KeyEventArgs e)
+ {
+
+ }
+
+ private void Form1_KeyDown(object sender, KeyEventArgs e)
+ {
+ if (e.KeyCode == Keys.Escape)
+ Close();
+ }
+
+ private void t1_Tick(object sender, EventArgs e)
+ {
+ Close();
+ }
+
+ private void Form1_Activated(object sender, EventArgs e)
+ {
+ t1.Enabled = false;
+ }
+
+ private void Form1_DragEnter(object sender, DragEventArgs e)
+ {
+ if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.Copy;
+ }
+
+ private void Form1_DragDrop(object sender, DragEventArgs e)
+ {
+ string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
+ if (files.Length == 0)
+ return;
+ foreach (string file in files)
+ Launcher.Add(file);
+ Launcher.Save();
+ ReAlign();
+ Update();
+ }
+
+ private void Form1_MouseMove(object sender, MouseEventArgs e)
+ {
+ mPoint = new Point(e.X, e.Y);
+ Invalidate();
+ }
+
+ private void Form1_MouseClick(object sender, MouseEventArgs e)
+ {
+ if (selected == null)
+ return;
+ inside = true;
+ if (e.Button == MouseButtons.Left)
+ if (selected.Open())
+ Close();
+ inside = false;
+ }
+
+ private void formMenuStrip_Opening(object sender, CancelEventArgs e)
+ {
+ bool itemen = selected != null;
+ borrarToolStripMenuItem.Enabled = itemen;
+ propiedadesToolStripMenuItem.Enabled = itemen;
+ }
+
+ private void borrarToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ Launcher.Del(selected);
+ Launcher.Save();
+ ReAlign();
+ Invalidate();
+ }
+
+ private void configuraciónToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ inside = true;
+ FConf.Execute();
+ Text = Launcher.title;
+ inside = false;
+ Focus();
+ }
+
+ private void propiedadesToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ if (selected == null)
+ return;
+ inside = true;
+ FItem.Execute(selected);
+ inside = false;
+ Focus();
+ Invalidate();
+ }
+
+ private void abrirCarpetaContenedoraToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ Process.Start(Text);
+ Close();
+ }
+
+ private void Form1_Shown(object sender, EventArgs e)
+ {
+ if (!Glass.Composite)
+ {
+ Opacity = 0.99;
+ Timer updt = new Timer();
+ updt.Tick += new EventHandler(updt_Tick);
+ updt.Interval = 500;
+ updt.Enabled = true;
+ }
+ }
+
+ void updt_Tick(object sender, EventArgs e)
+ {
+ Invalidate();
+ }
+ }
+}
diff --git a/V1/Launcheroid/Form1.resx b/V1/Launcheroid/Form1.resx
new file mode 100644
index 0000000..91ddf7c
--- /dev/null
+++ b/V1/Launcheroid/Form1.resx
@@ -0,0 +1,132 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 17, 17
+
+
+ 79, 17
+
+
+ 213, 17
+
+
+ 68
+
+
\ No newline at end of file
diff --git a/V1/Launcheroid/Iconofato.cs b/V1/Launcheroid/Iconofato.cs
new file mode 100644
index 0000000..d3c2cd1
--- /dev/null
+++ b/V1/Launcheroid/Iconofato.cs
@@ -0,0 +1,541 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Runtime.InteropServices;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+
+namespace Launcheroid
+{
+ public class IconTool
+ {
+ private static bool VistaUp
+ {
+ get
+ {
+ return (Environment.OSVersion.Version.Major >= 6);
+ }
+ }
+
+ private static bool IsJumbo(Bitmap bmp)
+ {
+ for (int y = 10; y < bmp.Height; y += 10)
+ for (int x = 50; x < bmp.Width; x += 10)
+ if (bmp.GetPixel(x, y).A != 0)
+ return true;
+ for (int y = 50; y < bmp.Height; y += 10)
+ for (int x = 10; x < 50; x += 10)
+ if (bmp.GetPixel(x, y).A != 0)
+ return true;
+ return false;
+ }
+
+ private static Bitmap ResizeToJumbo(Bitmap bmp)
+ {
+ Bitmap result = new Bitmap(256, 256);
+ Graphics g = Graphics.FromImage(result);
+ g.SmoothingMode = SmoothingMode.HighQuality;
+ g.InterpolationMode = InterpolationMode.HighQualityBicubic;
+ g.DrawImage(bmp, new Rectangle(0, 0, 256, 256), new Rectangle(0, 0, 48, 48), GraphicsUnit.Pixel);
+ g.Dispose();
+ bmp.Dispose();
+ return result;
+ }
+
+ public static Bitmap GetFileJumbo(string path)
+ {
+ try
+ {
+ Bitmap b = (Bitmap)Bitmap.FromFile(path);
+ return ResizeBitmap(b);
+ }
+ catch { };
+ Bitmap bmp = VistaUp ? WinApiEx.GetFileIconJumbo(path) : WinApiEx.GetFileIconExtraLarge(path);
+ if (!VistaUp || !IsJumbo(bmp))
+ {
+ bmp = ResizeToJumbo(bmp);
+ }
+ return bmp;
+ }
+
+ private static Bitmap ResizeBitmap(Bitmap b)
+ {
+ int ox, oy, ww, hh;
+ if (b.Width >= b.Height)
+ {
+ ox = 0;
+ ww = 256;
+ hh = b.Height * 256 / b.Width;
+ oy = (256 - hh) / 2;
+ }
+ else
+ {
+ oy = 0;
+ hh = 256;
+ ww = b.Width * 256 / b.Height;
+ ox = (256 - ww) / 2;
+ }
+ Bitmap bmp = new Bitmap(256, 256);
+ Graphics g = Graphics.FromImage(bmp);
+ g.DrawImage(b, ox, oy, ww, hh);
+ g.Dispose();
+ b.Dispose();
+ return bmp;
+ }
+ }
+
+ public class WinApi
+ {
+ private const string libShell32 = "Shell32.dll";
+ private const string libUser32 = "User32.dll";
+
+ #region Shell32
+
+ #region API Constants
+
+ private const int MAX_PATH = 256;
+
+ #region [BIF] Browsing for directory
+ protected const uint BIF_RETURNONLYFSDIRS = 0x0001;
+ protected const uint BIF_DONTGOBELOWDOMAIN = 0x0002;
+ protected const uint BIF_STATUSTEXT = 0x0004;
+ protected const uint BIF_RETURNFSANCESTORS = 0x0008;
+ protected const uint BIF_EDITBOX = 0x0010;
+ protected const uint BIF_VALIDATE = 0x0020;
+ protected const uint BIF_NEWDIALOGSTYLE = 0x0040;
+ protected const uint BIF_USENEWUI = (BIF_NEWDIALOGSTYLE | BIF_EDITBOX);
+ protected const uint BIF_BROWSEINCLUDEURLS = 0x0080;
+ protected const uint BIF_BROWSEFORCOMPUTER = 0x1000;
+ protected const uint BIF_BROWSEFORPRINTER = 0x2000;
+ protected const uint BIF_BROWSEINCLUDEFILES = 0x4000;
+ protected const uint BIF_SHAREABLE = 0x8000;
+ #endregion
+
+ #region [SHGFI]
+ protected const uint SHGFI_ICON = 0x000000100; // get icon
+ protected const uint SHGFI_DISPLAYNAME = 0x000000200; // get display name
+ protected const uint SHGFI_TYPENAME = 0x000000400; // get type name
+ protected const uint SHGFI_ATTRIBUTES = 0x000000800; // get attributes
+ protected const uint SHGFI_ICONLOCATION = 0x000001000; // get icon location
+ protected const uint SHGFI_EXETYPE = 0x000002000; // return exe type
+ protected const uint SHGFI_SYSICONINDEX = 0x000004000; // get system icon index
+ protected const uint SHGFI_LINKOVERLAY = 0x000008000; // put a link overlay on icon
+ protected const uint SHGFI_SELECTED = 0x000010000; // show icon in selected state
+ protected const uint SHGFI_ATTR_SPECIFIED = 0x000020000; // get only specified attributes
+ protected const uint SHGFI_LARGEICON = 0x000000000; // get large icon
+ protected const uint SHGFI_SMALLICON = 0x000000001; // get small icon
+ protected const uint SHGFI_OPENICON = 0x000000002; // get open icon
+ protected const uint SHGFI_SHELLICONSIZE = 0x000000004; // get shell size icon
+ protected const uint SHGFI_PIDL = 0x000000008; // pszPath is a pidl
+ protected const uint SHGFI_USEFILEATTRIBUTES = 0x000000010; // use passed dwFileAttribute
+ protected const uint SHGFI_ADDOVERLAYS = 0x000000020; // apply the appropriate overlays
+ protected const uint SHGFI_OVERLAYINDEX = 0x000000040; // Get the index of the overlay
+ #endregion
+
+ #region [FILE_ATTRIBUTE]
+ protected const uint FILE_ATTRIBUTE_DIRECTORY = 0x00000010;
+ protected const uint FILE_ATTRIBUTE_NORMAL = 0x00000080;
+ #endregion
+
+ #region [SHIL]
+ protected const uint SHIL_EXTRALARGE = 0x2;
+ protected const uint SHIL_JUMBO = 0x4;
+ #endregion
+
+ #region [ILD]
+ ///
+ /// Draw item normally.
+ ///
+ protected const uint ILD_NORMAL = 0x0;
+ ///
+ /// Draw item transparently.
+ ///
+ protected const uint ILD_TRANSPARENT = 0x1;
+ ///
+ /// Draw item blended with 25% of the specified foreground colour
+ /// or the Highlight colour if no foreground colour specified.
+ ///
+ protected const uint ILD_BLEND25 = 0x2;
+ ///
+ /// Draw item blended with 50% of the specified foreground colour
+ /// or the Highlight colour if no foreground colour specified.
+ ///
+ protected const uint ILD_SELECTED = 0x4;
+ ///
+ /// Draw the icon's mask
+ ///
+ protected const uint ILD_MASK = 0x10;
+ ///
+ /// Draw the icon image without using the mask
+ ///
+ protected const uint ILD_IMAGE = 0x20;
+ ///
+ /// Draw the icon using the ROP specified.
+ ///
+ protected const uint ILD_ROP = 0x40;
+ ///
+ /// ?
+ ///
+ protected const uint ILD_OVERLAYMASK = 0xF00;
+ ///
+ /// Preserves the alpha channel in dest. XP only.
+ ///
+ protected const uint ILD_PRESERVEALPHA = 0x1000; //
+ ///
+ /// Scale the image to cx, cy instead of clipping it. XP only.
+ ///
+ protected const uint ILD_SCALE = 0x2000;
+ ///
+ /// Scale the image to the current DPI of the display. XP only.
+ ///
+ protected const uint ILD_DPISCALE = 0x4000;
+ #endregion
+
+
+ #endregion
+
+ #region Structures
+ [StructLayout(LayoutKind.Sequential)]
+ protected struct SHITEMID
+ {
+ public ushort cb;
+ [MarshalAs(UnmanagedType.LPArray)]
+ public byte[] abID;
+ }
+
+ [StructLayout(LayoutKind.Sequential)]
+ protected struct ITEMIDLIST
+ {
+ public SHITEMID mkid;
+ }
+
+ [StructLayout(LayoutKind.Sequential)]
+ protected struct BROWSEINFO
+ {
+ public IntPtr hwndOwner;
+ public IntPtr pidlRoot;
+ public IntPtr pszDisplayName;
+ [MarshalAs(UnmanagedType.LPTStr)]
+ public string lpszTitle;
+ public uint ulFlags;
+ public IntPtr lpfn;
+ public int lParam;
+ public IntPtr iImage;
+ }
+
+ [StructLayout(LayoutKind.Sequential)]
+ protected struct SHFILEINFO
+ {
+ public const int NAMESIZE = 80;
+ public IntPtr hIcon;
+ public int iIcon;
+ public uint dwAttributes;
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PATH)]
+ public string szDisplayName;
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = NAMESIZE)]
+ public string szTypeName;
+ };
+ #endregion
+
+ [DllImport(libShell32)]
+ protected static extern IntPtr SHGetFileInfo(
+ string pszPath,
+ uint dwFileAttributes,
+ ref SHFILEINFO psfi,
+ uint cbFileInfo,
+ uint uFlags
+ );
+
+ #region ImageList
+
+
+ #region Private ImageList COM Interop (XP)
+ [StructLayout(LayoutKind.Sequential)]
+ public struct IMAGELISTDRAWPARAMS
+ {
+ public int cbSize;
+ public IntPtr himl;
+ public int i;
+ public IntPtr hdcDst;
+ public int x;
+ public int y;
+ public int cx;
+ public int cy;
+ public int xBitmap; // x offest from the upperleft of bitmap
+ public int yBitmap; // y offset from the upperleft of bitmap
+ public int rgbBk;
+ public int rgbFg;
+ public int fStyle;
+ public int dwRop;
+ public int fState;
+ public int Frame;
+ public int crEffect;
+ }
+ [StructLayout(LayoutKind.Sequential)]
+ public struct IMAGEINFO
+ {
+ public IntPtr hbmImage;
+ public IntPtr hbmMask;
+ public int Unused1;
+ public int Unused2;
+ public RECT rcImage;
+ }
+ [StructLayout(LayoutKind.Sequential)]
+ public struct RECT
+ {
+ int left;
+ int top;
+ int right;
+ int bottom;
+ }
+ [StructLayout(LayoutKind.Sequential)]
+ public struct POINT
+ {
+ int x;
+ int y;
+ }
+ [ComImportAttribute()]
+ [GuidAttribute("46EB5926-582E-4017-9FDF-E8998DAA0950")]
+ [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
+ //helpstring("Image List"),
+ public interface IImageList
+ {
+ [PreserveSig]
+ int Add(
+ IntPtr hbmImage,
+ IntPtr hbmMask,
+ ref int pi);
+
+ [PreserveSig]
+ int ReplaceIcon(
+ int i,
+ IntPtr hicon,
+ ref int pi);
+
+ [PreserveSig]
+ int SetOverlayImage(
+ int iImage,
+ int iOverlay);
+
+ [PreserveSig]
+ int Replace(
+ int i,
+ IntPtr hbmImage,
+ IntPtr hbmMask);
+
+ [PreserveSig]
+ int AddMasked(
+ IntPtr hbmImage,
+ int crMask,
+ ref int pi);
+
+ [PreserveSig]
+ int Draw(
+ ref IMAGELISTDRAWPARAMS pimldp);
+
+ [PreserveSig]
+ int Remove(
+ uint i);
+
+ [PreserveSig]
+ int GetIcon(
+ uint i,
+ uint flags,
+ ref IntPtr picon);
+
+ [PreserveSig]
+ int GetImageInfo(
+ uint i,
+ ref IMAGEINFO pImageInfo);
+
+ [PreserveSig]
+ int Copy(
+ uint iDst,
+ IImageList punkSrc,
+ uint iSrc,
+ uint uFlags);
+
+ [PreserveSig]
+ int Merge(
+ int i1,
+ IImageList punk2,
+ int i2,
+ int dx,
+ int dy,
+ ref Guid riid,
+ ref IntPtr ppv);
+
+ [PreserveSig]
+ int Clone(
+ ref Guid riid,
+ ref IntPtr ppv);
+
+ [PreserveSig]
+ int GetImageRect(
+ int i,
+ ref RECT prc);
+
+ [PreserveSig]
+ int GetIconSize(
+ ref int cx,
+ ref int cy);
+
+ [PreserveSig]
+ int SetIconSize(
+ int cx,
+ int cy);
+
+ [PreserveSig]
+ int GetImageCount(
+ ref int pi);
+
+ [PreserveSig]
+ int SetImageCount(
+ int uNewCount);
+
+ [PreserveSig]
+ int SetBkColor(
+ int clrBk,
+ ref int pclr);
+
+ [PreserveSig]
+ int GetBkColor(
+ ref int pclr);
+
+ [PreserveSig]
+ int BeginDrag(
+ int iTrack,
+ int dxHotspot,
+ int dyHotspot);
+
+ [PreserveSig]
+ int EndDrag();
+
+ [PreserveSig]
+ int DragEnter(
+ IntPtr hwndLock,
+ int x,
+ int y);
+
+ [PreserveSig]
+ int DragLeave(
+ IntPtr hwndLock);
+
+ [PreserveSig]
+ int DragMove(
+ int x,
+ int y);
+
+ [PreserveSig]
+ int SetDragCursorImage(
+ ref IImageList punk,
+ int iDrag,
+ int dxHotspot,
+ int dyHotspot);
+
+ [PreserveSig]
+ int DragShowNolock(
+ int fShow);
+
+ [PreserveSig]
+ int GetDragImage(
+ ref POINT ppt,
+ ref POINT pptHotspot,
+ ref Guid riid,
+ ref IntPtr ppv);
+
+ [PreserveSig]
+ int GetItemFlags(
+ int i,
+ ref int dwFlags);
+
+ [PreserveSig]
+ int GetOverlayImage(
+ int iOverlay,
+ ref int piIndex);
+ };
+ #endregion
+ ///
+ /// SHGetImageList is not exported correctly in XP. See KB316931
+ /// http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q316931
+ /// Apparently (and hopefully) ordinal 727 isn't going to change.
+ ///
+ [DllImport(libShell32, EntryPoint = "#727")]
+ public extern static int SHGetImageList(
+ uint iImageList,
+ ref Guid riid,
+ ref IImageList ppv
+ );
+ #endregion
+
+ #endregion
+
+ #region User32
+
+ ///
+ /// Provides access to function required to delete handle. This method is used internally
+ /// and is not required to be called separately.
+ ///
+ /// Pointer to icon handle.
+ /// N/A
+ [DllImport(libUser32)]
+ protected static extern int DestroyIcon(IntPtr hIcon);
+
+ #endregion
+ }
+
+ public class WinApiEx : WinApi
+ {
+ private static IImageList GetShellImageList(uint flags)
+ {
+ Guid shell_idImageList = new Guid("46EB5926-582E-4017-9FDF-E8998DAA0950");
+ IImageList result = null;
+ int hresult = SHGetImageList(flags, ref shell_idImageList, ref result);
+ if (hresult != 0)
+ throw new Exception("Can't get Shell Image List");
+ return result;
+ }
+
+ private static SHFILEINFO SHGetFileInfo(string path, uint flags)
+ {
+ SHFILEINFO result = new SHFILEINFO();
+ SHGetFileInfo(path,
+ FILE_ATTRIBUTE_NORMAL,
+ ref result,
+ (uint)System.Runtime.InteropServices.Marshal.SizeOf(result),
+ flags);
+ return result;
+ }
+
+ private static Icon ImageListGetIcon(IImageList il, uint index)
+ {
+ IntPtr iIcon = IntPtr.Zero;
+ il.GetIcon(index, ILD_TRANSPARENT, ref iIcon);
+ Icon ico = (Icon)Icon.FromHandle(iIcon).Clone();
+ DestroyIcon(iIcon);
+ return ico;
+ }
+
+ public static Bitmap GetFileIcon(string path, uint size)
+ {
+ SHFILEINFO shfi = SHGetFileInfo(path, SHGFI_SYSICONINDEX | SHGFI_DISPLAYNAME);
+ IImageList shil = GetShellImageList(size);
+
+ Icon ico = ImageListGetIcon(shil, (uint)shfi.iIcon);
+ Bitmap bmp = ico.ToBitmap();
+ ico.Dispose();
+ return bmp;
+ }
+
+ public static Bitmap GetFileIconJumbo(string path)
+ {
+ return GetFileIcon(path, SHIL_JUMBO);
+ }
+
+ public static Bitmap GetFileIconExtraLarge(string path)
+ {
+ return GetFileIcon(path, SHIL_EXTRALARGE);
+ }
+
+ }
+}
diff --git a/V1/Launcheroid/Launcher.cs b/V1/Launcheroid/Launcher.cs
new file mode 100644
index 0000000..b435e27
--- /dev/null
+++ b/V1/Launcheroid/Launcher.cs
@@ -0,0 +1,237 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.IO;
+using System.Drawing;
+using System.Drawing.Imaging;
+using System.Diagnostics;
+using System.Windows.Forms;
+
+namespace Launcheroid
+{
+ public static class Launcher
+ {
+ public static string FILE_NAME = "links.lrd";
+ private const string FILE_HEAD = "LnkrLnchr";
+ public static string title = "Launcheroid "+Program.version;
+
+ private static List links = new List();
+
+ public static void Clear()
+ {
+ links.Clear();
+ }
+
+ public static void Add(string path)
+ {
+ lLink lnk = lLink.FromExternalFile(path);
+ if (lnk == null)
+ return;
+ links.Add(lnk);
+ }
+
+ public static void Del(lLink item)
+ {
+ links.Remove(item);
+ }
+
+ #region Load/Save
+ public static void Save()
+ {
+ FileStream fs = new FileStream(FILE_NAME, FileMode.Create, FileAccess.Write);
+ BinaryWriter bw = new BinaryWriter(fs);
+ bw.Write(Encoding.ASCII.GetBytes(FILE_HEAD));
+ bw.Write((byte)2);
+ bw.Write(title);
+ bw.Write(links.Count);
+ foreach (lLink lnk in links)
+ lnk.SaveToStream(bw);
+ bw.Close();
+ fs.Close();
+ }
+
+ public static void Load()
+ {
+ Clear();
+ if (!File.Exists(FILE_NAME))
+ return;
+ FileStream fs = new FileStream(FILE_NAME, FileMode.Open, FileAccess.Read);
+ BinaryReader br = new BinaryReader(fs);
+ try
+ {
+ if (Encoding.ASCII.GetString(br.ReadBytes(FILE_HEAD.Length)) != FILE_HEAD)
+ throw new Exception("El archivo no es compatible");
+ int version=br.ReadByte();
+ if (version > 2)
+ throw new Exception("Versión del archivo no soportada");
+ title = br.ReadString();
+ int cnt = br.ReadInt32();
+ for (int i = 0; i < cnt; i++)
+ links.Add(lLink.FromStream(br,version));
+ }
+ finally
+ {
+ br.Close();
+ fs.Close();
+ }
+ }
+
+ public static void Navigate(string path)
+ {
+ try
+ {
+ string[] dirs=Directory.GetDirectories(path);
+ string[] fils = Directory.GetFiles(path);
+ foreach (string dir in dirs)
+ links.Add(lLink.FromExternalFile(dir));
+ foreach (string fil in fils)
+ links.Add(lLink.FromExternalFile(fil));
+ }
+ catch { };
+ }
+ #endregion
+
+ public static lLink[] Links { get { return links.ToArray(); } }
+ }
+
+ public class lLink
+ {
+ private string name;
+ private string path;
+ private string args;
+ private Bitmap bmp;
+ public bool Navigate;
+ private string dir;
+
+ #region Constructors
+ private lLink()
+ {
+ }
+
+ public static lLink FromExternalFile(string path)
+ {
+ lLink result = new lLink();
+ result.path = path;
+ result.name = System.IO.Path.GetFileNameWithoutExtension(path);
+ if (result.name.Length > 20)
+ result.name = result.name.Substring(0, 20 - 3) + "...";
+ result.args = "";
+ result.dir = System.IO.Path.GetDirectoryName(path);
+ if (result.dir == null)
+ result.dir = "";
+ result.bmp = IconTool.GetFileJumbo(path);
+ result.Navigate = Directory.Exists(path);
+ return result;
+ }
+
+ public static lLink FromStream(BinaryReader br,int version)
+ {
+ lLink result = new lLink();
+ switch (version)
+ {
+ case 0:
+ result.LoadFromStreamV0(br);
+ break;
+ case 1:
+ result.LoadFromStreamV1(br);
+ break;
+ case 2:
+ result.LoadFromStream(br);
+ break;
+ default:
+ throw new Exception("Versión "+version+" no implementada");
+ }
+ return result;
+ }
+ #endregion
+
+ #region Disk I/O
+ internal void SaveToStream(BinaryWriter bw)
+ {
+ bw.Write(name);
+ bw.Write(path);
+ bw.Write(args);
+ bw.Write(dir);
+ bw.Write(Navigate);
+ MemoryStream ms = new MemoryStream();
+ bmp.Save(ms, ImageFormat.Png);
+ ms.Close();
+ byte[] idata = ms.ToArray();
+ ms = null;
+ bw.Write(idata.Length);
+ bw.Write(idata);
+ }
+
+ internal void LoadFromStreamV0(BinaryReader br)
+ {
+ name = br.ReadString();
+ path = br.ReadString();
+ args = br.ReadString();
+ dir = "";
+ Navigate = false;
+ byte[] idata = br.ReadBytes(br.ReadInt32());
+ MemoryStream ms = new MemoryStream(idata);
+ bmp =(Bitmap) Bitmap.FromStream(ms);
+ }
+
+ internal void LoadFromStreamV1(BinaryReader br)
+ {
+ name = br.ReadString();
+ path = br.ReadString();
+ args = br.ReadString();
+ dir = System.IO.Path.GetDirectoryName(path);
+ if (dir == null)
+ dir = "";
+ Navigate = br.ReadBoolean();
+ byte[] idata = br.ReadBytes(br.ReadInt32());
+ MemoryStream ms = new MemoryStream(idata);
+ bmp = (Bitmap)Bitmap.FromStream(ms);
+ }
+
+ internal void LoadFromStream(BinaryReader br)
+ {
+ name = br.ReadString();
+ path = br.ReadString();
+ args = br.ReadString();
+ dir = br.ReadString();
+ Navigate = br.ReadBoolean();
+ byte[] idata = br.ReadBytes(br.ReadInt32());
+ MemoryStream ms = new MemoryStream(idata);
+ bmp = (Bitmap)Bitmap.FromStream(ms);
+ }
+ #endregion
+
+ #region Launch
+ public bool Open()
+ {
+ try
+ {
+ if (Navigate)
+ Process.Start(Program.path, "nav \"" + path + "\"");
+ else
+ {
+ ProcessStartInfo psi = new ProcessStartInfo();
+ psi.FileName = path;
+ psi.Arguments = args;
+ psi.ErrorDialog = true;
+ psi.WorkingDirectory = dir;
+ Process.Start(psi);
+ }
+ return true;
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show(e.Message, e.GetType().Name, MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ return false;
+ }
+ #endregion
+
+ public Bitmap Icon { get { return bmp; } set { bmp = value; } }
+ public string Name { get { return name; } set { name = value; } }
+ public string Path { get { return path; } set { path = value; } }
+ public string Args { get { return args; } set { args = value; } }
+ public string Dir { get { return dir; } set { dir = value; } }
+ }
+
+}
diff --git a/V1/Launcheroid/Launcheroid.csproj b/V1/Launcheroid/Launcheroid.csproj
new file mode 100644
index 0000000..efac5fc
--- /dev/null
+++ b/V1/Launcheroid/Launcheroid.csproj
@@ -0,0 +1,115 @@
+
+
+
+ Debug
+ AnyCPU
+ 9.0.30729
+ 2.0
+ {6403D9B8-17B0-45C8-B8B1-163A275EC3FB}
+ WinExe
+ Properties
+ Launcheroid
+ Launcheroid
+ v2.0
+ 512
+
+
+ BlueLauncher.ico
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+
+
+
+
+
+
+
+ Glass.cs
+ Form
+
+
+ Form
+
+
+ FConf.cs
+
+
+
+ Form
+
+
+ FItem.cs
+
+
+ Form
+
+
+ Form1.cs
+
+
+
+
+
+
+ FConf.cs
+
+
+ FItem.cs
+
+
+ Form1.cs
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+ Designer
+
+
+ True
+ Resources.resx
+ True
+
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+ True
+ Settings.settings
+ True
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/V1/Launcheroid/Program.cs b/V1/Launcheroid/Program.cs
new file mode 100644
index 0000000..409deac
--- /dev/null
+++ b/V1/Launcheroid/Program.cs
@@ -0,0 +1,173 @@
+using System;
+using System.Collections.Generic;
+using System.Windows.Forms;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using System.IO;
+using System.Reflection;
+
+namespace Launcheroid
+{
+ static class Program
+ {
+ public static string version = "2.0";
+ public static string path = Assembly.GetExecutingAssembly().Location;
+ public static bool NavMode = false;
+ ///
+ /// Punto de entrada principal para la aplicación.
+ ///
+ [STAThread]
+ static void Main(string[] args)
+ {
+ try
+ {
+ xwolf.FileAssociation.AssociateMe(".lrd", "Launcheroid", "Enlaces Launcheroid");
+ }
+ catch
+ {
+
+ }
+ //Arg[] aargs=Arg.ComputeArguments(args);
+ //args = null;
+
+ if (args.Length == 1)
+ if (File.Exists(args[0]))
+ Launcheroid.Launcher.FILE_NAME = args[0];
+ if (args.Length == 2)
+ {
+ string cmd = args[0].ToLower();
+ switch (cmd)
+ {
+ case "nav":
+ NavMode = true;
+ Launcher.title = args[1];
+ Launcher.Navigate(args[1]);
+ break;
+ }
+ }
+ else
+ Launcher.Load();
+ Application.EnableVisualStyles();
+ Application.SetCompatibleTextRenderingDefault(false);
+ Application.Run(new Form1());
+ }
+ }
+
+ //public class Arg
+ //{
+ // string cmd;
+ // string value;
+
+ // public static Arg[] ComputeArguments(string[] args)
+ // {
+ // List result = new List();
+ // int i = 0;
+ // while (i < args.Length)
+ // {
+ // string command = args[i];
+ // if ((command.Length == 3) && (i + 1 < args.Length))
+ // {
+ // Arg a = new Arg();
+ // a.cmd = command.ToUpper();
+ // a.value = args[i + 1];
+ // result.Add(a);
+ // }
+ // else
+ // {
+ // Arg a = new Arg();
+ // a.cmd = "";
+ // a.value = command;
+ // result.Add(a);
+ // }
+ // }
+ // return result.ToArray();
+ // }
+ //}
+
+ public static class GfxTools
+ {
+ #region Selected Bitmaps
+ private static Bitmap selectedBG;
+ private static Bitmap selectedFG;
+ private static Bitmap getSelectedBG()
+ {
+ if (selectedBG == null)
+ {
+ selectedBG = new Bitmap(128, 128);
+ Brush selBrush = new SolidBrush(Color.LightBlue);
+ Graphics g = Graphics.FromImage(selectedBG);
+ g.SmoothingMode = SmoothingMode.HighQuality;
+ g.CompositingQuality = CompositingQuality.HighQuality;
+ FillRoundRect(g, selBrush, 0, 0, 128, 128, 15);
+ g.Dispose();
+ selBrush.Dispose();
+ }
+ return selectedBG;
+ }
+ private static Bitmap getSelectedFG()
+ {
+ if (selectedFG == null)
+ {
+ selectedFG = new Bitmap(128, 128);
+ Pen selPen = new Pen(Color.Gray);
+ selPen.Width = 3;
+ selPen.DashStyle = DashStyle.Dash;
+ Graphics g = Graphics.FromImage(selectedFG);
+ g.SmoothingMode = SmoothingMode.HighQuality;
+ g.CompositingQuality = CompositingQuality.HighQuality;
+ DrawRoundRect(g, selPen, 5, 5, 118, 118, 10);
+ g.Dispose();
+ selPen.Dispose();
+ }
+ return selectedFG;
+ }
+
+ public static void DrawRoundRect(Graphics g, Pen p, float x, float y, float width, float height, float radius)
+ {
+ GraphicsPath gp = new GraphicsPath();
+ gp.AddLine(x + radius, y, x + width - (radius * 2), y); // Line
+ gp.AddArc(x + width - (radius * 2), y, radius * 2, radius * 2, 270, 90); // Corner
+ gp.AddLine(x + width, y + radius, x + width, y + height - (radius * 2)); // Line
+ gp.AddArc(x + width - (radius * 2), y + height - (radius * 2), radius * 2, radius * 2, 0, 90); // Corner
+ gp.AddLine(x + width - (radius * 2), y + height, x + radius, y + height); // Line
+ gp.AddArc(x, y + height - (radius * 2), radius * 2, radius * 2, 90, 90); // Corner
+ gp.AddLine(x, y + height - (radius * 2), x, y + radius); // Line
+ gp.AddArc(x, y, radius * 2, radius * 2, 180, 90); // Corner
+ gp.CloseFigure();
+ g.DrawPath(p, gp);
+ gp.Dispose();
+ }
+
+ public static void FillRoundRect(Graphics g, Brush b, float x, float y, float width, float height, float radius)
+ {
+ GraphicsPath gp = new GraphicsPath();
+ gp.AddLine(x + radius, y, x + width - (radius * 2), y); // Line
+ gp.AddArc(x + width - (radius * 2), y, radius * 2, radius * 2, 270, 90); // Corner
+ gp.AddLine(x + width, y + radius, x + width, y + height - (radius * 2)); // Line
+ gp.AddArc(x + width - (radius * 2), y + height - (radius * 2), radius * 2, radius * 2, 0, 90); // Corner
+ gp.AddLine(x + width - (radius * 2), y + height, x + radius, y + height); // Line
+ gp.AddArc(x, y + height - (radius * 2), radius * 2, radius * 2, 90, 90); // Corner
+ gp.AddLine(x, y + height - (radius * 2), x, y + radius); // Line
+ gp.AddArc(x, y, radius * 2, radius * 2, 180, 90); // Corner
+ gp.CloseFigure();
+ g.FillPath(b, gp);
+ gp.Dispose();
+ }
+
+ public static Bitmap SelectionBG { get { return getSelectedBG(); } }
+ public static Bitmap SelectionFG { get { return getSelectedFG(); } }
+ #endregion
+
+ private static Font textFont = new Font(FontFamily.GenericSansSerif, 10, FontStyle.Bold);
+ private static Brush textBrush = new SolidBrush(Color.White);
+ private static Brush textbgBrush = new SolidBrush(Color.FromArgb(220, 0, 0, 20));
+
+ public static void DrawString(Graphics g, string text, int x, int y)
+ {
+ int w = (int)g.MeasureString(text, textFont).Width / 2;
+ int w2 = w + 5;
+ FillRoundRect(g, textbgBrush, x - w2, y, w2 * 2, 16, 5);
+ g.DrawString(text, textFont, textBrush, x - w, y);
+ }
+ }
+}
diff --git a/V1/Launcheroid/Properties/AssemblyInfo.cs b/V1/Launcheroid/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..e910531
--- /dev/null
+++ b/V1/Launcheroid/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// La información general sobre un ensamblado se controla mediante el siguiente
+// conjunto de atributos. Cambie estos atributos para modificar la información
+// asociada con un ensamblado.
+[assembly: AssemblyTitle("Launcheroid")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("XWolf''")]
+[assembly: AssemblyProduct("Launcheroid")]
+[assembly: AssemblyCopyright("Copyright © XWolf'' 2011")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Si establece ComVisible como false, los tipos de este ensamblado no estarán visibles
+// para los componentes COM. Si necesita obtener acceso a un tipo de este ensamblado desde
+// COM, establezca el atributo ComVisible como true en este tipo.
+[assembly: ComVisible(false)]
+
+// El siguiente GUID sirve como identificador de typelib si este proyecto se expone a COM
+[assembly: Guid("5fd1b21f-6453-4e29-a034-6c0022986f1a")]
+
+// La información de versión de un ensamblado consta de los cuatro valores siguientes:
+//
+// Versión principal
+// Versión secundaria
+// Número de versión de compilación
+// Revisión
+//
+// Puede especificar todos los valores o establecer como predeterminados los números de versión de compilación y de revisión
+// mediante el asterisco ('*'), como se muestra a continuación:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("2.0.0.0")]
+[assembly: AssemblyFileVersion("2.0.0.0")]
diff --git a/V1/Launcheroid/Properties/Resources.Designer.cs b/V1/Launcheroid/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..7da8980
--- /dev/null
+++ b/V1/Launcheroid/Properties/Resources.Designer.cs
@@ -0,0 +1,63 @@
+//------------------------------------------------------------------------------
+//
+// Este código fue generado por una herramienta.
+// Versión del motor en tiempo de ejecución:2.0.50727.4952
+//
+// Los cambios en este archivo podrían causar un comportamiento incorrecto y se perderán si
+// se vuelve a generar el código.
+//
+//------------------------------------------------------------------------------
+
+namespace Launcheroid.Properties {
+ using System;
+
+
+ ///
+ /// Clase de recurso con establecimiento inflexible de tipos, para buscar cadenas traducidas, etc.
+ ///
+ // StronglyTypedResourceBuilder generó automáticamente esta clase
+ // a través de una herramienta como ResGen o Visual Studio.
+ // Para agregar o quitar un miembro, edite el archivo .ResX y, a continuación, vuelva a ejecutar ResGen
+ // con la opción /str o vuelva a generar su proyecto de VS.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ ///
+ /// Devuelve la instancia de ResourceManager almacenada en caché utilizada por esta clase.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Launcheroid.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Reemplaza la propiedad CurrentUICulture del subproceso actual para todas las
+ /// búsquedas de recursos mediante esta clase de recurso con establecimiento inflexible de tipos.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/V1/Launcheroid/Properties/Resources.resx b/V1/Launcheroid/Properties/Resources.resx
new file mode 100644
index 0000000..7080a7d
--- /dev/null
+++ b/V1/Launcheroid/Properties/Resources.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/V1/Launcheroid/Properties/Settings.Designer.cs b/V1/Launcheroid/Properties/Settings.Designer.cs
new file mode 100644
index 0000000..88f6f5b
--- /dev/null
+++ b/V1/Launcheroid/Properties/Settings.Designer.cs
@@ -0,0 +1,30 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:2.0.50727.4952
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace Launcheroid.Properties
+{
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
+ {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default
+ {
+ get
+ {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/V1/Launcheroid/Properties/Settings.settings b/V1/Launcheroid/Properties/Settings.settings
new file mode 100644
index 0000000..3964565
--- /dev/null
+++ b/V1/Launcheroid/Properties/Settings.settings
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/V1/Launcheroid/aGlass.cs b/V1/Launcheroid/aGlass.cs
new file mode 100644
index 0000000..cf75042
--- /dev/null
+++ b/V1/Launcheroid/aGlass.cs
@@ -0,0 +1,54 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Runtime.InteropServices;
+using System.Windows.Forms;
+
+namespace Launcheroid
+{
+ class Glass
+ {
+ #region API
+ private struct MARGINS
+ {
+ public int m_Left;
+ public int m_Right;
+ public int m_Top;
+ public int m_Buttom;
+
+ public static MARGINS getFull()
+ {
+ MARGINS result;
+ result.m_Left = -1;
+ result.m_Right = -1;
+ result.m_Top = -1;
+ result.m_Buttom = -1;
+ return result;
+ }
+ };
+ [DllImport("dwmapi.dll")]
+ private extern static int DwmExtendFrameIntoClientArea(IntPtr hwnd, ref MARGINS margin);
+ [DllImport("dwmapi.dll")]
+ private extern static int DwmIsCompositionEnabled(ref int en);
+ #endregion
+
+ private static bool aero;
+ static Glass()
+ {
+ aero = System.Environment.OSVersion.Version.Major >= 6;
+ }
+
+ public static bool Composite
+ {
+ get { if (!aero) return false; int en = 0; DwmIsCompositionEnabled(ref en); return en > 0; }
+ }
+
+ public static void GlassForm(Form f)
+ {
+ if (!Composite)
+ return;
+ MARGINS m = MARGINS.getFull();
+ DwmExtendFrameIntoClientArea(f.Handle, ref m);
+ }
+ }
+}
diff --git a/V1/Launcheroid/app.config b/V1/Launcheroid/app.config
new file mode 100644
index 0000000..df20690
--- /dev/null
+++ b/V1/Launcheroid/app.config
@@ -0,0 +1,3 @@
+
+
+
diff --git a/V1/lib/Microsoft.WindowsAPICodePack.Shell.dll b/V1/lib/Microsoft.WindowsAPICodePack.Shell.dll
new file mode 100644
index 0000000..36bc23a
--- /dev/null
+++ b/V1/lib/Microsoft.WindowsAPICodePack.Shell.dll
Binary files differ
diff --git a/V1/lib/Microsoft.WindowsAPICodePack.dll b/V1/lib/Microsoft.WindowsAPICodePack.dll
new file mode 100644
index 0000000..8c96ec5
--- /dev/null
+++ b/V1/lib/Microsoft.WindowsAPICodePack.dll
Binary files differ
diff --git a/V1/lib/VistaControls.dll b/V1/lib/VistaControls.dll
new file mode 100644
index 0000000..6e197af
--- /dev/null
+++ b/V1/lib/VistaControls.dll
Binary files differ
diff --git a/V1/res/1348138995_picons28.ico b/V1/res/1348138995_picons28.ico
new file mode 100644
index 0000000..e7c1878
--- /dev/null
+++ b/V1/res/1348138995_picons28.ico
Binary files differ
diff --git a/V1/res/1348138999_applications.png b/V1/res/1348138999_applications.png
new file mode 100644
index 0000000..5ebf45c
--- /dev/null
+++ b/V1/res/1348138999_applications.png
Binary files differ
diff --git a/V1/res/1348139221_application-x-executable.ico b/V1/res/1348139221_application-x-executable.ico
new file mode 100644
index 0000000..ae94bd0
--- /dev/null
+++ b/V1/res/1348139221_application-x-executable.ico
Binary files differ
diff --git a/V1/res/1348139308_gnome-mime-application-x-ms-dos-executable.ico b/V1/res/1348139308_gnome-mime-application-x-ms-dos-executable.ico
new file mode 100644
index 0000000..65c996e
--- /dev/null
+++ b/V1/res/1348139308_gnome-mime-application-x-ms-dos-executable.ico
Binary files differ
diff --git a/V1/res/1348139751_up_64.ico b/V1/res/1348139751_up_64.ico
new file mode 100644
index 0000000..b49b688
--- /dev/null
+++ b/V1/res/1348139751_up_64.ico
Binary files differ
diff --git a/V1/res/1348139761_Upload.ico b/V1/res/1348139761_Upload.ico
new file mode 100644
index 0000000..a63fe7b
--- /dev/null
+++ b/V1/res/1348139761_Upload.ico
Binary files differ
diff --git a/V1/res/1348139766_up.png b/V1/res/1348139766_up.png
new file mode 100644
index 0000000..c2dba07
--- /dev/null
+++ b/V1/res/1348139766_up.png
Binary files differ
diff --git a/V1/res/1348139769_go-top.ico b/V1/res/1348139769_go-top.ico
new file mode 100644
index 0000000..5066372
--- /dev/null
+++ b/V1/res/1348139769_go-top.ico
Binary files differ
diff --git a/V1/res/BlueLauncher.ico b/V1/res/BlueLauncher.ico
new file mode 100644
index 0000000..ce77a12
--- /dev/null
+++ b/V1/res/BlueLauncher.ico
Binary files differ
diff --git a/V1/res/Gnome App Green.ico b/V1/res/Gnome App Green.ico
new file mode 100644
index 0000000..220a074
--- /dev/null
+++ b/V1/res/Gnome App Green.ico
Binary files differ
diff --git a/V1/res/Gnome App Green2.ico b/V1/res/Gnome App Green2.ico
new file mode 100644
index 0000000..340605b
--- /dev/null
+++ b/V1/res/Gnome App Green2.ico
Binary files differ
diff --git a/V1/res/Gnome App.ico b/V1/res/Gnome App.ico
new file mode 100644
index 0000000..8fb4e7c
--- /dev/null
+++ b/V1/res/Gnome App.ico
Binary files differ
diff --git a/V1/res/lau.ico b/V1/res/lau.ico
new file mode 100644
index 0000000..4f2ad31
--- /dev/null
+++ b/V1/res/lau.ico
Binary files differ
diff --git a/V1/res/lau.xcf b/V1/res/lau.xcf
new file mode 100644
index 0000000..4f90726
--- /dev/null
+++ b/V1/res/lau.xcf
Binary files differ
diff --git a/V1/res/lau1.ico b/V1/res/lau1.ico
new file mode 100644
index 0000000..9aaaed1
--- /dev/null
+++ b/V1/res/lau1.ico
Binary files differ
diff --git a/V1/res/lau2.xcf b/V1/res/lau2.xcf
new file mode 100644
index 0000000..993ddd7
--- /dev/null
+++ b/V1/res/lau2.xcf
Binary files differ