Commit b57225bf authored by 神楽坂玲奈's avatar 神楽坂玲奈

package

parent efd9864a
'use strict';
const path = require('path');
module.exports = function (grunt) {
module.exports = (grunt) => {
let release_task;
switch (process.platform) {
case 'darwin':
build_prefix = 'Electron.app/Contents/Resources';
grunt.loadNpmTasks('grunt-appdmg');
var release_task = 'appdmg';
release_task = 'appdmg';
break;
case 'win32':
build_prefix = 'resources';
grunt.loadNpmTasks('grunt-electron-installer');
release_task = 'create-windows-installer';
break;
}
grunt.initConfig({
clean: ["build"],
clean: ["build2", "build3", "build4"],
copy: {
electron: {
app: {
expand: true,
options: {
mode: true,
timestamp: true
},
cwd: 'node_modules/electron-prebuilt/dist',
src: '**',
dest: 'build'
src: ['package.json', 'README.txt', 'LICENSE.txt', 'main.js', 'apps.js', 'bundle.json', '*.tar.xz', 'index.html', 'css/**', 'font/**', 'js/**'],
dest: 'build2'
},
app: {
node_modules: {
expand: true,
options: {
timestamp: true
},
src: ['package.json', 'README.txt', 'LICENSE.txt', 'index.html', 'main.js', 'ygopro.js', 'ygopro/**', 'node_modules/ws/**'],
dest: path.join('build', build_prefix, 'app')
cwd: 'build1',
src: ['node_modules/**', 'bin/**'],
dest: 'build2'
}
},
electron: {
osxBuild: {
win32build: {
options: {
name: 'Fixture',
dir: 'app',
out: 'dist',
version: '0.25.3',
platform: 'darwin',
arch: 'x64'
name: 'mycard',
dir: 'build2',
out: 'build3',
platform: 'win32',
arch: 'all',
icon: 'resources/win/icon.ico'
}
}
},
'create-windows-installer': {
x64: {
appDirectory: 'build',
outputDirectory: 'release',
appDirectory: 'build3/mycard-win32-x64',
outputDirectory: 'build4',
authors: 'MyCard',
exe: 'electron.exe',
}/*,
ia32: {
appDirectory: 'build/32',
outputDirectory: 'release/32',
authors: 'MyCard',
exe: 'mycard.exe'
}*/
exe: 'mycard.exe',
setupIcon: 'resources/win/icon.ico',
noMsi: true
}
}
});
grunt.loadNpmTasks('grunt-contrib-clean');
grunt.loadNpmTasks('grunt-contrib-copy');
grunt.loadNpmTasks('grunt-electron');
grunt.registerTask('build', ['clean', 'copy:electron','copy:app']);
grunt.registerTask('build', ['clean', 'copy', 'electron']);
grunt.registerTask('release', ['build', release_task]);
grunt.registerTask('default', ['release']);
};
nyaa
\ No newline at end of file
# build
npm install --prefix build1 --production glob ini mkdirp ws winreg windows-shortcuts
robocopy resources\win build1\bin\ *.exe *.dll
'use strict';
const os = require('os');
const fs = require('fs');
const path = require('path');
const child_process = require('child_process');
......@@ -26,7 +25,7 @@ try {
}
db.version = app.getVersion();
db.platform = os.platform();
db.platform = process.platform;
db.default_apps_path = path.join(data_path, 'apps');
var bundle;
......@@ -57,9 +56,19 @@ eventemitter.on('install', (app, options) => {
eventemitter.emit('update', app, local, 'install-started');
mkdirp(local.path, ()=> {
let extract = child_process.spawn('tar', ['fx', app.id + '.tar.xz', '-C', local.path], {stdio: 'inherit'});
extract.on('exit', (code) => {
console.log(code);
let tar;
if (db.platform == 'win32') {
let xz = child_process.spawn(path.join(__dirname, 'bin', 'xz.exe'), ['-d', '-c', path.join(__dirname, app.id + '.tar.xz')], {stdio: ['inherit', 'pipe', 'inherit']});
tar = child_process.spawn(path.join(__dirname, 'bin', 'tar.exe'), ['fx', '-'], {
cwd: local.path,
stdio: [xz.stdout, 'inherit', 'inherit']
});
} else {
tar = child_process.spawn('tar', ['fx', path.join(__dirname, app.id + '.tar.xz'), '-C', local.path], {stdio: 'inherit'});
}
tar.on('exit', (code) => {
if (code == 0) {
load(app, local, ()=> {
......@@ -86,7 +95,7 @@ eventemitter.on('action', function (app_id, action, options) {
}
let args = {'join': '-j', 'deck': '-d'}[action];
let main;
if (os.platform() == 'darwin') {
if (process.platform == 'darwin') {
main = 'ygopro.app/Contents/MacOS/ygopro'
} else {
main = 'ygopro_vs.exe'
......@@ -124,8 +133,14 @@ eventemitter.on('write', (app_id, file, data, merge) => {
let pending = 1;
for (let app_id in db.local) {
pending++;
load(db.apps[app_id], db.local[app_id], done);
if(db.local[app_id].status == 'installing'){
let options = db.local[app_id];
delete db.local[app_id];
eventemitter.emit('install', db.apps[app_id], options);
}else{
pending++;
load(db.apps[app_id], db.local[app_id], done);
}
}
done();
......@@ -146,7 +161,7 @@ function start_server() {
data: [db]
}));
if (bundle && Object.keys(db.apps).length == 0) {
if (bundle && Object.keys(db.local).length == 0) {
connection.send(JSON.stringify({
event: 'bundle',
data: [bundle]
......
/*
Animation example, for spinners
*/
.animate-spin {
-moz-animation: spin 2s infinite linear;
-o-animation: spin 2s infinite linear;
-webkit-animation: spin 2s infinite linear;
animation: spin 2s infinite linear;
display: inline-block;
}
@-moz-keyframes spin {
0% {
-moz-transform: rotate(0deg);
-o-transform: rotate(0deg);
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-moz-transform: rotate(359deg);
-o-transform: rotate(359deg);
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}
@-webkit-keyframes spin {
0% {
-moz-transform: rotate(0deg);
-o-transform: rotate(0deg);
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-moz-transform: rotate(359deg);
-o-transform: rotate(359deg);
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}
@-o-keyframes spin {
0% {
-moz-transform: rotate(0deg);
-o-transform: rotate(0deg);
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-moz-transform: rotate(359deg);
-o-transform: rotate(359deg);
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}
@-ms-keyframes spin {
0% {
-moz-transform: rotate(0deg);
-o-transform: rotate(0deg);
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-moz-transform: rotate(359deg);
-o-transform: rotate(359deg);
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}
@keyframes spin {
0% {
-moz-transform: rotate(0deg);
-o-transform: rotate(0deg);
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-moz-transform: rotate(359deg);
-o-transform: rotate(359deg);
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}
.icon-minimize:before { content: '\e800'; } /* '' */
.icon-restore:before { content: '\e801'; } /* '' */
.icon-maximize:before { content: '\e802'; } /* '' */
.icon-close:before { content: '\e803'; } /* '' */
\ No newline at end of file
This diff is collapsed.
.icon-minimize { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
.icon-restore { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
.icon-maximize { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
.icon-close { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
\ No newline at end of file
[class^="icon-"], [class*=" icon-"] {
font-family: 'fontello';
font-style: normal;
font-weight: normal;
/* fix buttons height */
line-height: 1em;
/* you can be more comfortable with increased icons size */
/* font-size: 120%; */
}
.icon-minimize { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
.icon-restore { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
.icon-maximize { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
.icon-close { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
\ No newline at end of file
@font-face {
font-family: 'fontello';
src: url('../font/fontello.eot?75866392');
src: url('../font/fontello.eot?75866392#iefix') format('embedded-opentype'),
url('../font/fontello.woff?75866392') format('woff'),
url('../font/fontello.ttf?75866392') format('truetype'),
url('../font/fontello.svg?75866392#fontello') format('svg');
font-weight: normal;
font-style: normal;
}
/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */
/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */
/*
@media screen and (-webkit-min-device-pixel-ratio:0) {
@font-face {
font-family: 'fontello';
src: url('../font/fontello.svg?75866392#fontello') format('svg');
}
}
*/
[class^="icon-"]:before, [class*=" icon-"]:before {
font-family: "fontello";
font-style: normal;
font-weight: normal;
speak: none;
display: inline-block;
text-decoration: inherit;
width: 1em;
margin-right: .2em;
text-align: center;
/* opacity: .8; */
/* For safety - reset parent styles, that can break glyph codes*/
font-variant: normal;
text-transform: none;
/* fix buttons height, for twitter bootstrap */
line-height: 1em;
/* Animation center compensation - margins should be symmetric */
/* remove if not needed */
margin-left: .2em;
/* you can be more comfortable with increased icons size */
/* font-size: 120%; */
/* Font smoothing. That was taken from TWBS */
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
/* Uncomment for 3D effect */
/* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */
}
.icon-minimize:before { content: '\e800'; } /* '' */
.icon-restore:before { content: '\e801'; } /* '' */
.icon-maximize:before { content: '\e802'; } /* '' */
.icon-close:before { content: '\e803'; } /* '' */
\ No newline at end of file
html {
font-size: 16px;
}
body {
font-family: "Helvetica Neue", Helvetica, Arial, 'Source Sans Pro', "Microsoft YaHei", 'Microsoft JhengHei', "WenQuanYi Micro Hei", sans-serif;
font-size: 1rem;
line-height: 1.5;
color: #373a3c;
background-color: #fff;
margin: 0;
}
webview {
position: absolute;
top: 54px;
bottom: 0;
width: 100%;
display: none;
}
nav {
color: #eceeef;
background-color: #373a3c;
padding: .5rem 0 0.5rem 1rem;
position: fixed;
top: 0;
right: 0;
left: 0;
-webkit-user-select: none;
-webkit-app-region: drag;
}
nav i, nav a {
-webkit-app-region: no-drag;
}
#brand {
float: left;
padding-top: .25rem;
padding-bottom: .25rem;
margin-right: 1rem;
font-size: 1.25rem;
color: #fff;
touch-action: manipulation;
}
ul {
padding-left: 0;
margin-bottom: 0;
margin-top: 0;
list-style: none;
}
li {
float: left;
}
li + li {
margin-left: 1rem;
}
li > a {
display: block;
padding-top: .425rem;
padding-bottom: .425rem;
text-decoration: none;
color: rgba(255, 255, 255, .75);
outline: none;
}
#window-buttons > i {
color: rgba(255, 255, 255, .75);
}
li > a:hover, #window-buttons > i:hover {
color: #fff;
cursor: pointer;
}
li.active > a {
color: #fff;
}
.navbar-right {
float: right
}
.navbar-right div {
float: left;
margin: 0 0.5rem
}
body.darwin nav {
padding-left: 80px;
}
body.win32 #window-buttons {
display: initial;
}
body.maximized #restore {
display: initial;
}
body.maximized #maximize {
display: none;
}
#avatar {
display: block;
float: left;
border-radius: 50%;
height: 2rem;
padding: 0.175rem;
}
#name {
float: left;
padding-top: .425rem;
padding-bottom: .425rem;
margin-left: 4px;
}
\ No newline at end of file
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>Copyright (C) 2016 by original authors @ fontello.com</metadata>
<defs>
<font id="fontello" horiz-adv-x="1000" >
<font-face font-family="fontello" font-weight="400" font-stretch="normal" units-per-em="1000" ascent="850" descent="-150" />
<missing-glyph horiz-adv-x="1000" />
<glyph glyph-name="minimize" unicode="&#xe800;" d="m786 439v-107q0-22-16-38t-38-15h-678q-23 0-38 15t-16 38v107q0 23 16 38t38 16h678q22 0 38-16t16-38z" horiz-adv-x="785.7" />
<glyph glyph-name="restore" unicode="&#xe801;" d="m429 314v-250q0-14-11-25t-25-10-25 10l-81 81-185-186q-5-5-13-5t-13 5l-63 64q-6 5-6 13t6 13l185 185-80 80q-11 11-11 25t11 25 25 11h250q14 0 25-11t11-25z m421 375q0-7-6-13l-185-185 80-80q11-11 11-25t-11-25-25-11h-250q-14 0-25 11t-10 25v250q0 14 10 25t25 10 25-10l81-81 185 186q6 5 13 5t13-5l63-64q6-5 6-13z" horiz-adv-x="857.1" />
<glyph glyph-name="maximize" unicode="&#xe802;" d="m421 261q0-8-5-13l-185-185 80-81q10-10 10-25t-10-25-25-11h-250q-15 0-25 11t-11 25v250q0 15 11 25t25 11 25-11l80-80 185 185q6 6 13 6t13-6l64-63q5-6 5-13z m436 482v-250q0-15-10-25t-26-11-25 11l-80 80-185-185q-6-6-13-6t-13 6l-64 63q-5 6-5 13t5 13l186 185-81 81q-10 10-10 25t10 25 25 11h250q15 0 26-11t10-25z" horiz-adv-x="857.1" />
<glyph glyph-name="close" unicode="&#xe803;" d="m724 112q0-22-15-38l-76-76q-16-15-38-15t-38 15l-164 165-164-165q-16-15-38-15t-38 15l-76 76q-16 16-16 38t16 38l164 164-164 164q-16 16-16 38t16 38l76 76q16 16 38 16t38-16l164-164 164 164q16 16 38 16t38-16l76-76q15-15 15-38t-15-38l-164-164 164-164q15-15 15-38z" horiz-adv-x="785.7" />
</font>
</defs>
</svg>
\ No newline at end of file
......@@ -2,143 +2,42 @@
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
html {
font-size: 16px;
}
body {
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 1rem;
line-height: 1.5;
color: #373a3c;
background-color: #fff;
margin: 0;
}
webview {
position: absolute;
top: 54px;
bottom: 0;
width: 100%;
display: none;
}
nav {
color: #eceeef;
background-color: #373a3c;
padding: .5rem 1rem;
position: fixed;
top: 0;
right: 0;
left: 0;
-webkit-user-select: none;
-webkit-app-region: drag;
}
#brand {
float: left;
padding-top: .25rem;
padding-bottom: .25rem;
margin-right: 1rem;
font-size: 1.25rem;
color: #fff;
touch-action: manipulation;
}
ul {
padding-left: 0;
margin-bottom: 0;
margin-top: 0;
list-style: none;
}
li {
float: left;
}
li + li {
margin-left: 1rem;
}
li > a {
display: block;
padding-top: .425rem;
padding-bottom: .425rem;
text-decoration: none;
color: rgba(255, 255, 255, .75);
}
li > a:hover {
color: #fff;
outline: 0;
}
li.active > a {
color: #fff;
}
.navbar-right {
float: right
}
.container {
margin-left: 100px;
margin-right: 100px;
}
</style>
<title>MyCard</title>
<link href="css/fontello.css" rel="stylesheet">
<link href="css/style.css" rel="stylesheet">
</head>
<body>
<nav>
<div class="container">
<span id="brand">萌卡</span>
<ul>
<li id="nav-store">
<a href="#store">商店</a>
</li>
<li id="nav-ygopro" class="active">
<a href="#ygopro">游戏</a>
</li>
<li id="nav-forum">
<a href="#forum">社区</a>
</li>
</ul>
<div class="navbar-right">zh99998</div>
<span id="brand">MyCard</span>
<ul>
<li id="nav-store">
<a href="#store">商店</a>
</li>
<li id="nav-ygopro" class="active">
<a href="#ygopro">游戏</a>
</li>
<li id="nav-forum">
<a href="#forum">社区</a>
</li>
</ul>
<div class="navbar-right">
<div id="user">
<img id="avatar" src="https://forum-cdn.touhou.cc/user_avatar/forum.touhou.cc/zh99998/36/167_1.png">
<div id="name">zh99998</div>
</div>
<div id="window-buttons" hidden>
<i id="minimize" class="icon-minimize"></i>
<i id="maximize" class="icon-maximize"></i>
<i id="restore" class="icon-restore" hidden></i>
<i id="close" class="icon-close"></i>
</div>
</div>
</nav>
<webview id="store" src="http://mycard.moe/"></webview>
<webview id="ygopro" src="http://local.mycard.moe:3000/"></webview>
<!--<webview id="ygopro" src="http://mycard.moe/lobby/"></webview>--> <!-- fuck https https://plus.google.com/u/0/+%E7%A5%9E%E6%A5%BD%E5%9D%82%E7%8E%B2%E5%A5%88/posts/79g2y5JRB1Z -->
<webview id="ygopro" src="http://mycard.moe/lobby/"></webview>
<!-- fuck https https://plus.google.com/u/0/+%E7%A5%9E%E6%A5%BD%E5%9D%82%E7%8E%B2%E5%A5%88/posts/79g2y5JRB1Z -->
<webview id="forum" src="https://forum.touhou.cc"></webview>
<script>
window.onhashchange = function (event) {
var hash = event.newURL.split('#', 2)[1];
document.getElementsByClassName('active')[0].className = "";
document.getElementById('nav-' + hash).className = "active";
document.getElementById(event.oldURL.split('#', 2)[1]).style.display = 'none';
document.getElementById(hash).style.display = 'block';
};
var hash = location.href.split('#', 2)[1];
document.getElementById('nav-' + hash).className = "active";
document.getElementById(hash).style.display = 'block';
var webviews = document.getElementsByTagName('webview');
for (var i = 0; i < webviews.length; i++) {
webviews.item(i).addEventListener('new-window', function (event) {
require('electron').shell.openExternal(event.url);
});
}
//debug
var webview = document.getElementById(hash);
webview.addEventListener("dom-ready", function () {
webview.openDevTools();
});
</script>
<script src="js/app.js"></script>
</body>
</html>
\ No newline at end of file
var platform = process.platform;
var remote = require('remote');
var current_window = remote.getCurrentWindow();
document.getElementById("minimize").onclick = function () {
current_window.minimize()
};
document.getElementById("maximize").onclick = function () {
current_window.maximize();
};
document.getElementById("restore").onclick = function () {
current_window.unmaximize();
};
document.getElementById("close").onclick = function () {
current_window.close();
};
current_window.on('maximize', function () {
document.body.className = platform + ' maximized'
});
current_window.on('unmaximize', function () {
document.body.className = platform
});
if (current_window.isMaximized()) {
document.body.className = platform + ' maximized'
} else {
document.body.className = platform
}
window.onhashchange = function (event) {
var hash = event.newURL.split('#', 2)[1];
document.getElementsByClassName('active')[0].className = "";
document.getElementById('nav-' + hash).className = "active";
document.getElementById(event.oldURL.split('#', 2)[1]).style.display = 'none';
document.getElementById(hash).style.display = 'block';
};
var hash = location.href.split('#', 2)[1];
document.getElementById('nav-' + hash).className = "active";
document.getElementById(hash).style.display = 'block';
var webviews = document.getElementsByTagName('webview');
for (var i = 0; i < webviews.length; i++) {
webviews.item(i).addEventListener('new-window', function (event) {
require('electron').shell.openExternal(event.url);
});
}
\ No newline at end of file
......@@ -111,17 +111,29 @@ app.on('ready', function () {
mainWindow = new BrowserWindow({
width: 1024,
height: 640,
//frame: false,
'title-bar-style': 'hidden'
frame: process.platform == 'darwin',
'title-bar-style': process.platform == 'darwin' ? 'hidden-inset' : null,
});
// and load the index.html of the app.
//mainWindow.loadURL('http://local.mycard.moe:3000');
mainWindow.loadURL('file://' + __dirname + '/index.html#ygopro');
//debug
if (process.execPath.indexOf('electron') != -1) {
// Open the DevTools.
mainWindow.webContents.openDevTools();
mainWindow.webContents.on('dom-ready', ()=> {
mainWindow.webContents.executeJavaScript(`
var webview = document.getElementById('ygopro')
webview.src = 'http://local.mycard.moe:3000/'
webview.addEventListener("dom-ready", function () {
webview.openDevTools();
});
`)
})
}
// Open the DevTools.
mainWindow.webContents.openDevTools();
// Emitted when the window is closed.
mainWindow.on('closed', function () {
......@@ -130,6 +142,13 @@ app.on('ready', function () {
// when you should delete the corresponding element.
mainWindow = null;
});
//debug
/*<webview id="ygopro" src="http://local.mycard.moe:3000/"></webview>
var webview = document.getElementById(hash);
webview.addEventListener("dom-ready", function () {
webview.openDevTools();
});*/
});
//const ipcMain = require('electron').ipcMain;
......@@ -142,18 +161,18 @@ const ygopro = require('./apps');
});*/
/*
autoUpdater.setFeedUrl('http://localhost:4001?version=' + app.getVersion());
autoUpdater.checkForUpdates();
autoUpdater
.on('checking-for-update', function () {
console.log('Checking for update');
})
.on('update-available', function () {
console.log('Update available');
})
.on('update-not-available', function () {
console.log('Update not available');
})
.on('update-downloaded', function () {
console.log('Update downloaded');
});*/
\ No newline at end of file
autoUpdater.setFeedUrl('http://localhost:4001?version=' + app.getVersion());
autoUpdater.checkForUpdates();
autoUpdater
.on('checking-for-update', function () {
console.log('Checking for update');
})
.on('update-available', function () {
console.log('Update available');
})
.on('update-not-available', function () {
console.log('Update not available');
})
.on('update-downloaded', function () {
console.log('Update downloaded');
});*/
\ No newline at end of file
......@@ -6,23 +6,23 @@
"license": "AGPL-3.0",
"repository": "github:mycard/mycard",
"dependencies": {
"glob": "^6.0.4",
"ini": "^1.3.4",
"mkdirp": "^0.5.1",
"ws": "^1.0.1"
"glob": "latest",
"ini": "latest",
"mkdirp": "latest",
"ws": "latest"
},
"optionalDependencies": {
"windows-shortcuts": "*",
"winreg": "*",
"grunt-appdmg": "*"
"windows-shortcuts": "latest",
"winreg": "latest",
"grunt-appdmg": "latest",
"grunt-electron-installer": "latest"
},
"devDependencies": {
"electron-prebuilt": "^0.36.5",
"grunt": "^0.4.5",
"grunt-appdmg": "^0.3.2",
"grunt-contrib-clean": "^0.7.0",
"grunt-contrib-copy": "^0.8.2",
"grunt-electron": "^2.0.1",
"grunt-electron-installer": "^1.2.1"
"grunt": "latest",
"grunt-appdmg": "latest",
"grunt-contrib-clean": "latest",
"grunt-contrib-copy": "latest",
"grunt-electron": "latest",
"electron-prebuilt": "latest"
}
}
How to use this icon:
Step 1: Copy the icon to the clipboard
a) Click on this file from the Finder
b) Choose 'Get Info' from the 'File' menu.
c) In the info window that pops up, click on the icon
d) Choose 'Copy' from the 'Edit' menu.
e) Close the info window
Step 2: Paste the icon to the desired item
a) Go to the item in the Finder that you want a custom icon
b) Click the item (file, folder, disk, etc)
b) Choose 'Get Info' from the 'File' menu.
c) In the info window that pops up, click on the icon
d) Choose 'Paste' from the 'Edit' menu.
e) Close the info window
Step 3:
Enjoy your newly customized icon!
For more thorough directions, see Apple's website at:
http://www.apple.com/support/mac101/customize/6/
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment