mirror of
				https://github.com/horst3180/arc-icon-theme
				synced 2025-06-13 12:53:53 +00:00 
			
		
		
		
	Merge b2167d8a44 into 55a575386a
				
					
				
			This commit is contained in:
		
						commit
						28d3fce618
					
				
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -9,3 +9,5 @@ configure | |||||||
| install-sh | install-sh | ||||||
| missing | missing | ||||||
| *.tmp | *.tmp | ||||||
|  | *_timestamp | ||||||
|  | *.cache | ||||||
|  | |||||||
							
								
								
									
										
											BIN
										
									
								
								src/SplitJob.class
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/SplitJob.class
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										54
									
								
								src/SplitJob.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								src/SplitJob.java
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,54 @@ | |||||||
|  | 
 | ||||||
|  | import java.io.*; | ||||||
|  | 
 | ||||||
|  | import static java.lang.ProcessBuilder.Redirect; | ||||||
|  | 
 | ||||||
|  | public class SplitJob { | ||||||
|  | 
 | ||||||
|  | 	private static final BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	public static void main(String[] args) { | ||||||
|  | 
 | ||||||
|  | 		final Runtime runtime = Runtime.getRuntime(); | ||||||
|  | 		int numThreads = runtime.availableProcessors(); | ||||||
|  | 		Process[] procs = new Process[numThreads]; | ||||||
|  | 
 | ||||||
|  | 		try { | ||||||
|  | 		 | ||||||
|  | 			ProcessBuilder builder = new ProcessBuilder(args); | ||||||
|  | 			builder.redirectError(Redirect.INHERIT); | ||||||
|  | 		 | ||||||
|  | 			for (int i = 0; i < numThreads; i++) { | ||||||
|  | 				procs[i] = builder.start(); | ||||||
|  | 			} | ||||||
|  | 		 | ||||||
|  | 			for (int i = 0; ; i = (i + 1) % numThreads) { | ||||||
|  | 	 | ||||||
|  | 				String s = in.readLine(); | ||||||
|  | 
 | ||||||
|  | 				if (s == null) | ||||||
|  | 					break; | ||||||
|  | 
 | ||||||
|  | 				byte[] data = (s + '\n').getBytes(); | ||||||
|  | 				procs[i].getOutputStream().write(data, 0, data.length); | ||||||
|  | 				procs[i].getOutputStream().flush(); | ||||||
|  | 			} | ||||||
|  | 		 | ||||||
|  | 			for (Process proc : procs) { | ||||||
|  | 			 | ||||||
|  | 				proc.getOutputStream().close(); | ||||||
|  | 				int exitCode = proc.waitFor(); | ||||||
|  | 				 | ||||||
|  | 				if (exitCode != 0) { | ||||||
|  | 					System.err.printf("[Error] %s stopped with exit code: %d\n", args[0], exitCode); | ||||||
|  | 					System.exit(2); | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			 | ||||||
|  | 		} catch (Exception e) { | ||||||
|  | 			System.err.printf("[Error] %s: %s\n", e.getClass().getName(), e.getMessage()); | ||||||
|  | 			System.exit(1); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										151
									
								
								src/render_icons.sh
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										151
									
								
								src/render_icons.sh
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @ -1,7 +1,6 @@ | |||||||
| #!/bin/bash | #!/bin/bash | ||||||
| 
 | 
 | ||||||
| INKSCAPE="/usr/bin/inkscape" | INKSCAPE="/usr/bin/inkscape" | ||||||
| OPTIPNG="/usr/bin/optipng" |  | ||||||
| 
 | 
 | ||||||
| pushd `dirname $0` > /dev/null | pushd `dirname $0` > /dev/null | ||||||
| DIR="$( cd "$(dirname "$0")" ; pwd -P )" | DIR="$( cd "$(dirname "$0")" ; pwd -P )" | ||||||
| @ -9,62 +8,116 @@ popd > /dev/null | |||||||
| 
 | 
 | ||||||
| cd ${DIR} | cd ${DIR} | ||||||
| 
 | 
 | ||||||
|  | TYPES=(actions apps categories devices emblems mimetypes places status) | ||||||
|  | SIZES=(16 22 24 32 48 64 96 128) | ||||||
|  | 
 | ||||||
| THEMEDIR=../Arc | THEMEDIR=../Arc | ||||||
| 
 | 
 | ||||||
| mkdir -p $THEMEDIR | # Set up all the folders in the theme directory. | ||||||
|  | mkdir -p $THEMEDIR/{actions,apps,categories,devices,emblems,mimetypes,places,status}/{16,22,24,32,48,64,96,128}{,@2x} | ||||||
| 
 | 
 | ||||||
| for CONTEXT in actions apps categories devices emblems mimetypes places status | cp -u index.theme $THEMEDIR/index.theme | ||||||
|  | 
 | ||||||
|  | for CONTEXT in ${TYPES[@]} | ||||||
| do | do | ||||||
| 
 |     for SIZE in ${SIZES[@]} | ||||||
|     mkdir -p $THEMEDIR/$CONTEXT |  | ||||||
|     mkdir -p $THEMEDIR/$CONTEXT |  | ||||||
| 
 |  | ||||||
|     cp -r $CONTEXT/symbolic $THEMEDIR/$CONTEXT |  | ||||||
| 
 |  | ||||||
|     for SIZE in 16 22 24 32 48 64 96 128 |  | ||||||
|     do |     do | ||||||
|         $INKSCAPE -S $CONTEXT.svg | grep -E "_$SIZE" | sed 's/\,.*$//' > index.tmp |         cp -ru $CONTEXT/symlinks/* $THEMEDIR/$CONTEXT/$SIZE | ||||||
| 
 |         cp -ru $CONTEXT/symlinks/* $THEMEDIR/$CONTEXT/$SIZE@2x | ||||||
|         mkdir -p $THEMEDIR/$CONTEXT/$SIZE |         cp -ru $CONTEXT/symbolic $THEMEDIR/$CONTEXT | ||||||
|         mkdir -p $THEMEDIR/$CONTEXT/$SIZE@2x |  | ||||||
| 
 |  | ||||||
|         cp -r $CONTEXT/symlinks/* $THEMEDIR/$CONTEXT/$SIZE |  | ||||||
|         cp -r $CONTEXT/symlinks/* $THEMEDIR/$CONTEXT/$SIZE@2x |  | ||||||
| 
 |  | ||||||
|         for OBJECT_ID in `cat index.tmp` |  | ||||||
|         do |  | ||||||
| 
 |  | ||||||
|             ICON_NAME=$(sed "s/\_$SIZE.*$//" <<< $OBJECT_ID) |  | ||||||
| 
 |  | ||||||
|             if [ -f $THEMEDIR/$CONTEXT/$SIZE/$ICON_NAME.png ]; then |  | ||||||
|                 echo $THEMEDIR/$CONTEXT/$SIZE/$ICON_NAME.png exists. |  | ||||||
|             else |  | ||||||
|                 echo |  | ||||||
|                 echo Rendering $THEMEDIR/$CONTEXT/$SIZE/$ICON_NAME.png |  | ||||||
|                 $INKSCAPE --export-id=$OBJECT_ID \ |  | ||||||
|                           --export-id-only \ |  | ||||||
|                           --export-png=$THEMEDIR/$CONTEXT/$SIZE/$ICON_NAME.png $CONTEXT.svg >/dev/null \ |  | ||||||
|                 && $OPTIPNG -o7 --quiet $ASSETS_DIR/$i.png  |  | ||||||
|             fi |  | ||||||
|             if [ -f $THEMEDIR/$CONTEXT/$SIZE@2x/$ICON_NAME.png ]; then |  | ||||||
|                 echo $THEMEDIR/$CONTEXT/$SIZE@2x/$ICON_NAME.png exists. |  | ||||||
|             else |  | ||||||
|                 echo |  | ||||||
|                 echo Rendering $THEMEDIR/$CONTEXT/$SIZE@2x/$ICON_NAME.png |  | ||||||
|                 $INKSCAPE --export-id=$OBJECT_ID \ |  | ||||||
|                           --export-dpi=180 \ |  | ||||||
|                           --export-id-only \ |  | ||||||
|                           --export-png=$THEMEDIR/$CONTEXT/$SIZE@2x/$ICON_NAME.png $CONTEXT.svg >/dev/null \ |  | ||||||
|                 && $OPTIPNG -o7 --quiet $ASSETS_DIR/$i@2.png  |  | ||||||
|             fi |  | ||||||
|         done |  | ||||||
|     done |     done | ||||||
| done | done | ||||||
| 
 | 
 | ||||||
| rm index.tmp |  | ||||||
| cp index.theme $THEMEDIR/index.theme |  | ||||||
| rm -rf $THEMEDIR/actions/{32,32@2x,48,48@2x,64,64@2x,96,96@2x,128,128@2x} # derp | rm -rf $THEMEDIR/actions/{32,32@2x,48,48@2x,64,64@2x,96,96@2x,128,128@2x} # derp | ||||||
| 
 | 
 | ||||||
| # TODO | # TODO | ||||||
| cp -r animations $THEMEDIR/. | cp -ru animations $THEMEDIR/. | ||||||
| cp -r panel $THEMEDIR/. | cp -ru panel $THEMEDIR/. | ||||||
|  | 
 | ||||||
|  | # Ensure cache folder exists | ||||||
|  | mkdir .cache | ||||||
|  | 
 | ||||||
|  | # Takes in an svg-file and an object-id and formats it | ||||||
|  | # to an inkscape export shell command that inkscape can | ||||||
|  | # then execute. | ||||||
|  | formatInkscapeCmd() { | ||||||
|  | 
 | ||||||
|  |     local CONTEXT=$1 | ||||||
|  |     local OBJECT_ID=$2 | ||||||
|  |     local SIZE=$(sed -r 's/.*\_([0-9]+).*$/\1/' <<< $OBJECT_ID) | ||||||
|  | 
 | ||||||
|  |     local ICON_NAME=$(sed "s/\_$SIZE.*$//" <<< $OBJECT_ID) | ||||||
|  | 
 | ||||||
|  |         echo \ | ||||||
|  |             "--export-id=$OBJECT_ID" \ | ||||||
|  |             "--export-id-only" \ | ||||||
|  |             "--export-png=$THEMEDIR/$CONTEXT/$SIZE/$ICON_NAME.png $CONTEXT.svg" | ||||||
|  |      | ||||||
|  |         echo \ | ||||||
|  |             "--export-id=$OBJECT_ID" \ | ||||||
|  |             "--export-dpi=180" \ | ||||||
|  |             "--export-id-only" \ | ||||||
|  |             "--export-png=$THEMEDIR/$CONTEXT/$SIZE@2x/$ICON_NAME.png $CONTEXT.svg" | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Generates inkscape export commands for the given | ||||||
|  | # svg-file that can be piped to inkscape. | ||||||
|  | genInkscapeCmds() { | ||||||
|  | 
 | ||||||
|  |     local CONTEXT=$1 | ||||||
|  | 
 | ||||||
|  |     for SIZE in ${SIZES[@]} | ||||||
|  |     do | ||||||
|  |         for OBJECT_ID in `cat <($INKSCAPE -S $CONTEXT.svg | grep -E "_$SIZE" | sed 's/\,.*$//')` | ||||||
|  |         do | ||||||
|  |             echo $OBJECT_ID >> .cache/$CONTEXT.cache.tmp | ||||||
|  |             formatInkscapeCmd $CONTEXT $OBJECT_ID | ||||||
|  |         done | ||||||
|  |     done | ||||||
|  |     mv .cache/$CONTEXT.cache.tmp .cache/$CONTEXT.cache | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Generates inkscape export commands that matches | ||||||
|  | # the provided regex pattern. | ||||||
|  | genInkscapeCmdsFiltered() { | ||||||
|  |      | ||||||
|  |     local CONTEXT=$1 | ||||||
|  |     local REGEX=$2 | ||||||
|  |      | ||||||
|  |     while read -r OBJECT_ID | ||||||
|  |     do | ||||||
|  |         echo "Match: $OBJECT_ID" >&2 | ||||||
|  |         formatInkscapeCmd $CONTEXT $OBJECT_ID | ||||||
|  |     done < <(grep -E $REGEX .cache/$CONTEXT.cache) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | if [[ ! -z $1 ]] | ||||||
|  | then | ||||||
|  |     echo "Rendering objects with IDs matching regex" | ||||||
|  |     for CONTEXT in ${TYPES[@]} | ||||||
|  |     do | ||||||
|  |         if [[ -f .cache/$CONTEXT.cache ]] || { [[ ! -f .cache/$CONTEXT.cache ]] && ($INKSCAPE -S $CONTEXT.svg | grep -E "_[0-9]+" | sed 's/\,.*$//' > .cache/$CONTEXT.cache.tmp); } | ||||||
|  |         then | ||||||
|  |             mv .cache/$CONTEXT.cache.tmp .cache/$CONTEXT.cache 2> /dev/null | ||||||
|  |             genInkscapeCmdsFiltered $CONTEXT $1 | java SplitJob $INKSCAPE --shell | ||||||
|  |         else | ||||||
|  |             echo "Failed creating creating object-ID cache for $CONTEXT.svg" | ||||||
|  |         fi | ||||||
|  |     done | ||||||
|  | else | ||||||
|  |     for CONTEXT in ${TYPES[@]} | ||||||
|  |     do | ||||||
|  |         # Only render out the icons if the svg-file has been modified | ||||||
|  |         # since we finished rendering it out last. | ||||||
|  |         if [[ $CONTEXT.svg -nt .cache/${CONTEXT}_timestamp ]] | ||||||
|  |         then | ||||||
|  |             echo "Rendering icons from $CONTEXT.svg" | ||||||
|  |             genInkscapeCmds $CONTEXT | java SplitJob $INKSCAPE --shell && touch .cache/${CONTEXT}_timestamp | ||||||
|  |         else | ||||||
|  |             echo "No changes to $CONTEXT.svg, skipping..." | ||||||
|  |         fi | ||||||
|  |     done | ||||||
|  | fi | ||||||
|  |      | ||||||
|  | # Remove all empty directories from the theme folder. | ||||||
|  | find $THEMEDIR -type d -empty -delete | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user