summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Bosveld <joel@JOEL-UBUNTU.(none)>2007-11-05 08:58:21 +0900
committerJoel Bosveld <joel@JOEL-UBUNTU.(none)>2007-11-05 08:58:21 +0900
commit4584bd206f4f9471c04d7b409fc8c8ab76bd12f7 (patch)
tree58c057eecdb1c8fee847de6a1425cbdddd9a138b
parent2afe36f9967df5fec7d1b0600964af1c74e7537a (diff)
downloadphotowheel-4584bd206f4f9471c04d7b409fc8c8ab76bd12f7.tar.gz
photowheel-4584bd206f4f9471c04d7b409fc8c8ab76bd12f7.tar.bz2
Added the code for plugin
-rw-r--r--Makefile463
-rw-r--r--photo.c591
-rw-r--r--photo.xml.in102
-rw-r--r--plugin.info2
4 files changed, 1158 insertions, 0 deletions
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..e1835ab
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,463 @@
+##
+#
+# Compiz plugin Makefile
+#
+# Copyright : (C) 2007 by Dennis Kasprzyk
+# E-mail : onestone@deltatauchi.de
+#
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+##
+
+# plugin.info file contents
+#
+# PLUGIN = foo
+# PKG_DEP = pango
+# LDFLAGS_ADD = -lGLU
+# CFLAGS_ADD = -I/usr/include/foo
+#
+
+#load config file
+include plugin.info
+
+
+ifeq ($(BUILD_GLOBAL),true)
+ PREFIX = $(shell pkg-config --variable=prefix compiz)
+ CLIBDIR = $(shell pkg-config --variable=libdir compiz)
+ CINCDIR = $(shell pkg-config --variable=includedir compiz)
+ PKGDIR = $(CLIBDIR)/pkgconfig
+ DESTDIR = $(shell pkg-config --variable=libdir compiz)/compiz
+ XMLDIR = $(shell pkg-config --variable=prefix compiz)/share/compiz
+ IMAGEDIR = $(shell pkg-config --variable=prefix compiz)/share/compiz
+ DATADIR = $(shell pkg-config --variable=prefix compiz)/share/compiz
+else
+ DESTDIR = $(HOME)/.compiz/plugins
+ XMLDIR = $(HOME)/.compiz/metadata
+ IMAGEDIR = $(HOME)/.compiz/images
+ DATADIR = $(HOME)/.compiz/data
+endif
+
+BUILDDIR = build
+
+ECHO = `which echo`
+
+CC = gcc
+CPP = g++
+LIBTOOL = libtool
+INSTALL = install
+
+BCOP = `pkg-config --variable=bin bcop`
+
+CFLAGS = -g -Wall -Wpointer-arith -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wnested-externs -fno-strict-aliasing `pkg-config --cflags $(PKG_DEP) compiz ` $(CFLAGS_ADD)
+LDFLAGS = `pkg-config --libs $(PKG_DEP) compiz ` $(LDFLAGS_ADD)
+
+DEFINES = -DIMAGEDIR=$(IMAGEDIR) -DDATADIR=$(DATADIR)
+
+POFILEDIR = $(shell if [ -n "$(PODIR)" ]; then $(ECHO) $(PODIR); else $(ECHO) ./po;fi )
+
+is-bcop-target := $(shell if [ -e $(PLUGIN).xml.in ]; then cat $(PLUGIN).xml.in | grep "useBcop=\"true\""; \
+ else if [ -e $(PLUGIN).xml ]; then cat $(PLUGIN).xml | grep "useBcop=\"true\""; fi; fi)
+
+trans-target := $(shell if [ -e $(PLUGIN).xml.in -o -e $(PLUGIN).xml ]; then $(ECHO) $(BUILDDIR)/$(PLUGIN).xml;fi )
+
+bcop-target := $(shell if [ -n "$(is-bcop-target)" ]; then $(ECHO) $(BUILDDIR)/$(PLUGIN).xml; fi )
+bcop-target-src := $(shell if [ -n "$(is-bcop-target)" ]; then $(ECHO) $(BUILDDIR)/$(PLUGIN)_options.c; fi )
+bcop-target-hdr := $(shell if [ -n "$(is-bcop-target)" ]; then $(ECHO) $(BUILDDIR)/$(PLUGIN)_options.h; fi )
+
+gen-schemas := $(shell if [ -e $(PLUGIN).xml.in -o -e $(PLUGIN).xml -a -n "`pkg-config --variable=xsltdir compiz-gconf`" ]; then $(ECHO) true; fi )
+schema-target := $(shell if [ -n "$(gen-schemas)" ]; then $(ECHO) $(BUILDDIR)/$(PLUGIN).xml; fi )
+schema-output := $(shell if [ -n "$(gen-schemas)" ]; then $(ECHO) $(BUILDDIR)/compiz-$(PLUGIN).schema; fi )
+
+ifeq ($(BUILD_GLOBAL),true)
+ pkg-target := $(shell if [ -e compiz-$(PLUGIN).pc.in -a -n "$(PREFIX)" -a -d "$(PREFIX)" ]; then $(ECHO) "$(BUILDDIR)/compiz-$(PLUGIN).pc"; fi )
+ hdr-install-target := $(shell if [ -e compiz-$(PLUGIN).pc.in -a -n "$(PREFIX)" -a -d "$(PREFIX)" -a -e $(PLUGIN).h ]; then $(ECHO) "$(PLUGIN).h"; fi )
+endif
+
+# find all the object files
+
+c-objs := $(patsubst %.c,%.lo,$(shell find -name '*.c' 2> /dev/null | grep -v "$(BUILDDIR)/" | sed -e 's/^.\///'))
+c-objs += $(patsubst %.cpp,%.lo,$(shell find -name '*.cpp' 2> /dev/null | grep -v "$(BUILDDIR)/" | sed -e 's/^.\///'))
+c-objs += $(patsubst %.cxx,%.lo,$(shell find -name '*.cxx' 2> /dev/null | grep -v "$(BUILDDIR)/" | sed -e 's/^.\///'))
+c-objs := $(filter-out $(bcop-target-src:.c=.lo),$(c-objs))
+
+h-files := $(shell find -name '*.h' 2> /dev/null | grep -v "$(BUILDDIR)/" | sed -e 's/^.\///')
+h-files += $(bcop-target-hdr)
+h-files += $(shell pkg-config --variable=includedir compiz)/compiz/compiz.h
+
+all-c-objs := $(addprefix $(BUILDDIR)/,$(c-objs))
+all-c-objs += $(bcop-target-src:.c=.lo)
+
+# additional files
+
+data-files := $(shell find data/ -name '*' -type f 2> /dev/null | sed -e 's/data\///')
+image-files := $(shell find images/ -name '*' -type f 2> /dev/null | sed -e 's/images\///')
+
+# system include path parameter, -isystem doesn't work on old gcc's
+inc-path-param = $(shell if [ -z "`gcc --version | head -n 1 | grep ' 3'`" ]; then $(ECHO) "-isystem"; else $(ECHO) "-I"; fi)
+
+# default color settings
+color := $(shell if [ $$TERM = "dumb" ]; then $(ECHO) "no"; else $(ECHO) "yes"; fi)
+
+#
+# Do it.
+#
+
+.PHONY: $(BUILDDIR) build-dir trans-target bcop-build pkg-creation schema-creation c-build-objs c-link-plugin
+
+all: $(BUILDDIR) build-dir trans-target bcop-build pkg-creation schema-creation c-build-objs c-link-plugin
+
+trans-build: $(trans-target)
+
+bcop-build: $(bcop-target-hdr) $(bcop-target-src)
+
+schema-creation: $(schema-output)
+
+c-build-objs: $(all-c-objs)
+
+c-link-plugin: $(BUILDDIR)/lib$(PLUGIN).la
+
+pkg-creation: $(pkg-target)
+
+#
+# Create build directory
+#
+
+$(BUILDDIR) :
+ @mkdir -p $(BUILDDIR)
+
+$(DESTDIR) :
+ @mkdir -p $(DESTDIR)
+
+#
+# fallback if xml.in doesn't exists
+#
+$(BUILDDIR)/%.xml: %.xml
+ @cp $< $@
+
+#
+# Translating
+#
+$(BUILDDIR)/%.xml: %.xml.in
+ @if [ -d $(POFILEDIR) ]; then \
+ if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -e -n "\033[0;1;5mtranslate \033[0m: \033[0;32m$< \033[0m-> \033[0;31m$@\033[0m"; \
+ else \
+ $(ECHO) "translate $< -> $@"; \
+ fi; \
+ intltool-merge -x -u $(POFILEDIR) $< $@ > /dev/null; \
+ if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -e "\r\033[0mtranslate : \033[34m$< -> $@\033[0m"; \
+ fi; \
+ else \
+ if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -e -n "\033[0;1;5mconvert \033[0m: \033[0;32m$< \033[0m-> \033[0;31m$@\033[0m"; \
+ else \
+ $(ECHO) "convert $< -> $@"; \
+ fi; \
+ cat $< | sed -e 's;<_;<;g' -e 's;</_;</;g' > $@; \
+ if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -e "\r\033[0mconvert : \033[34m$< -> $@\033[0m"; \
+ fi; \
+ fi
+
+#
+# BCOP'ing
+
+$(BUILDDIR)/%_options.h: $(BUILDDIR)/%.xml
+ @if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -e -n "\033[0;1;5mbcop'ing \033[0m: \033[0;32m$< \033[0m-> \033[0;31m$@\033[0m"; \
+ else \
+ $(ECHO) "bcop'ing $< -> $@"; \
+ fi
+ @$(BCOP) --header=$@ $<
+ @if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -e "\r\033[0mbcop'ing : \033[34m$< -> $@\033[0m"; \
+ fi
+
+$(BUILDDIR)/%_options.c: $(BUILDDIR)/%.xml
+ @if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -e -n "\033[0;1;5mbcop'ing \033[0m: \033[0;32m$< \033[0m-> \033[0;31m$@\033[0m"; \
+ else \
+ $(ECHO) "bcop'ing $< -> $@"; \
+ fi
+ @$(BCOP) --source=$@ $<
+ @if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -e "\r\033[0mbcop'ing : \033[34m$< -> $@\033[0m"; \
+ fi
+
+#
+# Schema generation
+
+$(BUILDDIR)/compiz-%.schema: $(BUILDDIR)/%.xml
+ @if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -e -n "\033[0;1;5mschema'ing\033[0m: \033[0;32m$< \033[0m-> \033[0;31m$@\033[0m"; \
+ else \
+ $(ECHO) "schema'ing $< -> $@"; \
+ fi
+ @xsltproc `pkg-config --variable=xsltdir compiz-gconf`/schemas.xslt $< > $@
+ @if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -e "\r\033[0mschema : \033[34m$< -> $@\033[0m"; \
+ fi
+
+#
+# pkg config file generation
+
+$(BUILDDIR)/compiz-%.pc: compiz-%.pc.in
+ @if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -e -n "\033[0;1;5mpkgconfig \033[0m: \033[0;32m$< \033[0m-> \033[0;31m$@\033[0m"; \
+ else \
+ $(ECHO) "pkgconfig $< -> $@"; \
+ fi
+ @COMPIZREQUIRES=`cat $(PKGDIR)/compiz.pc | grep Requires | sed -e 's;Requires: ;;g'`; \
+ COMPIZCFLAGS=`cat $(PKGDIR)/compiz.pc | grep Cflags | sed -e 's;Cflags: ;;g'`; \
+ sed -e 's;@prefix@;$(PREFIX);g' -e 's;\@libdir@;$(CLIBDIR);g' \
+ -e 's;@includedir@;$(CINCDIR);g' -e 's;\@VERSION@;0.0.1;g' \
+ -e "s;@COMPIZ_REQUIRES@;$$COMPIZREQUIRES;g" \
+ -e "s;@COMPIZ_CFLAGS@;$$COMPIZCFLAGS;g" $< > $@;
+ @if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -e "\r\033[0mpkgconfig : \033[34m$< -> $@\033[0m"; \
+ fi
+
+#
+# Compiling
+#
+
+$(BUILDDIR)/%.lo: %.c $(h-files)
+ @if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -n -e "\033[0;1;5mcompiling \033[0m: \033[0;32m$< \033[0m-> \033[0;31m$@\033[0m"; \
+ else \
+ $(ECHO) "compiling $< -> $@"; \
+ fi
+ @$(LIBTOOL) --quiet --mode=compile $(CC) $(CFLAGS) $(DEFINES) -I$(BUILDDIR) -c -o $@ $<
+ @if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -e "\r\033[0mcompiling : \033[34m$< -> $@\033[0m"; \
+ fi
+
+$(BUILDDIR)/%.lo: $(BUILDDIR)/%.c $(h-files)
+ @if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -n -e "\033[0;1;5mcompiling \033[0m: \033[0;32m$< \033[0m-> \033[0;31m$@\033[0m"; \
+ else \
+ $(ECHO) "compiling $< -> $@"; \
+ fi
+ @$(LIBTOOL) --quiet --mode=compile $(CC) $(CFLAGS) $(DEFINES) -I$(BUILDDIR) -c -o $@ $<
+ @if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -e "\r\033[0mcompiling : \033[34m$< -> $@\033[0m"; \
+ fi
+
+$(BUILDDIR)/%.lo: %.cpp $(h-files)
+ @if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -n -e "\033[0;1;5mcompiling \033[0m: \033[0;32m$< \033[0m-> \033[0;31m$@\033[0m"; \
+ else \
+ $(ECHO) "compiling $< -> $@"; \
+ fi
+ @$(LIBTOOL) --quiet --mode=compile $(CPP) $(CFLAGS) $(DEFINES) -I$(BUILDDIR) -c -o $@ $<
+ @if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -e "\r\033[0mcompiling : \033[34m$< -> $@\033[0m"; \
+ fi
+
+$(BUILDDIR)/%.lo: %.cxx $(h-files)
+ @if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -n -e "\033[0;1;5mcompiling \033[0m: \033[0;32m$< \033[0m-> \033[0;31m$@\033[0m"; \
+ else \
+ $(ECHO) "compiling $< -> $@"; \
+ fi
+ @$(LIBTOOL) --quiet --mode=compile $(CPP) $(CFLAGS) $(DEFINES) -I$(BUILDDIR) -c -o $@ $<
+ @if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -e "\r\033[0mcompiling : \033[34m$< -> $@\033[0m"; \
+ fi
+
+#
+# Linking
+#
+
+cxx-rpath-prefix := -Wl,-rpath,
+
+$(BUILDDIR)/lib$(PLUGIN).la: $(all-c-objs)
+ @if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -e -n "\033[0;1;5mlinking \033[0m: \033[0;31m$@\033[0m"; \
+ else \
+ $(ECHO) "linking : $@"; \
+ fi
+ @$(LIBTOOL) --quiet --mode=link $(CC) $(LDFLAGS) -rpath $(DESTDIR) -o $@ $(all-c-objs)
+ @if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -e "\r\033[0mlinking : \033[34m$@\033[0m"; \
+ fi
+
+
+clean:
+ @if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -e -n "\033[0;1;5mremoving \033[0m: \033[0;31m./$(BUILDDIR)\033[0m"; \
+ else \
+ $(ECHO) "removing : ./$(BUILDDIR)"; \
+ fi
+ @rm -rf $(BUILDDIR)
+ @if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -e "\r\033[0mremoving : \033[34m./$(BUILDDIR)\033[0m"; \
+ fi
+
+
+install: $(DESTDIR) all
+ @if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -n -e "\033[0;1;5minstall \033[0m: \033[0;31m$(DESTDIR)/lib$(PLUGIN).so\033[0m"; \
+ else \
+ $(ECHO) "install : $(DESTDIR)/lib$(PLUGIN).so"; \
+ fi
+ @mkdir -p $(DESTDIR)
+ @$(INSTALL) $(BUILDDIR)/.libs/lib$(PLUGIN).so $(DESTDIR)/lib$(PLUGIN).so
+ @if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -e "\r\033[0minstall : \033[34m$(DESTDIR)/lib$(PLUGIN).so\033[0m"; \
+ fi
+ @if [ -e $(BUILDDIR)/$(PLUGIN).xml ]; then \
+ if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -n -e "\033[0;1;5minstall \033[0m: \033[0;31m$(XMLDIR)/$(PLUGIN).xml\033[0m"; \
+ else \
+ $(ECHO) "install : $(XMLDIR)/$(PLUGIN).xml"; \
+ fi; \
+ mkdir -p $(XMLDIR); \
+ cp $(BUILDDIR)/$(PLUGIN).xml $(XMLDIR)/$(PLUGIN).xml; \
+ if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -e "\r\033[0minstall : \033[34m$(XMLDIR)/$(PLUGIN).xml\033[0m"; \
+ fi; \
+ fi
+ @if [ -n "$(hdr-install-target)" ]; then \
+ if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -n -e "\033[0;1;5minstall \033[0m: \033[0;31m$(CINCDIR)/compiz/$(hdr-install-target)\033[0m"; \
+ else \
+ $(ECHO) "install : $(CINCDIR)/compiz/$(hdr-install-target)"; \
+ fi; \
+ cp $(hdr-install-target) $(CINCDIR)/compiz/$(hdr-install-target); \
+ if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -e "\r\033[0minstall : \033[34m$(CINCDIR)/compiz/$(hdr-install-target)\033[0m"; \
+ fi; \
+ fi
+ @if [ -n "$(pkg-target)" ]; then \
+ if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -n -e "\033[0;1;5minstall \033[0m: \033[0;31m$(PKGDIR)/compiz-$(PLUGIN).pc\033[0m"; \
+ else \
+ $(ECHO) "install : $(PKGDIR)/compiz-$(PLUGIN).pc"; \
+ fi; \
+ cp $(pkg-target) $(PKGDIR)/compiz-$(PLUGIN).pc; \
+ if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -e "\r\033[0minstall : \033[34m$(PKGDIR)/compiz-$(PLUGIN).pc\033[0m"; \
+ fi; \
+ fi
+ @if [ -n "$(schema-output)" -a -e "$(schema-output)" ]; then \
+ if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -n -e "\033[0;1;5minstall \033[0m: \033[0;31m$(schema-output)\033[0m"; \
+ else \
+ $(ECHO) "install : $(schema-output)"; \
+ fi; \
+ gconftool-2 --install-schema-file=$(schema-output) > /dev/null; \
+ if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -e "\r\033[0minstall : \033[34m$(schema-output)\033[0m"; \
+ fi; \
+ fi
+ @if [ -n "$(data-files)" ]; then \
+ mkdir -p $(DATADIR); \
+ for FILE in $(data-files); do \
+ if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -n -e "\033[0;1;5minstall \033[0m: \033[0;31m$(DATADIR)/$$FILE\033[0m"; \
+ else \
+ $(ECHO) "install : $(DATADIR)/$$FILE"; \
+ fi; \
+ cp data/$$FILE $(DATADIR)/$$FILE; \
+ if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -e "\r\033[0minstall : \033[34m$(DATADIR)/$$FILE\033[0m"; \
+ fi; \
+ done \
+ fi
+ @if [ -n "$(image-files)" ]; then \
+ mkdir -p $(IMAGEDIR); \
+ for FILE in $(image-files); do \
+ if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -n -e "\033[0;1;5minstall \033[0m: \033[0;31m$(IMAGEDIR)/$$FILE\033[0m"; \
+ else \
+ $(ECHO) "install : $(IMAGEDIR)/$$FILE"; \
+ fi; \
+ cp images/$$FILE $(IMAGEDIR)/$$FILE; \
+ if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -e "\r\033[0minstall : \033[34m$(IMAGEDIR)/$$FILE\033[0m"; \
+ fi; \
+ done \
+ fi
+
+uninstall:
+ @if [ -e $(DESTDIR)/lib$(PLUGIN).so ]; then \
+ if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -n -e "\033[0;1;5muninstall \033[0m: \033[0;31m$(DESTDIR)/lib$(PLUGIN).so\033[0m"; \
+ else \
+ $(ECHO) "uninstall : $(DESTDIR)/lib$(PLUGIN).so"; \
+ fi; \
+ rm -f $(DESTDIR)/lib$(PLUGIN).so; \
+ if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -e "\r\033[0muninstall : \033[34m$(DESTDIR)/lib$(PLUGIN).so\033[0m"; \
+ fi; \
+ fi
+ @if [ -e $(XMLDIR)/$(PLUGIN).xml ]; then \
+ if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -n -e "\033[0;1;5muninstall \033[0m: \033[0;31m$(XMLDIR)/$(PLUGIN).xml\033[0m"; \
+ else \
+ $(ECHO) "uninstall : $(XMLDIR)/$(PLUGIN).xml"; \
+ fi; \
+ rm -f $(XMLDIR)/$(PLUGIN).xml; \
+ if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -e "\r\033[0muninstall : \033[34m$(XMLDIR)/$(PLUGIN).xml\033[0m"; \
+ fi; \
+ fi
+ @if [ -n "$(hdr-install-target)" -a -e $(CINCDIR)/compiz/$(hdr-install-target) ]; then \
+ if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -n -e "\033[0;1;5muninstall \033[0m: \033[0;31m$(CINCDIR)/compiz/$(hdr-install-target)\033[0m"; \
+ else \
+ $(ECHO) "uninstall : $(CINCDIR)/compiz/$(hdr-install-target)"; \
+ fi; \
+ rm -f $(CINCDIR)/compiz/$(hdr-install-target); \
+ if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -e "\r\033[0muninstall : \033[34m$(CINCDIR)/compiz/$(hdr-install-target)\033[0m"; \
+ fi; \
+ fi
+ @if [ -n "$(pkg-target)" -a -e $(PKGDIR)/compiz-$(PLUGIN).pc ]; then \
+ if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -n -e "\033[0;1;5muninstall \033[0m: \033[0;31m$(PKGDIR)/compiz-$(PLUGIN).pc\033[0m"; \
+ else \
+ $(ECHO) "uninstall : $(PKGDIR)/compiz-$(PLUGIN).pc"; \
+ fi; \
+ rm -f $(PKGDIR)/compiz-$(PLUGIN).pc; \
+ if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -e "\r\033[0muninstall : \033[34m$(PKGDIR)/compiz-$(PLUGIN).pc\033[0m"; \
+ fi; \
+ fi
+ @if [ -n "$(data-files)" ]; then \
+ for FILE in $(data-files); do \
+ if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -n -e "\033[0;1;5muninstall \033[0m: \033[0;31m$(DATADIR)/$$FILE\033[0m"; \
+ else \
+ $(ECHO) "uninstall : $(DATADIR)/$$FILE"; \
+ fi; \
+ rm -f $(DATADIR)/$$FILE; \
+ if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -e "\r\033[0muninstall : \033[34m$(DATADIR)/$$FILE\033[0m"; \
+ fi; \
+ done \
+ fi
+ @if [ -n "$(image-files)" ]; then \
+ for FILE in $(image-files); do \
+ if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -n -e "\033[0;1;5muninstall \033[0m: \033[0;31m$(IMAGEDIR)/$$FILE\033[0m"; \
+ else \
+ $(ECHO) "uninstall : $(IMAGEDIR)/$$FILE"; \
+ fi; \
+ rm -f $(IMAGEDIR)/$$FILE; \
+ if [ '$(color)' != 'no' ]; then \
+ $(ECHO) -e "\r\033[0muninstall : \033[34m$(IMAGEDIR)/$$FILE\033[0m"; \
+ fi; \
+ done \
+ fi
diff --git a/photo.c b/photo.c
new file mode 100644
index 0000000..1b6e4e9
--- /dev/null
+++ b/photo.c
@@ -0,0 +1,591 @@
+/******************************
+Copyright stuff goes here =)
+...
+Based on Gears (see below)
+Joel Bosveld (Joel.Bosveld@gmail.com)
+******************************/
+
+/*
+ * Compiz cube gears plugin
+ *
+ * gears.c
+ *
+ * This is an example plugin to show how to render something inside
+ * of the transparent cube
+ *
+ * Copyright : (C) 2007 by Dennis Kasprzyk
+ * E-mail : onestone@opencompositing.org
+ *
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * Based on glxgears.c:
+ * http://cvsweb.xfree86.org/cvsweb/xc/programs/glxgears/glxgears.c
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <signal.h>
+#include <unistd.h>
+#include <math.h>
+
+#include <compiz-core.h>
+#include <compiz-cube.h>
+
+#include "photo_options.h"
+
+#define PI 3.14159
+
+static int displayPrivateIndex;
+
+static int cubeDisplayPrivateIndex;
+
+typedef struct _PhotoTexture
+{
+ CompTexture tex;
+
+ unsigned height;
+ unsigned width;
+
+ GLuint dList;
+}
+PhotoTexture;
+
+typedef struct _PhotoDisplay
+{
+ int screenPrivateIndex;
+
+}
+PhotoDisplay;
+
+typedef struct _PhotoScreen
+{
+ DonePaintScreenProc donePaintScreen;
+ PreparePaintScreenProc preparePaintScreen;
+
+ CubeClearTargetOutputProc clearTargetOutput;
+ CubePaintInsideProc paintInside;
+
+ Bool damage;
+
+ Bool firsttime;
+
+ Bool transformOrder;
+
+ Bool enablecull;
+
+ PhotoTexture *photoTexture;
+ int n; /* how many sides on prism */
+ GLfloat l; /* how big is the prism */
+ GLfloat h; /* how high is the prism */
+ float rspeed; /* speed of rotation */
+
+ float xpos;
+ float ypos;
+ float zpos;
+
+ GLuint dList; /* caps */
+
+ CompListValue *photoTexFiles;
+
+ float angle;
+
+}
+PhotoScreen;
+
+#define GET_PHOTO_DISPLAY(d) \
+ ((PhotoDisplay *) (d)->base.privates[displayPrivateIndex].ptr)
+#define PHOTO_DISPLAY(d) \
+ PhotoDisplay *gd = GET_PHOTO_DISPLAY(d); /* Macros to get the gd pointer to PhotoDisplay struct */
+
+#define GET_PHOTO_SCREEN(s, gd) \
+ ((PhotoScreen *) (s)->base.privates[(gd)->screenPrivateIndex].ptr)
+#define PHOTO_SCREEN(s) \
+ PhotoScreen *gs = GET_PHOTO_SCREEN(s, GET_PHOTO_DISPLAY(s->display)) /* Macros to get the gs pointer to PhotoScreen struct */
+
+
+static void
+photoParamChange (CompScreen *s,
+ CompOption *opt,
+ PhotoScreenOptions num)
+ {
+ PHOTO_SCREEN (s);
+
+ gs->h= photoGetHeight (s);
+ gs->l= photoGetWidth (s);
+ gs->rspeed = photoGetSpeed (s);
+ gs->xpos = photoGetXpos (s);
+ gs->ypos = photoGetYpos (s);
+ gs->zpos = photoGetZpos (s);
+ gs->transformOrder = photoGetOrder (s);
+ gs->enablecull = photoGetCull (s);
+ }
+
+
+static void
+photoCapChange (CompScreen *s,
+ CompOption *opt,
+ PhotoScreenOptions num)
+
+ {
+
+ PHOTO_SCREEN (s);
+ int i;
+ unsigned short *top;
+ unsigned short *bot;
+
+ top = photoGetTopColour (s);
+ bot = photoGetBottomColour (s);
+
+
+ if(!(gs->firsttime))
+ {
+ glDeleteLists (gs->dList, 1);
+ }
+
+ gs->dList = glGenLists (1);
+ glNewList (gs->dList, GL_COMPILE);
+ glBegin(GL_POLYGON);
+
+ glColor4us(top[0],top[1],bot[2],bot[3]);
+
+ for(i=gs->n-1;i>-1;i--)
+ {
+ glVertex3f( cos(i*2*PI/(gs->n)), 1, sin(i*2*PI/(gs->n)) );
+ }
+
+ glEnd();
+
+ glBegin(GL_POLYGON);
+
+ glColor4us(bot[0],bot[1],bot[2],bot[3]);
+
+ for(i=0;i<(gs->n);i++)
+ {
+ glVertex3f( cos(i*2*PI/(gs->n)), -1, sin(i*2*PI/(gs->n)) );
+ }
+
+ glEnd();
+ glEndList();
+ }
+
+static void
+photoTextureChange (CompScreen *s,
+ CompOption *opt,
+ PhotoScreenOptions num)
+ {
+ PHOTO_SCREEN (s);
+
+ int i;
+ int i2;
+
+ if(!(gs->firsttime))
+ {
+ for(i=0;i<(gs->n);i++)
+ {
+ finiTexture (s, &gs->photoTexture[i].tex);
+ glDeleteLists (gs->photoTexture[i].dList, 1);
+ }
+
+ glDeleteLists (gs->dList, 1);
+ }
+
+ CompMatrix *mat;
+
+
+ gs->photoTexFiles = photoGetPhotoTextures (s);
+ gs->n=gs->photoTexFiles->nValue; /*these two lines are the problem */
+
+ gs->photoTexture=malloc(sizeof (PhotoTexture) * gs-> n);
+
+ for(i=0;i<(gs->n);i++)
+ {
+ readImageToTexture (s, &(gs->photoTexture[i]).tex, /*texture pointer*/
+ gs->photoTexFiles->value[i].s, /*file*/
+ &(gs->photoTexture[i]).width, /*pointer for width*/
+ &(gs->photoTexture[i]).height); /*pointer for height*/
+
+ mat = &gs->photoTexture[i].tex.matrix;
+ gs->photoTexture[i].dList = glGenLists (1);
+
+ i2=i+1;
+ if((i2==gs->n))i2=0;
+
+ glNewList (gs->photoTexture[i].dList, GL_COMPILE);
+ glBegin(GL_QUADS);
+
+ glTexCoord2f (COMP_TEX_COORD_X (mat, (gs->photoTexture[i]).width),
+ COMP_TEX_COORD_Y (mat, 0));
+ glVertex3f( cos(i*2*PI/(gs->n)), 1.0f, sin(i*2*PI/(gs->n)) ); // Top Left Of The Texture and Quad
+
+ glTexCoord2f (COMP_TEX_COORD_X (mat, 0),
+ COMP_TEX_COORD_Y (mat, 0));
+ glVertex3f( cos(i2*2*PI/(gs->n)), 1.0f, sin(i2*2*PI/(gs->n)) ); // Top Right Of The Texture and Quad
+
+ glTexCoord2f (COMP_TEX_COORD_X (mat, 0),
+ COMP_TEX_COORD_Y (mat, (gs->photoTexture[i]).height));
+ glVertex3f( cos(i2*2*PI/(gs->n)), -1.0f, sin(i2*2*PI/(gs->n)) ); // Bot Right Of The Texture and Quad
+
+ glTexCoord2f (COMP_TEX_COORD_X (mat, (gs->photoTexture[i]).width),
+ COMP_TEX_COORD_Y (mat, (gs->photoTexture[i]).height));
+ glVertex3f( cos(i*2*PI/(gs->n)), -1.0f, sin(i*2*PI/(gs->n)) ); // Bot Left Of The Texture and Quad
+
+ glEnd();
+ glEndList ();
+ }
+
+
+ }
+
+static void
+photoClearTargetOutput (CompScreen *s, /* Doesn't do anything except glClear(GL_DEPTH_BUFFER_BIT)? - cube must change it? */
+ float xRotate,
+ float vRotate)
+{
+ PHOTO_SCREEN (s);
+ CUBE_SCREEN (s);
+
+ UNWRAP (gs, cs, clearTargetOutput);
+ (*cs->clearTargetOutput) (s, xRotate, vRotate);
+ WRAP (gs, cs, clearTargetOutput, photoClearTargetOutput);
+
+ glClear (GL_DEPTH_BUFFER_BIT);
+}
+
+static void /* draws the photo, then calls the cube function */
+photoPaintInside (CompScreen *s,
+ const ScreenPaintAttrib *sAttrib,
+ const CompTransform *transform,
+ CompOutput *output,
+ int size)
+{
+ PHOTO_SCREEN (s);
+ CUBE_SCREEN (s);
+
+ int i;
+ Bool enabled;
+
+ ScreenPaintAttrib sA = *sAttrib;
+
+ sA.yRotate += (360.0f / size) * (cs->xRotations - (s->x * cs->nOutput)); /*?*/
+
+ CompTransform mT = *transform;
+
+ (*s->applyScreenTransform) (s, &sA, output, &mT);
+
+ glPushMatrix();
+ glLoadMatrixf (mT.m);
+ glTranslatef (cs->outputXOffset, -cs->outputYOffset, 0.0f); /* OpenGL stuff to set correct transformation due to cube rotation? */
+ glScalef (cs->outputXScale, cs->outputYScale, 1.0f);
+
+ glPushAttrib (GL_COLOR_BUFFER_BIT | GL_TEXTURE_BIT);
+
+ glEnable (GL_BLEND);
+
+
+ enabled = glIsEnabled (GL_CULL_FACE);
+
+ if(gs->enablecull)glEnable(GL_CULL_FACE);
+ else glDisable(GL_CULL_FACE);
+
+
+ glPushMatrix();
+
+ glDisable (GL_LIGHTING);
+ glDisable (GL_COLOR_MATERIAL);
+ glEnable (GL_DEPTH_TEST);
+
+
+/******************************/
+
+ glScalef (0.25f, 0.25f, 0.25f);
+
+ if(gs->transformOrder)glTranslatef(gs->xpos,gs->ypos,gs->zpos);
+
+ glRotatef((gs->angle),0.0f,1.0f,0.0f);
+
+ if(!(gs->transformOrder))glTranslatef(gs->xpos,gs->ypos,gs->zpos);
+
+ (gs->angle)+=(gs->rspeed);
+ if((gs->angle>=360.0f)) (gs->angle)=0.0f;
+
+
+ glScalef (gs->l, gs->h, gs->l);
+
+ for(i=0; i<(gs->n);i++)
+ {
+ glEnable (gs->photoTexture[i].tex.target);
+
+ enableTexture (s, &(gs->photoTexture[i].tex),
+ COMP_TEXTURE_FILTER_GOOD);
+ glCallList (gs->photoTexture[i].dList);
+
+ disableTexture (s, &(gs->photoTexture[i].tex));
+ }
+
+ glCallList(gs->dList);
+
+
+
+/****************************************/
+
+ glPopMatrix();
+
+ glEnable (GL_COLOR_MATERIAL);
+
+ if (s->lighting)
+ glEnable (GL_LIGHTING);
+
+ glDisable (GL_DEPTH_TEST);
+ glDisable (GL_BLEND);
+
+ if (enabled) glEnable (GL_CULL_FACE);
+ else glDisable (GL_CULL_FACE); /* resets settings to original */
+
+ glPopMatrix();
+ glPopAttrib();
+
+ gs->damage = TRUE;
+
+ UNWRAP (gs, cs, paintInside);
+ (*cs->paintInside) (s, sAttrib, transform, output, size);
+ WRAP (gs, cs, paintInside, photoPaintInside);
+}
+
+static void /* Rotates the various photo ... */
+photoPreparePaintScreen (CompScreen *s,
+ int ms)
+{
+ PHOTO_SCREEN (s);
+
+
+
+ UNWRAP (gs, s, preparePaintScreen);
+ (*s->preparePaintScreen) (s, ms);
+ WRAP (gs, s, preparePaintScreen, photoPreparePaintScreen);
+}
+
+static void /* Calls damageScreen ? */
+photoDonePaintScreen (CompScreen * s)
+{
+ PHOTO_SCREEN (s);
+
+ if (gs->damage)
+ {
+ damageScreen (s);
+ gs->damage = FALSE;
+ }
+
+ UNWRAP (gs, s, donePaintScreen);
+ (*s->donePaintScreen) (s);
+ WRAP (gs, s, donePaintScreen, photoDonePaintScreen);
+}
+
+/* Inits display */
+
+static Bool
+photoInitDisplay (CompPlugin *p,
+ CompDisplay *d)
+{
+ PhotoDisplay *gd;
+
+ if (!checkPluginABI ("core", CORE_ABIVERSION) ||
+ !checkPluginABI ("cube", CUBE_ABIVERSION))
+ return FALSE;
+
+ if (!getPluginDisplayIndex (d, "cube", &cubeDisplayPrivateIndex))
+ return FALSE;
+
+ gd = malloc (sizeof (PhotoDisplay)); /* creates data struct - remainder is error checking */
+
+ if (!gd)
+ return FALSE;
+
+ gd->screenPrivateIndex = allocateScreenPrivateIndex (d);
+
+ if (gd->screenPrivateIndex < 0)
+ {
+ free (gd);
+ return FALSE;
+ }
+
+ d->base.privates[displayPrivateIndex].ptr = gd; /* allows use of PHOTO_DISPLAY macro */
+
+ return TRUE;
+}
+
+static void
+photoFiniDisplay (CompPlugin *p,
+ CompDisplay *d)
+{
+ PHOTO_DISPLAY (d);
+
+ freeScreenPrivateIndex (d, gd->screenPrivateIndex);
+ free (gd);
+}
+
+
+/* Function which is run when screen is initialized */
+
+static Bool
+photoInitScreen (CompPlugin *p,
+ CompScreen *s)
+{
+ PhotoScreen *gs;
+
+ PHOTO_DISPLAY (s->display); /* sets gd pointer used below */
+
+ CUBE_SCREEN (s);
+
+ gs = malloc (sizeof (PhotoScreen) ); /* creates gearScreen struct */
+
+ if (!gs)
+ return FALSE;
+
+ s->base.privates[gd->screenPrivateIndex].ptr = gs; /* For the PHOTO_SCREEN macro to work */
+
+ /*** My Code ***/
+ gs->firsttime=TRUE;
+ gs->rspeed=photoGetSpeed (s);
+ gs->xpos=photoGetXpos (s);
+ gs->ypos=photoGetYpos (s);
+ gs->zpos=photoGetZpos (s);
+ gs->transformOrder = photoGetOrder (s);
+
+ photoSetPhotoTexturesNotify (s, photoTextureChange);
+ photoSetHeightNotify (s, photoParamChange);
+ photoSetWidthNotify (s, photoParamChange);
+ photoSetSpeedNotify (s, photoParamChange);
+ photoSetXposNotify (s, photoParamChange);
+ photoSetYposNotify (s, photoParamChange);
+ photoSetZposNotify (s, photoParamChange);
+ photoSetOrderNotify (s, photoParamChange);
+
+ photoSetTopColourNotify (s, photoCapChange);
+ photoSetBottomColourNotify (s, photoCapChange);
+ photoSetCullNotify (s, photoParamChange);
+
+ photoTextureChange (s, NULL, 0);
+ photoParamChange (s, NULL, 0);
+ photoCapChange (s, NULL, 0);
+
+
+ /*** End of my Code ***/
+
+ WRAP (gs, s, donePaintScreen, photoDonePaintScreen); /*Functions version of ... is called instead of cores (which then also calls core function) */
+ WRAP (gs, s, preparePaintScreen, photoPreparePaintScreen);
+ WRAP (gs, cs, clearTargetOutput, photoClearTargetOutput);
+ WRAP (gs, cs, paintInside, photoPaintInside);
+
+ return TRUE;
+
+}
+
+/* Fuction is run when screen is uninitialized */
+
+static void
+photoFiniScreen (CompPlugin *p,
+ CompScreen *s)
+{
+ PHOTO_SCREEN (s); /*Sets the pointers cs gs */
+ CUBE_SCREEN (s);
+ int i;
+
+ for(i=0;i<(gs->n);i++)
+ {
+ finiTexture (s, &gs->photoTexture[i].tex);
+ glDeleteLists (gs->photoTexture[i].dList, 1);
+ }
+
+ glDeleteLists (gs->dList, 1);
+
+ free(gs->photoTexture);
+
+
+
+ UNWRAP (gs, s, donePaintScreen); /* gs is pointer to structure GearScreen, s is pointer to structure screen? - these functions are core functions*/
+ UNWRAP (gs, s, preparePaintScreen);
+
+ UNWRAP (gs, cs, clearTargetOutput); /* ... cs is pointer to structure CubeScreen? - these two functions are part of the Cube plugin*/
+ UNWRAP (gs, cs, paintInside);
+
+
+
+ free (gs);
+}
+
+/* Load and Unload plugin */
+
+static Bool
+photoInit (CompPlugin * p)
+{
+ displayPrivateIndex = allocateDisplayPrivateIndex();
+
+ if (displayPrivateIndex < 0)
+ return FALSE;
+
+ return TRUE;
+}
+
+static void
+photoFini (CompPlugin * p)
+{
+ if (displayPrivateIndex >= 0)
+ freeDisplayPrivateIndex (displayPrivateIndex);
+}
+
+/* Init Object - lists functions for Core, Display and Screen */
+
+static CompBool
+photoInitObject (CompPlugin *p,
+ CompObject *o)
+{
+ static InitPluginObjectProc dispTab[] = {
+ (InitPluginObjectProc) 0, /* InitCore */
+ (InitPluginObjectProc) photoInitDisplay,
+ (InitPluginObjectProc) photoInitScreen
+ };
+
+ RETURN_DISPATCH (o, dispTab, ARRAY_SIZE (dispTab), TRUE, (p, o));
+}
+
+static void
+photoFiniObject (CompPlugin *p,
+ CompObject *o)
+{
+ static FiniPluginObjectProc dispTab[] = {
+ (FiniPluginObjectProc) 0, /* FiniCore */
+ (FiniPluginObjectProc) photoFiniDisplay,
+ (FiniPluginObjectProc) photoFiniScreen
+ };
+
+ DISPATCH (o, dispTab, ARRAY_SIZE (dispTab), (p, o));
+}
+
+/* VTable */
+
+CompPluginVTable photoVTable = {
+ "photo",
+ 0, /* (?) */
+ photoInit,
+ photoFini,
+ photoInitObject,
+ photoFiniObject,
+ 0, /* Get(?) Object Options */
+ 0 /* Set(?) Object Options */
+};
+
+CompPluginVTable *
+getCompPluginInfo (void)
+{
+ return &photoVTable;
+}
diff --git a/photo.xml.in b/photo.xml.in
new file mode 100644
index 0000000..38c26e1
--- /dev/null
+++ b/photo.xml.in
@@ -0,0 +1,102 @@
+<?xml version="1.0"?>
+<compiz>
+ <plugin name="photo" useBcop="true">
+ <_short>Photowheel</_short>
+ <_long>Photo turn wheel for center of cube</_long>
+ <category>Effects</category>
+ <deps>
+ <relation type="after">
+ <plugin>cube</plugin>
+ </relation>
+ <requirement>
+ <plugin>cube</plugin>
+ </requirement>
+ </deps>
+ <screen>
+ <option name="photo_textures" type="list">
+ <_short>Photo Textures</_short>
+ <_long>Photo textures</_long>
+ <hints>file;image;</hints>
+ <type>string</type>
+ <default>
+ </default>
+ </option>
+ <option name="height" type="float">
+ <_short>Height</_short>
+ <_long>Height</_long>
+ <default>1.0</default>
+ <min>0.0</min>
+ <max>2.0</max>
+ <precision>0.01</precision>
+ </option>
+ <option name="width" type="float">
+ <_short>Width</_short>
+ <_long>Width</_long>
+ <default>1.0</default>
+ <min>0.0</min>
+ <max>3.0</max>
+ <precision>0.01</precision>
+ </option>
+ <option name="speed" type="float">
+ <_short>Speed</_short>
+ <_long>Speed</_long>
+ <default>0.5</default>
+ <min>0.0</min>
+ <max>5.0</max>
+ <precision>0.01</precision>
+ </option>
+ <option name="xpos" type="float">
+ <_short>x offset</_short>
+ <_long>x offset</_long>
+ <default>0</default>
+ <min>-2.0</min>
+ <max>2.0</max>
+ <precision>0.01</precision>
+ </option>
+ <option name="ypos" type="float">
+ <_short>y offset</_short>
+ <_long>y offset - note this is height</_long>
+ <default>0</default>
+ <min>-2.0</min>
+ <max>2.0</max>
+ <precision>0.01</precision>
+ </option>
+ <option name="zpos" type="float">
+ <_short>z offset</_short>
+ <_long>z offset</_long>
+ <default>0</default>
+ <min>-2.0</min>
+ <max>2.0</max>
+ <precision>0.01</precision>
+ </option>
+ <option name="order" type="bool">
+ <_short>Rotate around axis</_short>
+ <_long>Otherwise rotate around its center of cube</_long>
+ <default>true</default>
+ </option>
+ <option name="top_colour" type="color">
+ <_short>Top Colour</_short>
+ <_long>Colour of top face of the photo wheel</_long>
+ <default>
+ <red>0xffff</red>
+ <green>0xffff</green>
+ <blue>0xffff</blue>
+ </default>
+ </option>
+ <option name="bottom_colour" type="color">
+ <_short>Bottom Colour</_short>
+ <_long>Colour of bottom face of the photo wheel</_long>
+ <default>
+ <red>0xffff</red>
+ <green>0xffff</green>
+ <blue>0xffff</blue>
+ </default>
+ </option>
+ <option name="cull" type="bool">
+ <_short>Backface culling</_short>
+ <_long>Enable backface culling</_long>
+ <default>true</default>
+ </option>
+ </screen>
+ </plugin>
+</compiz>
diff --git a/plugin.info b/plugin.info
new file mode 100644
index 0000000..1060d51
--- /dev/null
+++ b/plugin.info
@@ -0,0 +1,2 @@
+PLUGIN = photo
+PKG_DEP = compiz-cube