Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8f859ce9ac | ||
|
|
a03ad443ee | ||
|
|
092d679c21 |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -1,3 +0,0 @@
|
||||
__pycache__
|
||||
_build/
|
||||
**/*~
|
||||
410
.gitlab-ci.yml
410
.gitlab-ci.yml
@@ -1,410 +0,0 @@
|
||||
image: registry.gitlab.gnome.org/gnome/gnome-control-center:fedora.dev
|
||||
stages:
|
||||
- build
|
||||
- test
|
||||
- manual
|
||||
- review
|
||||
- deploy
|
||||
|
||||
.Log files: &log_files [./*.log, _build/meson-logs/]
|
||||
|
||||
.Build logs: &save_build_logs
|
||||
artifacts:
|
||||
name: log
|
||||
when: always
|
||||
paths: *log_files
|
||||
|
||||
.Git Untracked files: &save_untracked_files
|
||||
artifacts:
|
||||
name: untracked
|
||||
paths: [$(pwd)]
|
||||
expire_in: 3h30min
|
||||
|
||||
.Show Info: &environment_information
|
||||
build-aux/ci/ci-helper.sh "INFO" &&
|
||||
build-aux/ci/ci-helper.sh "GIT_INFO"
|
||||
|
||||
.Build procedure: &build_procedure
|
||||
echo "== Building ==" &&
|
||||
rm -rf _build/ &&
|
||||
meson . _build ${BUILD_OPTS} &&
|
||||
ninja -C _build 2>&1 | tee compilation.log
|
||||
|
||||
.Run Tests: &run_tests
|
||||
echo "== Testing ==" &&
|
||||
meson test -C _build --verbose --no-stdsplit
|
||||
|
||||
##
|
||||
# Stage: Build
|
||||
#
|
||||
# Checks if GNOME Control Center is properly building and installing. This is the
|
||||
# most important stage of the CI, and no MR should ever be merged if it breaks
|
||||
# any of them.
|
||||
##
|
||||
build:
|
||||
<<: *save_untracked_files
|
||||
stage: build
|
||||
|
||||
script:
|
||||
- *environment_information
|
||||
- *build_procedure
|
||||
|
||||
- echo "== Installing =="
|
||||
- ninja -C _build install
|
||||
|
||||
- echo "== Report =="
|
||||
- build-aux/ci/ci-helper.sh "WARNINGS"
|
||||
|
||||
# Save all but git-related files
|
||||
- rm -rf .git .gitignore .gitmodules
|
||||
|
||||
except:
|
||||
variables:
|
||||
- $CI_PIPELINE_SOURCE == "schedule"
|
||||
|
||||
##
|
||||
# Stage: Test
|
||||
#
|
||||
# Runs the unit tests.
|
||||
##
|
||||
test:
|
||||
<<: *save_build_logs
|
||||
stage: test
|
||||
|
||||
dependencies:
|
||||
- build
|
||||
|
||||
script:
|
||||
- *environment_information
|
||||
- *run_tests
|
||||
|
||||
- |
|
||||
if [[ -n "${CI_COMMIT_TAG}" ]]; then
|
||||
echo "== Distro Test =="
|
||||
ninja dist -C _build
|
||||
fi
|
||||
|
||||
except:
|
||||
variables:
|
||||
- $CI_PIPELINE_SOURCE == "schedule"
|
||||
- $CI_COMMIT_TITLE =~ /^Update.*translation$/
|
||||
|
||||
# Runs the coverage test.
|
||||
coverage:
|
||||
<<: *save_build_logs
|
||||
stage: test
|
||||
variables:
|
||||
BUILD_OPTS: "-Db_coverage=true"
|
||||
coverage: '/^Lines:.\d+.\d+.(\d+\.\d+\%)/'
|
||||
only:
|
||||
- master@GNOME/gnome-control-center
|
||||
|
||||
script:
|
||||
- *environment_information
|
||||
- *build_procedure
|
||||
- *run_tests
|
||||
|
||||
- ninja -C _build coverage-html
|
||||
|
||||
# Parse the report to get the coverage result
|
||||
- |
|
||||
echo == Coverage ==
|
||||
sed -e 's/<[^>]*>//g' _build/meson-logs/coveragereport/index.html | tr -d ' \t' | grep -A3 -P '^Lines:$' | tr '\n' ' '; echo
|
||||
|
||||
except:
|
||||
variables:
|
||||
- $CI_PIPELINE_SOURCE == "schedule"
|
||||
- $CI_COMMIT_TITLE =~ /^Update.*translation$/
|
||||
|
||||
# Runs the address sanitizer.
|
||||
# - below, at the "sanitizers section"
|
||||
|
||||
##
|
||||
# Stage: Deploy
|
||||
#
|
||||
# Publishes the Coverage Report generated above
|
||||
##
|
||||
pages:
|
||||
stage: deploy
|
||||
dependencies:
|
||||
- coverage
|
||||
script:
|
||||
- mv _build/meson-logs/coveragereport/ public/
|
||||
artifacts:
|
||||
paths:
|
||||
- public
|
||||
only:
|
||||
- master@GNOME/gnome-control-center
|
||||
|
||||
except:
|
||||
variables:
|
||||
- $CRON_TASK == "BUILD_CI_IMAGES"
|
||||
- $CI_COMMIT_TITLE =~ /^Update.*translation$/
|
||||
|
||||
##
|
||||
# Stage: Manual
|
||||
#
|
||||
# Creates a flatpak
|
||||
##
|
||||
flatpak:
|
||||
stage: manual
|
||||
image: registry.gitlab.gnome.org/gnome/gnome-runtime-images/gnome:master
|
||||
artifacts:
|
||||
name: package
|
||||
paths:
|
||||
- $(pwd)/*.flatpak
|
||||
expire_in: 7 days
|
||||
|
||||
variables:
|
||||
OLD_APPID: "org.gnome.Settings"
|
||||
APPID: "org.gnome.SettingsDevel"
|
||||
BUNDLE: "org.gnome.SettingsDevel.flatpak"
|
||||
MANIFEST_PATH: "org.gnome.Settings.json"
|
||||
PATCHES: "build-aux/flatpak/*.patch"
|
||||
PROJECT_FILE: "build-aux/flatpak/org.gnome.Settings.json"
|
||||
PROJECT_ID: "org.gnome.Settings"
|
||||
PROJECT_NAME: "gnome-control-center.git"
|
||||
RUNTIME_REPO: "https://sdk.gnome.org/gnome-nightly.flatpakrepo"
|
||||
|
||||
script:
|
||||
- echo "== Flatpak packaging =="
|
||||
|
||||
# Move needed files to the root folder
|
||||
- cp ${PATCHES} . || true
|
||||
- cp ${PROJECT_FILE} ${MANIFEST_PATH}
|
||||
|
||||
# Make it a develoment manifest
|
||||
- sed -i -n "p; s/$PROJECT_NAME//p" ${MANIFEST_PATH}
|
||||
- >
|
||||
sed -i "s,\"app-id\" : \"$PROJECT_ID\",\"app-id\" : \"<<ID>>\",g" ${MANIFEST_PATH}
|
||||
- >
|
||||
sed -i "s,\"url\" : \"https://gitlab.gnome.org/GNOME/$PROJECT_NAME\",\"branch\" : \"<<current>>\"\,,g" ${MANIFEST_PATH}
|
||||
- >
|
||||
sed -i "s,\"url\" : \"https://gitlab.gnome.org/GNOME/\",\"path\" : \".\",g" ${MANIFEST_PATH}
|
||||
|
||||
# Adjust the manifest to HEAD
|
||||
- sed -i "s,<<ID>>,$APPID,g" ${MANIFEST_PATH}
|
||||
- sed -i "s,<<current>>,origin/$CI_COMMIT_REF_NAME,g" ${MANIFEST_PATH}
|
||||
|
||||
# Update the icon name
|
||||
- mv data/icons/hicolor/scalable/apps/$OLD_APPID.svg data/icons/hicolor/scalable/apps/$APPID.svg
|
||||
- mv data/icons/hicolor/symbolic/apps/$OLD_APPID-symbolic.svg data/icons/hicolor/symbolic/apps/$APPID-symbolic.svg
|
||||
|
||||
- flatpak-builder --bundle-sources --repo=devel build ${MANIFEST_PATH}
|
||||
- flatpak build-bundle devel ${BUNDLE} --runtime-repo=${RUNTIME_REPO} ${APPID}
|
||||
|
||||
cache:
|
||||
paths:
|
||||
- .flatpak-builder/cache
|
||||
when: manual
|
||||
except:
|
||||
- tags
|
||||
- gnome-3-.*
|
||||
- master@GNOME/gnome-control-center
|
||||
|
||||
##
|
||||
# Review
|
||||
#
|
||||
# Stage: review
|
||||
#
|
||||
# Starts the Flatpak review process.
|
||||
##
|
||||
review:
|
||||
stage: review
|
||||
dependencies:
|
||||
- flatpak
|
||||
|
||||
when: manual
|
||||
variables:
|
||||
BUNDLE: "org.gnome.SettingsDevel.flatpak"
|
||||
script:
|
||||
- echo "Generating flatpak deployment"
|
||||
artifacts:
|
||||
paths:
|
||||
- ${BUNDLE}
|
||||
expire_in: 30 days
|
||||
environment:
|
||||
name: review/$CI_COMMIT_REF_NAME
|
||||
url: https://gitlab.gnome.org/$CI_PROJECT_PATH/-/jobs/$CI_JOB_ID/artifacts/raw/${BUNDLE}
|
||||
on_stop: stop_review
|
||||
except:
|
||||
- tags
|
||||
- gnome-3-.*
|
||||
- master@GNOME/gnome-control-center
|
||||
|
||||
##
|
||||
# Stop Review
|
||||
#
|
||||
# Stage: review
|
||||
#
|
||||
# Stops the Flatpak review process.
|
||||
##
|
||||
stop_review:
|
||||
stage: review
|
||||
script:
|
||||
- echo "Stopping flatpak deployment"
|
||||
when: manual
|
||||
environment:
|
||||
name: review/$CI_COMMIT_REF_NAME
|
||||
action: stop
|
||||
except:
|
||||
variables:
|
||||
- $CI_PIPELINE_SOURCE == "schedule"
|
||||
|
||||
# Runs the sanitizers [address, thread, undefined, and memory].
|
||||
.sanitizer: &sanitizer
|
||||
<<: *save_build_logs
|
||||
stage: manual
|
||||
when: manual
|
||||
script:
|
||||
- *environment_information
|
||||
- *build_procedure
|
||||
- *run_tests
|
||||
|
||||
except:
|
||||
variables:
|
||||
- $CI_PIPELINE_SOURCE == "schedule"
|
||||
- $CI_COMMIT_TITLE =~ /^Update.*translation$/
|
||||
|
||||
asan:
|
||||
<<: *sanitizer
|
||||
stage: test
|
||||
when: on_success
|
||||
variables:
|
||||
BUILD_OPTS: "-Db_sanitize=address"
|
||||
LSAN_OPTIONS: "suppressions=${CI_PROJECT_DIR}/build-aux/ci/lsan.supp"
|
||||
|
||||
tsan:
|
||||
<<: *sanitizer
|
||||
variables:
|
||||
BUILD_OPTS: "-Db_sanitize=thread"
|
||||
|
||||
ubsan:
|
||||
<<: *sanitizer
|
||||
variables:
|
||||
BUILD_OPTS: "-Db_sanitize=undefined"
|
||||
|
||||
msan:
|
||||
<<: *sanitizer
|
||||
variables:
|
||||
BUILD_OPTS: "-Db_sanitize=memory"
|
||||
CC: "clang"
|
||||
|
||||
# Runs multiarch build test.
|
||||
.qemu: &multiarch
|
||||
<<: *save_build_logs
|
||||
image: docker:latest
|
||||
services:
|
||||
- docker:dind
|
||||
|
||||
script:
|
||||
# Register QEMU archs
|
||||
- docker run --rm --privileged multiarch/qemu-user-static:register --reset
|
||||
|
||||
# Run the multiarch test job using QEMU
|
||||
- 'docker run -v $(pwd):/cwd $IMAGE bash -e -c "cd /cwd &&
|
||||
echo == Building == &&
|
||||
rm -rf _build/ &&
|
||||
meson . _build ${BUILD_OPTS} &&
|
||||
ninja -C _build 2>&1 | tee compilation.log &&
|
||||
|
||||
echo == Testing == &&
|
||||
ninja -C _build test"
|
||||
'
|
||||
|
||||
except:
|
||||
variables:
|
||||
- $CI_PIPELINE_SOURCE == "schedule"
|
||||
- $CI_COMMIT_TITLE =~ /^Update.*translation$/
|
||||
|
||||
armv8:
|
||||
<<: *multiarch
|
||||
stage: manual
|
||||
when: manual
|
||||
variables:
|
||||
DOCKER_DRIVER: overlay
|
||||
IMAGE: "registry.gitlab.gnome.org/gnome/gnome-control-center:fedora.aarch64"
|
||||
|
||||
ppc64le:
|
||||
<<: *multiarch
|
||||
stage: manual
|
||||
when: manual
|
||||
allow_failure: true
|
||||
variables:
|
||||
DOCKER_DRIVER: overlay
|
||||
IMAGE: "registry.gitlab.gnome.org/gnome/gnome-control-center:fedora.ppc64le"
|
||||
|
||||
#############################################
|
||||
# Create CI Docker Images #
|
||||
#############################################
|
||||
.Docker image template: &create_docker_image
|
||||
image: docker:latest
|
||||
stage: deploy
|
||||
services:
|
||||
- docker:dind
|
||||
only:
|
||||
variables:
|
||||
- $CRON_TASK == "BUILD_CI_IMAGES"
|
||||
changes:
|
||||
- build-aux/ci/Dockerfile.*
|
||||
|
||||
|
||||
script:
|
||||
# Skip the build (if requested)
|
||||
- |
|
||||
if [[ -z "${CI_COMMIT_MESSAGE##*'[skip images]'*}" ]]; then
|
||||
echo "== Nothing to do =="
|
||||
exit 0
|
||||
fi
|
||||
|
||||
- |
|
||||
if [[ "${CI_COMMIT_REF_NAME}" != "master" ]]; then
|
||||
echo "== Exiting, will only build CI images when pushing to master. =="
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Only when we have somewhere to publish to
|
||||
- |
|
||||
if [[ -z "${CI_REGISTRY}${CI_REGISTRY_IMAGE}${CI_REGISTRY_USER}${CI_REGISTRY_PASSWORD}" ]]; then
|
||||
echo "== Exiting, CI registry not configured. =="
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Get multiarch stuff
|
||||
- |
|
||||
if [[ -n "${TARGET_ARCH}" ]]; then
|
||||
docker run --rm --privileged multiarch/qemu-user-static:register --reset
|
||||
wget https://github.com/multiarch/qemu-user-static/releases/download/v2.12.0/x86_64_qemu-${TARGET_ARCH}-static.tar.gz
|
||||
fi
|
||||
|
||||
# Build using the Dockerfile
|
||||
- docker build -f "$DOCKERFILE" -t "$CI_REGISTRY_IMAGE:$NAME" .
|
||||
|
||||
# Publish
|
||||
- docker tag "$CI_REGISTRY_IMAGE:$NAME" "$CI_REGISTRY_IMAGE:job-"$CI_JOB_ID"_$NAME"
|
||||
- docker images
|
||||
- docker login ${CI_REGISTRY} -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD}
|
||||
- docker push "$CI_REGISTRY_IMAGE"
|
||||
|
||||
fedora.dev:
|
||||
<<: *create_docker_image
|
||||
variables:
|
||||
DOCKER_DRIVER: overlay
|
||||
DOCKERFILE: "build-aux/ci/Dockerfile.fedora.30"
|
||||
NAME: "fedora.dev"
|
||||
|
||||
fedora.aarch64:
|
||||
<<: *create_docker_image
|
||||
variables:
|
||||
DOCKER_DRIVER: overlay
|
||||
DOCKERFILE: "build-aux/ci/Dockerfile.arm64v8.fedora.30"
|
||||
NAME: "fedora.aarch64"
|
||||
TARGET_ARCH: "aarch64"
|
||||
|
||||
fedora.ppc64le:
|
||||
<<: *create_docker_image
|
||||
variables:
|
||||
DOCKER_DRIVER: overlay
|
||||
DOCKERFILE: "build-aux/ci/Dockerfile.ppc64le.fedora.latest"
|
||||
NAME: "fedora.ppc64le"
|
||||
TARGET_ARCH: "ppc64le"
|
||||
@@ -1,18 +0,0 @@
|
||||
<!--
|
||||
|
||||
Not following the communication guidelines [1] will mean your issue or comment
|
||||
will be removed. Read it carefully before submitting this issue.
|
||||
|
||||
|
||||
[1] https://gitlab.gnome.org/GNOME/gnome-control-center/blob/master/docs/CONTRIBUTING.md#communication-guideline
|
||||
|
||||
-->
|
||||
|
||||
Detailed description of the issue. Put as much information as you can, potentially
|
||||
with images showing the issue.
|
||||
|
||||
Steps to reproduce:
|
||||
|
||||
1. Open GNOME Settings
|
||||
2. Change X to something else
|
||||
3. ...
|
||||
@@ -1,41 +0,0 @@
|
||||
# Current problems
|
||||
<!--
|
||||
What are the problems that the current project has?
|
||||
|
||||
For example:
|
||||
* User cannot use the keyboard to perform most common actions
|
||||
or
|
||||
* User cannot see documents from cloud services
|
||||
-->
|
||||
|
||||
# Goals & use cases
|
||||
<!--
|
||||
What are the use cases that this proposal will cover? What are the end goals?
|
||||
|
||||
For example:
|
||||
* User needs to share a file with their friends.
|
||||
or
|
||||
* It should be easy to edit a picture within the app.
|
||||
-->
|
||||
|
||||
# Requirements
|
||||
<!--
|
||||
What does the solution needs to ensure for being succesful?
|
||||
|
||||
For example:
|
||||
* Work on small form factors and touch
|
||||
or
|
||||
* Use the Meson build system and integrate with it
|
||||
-->
|
||||
|
||||
# Relevant art
|
||||
<!--
|
||||
Is there any product that has implemented something similar? Put links to other
|
||||
projects, pictures, links to other code, etc.
|
||||
-->
|
||||
|
||||
# Proposal & plan
|
||||
<!-- What's the solution and how should be achieved? It can be split in smaller
|
||||
tasks of minimum change, so they can be delivered across several releases. -->
|
||||
|
||||
/label ~"1. Epic"
|
||||
@@ -1,27 +0,0 @@
|
||||
<!--
|
||||
|
||||
Not following the communication guidelines [1] will mean your issue or comment
|
||||
will be removed. Read it carefully before submitting this issue.
|
||||
|
||||
|
||||
[1] https://gitlab.gnome.org/GNOME/gnome-control-center/blob/master/docs/CONTRIBUTING.md#communication-guideline
|
||||
|
||||
-->
|
||||
|
||||
Detailed description of the feature. Put as much information as you can.
|
||||
|
||||
Proposed Mockups:
|
||||
|
||||
(Add mockups of the proposed feature)
|
||||
|
||||
## Design Tasks
|
||||
|
||||
* [ ] design tasks
|
||||
|
||||
## Development Tasks
|
||||
|
||||
* [ ] development tasks
|
||||
|
||||
## QA Tasks
|
||||
|
||||
* [ ] qa (quality assurance) tasks
|
||||
6
.gitmodules
vendored
6
.gitmodules
vendored
@@ -1,6 +0,0 @@
|
||||
[submodule "subprojects/gvc"]
|
||||
path = subprojects/gvc
|
||||
url = https://gitlab.gnome.org/GNOME/libgnome-volume-control.git
|
||||
[submodule "subprojects/libhandy"]
|
||||
path = subprojects/libhandy
|
||||
url = https://source.puri.sm/Librem5/libhandy.git
|
||||
340
COPYING
340
COPYING
@@ -1,340 +0,0 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Lesser General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
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.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License.
|
||||
|
||||
63
README.md
63
README.md
@@ -1,63 +0,0 @@
|
||||
[](https://gitlab.gnome.org/GNOME/gnome-control-center/pipelines)
|
||||
[](https://gnome.pages.gitlab.gnome.org/gnome-control-center/)
|
||||
[](https://gitlab.gnome.org/GNOME/gnome-control-center/blob/master/COPYING)
|
||||
|
||||
GNOME Settings
|
||||
====================
|
||||
|
||||
GNOME Settings is GNOME's main interface for configuration of various aspects of your desktop.
|
||||
|
||||
## Contributing
|
||||
|
||||
See `docs/CONTRIBUTING.md` for details on the contribution process, and `docs/HACKING.md`
|
||||
for the coding style guidelines.
|
||||
|
||||
## Reporting Bugs
|
||||
|
||||
Before reporting any bugs or opening feature requests, [read the communication guidelines][communication-guidelines].
|
||||
|
||||
Bugs should be reported to the GNOME bug tracking system under the product
|
||||
gnome-control-center. It is available at [GitLab Issues](https://gitlab.gnome.org/GNOME/gnome-control-center/issues).
|
||||
|
||||
In the report please include the following information:
|
||||
|
||||
* Operating system and version
|
||||
* For Linux, version of the C library
|
||||
* Exact error message
|
||||
* Steps to reproduce the bug
|
||||
* If the bug is a visual defect, attach a screenshot
|
||||
* If the bug is a crash, attach a backtrace if possible [see below]
|
||||
|
||||
### How to get a backtrace
|
||||
|
||||
If the crash is reproducible, follow the steps to obtain a
|
||||
backtrace:
|
||||
|
||||
Install debug symbols for gnome-control-center.
|
||||
|
||||
Run the program in gdb [the GNU debugger] or any other debugger.
|
||||
|
||||
gdb gnome-control-center
|
||||
|
||||
Start the program.
|
||||
|
||||
(gdb) run
|
||||
|
||||
Reproduce the crash and when the program exits to (gdb) prompt, get the backtrace.
|
||||
|
||||
(gdb) bt full
|
||||
|
||||
Once you have the backtrace, copy and paste it into the 'Comments' field or attach it as
|
||||
a file to the bug report.
|
||||
|
||||
## Testing Unstable Settings
|
||||
|
||||
It is quite easy to test and give feedback about the development version of GNOME
|
||||
Settings. Just access https://gitlab.gnome.org/GNOME/gnome-control-center/environments,
|
||||
get the latest version, download it, double-click the file, install and run.
|
||||
|
||||
Note that GNOME Settings Flatpak will only work if you are running
|
||||
the latest GNOME version in your host system.
|
||||
|
||||
|
||||
[communication-guidelines]: https://gitlab.gnome.org/GNOME/gnome-control-center/blob/master/docs/CONTRIBUTING.md#communication-guidelines
|
||||
@@ -1,26 +0,0 @@
|
||||
FROM arm64v8/fedora:30
|
||||
MAINTAINER Claudio André (c) 2018 V1.0
|
||||
|
||||
LABEL architecture="aarch64"
|
||||
LABEL version="1.0"
|
||||
LABEL description="Multiarch Docker image to run CI for GNOME Settings."
|
||||
|
||||
ADD x86_64_qemu-aarch64-static.tar.gz /usr/bin
|
||||
|
||||
RUN dnf -y --nogpgcheck upgrade && \
|
||||
dnf -y install \
|
||||
@c-development @development-tools clang libasan gcovr \
|
||||
accountsservice-devel cheese-libs-devel chrpath colord-devel \
|
||||
colord-gtk-devel cups-devel desktop-file-utils docbook-style-xsl flatpak-devel gdk-pixbuf2-devel \
|
||||
gettext git glib2-devel gnome-bluetooth-libs-devel gnome-desktop3-devel \
|
||||
gnome-online-accounts-devel gnome-settings-daemon-devel grilo-devel \
|
||||
gsettings-desktop-schemas-devel gsound-devel gtk3-devel ibus-devel intltool libcanberra-devel \
|
||||
libgtop2-devel libgudev-devel libnma-devel libpwquality-devel libsmbclient-devel \
|
||||
libsoup-devel libudisks2-devel libwacom-devel libX11-devel libXi-devel libxml2-devel libxslt \
|
||||
libXxf86misc-devel meson ModemManager-glib-devel NetworkManager-libnm-devel \
|
||||
polkit-devel pulseaudio-libs-devel upower-devel \
|
||||
python3-dbusmock xorg-x11-server-Xvfb mesa-dri-drivers libsecret-devel && \
|
||||
dnf -y clean all
|
||||
|
||||
CMD ["/bin/bash"]
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
FROM fedora:30
|
||||
MAINTAINER Claudio André (c) 2018 V1.0
|
||||
|
||||
LABEL architecture="x86_64"
|
||||
LABEL version="1.0"
|
||||
LABEL description="Docker image to run CI for GNOME Settings."
|
||||
|
||||
RUN dnf -y --nogpgcheck upgrade && \
|
||||
dnf -y install \
|
||||
@c-development @development-tools clang libasan gcovr \
|
||||
accountsservice-devel cheese-libs-devel chrpath colord-devel \
|
||||
colord-gtk-devel cups-devel desktop-file-utils docbook-style-xsl flatpak-devel gdk-pixbuf2-devel \
|
||||
gettext git glib2-devel gnome-bluetooth-libs-devel gnome-desktop3-devel \
|
||||
gnome-online-accounts-devel gnome-settings-daemon-devel grilo-devel \
|
||||
gsettings-desktop-schemas-devel gsound-devel gtk3-devel ibus-devel intltool libcanberra-devel \
|
||||
libgtop2-devel libgudev-devel libnma-devel libpwquality-devel libsmbclient-devel \
|
||||
libsoup-devel libudisks2-devel libwacom-devel libX11-devel libXi-devel libxml2-devel libxslt \
|
||||
libXxf86misc-devel meson ModemManager-glib-devel NetworkManager-libnm-devel \
|
||||
polkit-devel pulseaudio-libs-devel upower-devel \
|
||||
python3-dbusmock xorg-x11-server-Xvfb mesa-dri-drivers libsecret-devel llvm && \
|
||||
dnf -y clean all
|
||||
|
||||
CMD ["/bin/bash"]
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
FROM ppc64le/fedora:latest
|
||||
MAINTAINER Claudio André (c) 2018 V1.0
|
||||
|
||||
LABEL architecture="ppc64le"
|
||||
LABEL version="1.0"
|
||||
LABEL description="Multiarch Docker image to run CI for GNOME Settings."
|
||||
|
||||
ADD x86_64_qemu-ppc64le-static.tar.gz /usr/bin
|
||||
|
||||
RUN dnf -y --nogpgcheck upgrade && \
|
||||
dnf -y install \
|
||||
@c-development @development-tools clang libasan gcovr \
|
||||
accountsservice-devel cheese-libs-devel chrpath colord-devel \
|
||||
colord-gtk-devel cups-devel desktop-file-utils docbook-style-xsl flatpak-devel gdk-pixbuf2-devel \
|
||||
gettext git glib2-devel gnome-bluetooth-libs-devel gnome-desktop3-devel \
|
||||
gnome-online-accounts-devel gnome-settings-daemon-devel grilo-devel \
|
||||
gsettings-desktop-schemas-devel gsound-devel gtk3-devel ibus-devel intltool libcanberra-devel \
|
||||
libgtop2-devel libgudev-devel libnma-devel libpwquality-devel libsmbclient-devel \
|
||||
libsoup-devel libudisks2-devel libwacom-devel libX11-devel libXi-devel libxml2-devel libxslt \
|
||||
libXxf86misc-devel meson ModemManager-glib-devel NetworkManager-libnm-devel \
|
||||
polkit-devel pulseaudio-libs-devel upower-devel \
|
||||
python3-dbusmock xorg-x11-server-Xvfb mesa-dri-drivers libsecret-devel && \
|
||||
dnf -y clean all
|
||||
|
||||
CMD ["/bin/bash"]
|
||||
|
||||
@@ -1,61 +0,0 @@
|
||||
#!/bin/bash -e
|
||||
|
||||
function do_print_labels(){
|
||||
|
||||
if [[ -n "${1}" ]]; then
|
||||
label_len=${#1}
|
||||
span=$(((54 - $label_len) / 2))
|
||||
|
||||
echo
|
||||
echo "= ======================================================== ="
|
||||
printf "%s %${span}s %s %${span}s %s\n" "=" "" "$1" "" "="
|
||||
echo "= ======================================================== ="
|
||||
else
|
||||
echo "= ========================= Done ========================= ="
|
||||
echo
|
||||
fi
|
||||
}
|
||||
|
||||
function do_show_info(){
|
||||
|
||||
local compiler=gcc
|
||||
|
||||
echo -n "Processors: "; grep -c ^processor /proc/cpuinfo
|
||||
grep ^MemTotal /proc/meminfo
|
||||
id; uname -a
|
||||
printenv
|
||||
echo '-----------------------------------------'
|
||||
cat /etc/*-release
|
||||
echo '-----------------------------------------'
|
||||
|
||||
if [[ ! -z $CC ]]; then
|
||||
compiler=$CC
|
||||
fi
|
||||
echo 'Compiler version'
|
||||
$compiler --version
|
||||
echo '-----------------------------------------'
|
||||
$compiler -dM -E -x c /dev/null
|
||||
echo '-----------------------------------------'
|
||||
}
|
||||
|
||||
function do_check_warnings(){
|
||||
|
||||
cat compilation.log | grep "warning:" | awk '{total+=1}END{print "Total number of warnings: "total}'
|
||||
}
|
||||
|
||||
# ----------- -----------
|
||||
if [[ $1 == "INFO" ]]; then
|
||||
do_print_labels 'Build environment '
|
||||
do_show_info
|
||||
do_print_labels
|
||||
|
||||
elif [[ $1 == "GIT_INFO" ]]; then
|
||||
do_print_labels 'Commit'
|
||||
git log --pretty=format:"%h %cd %s" -1; echo
|
||||
do_print_labels
|
||||
|
||||
elif [[ $1 == "WARNINGS" ]]; then
|
||||
do_print_labels 'Warning Report '
|
||||
do_check_warnings
|
||||
do_print_labels
|
||||
fi
|
||||
@@ -1,19 +0,0 @@
|
||||
# https://bugs.freedesktop.org/show_bug.cgi?id=105466
|
||||
leak:libfontconfig.so.1
|
||||
|
||||
# Unknown and unreported bugs
|
||||
leak:__GI___vasprintf_chk
|
||||
leak:__interceptor_malloc
|
||||
leak:__alloc_dir
|
||||
leak:libglib-2.0.so.0
|
||||
|
||||
# Needing attention
|
||||
leak:<unknown module>
|
||||
leak:test_timezone_gfx
|
||||
|
||||
########
|
||||
# __GI___vasprintf_chk /usr/src/debug/glibc-2.27.9000-432-g104502102c/debug/vasprintf_chk.c:80
|
||||
# __alloc_dir ../sysdeps/posix/opendir.c:118
|
||||
# g_malloc (/lib64/libglib-2.0.so.0+0x523c5)
|
||||
# g_realloc (/lib64/libglib-2.0.so.0+0x5247d)
|
||||
########
|
||||
@@ -1,22 +0,0 @@
|
||||
From ba5e0451b51c983e40afd123b6e0d3eddb55e610 Mon Sep 17 00:00:00 2001
|
||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||
Date: Sat, 24 Mar 2018 17:37:02 +0000
|
||||
Subject: linux: Include <sys/sysmacros.h> for major() macro.
|
||||
|
||||
Since glibc 2.27 this header is required.
|
||||
---
|
||||
libparted/arch/linux.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/libparted/arch/linux.c b/libparted/arch/linux.c
|
||||
index 31b98ab..7e86b51 100644
|
||||
--- a/libparted/arch/linux.c
|
||||
+++ b/libparted/arch/linux.c
|
||||
@@ -41,6 +41,7 @@
|
||||
#include <sys/utsname.h> /* for uname() */
|
||||
#include <scsi/scsi.h>
|
||||
#include <assert.h>
|
||||
+#include <sys/sysmacros.h>
|
||||
#ifdef ENABLE_DEVICE_MAPPER
|
||||
#include <libdevmapper.h>
|
||||
#endif
|
||||
@@ -1,716 +0,0 @@
|
||||
{
|
||||
"app-id" : "org.gnome.Settings",
|
||||
"runtime" : "org.gnome.Sdk",
|
||||
"runtime-version" : "master",
|
||||
"sdk" : "org.gnome.Sdk",
|
||||
"command" : "gnome-control-center",
|
||||
"rename-desktop-file" : "gnome-control-center.desktop",
|
||||
"tags" : [
|
||||
"devel"
|
||||
],
|
||||
"desktop-file-name-prefix" : "(Development) ",
|
||||
"finish-args" : [
|
||||
"--device=dri",
|
||||
"--env=DCONF_USER_CONFIG_DIR=.config/dconf",
|
||||
"--filesystem=host",
|
||||
"--own-name=org.gnome.ControlCenter",
|
||||
"--own-name=org.gnome.SessionManager",
|
||||
"--share=ipc",
|
||||
"--share=network",
|
||||
"--socket=x11",
|
||||
"--socket=pulseaudio",
|
||||
"--socket=session-bus",
|
||||
"--socket=system-bus",
|
||||
"--socket=wayland"
|
||||
],
|
||||
"build-options" : {
|
||||
"cflags" : "-O2 -g",
|
||||
"cxxflags" : "-O2 -g",
|
||||
"env" : {
|
||||
"V" : "1"
|
||||
}
|
||||
},
|
||||
"x-run-args" : [
|
||||
"--verbose"
|
||||
],
|
||||
"cleanup" : [
|
||||
"/include",
|
||||
"/share/aclocal",
|
||||
"/man",
|
||||
"/share/man",
|
||||
"/share/gtk-doc",
|
||||
"/share/vala",
|
||||
"*.la",
|
||||
"*.a"
|
||||
],
|
||||
"modules" : [
|
||||
{
|
||||
"name" : "pwquality",
|
||||
"buildsystem" : "autotools",
|
||||
"config-opts" : [
|
||||
],
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "git",
|
||||
"url" : "https://github.com/libpwquality/libpwquality.git"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "polkit",
|
||||
"buildsystem" : "autotools",
|
||||
"config-opts" : [
|
||||
"--disable-man-pages",
|
||||
"--disable-introspection",
|
||||
"--disable-libelogind",
|
||||
"--enable-libsystemd-login=no",
|
||||
"--with-systemdsystemunitdir=no"
|
||||
],
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "git",
|
||||
"url" : "git://anongit.freedesktop.org/polkit"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "accountservice",
|
||||
"buildsystem" : "meson",
|
||||
"config-opts" : [
|
||||
"-Ddocbook=false",
|
||||
"-Delogind=false",
|
||||
"-Dgtk_doc=false",
|
||||
"-Dintrospection=false",
|
||||
"-Dsystemd=false",
|
||||
"-Dsystemdsystemunitdir=no"
|
||||
],
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "git",
|
||||
"url" : "git://anongit.freedesktop.org/accountsservice"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "libusb1",
|
||||
"buildsystem" : "autotools",
|
||||
"config-opts" : [
|
||||
"--disable-udev"
|
||||
],
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "git",
|
||||
"url" : "git://github.com/libusb/libusb.git"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "gusb",
|
||||
"buildsystem" : "meson",
|
||||
"config-opts" : [
|
||||
"-Ddocs=false",
|
||||
"-Dtests=false",
|
||||
"-Dvapi=false"
|
||||
],
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "git",
|
||||
"url" : "git://github.com/hughsie/libgusb.git"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "udev",
|
||||
"config-opts" : [
|
||||
"--disable-hwdb",
|
||||
"--disable-logging",
|
||||
"--disable-gudev",
|
||||
"--disable-introspection",
|
||||
"--disable-keymap",
|
||||
"--disable-mtd_probe"
|
||||
],
|
||||
"cleanup" : [
|
||||
"/include",
|
||||
"/etc",
|
||||
"/libexec",
|
||||
"/sbin",
|
||||
"/lib/pkgconfig",
|
||||
"/man",
|
||||
"/share/aclocal",
|
||||
"/share/doc",
|
||||
"/share/gtk-doc",
|
||||
"/share/man",
|
||||
"/share/pkgconfig",
|
||||
"*.la",
|
||||
"*.a"
|
||||
],
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "git",
|
||||
"url" : "git://github.com/gentoo/eudev.git"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "gudev",
|
||||
"buildsystem" : "autotools",
|
||||
"config-opts" : [
|
||||
"--disable-umockdev"
|
||||
],
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "git",
|
||||
"url" : "https://gitlab.gnome.org/GNOME/libgudev.git"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "colord",
|
||||
"buildsystem" : "meson",
|
||||
"config-opts" : [
|
||||
"-Dargyllcms_sensor=false",
|
||||
"-Dbash_completion=false",
|
||||
"-Dman=false",
|
||||
"-Dudev_rules=false",
|
||||
"-Dsystemd=false",
|
||||
"-Dvapi=false",
|
||||
"-Ddocs=false",
|
||||
"-Dtests=false",
|
||||
"-Dinstalled_tests=false"
|
||||
],
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "git",
|
||||
"url" : "git://github.com/hughsie/colord.git"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "colord-gtk",
|
||||
"buildsystem" : "meson",
|
||||
"config-opts" : [
|
||||
"-Dman=false"
|
||||
],
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "git",
|
||||
"url" : "git://github.com/hughsie/colord-gtk.git"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "rest",
|
||||
"buildsystem" : "autotools",
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "git",
|
||||
"branch" : "librest-0-7",
|
||||
"url" : "https://gitlab.gnome.org/GNOME/librest.git"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "gnome-online-accounts",
|
||||
"buildsystem" : "meson",
|
||||
"build-options" : {
|
||||
"cflags" : "-Wno-error"
|
||||
},
|
||||
"config-opts" : [
|
||||
"-Dgtk_doc=false",
|
||||
"-Dintrospection=false",
|
||||
"-Dvapi=false"
|
||||
],
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "git",
|
||||
"url" : "https://gitlab.gnome.org/GNOME/gnome-online-accounts.git"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "gnome-desktop",
|
||||
"buildsystem" : "meson",
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "git",
|
||||
"url" : "https://gitlab.gnome.org/GNOME/gnome-desktop.git"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "geocode-glib",
|
||||
"buildsystem" : "meson",
|
||||
"config-opts" : [
|
||||
"-Denable-gtk-doc=false",
|
||||
"-Denable-introspection=false",
|
||||
"-Denable-installed-tests=false"
|
||||
],
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "git",
|
||||
"url" : "https://gitlab.gnome.org/GNOME/geocode-glib.git"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "libgweather",
|
||||
"buildsystem" : "meson",
|
||||
"config-opts" : [
|
||||
"-Dglade_catalog=false",
|
||||
"-Denable_vala=false",
|
||||
"-Dgtk_doc=false"
|
||||
],
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "git",
|
||||
"url" : "https://gitlab.gnome.org/GNOME/libgweather.git"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "upower",
|
||||
"buildsystem" : "autotools",
|
||||
"config-opts" : [
|
||||
"--prefix=/app",
|
||||
"--with-systemdsystemunitdir=/app/lib/systemd/system",
|
||||
"--disable-gtk-doc",
|
||||
"--disable-man-pages",
|
||||
"--disable-tests"
|
||||
],
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "git",
|
||||
"url" : "git://anongit.freedesktop.org/upower"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "libwacom",
|
||||
"buildsystem" : "autotools",
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "git",
|
||||
"url" : "https://github.com/linuxwacom/libwacom.git"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "libndp",
|
||||
"buildsystem" : "autotools",
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "archive",
|
||||
"url" : " http://libndp.org/files/libndp-1.6.tar.gz",
|
||||
"sha256" : "0c7dfa84e013bd5e569ef2c6292a6f72cfaf14f4ff77a77425e52edc33ffac0e"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "NetworkManager",
|
||||
"buildsystem" : "meson",
|
||||
"build-options" : {
|
||||
"cflags" : "-ltinfo",
|
||||
"cxxflags" : "-ltinfo"
|
||||
},
|
||||
"config-opts" : [
|
||||
"-Dlibaudit=no",
|
||||
"-Ddbus_conf_dir=/app/etc/dbus-1/system.d",
|
||||
"-Ddbus_ifaces_dir=/app/share/dbus-1/interfaces",
|
||||
"-Ddbus_sys_dir=/app/share/dbus-1/system.d",
|
||||
"-Ddnsmasq=/usr/bin/true",
|
||||
"-Ddocs=false",
|
||||
"-Dintrospection=false",
|
||||
"-Diptables=/usr/bin/true",
|
||||
"-Djson_validation=false",
|
||||
"-Dlibnm_glib=false",
|
||||
"-Dlibpsl=false",
|
||||
"-Dmodem_manager=false",
|
||||
"-Dnmtui=false",
|
||||
"-Dovs=false",
|
||||
"-Dppp=false",
|
||||
"-Dqt=false",
|
||||
"-Dselinux=false",
|
||||
"-Dsession_tracking=no",
|
||||
"-Dsystemdsystemunitdir='no'",
|
||||
"-Dsystemd_journal=false",
|
||||
"-Dtests=no",
|
||||
"-Dvapi=false"
|
||||
],
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "git",
|
||||
"url" : "https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "network-manager-applet",
|
||||
"buildsystem" : "meson",
|
||||
"config-opts" : [
|
||||
"-Dgtk_doc=false",
|
||||
"-Dintrospection=false",
|
||||
"-Dlibnm_gtk=false",
|
||||
"-Dselinux=false",
|
||||
"-Dteam=false",
|
||||
"-Dwwan=false",
|
||||
"-Dmobile_broadband_provider_info=false"
|
||||
],
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "git",
|
||||
"url" : "https://gitlab.gnome.org/GNOME/network-manager-applet.git"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "ModemManager",
|
||||
"buildsystem" : "autotools",
|
||||
"config-opts" : [
|
||||
"--disable-introspection",
|
||||
"--disable-vala",
|
||||
"--with-udev-base-dir=/app/lib",
|
||||
"--with-systemdsystemunitdir=/app/lib/systemd/system",
|
||||
"--without-mbim",
|
||||
"--without-qmi"
|
||||
],
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "git",
|
||||
"url" : "git://anongit.freedesktop.org/ModemManager/ModemManager"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "gnome-settings-daemon",
|
||||
"buildsystem" : "meson",
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "git",
|
||||
"url" : "https://gitlab.gnome.org/GNOME/gnome-settings-daemon.git"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "gnome-bluetooth",
|
||||
"buildsystem" : "meson",
|
||||
"config-opts" : [
|
||||
"-Dintrospection=false"
|
||||
],
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "git",
|
||||
"url" : "https://gitlab.gnome.org/GNOME/gnome-bluetooth.git"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "grilo",
|
||||
"buildsystem" : "meson",
|
||||
"config-opts" : [
|
||||
"-Denable-grl-pls=false",
|
||||
"-Denable-gtk-doc=false",
|
||||
"-Denable-introspection=false",
|
||||
"-Denable-test-ui=false",
|
||||
"-Denable-vala=false"
|
||||
],
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "git",
|
||||
"url" : "https://gitlab.gnome.org/GNOME/grilo.git"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "openldap",
|
||||
"buildsystem" : "autotools",
|
||||
"config-opts" : [
|
||||
"--disable-slapd"
|
||||
],
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "archive",
|
||||
"url" : "https://www.openldap.org/software/download/OpenLDAP/openldap-release/openldap-2.4.46.tgz",
|
||||
"sha256" : "9a90dcb86b99ae790ccab93b7585a31fbcbeec8c94bf0f7ab0ca0a87ea0c4b2d"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "libtirpc",
|
||||
"buildsystem" : "autotools",
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "archive",
|
||||
"url" : "http://downloads.sourceforge.net/sourceforge/libtirpc/libtirpc-1.0.3.tar.bz2",
|
||||
"sha256" : "86c3a78fc1bddefa96111dd233124c703b22a78884203c55c3e06b3be6a0fd5e"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "rpcsvc-proto",
|
||||
"buildsystem" : "autotools",
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "archive",
|
||||
"url" : "https://github.com/thkukuk/rpcsvc-proto/archive/v1.4.tar.gz",
|
||||
"sha256" : "eaa227686b84e8ae20181d2119c0ccac29d82371441844008019a134dafe3613"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "samba",
|
||||
"buildsystem" : "autotools",
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "archive",
|
||||
"url" : "https://download.samba.org/pub/samba/stable/samba-4.8.1.tar.gz",
|
||||
"sha256" : "8ef7367507f16b7a5e2f6aed5bcdbd1143feca79aa2a07c9b21292b17d7f789d"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "libgtop2",
|
||||
"buildsystem" : "autotools",
|
||||
"config-opts" : [
|
||||
"--disable-introspection"
|
||||
],
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "git",
|
||||
"url" : "https://gitlab.gnome.org/GNOME/libgtop.git"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "cheese",
|
||||
"buildsystem" : "autotools",
|
||||
"config-opts" : [
|
||||
"--disable-introspection"
|
||||
],
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "git",
|
||||
"url" : "https://gitlab.gnome.org/GNOME/cheese.git"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "libhandy",
|
||||
"buildsystem" : "meson",
|
||||
"config-opts" : [
|
||||
"-Dexamples=false",
|
||||
"-Dglade_catalog=disabled",
|
||||
"-Dintrospection=disabled",
|
||||
"-Dtests=false",
|
||||
"-Dvapi=false"
|
||||
],
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "git",
|
||||
"url" : "https://source.puri.sm/Librem5/libhandy.git"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "gsound",
|
||||
"buildsystem" : "autotools",
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "git",
|
||||
"url" : "https://gitlab.gnome.org/GNOME/gsound.git"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "libkmod",
|
||||
"buildsystem" : "autotools",
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "archive",
|
||||
"url" : "https://mirrors.edge.kernel.org/pub/linux/utils/kernel/kmod/kmod-25.tar.xz",
|
||||
"sha256" : "7165e6496656159dcb909a91ed708a0fe273a4b128b4b1dc997ccb5189eef1cd"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "lvm2",
|
||||
"buildsystem" : "autotools",
|
||||
"config-opts" : [
|
||||
"--prefix=/app",
|
||||
"--enable-cmdlib",
|
||||
"--enable-dmeventd",
|
||||
"--enable-pkgconfig",
|
||||
"--with-usrlibdir=/app/lib",
|
||||
"--with-usrbindir=/app/bin",
|
||||
"--with-staticdir=/app/bin"
|
||||
],
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "archive",
|
||||
"url" : "https://www.sourceware.org/pub/lvm2/LVM2.2.02.177.tgz",
|
||||
"sha256" : "4025a23ec9b15c2cb7486d151c29dc953b75efc4d452cfe9dbbc7c0fac8e80f2"
|
||||
}
|
||||
],
|
||||
"post-install" : [
|
||||
"chmod 755 /app/sbin/dm*",
|
||||
"chmod 755 /app/sbin/lvm*",
|
||||
"chmod 755 /app/lib/libdevmapper-event-lvm2.so.2.02",
|
||||
"chmod 755 /app/lib/libdevmapper-event-lvm2mirror.so",
|
||||
"chmod 755 /app/lib/libdevmapper-event-lvm2raid.so",
|
||||
"chmod 755 /app/lib/libdevmapper-event-lvm2snapshot.so",
|
||||
"chmod 755 /app/lib/libdevmapper-event-lvm2thin.so",
|
||||
"chmod 755 /app/lib/libdevmapper-event.so.1.02",
|
||||
"chmod 755 /app/lib/libdevmapper.so.1.02",
|
||||
"chmod 755 /app/lib/liblvm2cmd.so.2.02"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "parted",
|
||||
"buildsystem" : "autotools",
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "archive",
|
||||
"url" : "http://ftp.gnu.org/gnu/parted/parted-3.2.tar.xz",
|
||||
"sha256" : "858b589c22297cacdf437f3baff6f04b333087521ab274f7ab677cb8c6bb78e4"
|
||||
},
|
||||
{
|
||||
"type" : "patch",
|
||||
"path" : "libparted-include.patch"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "mpfr",
|
||||
"buildsystem" : "autotools",
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "archive",
|
||||
"url" : "https://www.mpfr.org/mpfr-4.0.2/mpfr-4.0.2.tar.xz",
|
||||
"sha256" : "1d3be708604eae0e42d578ba93b390c2a145f17743a744d8f3f8c2ad5855a38a"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "bytesize",
|
||||
"buildsystem" : "autotools",
|
||||
"config-opts" : [
|
||||
"--with-gtk-doc=no"
|
||||
],
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "git",
|
||||
"url" : "https://github.com/storaged-project/libbytesize.git"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "cryptsetup",
|
||||
"autotools" : "autotools",
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "archive",
|
||||
"url" : "https://www.kernel.org/pub/linux/utils/cryptsetup/v1.7/cryptsetup-1.7.5.tar.xz",
|
||||
"sha256" : "2b30cd1d0dd606a53ac77b406e1d37798d4b0762fa89de6ea546201906a251bd"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "swig",
|
||||
"buildsystem" : "autotools",
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "git",
|
||||
"url" : "https://github.com/swig/swig.git"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "volume-key",
|
||||
"buildsystem" : "simple",
|
||||
"build-commands" : [
|
||||
"autoreconf -i",
|
||||
"./configure --prefix=/app",
|
||||
"make install"
|
||||
],
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "archive",
|
||||
"url" : "https://github.com/felixonmars/volume_key/archive/volume_key-0.3.11.tar.gz",
|
||||
"sha256" : "92250506756eca19a0b6f50c16d3502eb5566ea4725645d7c5d87eb5cc8f3fd8"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "libblockdev",
|
||||
"buildsystem" : "autotools",
|
||||
"config-opts" : [
|
||||
"--disable-tests",
|
||||
"--with-btrfs=no",
|
||||
"--with-dm=no",
|
||||
"--with-gtk-doc=no",
|
||||
"--with-kbd=no",
|
||||
"--with-lvm=no",
|
||||
"--with-lvm-dbus=no",
|
||||
"--with-mpath=no",
|
||||
"--with-nvdimm=no",
|
||||
"--with-tools=no",
|
||||
"--with-vdo=no"
|
||||
],
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "git",
|
||||
"url" : "https://github.com/storaged-project/libblockdev.git"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "atasmart",
|
||||
"buildsystem" : "autotools",
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "archive",
|
||||
"url" : "http://0pointer.de/public/libatasmart-0.19.tar.xz",
|
||||
"sha256" : "61f0ea345f63d28ab2ff0dc352c22271661b66bf09642db3a4049ac9dbdb0f8d"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "udisks",
|
||||
"buildsystem" : "autotools",
|
||||
"config-opts" : [
|
||||
"--disable-introspection",
|
||||
"--disable-lvm2",
|
||||
"--with-systemdsystemunitdir=/app/lib/systemd/system",
|
||||
"--with-tmpfilesdir=/app/lib/tmpfiles.d"
|
||||
],
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "git",
|
||||
"url" : "https://github.com/storaged-project/udisks.git"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "gnome-backgrounds",
|
||||
"buildsystem" : "meson",
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "git",
|
||||
"url" : "https://gitlab.gnome.org/GNOME/gnome-backgrounds.git"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "gnome-control-center",
|
||||
"buildsystem" : "meson",
|
||||
"sources" : [
|
||||
{
|
||||
"type" : "git",
|
||||
"url" : "https://gitlab.gnome.org/GNOME/gnome-control-center.git"
|
||||
}
|
||||
],
|
||||
"config-opts" : [
|
||||
"-Dtracing=true"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
update_from_gsd = find_program('meson/update-from-gsd.sh')
|
||||
update_from_gsd_in = files('meson/update-from-gsd.in')
|
||||
update_from_nma_in = files('meson/update-from-nma.in')
|
||||
|
||||
meson.add_install_script('meson/meson_post_install.py', control_center_datadir)
|
||||
@@ -1,15 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
gsettingsschemadir = os.path.join(sys.argv[1], 'glib-2.0', 'schemas')
|
||||
icondir = os.path.join(sys.argv[1], 'icons', 'hicolor')
|
||||
|
||||
if not os.environ.get('DESTDIR'):
|
||||
print('Compiling gsettings schemas...')
|
||||
subprocess.call(['glib-compile-schemas', gsettingsschemadir])
|
||||
|
||||
print('Update icon cache...')
|
||||
subprocess.call(['gtk-update-icon-cache', '-f', '-t', icondir])
|
||||
@@ -1,10 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
cd @working_dir@
|
||||
|
||||
export FILES="@source_files@"
|
||||
export DIR="@input_dir@"
|
||||
|
||||
@program@ &&
|
||||
git add @source_files@ &&
|
||||
git commit -m "@source_message@"
|
||||
@@ -1,26 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
function die() {
|
||||
echo $*
|
||||
exit 1
|
||||
}
|
||||
|
||||
if test -z "$DIR"; then
|
||||
echo "Must set DIR"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if test -z "$FILES"; then
|
||||
echo "Must set FILES"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
for FILE in $FILES; do
|
||||
if cmp -s $DIR/$FILE $FILE; then
|
||||
echo "File $FILE is unchanged"
|
||||
else
|
||||
cp $DIR/$FILE $FILE || die "Could not move $DIR/$FILE to $FILE"
|
||||
echo "Updated $FILE"
|
||||
git add $FILE
|
||||
fi
|
||||
done
|
||||
@@ -1,19 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
cd @working_dir@
|
||||
|
||||
export FILES="@source_files@"
|
||||
export DIR="@input_dir@"
|
||||
|
||||
@program@ &&
|
||||
patch -p4 < @source_patch@ &&
|
||||
git add @source_files@ &&
|
||||
git commit -m "@source_message@"
|
||||
|
||||
export FILES="@resource_data@"
|
||||
export DIR="@input_dir@"
|
||||
|
||||
@program@ &&
|
||||
patch -p4 < @resource_patch@ &&
|
||||
git add @resource_data@ &&
|
||||
git commit -m "@resource_message@"
|
||||
@@ -1,453 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
viewBox="0 0 128 128"
|
||||
style="display:inline;enable-background:new"
|
||||
version="1.0"
|
||||
id="svg11300"
|
||||
height="128"
|
||||
width="128">
|
||||
<title
|
||||
id="title4162">Adwaita Icon Template</title>
|
||||
<defs
|
||||
id="defs3">
|
||||
<linearGradient
|
||||
id="linearGradient1025">
|
||||
<stop
|
||||
id="stop1021"
|
||||
offset="0"
|
||||
style="stop-color:#9a9996;stop-opacity:1" />
|
||||
<stop
|
||||
id="stop1023"
|
||||
offset="1"
|
||||
style="stop-color:#77767b;stop-opacity:1" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient1069">
|
||||
<stop
|
||||
id="stop1065"
|
||||
offset="0"
|
||||
style="stop-color:#d5d3cf;stop-opacity:1" />
|
||||
<stop
|
||||
id="stop1067"
|
||||
offset="1"
|
||||
style="stop-color:#949390;stop-opacity:1" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient1036">
|
||||
<stop
|
||||
id="stop1032"
|
||||
offset="0"
|
||||
style="stop-color:#d5d3cf;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop1034"
|
||||
offset="1"
|
||||
style="stop-color:#f6f5f4;stop-opacity:1" />
|
||||
</linearGradient>
|
||||
<clipPath
|
||||
id="clipPath4929-3"
|
||||
clipPathUnits="userSpaceOnUse">
|
||||
<circle
|
||||
transform="rotate(90)"
|
||||
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;color-interpolation:sRGB;color-interpolation-filters:linearRGB;fill:#ad7fa8;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.0071969;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
id="circle4931-6"
|
||||
cx="908"
|
||||
cy="-2632"
|
||||
r="28.000305" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4967-7"
|
||||
clipPathUnits="userSpaceOnUse">
|
||||
<circle
|
||||
r="28.000305"
|
||||
cy="-2702"
|
||||
cx="980"
|
||||
id="circle4969-5"
|
||||
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;color-interpolation:sRGB;color-interpolation-filters:linearRGB;fill:#ede3ec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.0071969;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
transform="rotate(90)" />
|
||||
</clipPath>
|
||||
<linearGradient
|
||||
y2="236"
|
||||
x2="96"
|
||||
y1="236"
|
||||
x1="32"
|
||||
gradientTransform="translate(171.99999,-299.99999)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient1099"
|
||||
xlink:href="#linearGradient1036" />
|
||||
<radialGradient
|
||||
r="32"
|
||||
fy="-76"
|
||||
fx="-244"
|
||||
cy="-76"
|
||||
cx="-244"
|
||||
gradientTransform="matrix(0.88333331,0,0,0.88333331,-27.533334,-7.4666741)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="radialGradient1103"
|
||||
xlink:href="#linearGradient1069" />
|
||||
<linearGradient
|
||||
gradientUnits="userSpaceOnUse"
|
||||
y2="232"
|
||||
x2="64"
|
||||
y1="262.5"
|
||||
x1="64"
|
||||
id="linearGradient1027"
|
||||
xlink:href="#linearGradient1025" />
|
||||
</defs>
|
||||
<metadata
|
||||
id="metadata4">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>GNOME Design Team</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
<dc:source />
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
|
||||
<dc:title>Adwaita Icon Template</dc:title>
|
||||
<dc:subject>
|
||||
<rdf:Bag />
|
||||
</dc:subject>
|
||||
<dc:date />
|
||||
<dc:rights>
|
||||
<cc:Agent>
|
||||
<dc:title />
|
||||
</cc:Agent>
|
||||
</dc:rights>
|
||||
<dc:publisher>
|
||||
<cc:Agent>
|
||||
<dc:title />
|
||||
</cc:Agent>
|
||||
</dc:publisher>
|
||||
<dc:identifier />
|
||||
<dc:relation />
|
||||
<dc:language />
|
||||
<dc:coverage />
|
||||
<dc:description />
|
||||
<dc:contributor>
|
||||
<cc:Agent>
|
||||
<dc:title />
|
||||
</cc:Agent>
|
||||
</dc:contributor>
|
||||
</cc:Work>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#Reproduction" />
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#Distribution" />
|
||||
<cc:requires
|
||||
rdf:resource="http://creativecommons.org/ns#Notice" />
|
||||
<cc:requires
|
||||
rdf:resource="http://creativecommons.org/ns#Attribution" />
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
|
||||
<cc:requires
|
||||
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
transform="translate(0,-172)"
|
||||
style="display:inline"
|
||||
id="layer1">
|
||||
<g
|
||||
style="display:none"
|
||||
id="layer2">
|
||||
<text
|
||||
id="context"
|
||||
y="145.34863"
|
||||
x="7.906189"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11.77367783px;line-height:125%;font-family:Cantarell;-inkscape-font-specification:'Cantarell, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.64332354;enable-background:new"
|
||||
xml:space="preserve"><tspan
|
||||
style="stroke-width:0.64332354"
|
||||
y="145.34863"
|
||||
x="7.906189"
|
||||
id="tspan2716">apps</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:11.77367783px;line-height:125%;font-family:Cantarell;-inkscape-font-specification:'Cantarell, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.64332354;enable-background:new"
|
||||
x="7.5258484"
|
||||
y="161.94572"
|
||||
id="text3021"><tspan
|
||||
style="stroke-width:0.64332354"
|
||||
id="tspan3023"
|
||||
x="7.5258484"
|
||||
y="161.94572">org.gnome.Settings</tspan></text>
|
||||
<g
|
||||
id="g12027"
|
||||
transform="matrix(7.9911709,0,0,8.0036407,-167.79091,-4846.0776)"
|
||||
style="display:inline;fill:#000000;enable-background:new" />
|
||||
<g
|
||||
transform="translate(-24.000009,23.999992)"
|
||||
style="display:inline;fill:none;fill-opacity:0.25098039;stroke:#a579b3;stroke-opacity:1;enable-background:new"
|
||||
id="g883" />
|
||||
<g
|
||||
transform="translate(-24.000009,23.999992)"
|
||||
style="display:inline;fill:none;fill-opacity:0.25098039;stroke:#a579b3;stroke-opacity:1;enable-background:new"
|
||||
id="g900" />
|
||||
<rect
|
||||
y="172"
|
||||
x="0"
|
||||
height="128"
|
||||
width="128"
|
||||
id="rect13805"
|
||||
style="display:inline;overflow:visible;visibility:visible;fill:#f0f0f0;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;marker:none;enable-background:accumulate" />
|
||||
<g
|
||||
transform="matrix(0.25,0,0,0.25,-9.3066406e-6,224.99999)"
|
||||
id="g1168"
|
||||
style="display:inline;enable-background:new">
|
||||
<rect
|
||||
style="opacity:0.1;fill:#2864b0;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
|
||||
id="rect1110"
|
||||
width="319.99979"
|
||||
height="448"
|
||||
x="96"
|
||||
y="-180"
|
||||
rx="32"
|
||||
ry="32" />
|
||||
<rect
|
||||
style="display:inline;opacity:0.1;fill:#2864b0;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;enable-background:new"
|
||||
id="rect1110-8"
|
||||
width="416"
|
||||
height="416"
|
||||
x="48"
|
||||
y="-164"
|
||||
rx="32"
|
||||
ry="32" />
|
||||
<rect
|
||||
style="display:inline;opacity:0.1;fill:#2864b0;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;enable-background:new"
|
||||
id="rect1110-8-9"
|
||||
width="448"
|
||||
height="320"
|
||||
x="32"
|
||||
y="-116"
|
||||
rx="32"
|
||||
ry="32" />
|
||||
<circle
|
||||
style="opacity:0.1;fill:#2864b0;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
|
||||
id="path1142"
|
||||
r="240"
|
||||
cy="44"
|
||||
cx="256" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
style="display:inline"
|
||||
id="layer9">
|
||||
<g
|
||||
transform="translate(140,2)"
|
||||
id="g1084"
|
||||
style="fill:#77767b">
|
||||
<rect
|
||||
ry="8"
|
||||
rx="8"
|
||||
y="176"
|
||||
x="-88"
|
||||
height="24"
|
||||
width="24"
|
||||
id="rect1068"
|
||||
style="display:inline;opacity:1;vector-effect:none;fill:#77767b;fill-opacity:1;stroke:none;stroke-width:0.53571427;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;enable-background:new" />
|
||||
<rect
|
||||
style="display:inline;opacity:1;vector-effect:none;fill:#77767b;fill-opacity:1;stroke:none;stroke-width:0.53571427;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;enable-background:new"
|
||||
id="rect1070"
|
||||
width="24"
|
||||
height="24"
|
||||
x="-88"
|
||||
y="272"
|
||||
rx="8"
|
||||
ry="8" />
|
||||
<rect
|
||||
transform="rotate(-45)"
|
||||
style="display:inline;opacity:1;vector-effect:none;fill:#77767b;fill-opacity:1;stroke:none;stroke-width:0.53571427;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;enable-background:new"
|
||||
id="rect1072"
|
||||
width="24"
|
||||
height="24"
|
||||
x="-232.61731"
|
||||
y="53.137085"
|
||||
rx="8"
|
||||
ry="8" />
|
||||
<rect
|
||||
transform="rotate(-45)"
|
||||
ry="8"
|
||||
rx="8"
|
||||
y="149.13708"
|
||||
x="-232.61731"
|
||||
height="24"
|
||||
width="24"
|
||||
id="rect1074"
|
||||
style="display:inline;opacity:1;vector-effect:none;fill:#77767b;fill-opacity:1;stroke:none;stroke-width:0.53571427;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;enable-background:new" />
|
||||
<rect
|
||||
transform="rotate(-90)"
|
||||
ry="8"
|
||||
rx="8"
|
||||
y="-136"
|
||||
x="-248"
|
||||
height="24"
|
||||
width="24"
|
||||
id="rect1076"
|
||||
style="display:inline;opacity:1;vector-effect:none;fill:#77767b;fill-opacity:1;stroke:none;stroke-width:0.53571427;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;enable-background:new" />
|
||||
<rect
|
||||
transform="rotate(-90)"
|
||||
style="display:inline;opacity:1;vector-effect:none;fill:#77767b;fill-opacity:1;stroke:none;stroke-width:0.53571427;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;enable-background:new"
|
||||
id="rect1078"
|
||||
width="24"
|
||||
height="24"
|
||||
x="-248"
|
||||
y="-40"
|
||||
rx="8"
|
||||
ry="8" />
|
||||
<rect
|
||||
transform="rotate(-135)"
|
||||
style="display:inline;opacity:1;vector-effect:none;fill:#77767b;fill-opacity:1;stroke:none;stroke-width:0.53571427;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;enable-background:new"
|
||||
id="rect1080"
|
||||
width="24"
|
||||
height="24"
|
||||
x="-125.13708"
|
||||
y="-280.61731"
|
||||
rx="8"
|
||||
ry="8" />
|
||||
<rect
|
||||
transform="rotate(-135)"
|
||||
ry="8"
|
||||
rx="8"
|
||||
y="-184.61731"
|
||||
x="-125.13708"
|
||||
height="24"
|
||||
width="24"
|
||||
id="rect1082"
|
||||
style="display:inline;opacity:1;vector-effect:none;fill:#77767b;fill-opacity:1;stroke:none;stroke-width:0.53571427;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;enable-background:new" />
|
||||
</g>
|
||||
<g
|
||||
id="g1166" />
|
||||
<g
|
||||
transform="rotate(45,64,236)"
|
||||
id="g1172" />
|
||||
<g
|
||||
id="g1178"
|
||||
transform="rotate(90,64,236)" />
|
||||
<g
|
||||
transform="translate(140)"
|
||||
style="fill:#f6f5f4"
|
||||
id="g1066">
|
||||
<rect
|
||||
style="display:inline;opacity:1;vector-effect:none;fill:#f6f5f4;fill-opacity:1;stroke:none;stroke-width:0.53571427;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;enable-background:new"
|
||||
id="rect991-5-3"
|
||||
width="24"
|
||||
height="24"
|
||||
x="-88"
|
||||
y="176"
|
||||
rx="8"
|
||||
ry="8" />
|
||||
<rect
|
||||
ry="8"
|
||||
rx="8"
|
||||
y="272"
|
||||
x="-88"
|
||||
height="24"
|
||||
width="24"
|
||||
id="rect1023"
|
||||
style="display:inline;opacity:1;vector-effect:none;fill:#f6f5f4;fill-opacity:1;stroke:none;stroke-width:0.53571427;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;enable-background:new" />
|
||||
<rect
|
||||
ry="8"
|
||||
rx="8"
|
||||
y="53.137085"
|
||||
x="-232.61731"
|
||||
height="24"
|
||||
width="24"
|
||||
id="rect1029"
|
||||
style="display:inline;opacity:1;vector-effect:none;fill:#f6f5f4;fill-opacity:1;stroke:none;stroke-width:0.53571427;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;enable-background:new"
|
||||
transform="rotate(-45)" />
|
||||
<rect
|
||||
style="display:inline;opacity:1;vector-effect:none;fill:#f6f5f4;fill-opacity:1;stroke:none;stroke-width:0.53571427;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;enable-background:new"
|
||||
id="rect1031"
|
||||
width="24"
|
||||
height="24"
|
||||
x="-232.61731"
|
||||
y="149.13708"
|
||||
rx="8"
|
||||
ry="8"
|
||||
transform="rotate(-45)" />
|
||||
<rect
|
||||
style="display:inline;opacity:1;vector-effect:none;fill:#f6f5f4;fill-opacity:1;stroke:none;stroke-width:0.53571427;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;enable-background:new"
|
||||
id="rect1035"
|
||||
width="24"
|
||||
height="24"
|
||||
x="-248"
|
||||
y="-136"
|
||||
rx="8"
|
||||
ry="8"
|
||||
transform="rotate(-90)" />
|
||||
<rect
|
||||
ry="8"
|
||||
rx="8"
|
||||
y="-40"
|
||||
x="-248"
|
||||
height="24"
|
||||
width="24"
|
||||
id="rect1037"
|
||||
style="display:inline;opacity:1;vector-effect:none;fill:#f6f5f4;fill-opacity:1;stroke:none;stroke-width:0.53571427;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;enable-background:new"
|
||||
transform="rotate(-90)" />
|
||||
<rect
|
||||
ry="8"
|
||||
rx="8"
|
||||
y="-280.61731"
|
||||
x="-125.13708"
|
||||
height="24"
|
||||
width="24"
|
||||
id="rect1041"
|
||||
style="display:inline;opacity:1;vector-effect:none;fill:#f6f5f4;fill-opacity:1;stroke:none;stroke-width:0.53571427;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;enable-background:new"
|
||||
transform="rotate(-135)" />
|
||||
<rect
|
||||
style="display:inline;opacity:1;vector-effect:none;fill:#f6f5f4;fill-opacity:1;stroke:none;stroke-width:0.53571427;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;enable-background:new"
|
||||
id="rect1043"
|
||||
width="24"
|
||||
height="24"
|
||||
x="-125.13708"
|
||||
y="-184.61731"
|
||||
rx="8"
|
||||
ry="8"
|
||||
transform="rotate(-135)" />
|
||||
</g>
|
||||
<ellipse
|
||||
style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:url(#linearGradient1027);stroke-width:24;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;enable-background:new"
|
||||
id="ellipse1093"
|
||||
cx="64"
|
||||
cy="238"
|
||||
rx="36"
|
||||
ry="36.000008" />
|
||||
<ellipse
|
||||
ry="38.000011"
|
||||
rx="38"
|
||||
cy="236.00002"
|
||||
cx="64"
|
||||
id="path1023-6-6"
|
||||
style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#f6f5f4;stroke-width:20.00000191;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;enable-background:new" />
|
||||
<circle
|
||||
transform="matrix(0,-1,-1,0,0,0)"
|
||||
r="26.5"
|
||||
cy="-64"
|
||||
cx="-236"
|
||||
id="circle1101"
|
||||
style="opacity:1;fill:none;fill-opacity:1;stroke:url(#radialGradient1103);stroke-width:5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<circle
|
||||
style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient1099);stroke-width:7.99999905;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="circle1097"
|
||||
cx="236"
|
||||
cy="-64"
|
||||
r="32"
|
||||
transform="rotate(90)" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 20 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16">
|
||||
<g fill="#2e3436">
|
||||
<path d="M7.467 0h1.066C9.124 0 9.6.476 9.6 1.067v1.066c0 .591-.476 1.067-1.067 1.067H7.467C6.876 3.2 6.4 2.724 6.4 2.133V1.067C6.4.476 6.876 0 7.467 0zM7.467 12.8h1.066c.591 0 1.067.476 1.067 1.067v1.066C9.6 15.524 9.124 16 8.533 16H7.467c-.591 0-1.067-.476-1.067-1.067v-1.066c0-.591.476-1.067 1.067-1.067zM1.966 2.72l.754-.754a1.064 1.064 0 0 1 1.509 0l.754.754c.418.418.418 1.09 0 1.509l-.754.754a1.064 1.064 0 0 1-1.509 0l-.754-.754a1.064 1.064 0 0 1 0-1.509zM11.017 11.771l.754-.754a1.064 1.064 0 0 1 1.509 0l.754.754c.418.418.418 1.09 0 1.509l-.754.754a1.064 1.064 0 0 1-1.509 0l-.754-.754a1.064 1.064 0 0 1 0-1.509zM0 8.533V7.467C0 6.876.476 6.4 1.067 6.4h1.066c.591 0 1.067.476 1.067 1.067v1.066c0 .591-.476 1.067-1.067 1.067H1.067C.476 9.6 0 9.124 0 8.533zM12.8 8.533V7.467c0-.591.476-1.067 1.067-1.067h1.066c.591 0 1.067.476 1.067 1.067v1.066c0 .591-.476 1.067-1.067 1.067h-1.066c-.591 0-1.067-.476-1.067-1.067zM2.72 14.034l-.754-.754a1.064 1.064 0 0 1 0-1.509l.754-.754a1.064 1.064 0 0 1 1.509 0l.754.754c.418.418.418 1.09 0 1.509l-.754.754a1.064 1.064 0 0 1-1.509 0zM11.771 4.983l-.754-.754a1.064 1.064 0 0 1 0-1.509l.754-.754a1.064 1.064 0 0 1 1.509 0l.754.754c.418.418.418 1.09 0 1.509l-.754.754a1.064 1.064 0 0 1-1.509 0z" style="marker:none"/>
|
||||
<path d="M8 1.5C4.428 1.5 1.5 4.428 1.5 8s2.928 6.5 6.5 6.5 6.5-2.928 6.5-6.5S11.572 1.5 8 1.5zm0 3c1.95 0 3.5 1.55 3.5 3.5S9.95 11.5 8 11.5 4.5 9.95 4.5 8 6.05 4.5 8 4.5z" style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;shape-padding:0;isolation:auto;mix-blend-mode:normal;marker:none" color="#000" font-weight="400" font-family="sans-serif" white-space="normal" overflow="visible"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.0 KiB |
@@ -1,4 +0,0 @@
|
||||
install_subdir(
|
||||
'hicolor',
|
||||
install_dir : control_center_icondir
|
||||
)
|
||||
@@ -1,212 +0,0 @@
|
||||
# Contributing
|
||||
|
||||
When contributing to the development of GNOME Settings, please first discuss the change you wish to
|
||||
make via issue, email, or any other method with the maintainers before making a change.
|
||||
|
||||
Please note we have a Code of Conduct, please follow it in all your interactions with the project.
|
||||
|
||||
## Pull Request Process
|
||||
|
||||
1. Create a fork in GitLab and push your work to there
|
||||
2. Open a Merge Request
|
||||
1. Always allow maintainer edits
|
||||
2. Mark the Merge Request as WIP if your work is not ready to be reviewed
|
||||
3. Assign the correct maintainer to the Merge Request (see [`MAINTAINERS.md`][maintainers] to select
|
||||
the correct maintainer)
|
||||
4. Format commit messages as follows:
|
||||
```
|
||||
component: <summary>
|
||||
|
||||
A paragraph explaining the problem and its context.
|
||||
|
||||
Another one explaining how you solved that.
|
||||
|
||||
<link to the issue>
|
||||
```
|
||||
4. You may merge the pull request in once you have the sign-off of the maintainers, or if you
|
||||
do not have permission to do that, you may request the second reviewer to merge it for you.
|
||||
|
||||
## Code of Conduct
|
||||
|
||||
GNOME Settings is a project developed based on GNOME Code of Conduct and GitHub's community
|
||||
guidelines. You can read it below:
|
||||
|
||||
### Summary
|
||||
|
||||
GNOME creates software for a better world. We achieve this by behaving well towards
|
||||
each other.
|
||||
|
||||
Therefore this document suggests what we consider ideal behaviour, so you know what
|
||||
to expect when getting involved in GNOME. This is who we are and what we want to be.
|
||||
There is no official enforcement of these principles, and this should not be interpreted
|
||||
like a legal document.
|
||||
|
||||
### Advice
|
||||
|
||||
* **Be respectful and considerate**: Disagreement is no excuse for poor behaviour or personal
|
||||
attacks. Remember that a community where people feel uncomfortable is not a productive one.
|
||||
|
||||
* **Be patient and generous**: If someone asks for help it is because they need it. Do politely
|
||||
suggest specific documentation or more appropriate venues where appropriate, but avoid
|
||||
aggressive or vague responses such as "RTFM".
|
||||
|
||||
* **Assume people mean well**: Remember that decisions are often a difficult choice between
|
||||
competing priorities. If you disagree, please do so politely. If something seems outrageous,
|
||||
check that you did not misinterpret it. Ask for clarification, but do not assume the worst.
|
||||
|
||||
* **Try to be concise**: Avoid repeating what has been said already. Making a conversation larger
|
||||
makes it difficult to follow, and people often feel personally attacked if they receive multiple
|
||||
messages telling them the same thing.
|
||||
|
||||
|
||||
In the interest of fostering an open and welcoming environment, we as
|
||||
contributors and maintainers pledge to making participation in our project and
|
||||
our community a harassment-free experience for everyone, regardless of age, body
|
||||
size, disability, ethnicity, gender identity and expression, level of experience,
|
||||
nationality, personal appearance, race, religion, or sexual identity and
|
||||
orientation.
|
||||
|
||||
### Communication Guideline
|
||||
|
||||
It is of ultimate importance to maintain a community in which everyone feels free to express
|
||||
themselves, review, and comment on each others ideas, both technical and otherwise. Correspondingly,
|
||||
an environment in which individuals are silenced, berated, or are otherwise afraid to speak up is
|
||||
unlikely to foster fruitful dialog.
|
||||
|
||||
Everyone interacting with members of the community should always keep in mind the asymmetry of
|
||||
communication: while your interaction with community members (and in particular, maintainers and
|
||||
long-term contributors) may be singular and fleeting, these members generally interact with a high
|
||||
volume of individuals each day. Before writing a comment, opening a new issue, or engaging as part
|
||||
of any forum or IRC discussion, please take a moment to appreciate that fact.
|
||||
|
||||
While communicating, it is expected that all involved participants be respectful and civil at all
|
||||
times and refrain from personal attacks.
|
||||
|
||||
#### Communication Rules
|
||||
|
||||
The following behavior will not be tolerated on any occasion:
|
||||
|
||||
* **Threats of violence**: You may not threaten violence towards others or use the site to organize,
|
||||
promote, or incite acts of real-world violence or terrorism. Think carefully about the words you
|
||||
use, the images you post, and even the software you write, and how they may be interpreted by
|
||||
others. Even if you mean something as a joke, it might not be received that way. If you think
|
||||
that someone else might interpret the content you post as a threat or as promoting violence or
|
||||
terrorism, stop. Don't post it. In extraordinary cases, we may report threats of violence to law
|
||||
enforcement if we think there may be a genuine risk of physical harm or a threat to public safety.
|
||||
|
||||
* **Hate speech and discrimination**: While it is not forbidden to broach topics such as age, body
|
||||
size, disability, ethnicity, gender identity and expression, level of experience, nationality,
|
||||
personal appearance, race, religion, or sexual identity and orientation, we do not tolerate speech
|
||||
that attacks a person or group of people on the basis of who they are. When approached in an
|
||||
aggressive or insulting manner these (and other) sensitive topics can make others feel unwelcome,
|
||||
or perhaps even unsafe. While there's always the potential for misunderstandings, we expect our
|
||||
community members to remain respectful and civil when discussing sensitive topics.
|
||||
|
||||
* **Bullying and harassment**: We do not tolerate bullying, harassment, or any other means of
|
||||
habitual badgering or intimidation targeted at a specific person or group of people. In general,
|
||||
if your actions are unwanted and you cease to terminate this form of engagement, there is a good
|
||||
chance that your behavior will be classified as bullying or harassment.
|
||||
|
||||
* **Impersonation**: You may not seek to mislead others as to your identity by copying another
|
||||
person's avatar, posting content under their email address, using a similar username, or otherwise
|
||||
posing as someone else. Impersonation and identity theft is a form of harassment.
|
||||
|
||||
* **Doxxing and invasion of privacy**: Don't post other people's personal information, such as phone
|
||||
numbers, private email addresses, physical addresses, credit card numbers, Social Security/National
|
||||
Identity numbers, or passwords. Depending on the context, we may consider such behavior to be an
|
||||
invasion of privacy, with particularly egregious examples potentially escalating to the point of
|
||||
legal action, such as when the released material presents a safety risk to the subject.
|
||||
|
||||
* **Obscene content**: In essence, do not post pornography, gore, or any other depiction of violence.
|
||||
|
||||
#### General Advice
|
||||
|
||||
The following advice will help to increase the efficiency of communication with community members:
|
||||
|
||||
* Do not post "me too" comments. Use the GitLab reactions instead, e.g. “thumbs up” or “thumbs down”.
|
||||
* Avoid adding priority, time, or relevance hints if you are not involved with the development of
|
||||
the application. For example, `“This is an urgent issue”`, or `“This should be fixed now”`, or
|
||||
even `“The majority of users need this feature”`.
|
||||
* Do not use passive-aggressive communication tactics.
|
||||
* When reporting technical problems with the application, such as misbehavior or crashes, focus on
|
||||
sharing as many details as possible and avoid adding non-technical information to it.
|
||||
|
||||
An example of a **good** issue report:
|
||||
|
||||
```
|
||||
GNOME Settings crashes when opening the Wi-Fi panel with 3+ Wi-Fi adapters
|
||||
|
||||
Steps to reproduce (assuming 3+ Wi-Fi adapters are present):
|
||||
|
||||
1. Open GNOME Settings
|
||||
2. Select the Wi-Fi panel
|
||||
3. Observe the crash
|
||||
|
||||
This does not happen with 2 or less adapters. Here is a backtrace of the
|
||||
crash: backtrace.txt
|
||||
```
|
||||
|
||||
In contrast, here is an example of a **bad** issue report:
|
||||
|
||||
```
|
||||
GNOME Settings crashed while I was trying to connect to the internet. How can such
|
||||
a thing happen and nobody notice? Did you not test it before releasing it?
|
||||
|
||||
This should be fixed as quick as possible!
|
||||
```
|
||||
|
||||
* When asking for new features, try and add as much information as possible to justify its relevance,
|
||||
why should it not be implemented as an auxiliary program, what problems it would solve, and offer
|
||||
suggestions about how you think it should be implemented.
|
||||
|
||||
Example of a **good** feature request:
|
||||
|
||||
```
|
||||
GNOME Settings needs to expose IPv6 options
|
||||
|
||||
As of now, the connection editor dialog does not allow editing various IPv6
|
||||
options. This is relevant because without some of these options, it is not
|
||||
possible to have a valid IPv6 configuration and, consequently, not have access
|
||||
to various websites and services.
|
||||
|
||||
The list of missing configurations that are essential is:
|
||||
|
||||
* <Feature A>
|
||||
* <Feature B>
|
||||
|
||||
Optionally, the following configurations can also be added:
|
||||
|
||||
* <Feature C>
|
||||
* <Feature D>
|
||||
|
||||
Here is a quick sketch I have made showing how I think these options
|
||||
should be exposed as a user interface: sketch.png.
|
||||
```
|
||||
|
||||
Example of a **bad** feature request:
|
||||
|
||||
```
|
||||
Merge GNOME Tweaks in GNOME Settings
|
||||
|
||||
The options in GNOME Tweaks are absolutely essential to the majority of us
|
||||
users. Why was it not merged already? This is an urgent issue and should
|
||||
have been addressed years ago. You should allocate all your resources on
|
||||
merging those two applications.
|
||||
```
|
||||
|
||||
#### What happens if someone breaks these rules or guidelines?
|
||||
|
||||
Actions that may be taken in response to an abusive comment include but are not limited to:
|
||||
|
||||
* Content removal (when breaking any of the guidelines or rules)
|
||||
* Content blocking (when breaking any of the guidelines or rules)
|
||||
* Formal report to the Code of Conduct Committee (when breaking any of the rules)
|
||||
|
||||
### Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
|
||||
available at [http://contributor-covenant.org/version/1/4][version]
|
||||
|
||||
[homepage]: http://contributor-covenant.org
|
||||
[version]: http://contributor-covenant.org/version/1/4/
|
||||
[maintainers]: https://gitlab.gnome.org/GNOME/gnome-control-center/blob/master/docs/MAINTAINERS.md
|
||||
291
docs/HACKING.md
291
docs/HACKING.md
@@ -1,291 +0,0 @@
|
||||
# Style
|
||||
|
||||
GNOME Settings has a coding style based on GTK Coding Style, but with a few more
|
||||
rules. Please read them carefully and, if in doubt, ask a maintainer for directions.
|
||||
|
||||
## General
|
||||
|
||||
The most important rule is: **see the surrounding code, and copy its style**.
|
||||
|
||||
That said, GNOME Settings assumes:
|
||||
|
||||
* 2 spaces of indentation
|
||||
* 120 columns of line width
|
||||
* Newline before `{`
|
||||
|
||||
Another rule that applies to function declarations is that all parameters are
|
||||
aligned by the last '*'. There are plenty of examples below.
|
||||
|
||||
## Comments
|
||||
|
||||
Comment blocks should be formatted as following:
|
||||
|
||||
```c
|
||||
/* Single line comment */
|
||||
|
||||
/* Multiline comments start at the first line of the comment block,
|
||||
* but have the closing slash a line after. Every line starts with
|
||||
* an asterisk that is aligned with every the rest of the block.
|
||||
*/
|
||||
```
|
||||
|
||||
## Conditionals
|
||||
|
||||
Conditionals should either be all in one line, or one per line. Newlines inside
|
||||
conditionals are aligned by the last parenthesis.
|
||||
|
||||
|
||||
Some examples below:
|
||||
|
||||
```c
|
||||
// Single line if
|
||||
if (a || b || (c && d))
|
||||
return;
|
||||
|
||||
// Multiline if with nested parenthesis
|
||||
if (long_boolean_variable_used_in_this_condition_a ||
|
||||
long_boolean_variable_used_in_this_condition_b ||
|
||||
(long_boolean_variable_used_in_this_condition_c &&
|
||||
long_boolean_variable_used_in_this_condition_d))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Another single line example with do {} while (...)
|
||||
do
|
||||
{
|
||||
/* something */
|
||||
}
|
||||
while (a || b || (c && d));
|
||||
```
|
||||
|
||||
## Structs and Enums
|
||||
|
||||
Structures and enums are formatted as following:
|
||||
|
||||
```c
|
||||
struct _FooBar
|
||||
{
|
||||
guint32 field_one;
|
||||
gchar *text;
|
||||
};
|
||||
|
||||
typedef struct
|
||||
{
|
||||
FooParent parent;
|
||||
|
||||
guint32 field_one;
|
||||
gchar *text;
|
||||
|
||||
struct
|
||||
{
|
||||
CustomType *something;
|
||||
guint something_else;
|
||||
} inner_struct;
|
||||
|
||||
gboolean flag : 1;
|
||||
} FooBar;
|
||||
|
||||
enum
|
||||
{
|
||||
FIRST,
|
||||
SECOND,
|
||||
LAST,
|
||||
};
|
||||
|
||||
typedef enum
|
||||
{
|
||||
FOO_BAR_FIRST,
|
||||
FOO_BAR_SECOND,
|
||||
FOO_BAR_LAST,
|
||||
} FooEnumBar;
|
||||
```
|
||||
|
||||
## Header (.h) files
|
||||
|
||||
It is organized by the following structure:
|
||||
|
||||
1. GPL header
|
||||
2. Local includes
|
||||
3. System includes
|
||||
4. `G_BEGIN_DECLS`
|
||||
5. `#defines`
|
||||
6. `G_DECLARE_{FINAL,DERIVABLE}_TYPE`
|
||||
7. Public API
|
||||
8. `G_END_DECLS`
|
||||
|
||||
The following style rules apply:
|
||||
|
||||
* The '*' and the type come together, without any spaces in between.
|
||||
* Function names are aligned by the widest return value.
|
||||
* Parenthesis after function name is aligned by the widest function name
|
||||
* The last '*' in parameters are aligned by the widest parameter type
|
||||
* No new line at the end of the file
|
||||
|
||||
As an example, this is how a header file should look like (extracted from
|
||||
the `cc-object-storage.h` file):
|
||||
|
||||
```c
|
||||
/* cc-object-storage.h
|
||||
*
|
||||
* Copyright 2018 Georges Basile Stavracas Neto <georges.stavracas@gmail.com>
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <glib-object.h>
|
||||
#include <gio/gio.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
/* Default storage keys */
|
||||
#define CC_OBJECT_NMCLIENT "CcObjectStorage::nm-client"
|
||||
|
||||
|
||||
#define CC_TYPE_OBJECT_STORAGE (cc_object_storage_get_type())
|
||||
|
||||
G_DECLARE_FINAL_TYPE (CcObjectStorage, cc_object_storage, CC, OBJECT_STORAGE, GObject)
|
||||
|
||||
gboolean cc_object_storage_has_object (const gchar *key);
|
||||
|
||||
void cc_object_storage_add_object (const gchar *key,
|
||||
gpointer object);
|
||||
|
||||
gpointer cc_object_storage_get_object (const gchar *key);
|
||||
|
||||
gpointer cc_object_storage_create_dbus_proxy_sync (GBusType bus_type,
|
||||
GDBusProxyFlags flags,
|
||||
const gchar *name,
|
||||
const gchar *path,
|
||||
const gchar *interface,
|
||||
GCancellable *cancellable,
|
||||
GError **error);
|
||||
|
||||
void cc_object_storage_create_dbus_proxy (GBusType bus_type,
|
||||
GDBusProxyFlags flags,
|
||||
const gchar *name,
|
||||
const gchar *path,
|
||||
const gchar *interface,
|
||||
GCancellable *cancellable,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
|
||||
G_END_DECLS
|
||||
```
|
||||
|
||||
## Source code
|
||||
|
||||
The source file keeps an order of methods. The order will be as following:
|
||||
|
||||
1. GPL header
|
||||
2. Structures
|
||||
3. Function prototypes
|
||||
4. G_DEFINE_TYPE()
|
||||
5. Enums
|
||||
6. Static variables
|
||||
7. Auxiliary methods
|
||||
8. Callbacks
|
||||
9. Interface implementations
|
||||
10. Parent class overrides
|
||||
11. class_init and init
|
||||
12. Public API
|
||||
|
||||
### Structures
|
||||
|
||||
The structures must have the first pointer asterisk aligned one space after the
|
||||
widest type name. For example:
|
||||
|
||||
```c
|
||||
typedef struct
|
||||
{
|
||||
GBusType bus_type;
|
||||
GDBusProxyFlags flags;
|
||||
gchar *name;
|
||||
gchar *path;
|
||||
gchar *interface;
|
||||
gboolean cached;
|
||||
} TaskData;
|
||||
|
||||
```
|
||||
|
||||
### Function Prototypes
|
||||
|
||||
Function prototypes must be formatted just like in header files.
|
||||
|
||||
### Auxiliary Methods
|
||||
|
||||
Auxiliary method names must have a verb in the dictionary form, and should always
|
||||
perform an action over something. They don't have the `cc_` prefix. For example:
|
||||
|
||||
```c
|
||||
static void
|
||||
execute_something_on_data (Foo *data,
|
||||
Bar *bar)
|
||||
{
|
||||
/* ... */
|
||||
}
|
||||
```
|
||||
|
||||
### Callbacks
|
||||
|
||||
* Callbacks always have the `_cb` suffix
|
||||
* Signal callbacks always have the `on_<object_name>` prefix
|
||||
* Callback names must have the name of the signal in the past
|
||||
|
||||
For example:
|
||||
|
||||
```c
|
||||
static void
|
||||
on_foo_size_allocated_cb (GtkWidget *widget,
|
||||
GtkAllocation *allocation,
|
||||
gpointer user_data)
|
||||
{
|
||||
/* ... */
|
||||
}
|
||||
```
|
||||
|
||||
### Line Splitting
|
||||
|
||||
Line splitting works following the GTK code style, but legibility comes over above
|
||||
all. If a function call looks unbalanced following the GTK style, it is fine to
|
||||
slightly escape the rules.
|
||||
|
||||
For example, this feels extremelly unbalanced:
|
||||
|
||||
```c
|
||||
foo_bar_do_somthing_sync (a,
|
||||
1,
|
||||
object,
|
||||
data,
|
||||
something
|
||||
cancellable,
|
||||
&error);
|
||||
```
|
||||
|
||||
Notice the empty space before the arguments, and how empty and odd it looks. In
|
||||
comparison, it will look better if written like this:
|
||||
|
||||
```c
|
||||
foo_bar_do_somthing_sync (a, 1, object, data,
|
||||
something
|
||||
cancellable,
|
||||
&error);
|
||||
```
|
||||
|
||||
# Contributing guidelines
|
||||
|
||||
See CONTRIBUTIONS.md file for the contribution guidelines, and the Code of Conduct
|
||||
that contributors are expected to follow.
|
||||
@@ -1,62 +0,0 @@
|
||||
This document describes how maintainership works on GNOME Settings. It is intended to be a guideline
|
||||
for future reference.
|
||||
|
||||
The list of current maintainers can be found at the [gnome-control-center.doap][doap] DOAP file.
|
||||
|
||||
# General Rules
|
||||
|
||||
The purpose of the shared maintainership model in GNOME Settings is to avoid as much as possible
|
||||
pushing unreviewed code in the main repository. Not only it is a good engineering practice, but it
|
||||
also increases the code quality and reduces the number of bugs.
|
||||
|
||||
GNOME Settings has two types of maintainers:
|
||||
|
||||
* **General Maintainer**: take care of the whole codebase and of panels without a specific maintainer.
|
||||
* **Panel Maintainer**: take care of a specific panel with a stronger authority over General
|
||||
Maintainers.
|
||||
|
||||
|
||||
## For Contributors
|
||||
|
||||
Panel Maintainers have a stronger authority over their panels than a General Maintainer. If you are
|
||||
contributing to a specific panel, and that panel has a dedicate maintainer, they should be the main
|
||||
point of contact.
|
||||
|
||||
In the rare case of Panel Maintainers not being responsive, it is allowed to contact General
|
||||
Maintainers.
|
||||
|
||||
## For Maintainers
|
||||
|
||||
If you are a Panel Maintainer, your merge requests will be reviewed by General Maintainer. The
|
||||
opposite is true as well - General Maintainers contributing to a specific panel will have their
|
||||
merge requests reviewed by the Panel Maintainer of that panel.
|
||||
|
||||
If you are a General Maintainer contributing to an unmaintained panel, or to the main codebase, your
|
||||
merge requests will be reviewed by another General Maintainer.
|
||||
|
||||
Avoid pushing commits without an explicit review, except in the following cases:
|
||||
|
||||
* The commit is a translation commit
|
||||
* The commit is trivial
|
||||
* The commit is urgent and no reviewers were available in time
|
||||
|
||||
When accepting a merge request and allowing the other maintainer to merge, avoid misunderstandings
|
||||
by being explicit. Suggested acceptance phrase:
|
||||
|
||||
`I approve this merge request. You are allowed to merge it.`
|
||||
|
||||
### Urgency Commits
|
||||
|
||||
Urgency commits should never happen, but in case they're needed, they are defined by the following
|
||||
criteria:
|
||||
|
||||
* On stable branches (or master right after a stable release)
|
||||
* Symptoms:
|
||||
* Always OR often reproducible; AND
|
||||
* Crash; OR
|
||||
* Data loss; OR
|
||||
* System corruption
|
||||
* Quickly followed by an emergency release (at most 2 days after the commit)
|
||||
|
||||
|
||||
[doap]: https://gitlab.gnome.org/GNOME/gnome-control-center/blob/master/gnome-control-center.doap
|
||||
@@ -1,15 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
<its:rules xmlns:its="http://www.w3.org/2005/11/its"
|
||||
xmlns:gt="https://www.gnu.org/s/gettext/ns/its/extensions/1.0"
|
||||
version="2.0">
|
||||
<its:translateRule selector="/KeyListEntries" translate="no"/>
|
||||
<its:translateRule selector="/KeyListEntries/@name" translate="yes"/>
|
||||
<its:translateRule selector="//KeyListEntry" translate="yes"/>
|
||||
<its:translateRule selector="//KeyListEntry/@description" translate="yes"/>
|
||||
|
||||
<gt:contextRule selector="//KeyListEntry[@msgctxt]" contextPointer="@msgctxt"/>
|
||||
|
||||
<!-- Extracted strings are consumed by the library and are never
|
||||
merged back; we don't want to escape special characters. -->
|
||||
<gt:escapeRule selector="/KeyListEntries" escape="no"/>
|
||||
</its:rules>
|
||||
@@ -1,6 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
<locatingRules>
|
||||
<locatingRule name="GnomeKeybindings" pattern="*.xml">
|
||||
<documentRule localName="KeyListEntries" target="gnome-keybindings.its"/>
|
||||
</locatingRule>
|
||||
</locatingRules>
|
||||
@@ -1,6 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
<its:rules xmlns:its="http://www.w3.org/2005/11/its"
|
||||
version="2.0">
|
||||
<its:translateRule selector="/sounds" translate="no"/>
|
||||
<its:translateRule selector="//name" translate="yes"/>
|
||||
</its:rules>
|
||||
@@ -1,6 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
<locatingRules>
|
||||
<locatingRule name="sounds" pattern="*.xml">
|
||||
<documentRule localName="sounds" target="sounds.its"/>
|
||||
</locatingRule>
|
||||
</locatingRules>
|
||||
@@ -1,104 +0,0 @@
|
||||
<Project xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
|
||||
xmlns:foaf="http://xmlns.com/foaf/0.1/"
|
||||
xmlns:gnome="http://api.gnome.org/doap-extensions#"
|
||||
xmlns="http://usefulinc.com/ns/doap#">
|
||||
|
||||
<name xml:lang="en">GNOME Settings</name>
|
||||
<shortdesc xml:lang="en">GNOME's main interface to configure various aspects of the desktop</shortdesc>
|
||||
<description xml:lang="en">GNOME's main interface to configure various aspects of the desktop</description>
|
||||
<mailing-list rdf:resource="http://mail.gnome.org/mailman/listinfo/gnomecc-list" />
|
||||
<download-page rdf:resource="http://download.gnome.org/sources/gnome-control-center/" />
|
||||
<bug-database rdf:resource="http://gitlab.gnome.org/GNOME/gnome-control-center/issues" />
|
||||
<category rdf:resource="http://api.gnome.org/doap-extensions#core" />
|
||||
<programming-language>C</programming-language>
|
||||
|
||||
<!-- General -->
|
||||
<maintainer>
|
||||
<foaf:Person>
|
||||
<foaf:name>Georges Basile Stavracas Neto</foaf:name>
|
||||
<foaf:mbox rdf:resource="mailto:gbsneto@gnome.org" />
|
||||
<gnome:userid>gbsneto</gnome:userid>
|
||||
</foaf:Person>
|
||||
</maintainer>
|
||||
|
||||
<!-- General, Region & Language -->
|
||||
<maintainer>
|
||||
<foaf:Person>
|
||||
<foaf:name>Robert Ancell</foaf:name>
|
||||
<foaf:mbox rdf:resource="mailto:rancell@gnome.org" />
|
||||
<gnome:userid>rancell</gnome:userid>
|
||||
</foaf:Person>
|
||||
</maintainer>
|
||||
|
||||
<!-- Bluetooth -->
|
||||
<maintainer>
|
||||
<foaf:Person>
|
||||
<foaf:name>Bastien Nocera</foaf:name>
|
||||
<foaf:mbox rdf:resource="mailto:hadess@gnome.org" />
|
||||
<gnome:userid>hadess</gnome:userid>
|
||||
</foaf:Person>
|
||||
</maintainer>
|
||||
|
||||
<!-- Display -->
|
||||
<maintainer>
|
||||
<foaf:Person>
|
||||
<foaf:name>Benjamin Berg</foaf:name>
|
||||
<foaf:mbox rdf:resource="mailto:bberg@gnome.org" />
|
||||
<gnome:userid>bberg</gnome:userid>
|
||||
</foaf:Person>
|
||||
</maintainer>
|
||||
|
||||
<!-- Mouse & Touchpad, Printers -->
|
||||
<maintainer>
|
||||
<foaf:Person>
|
||||
<foaf:name>Felipe Borges</foaf:name>
|
||||
<foaf:mbox rdf:resource="mailto:felipeborges@gnome.org" />
|
||||
<gnome:userid>felipeborges</gnome:userid>
|
||||
</foaf:Person>
|
||||
</maintainer>
|
||||
|
||||
<!-- Online Accounts -->
|
||||
<maintainer>
|
||||
<foaf:Person>
|
||||
<foaf:name>Debarshi Ray</foaf:name>
|
||||
<foaf:mbox rdf:resource="mailto:debarshir@gnome.org" />
|
||||
<gnome:userid>debarshir</gnome:userid>
|
||||
</foaf:Person>
|
||||
</maintainer>
|
||||
|
||||
<!-- Printers -->
|
||||
<maintainer>
|
||||
<foaf:Person>
|
||||
<foaf:name>Marek Kašík</foaf:name>
|
||||
<foaf:mbox rdf:resource="mailto:mkasik@gnome.org" />
|
||||
</foaf:Person>
|
||||
</maintainer>
|
||||
|
||||
<!-- Thunderbolt -->
|
||||
<maintainer>
|
||||
<foaf:Person>
|
||||
<foaf:name>Christian Kellner</foaf:name>
|
||||
<foaf:mbox rdf:resource="mailto:gicmo@gnome.org" />
|
||||
<gnome:userid>gicmo</gnome:userid>
|
||||
</foaf:Person>
|
||||
</maintainer>
|
||||
|
||||
<!-- User Accounts -->
|
||||
<maintainer>
|
||||
<foaf:Person>
|
||||
<foaf:name>Ondrej Holy</foaf:name>
|
||||
<foaf:mbox rdf:resource="mailto:oholy@gnome.org" />
|
||||
<gnome:userid>oholy</gnome:userid>
|
||||
</foaf:Person>
|
||||
</maintainer>
|
||||
|
||||
<!-- Wacom -->
|
||||
<maintainer>
|
||||
<foaf:Person>
|
||||
<foaf:name>Carlos Garnacho</foaf:name>
|
||||
<foaf:mbox rdf:resource="mailto:carlosg@gnome.org" />
|
||||
<gnome:userid>carlosg</gnome:userid>
|
||||
</foaf:Person>
|
||||
</maintainer>
|
||||
</Project>
|
||||
2
libbackground/.cvsignore
Normal file
2
libbackground/.cvsignore
Normal file
@@ -0,0 +1,2 @@
|
||||
Makefile
|
||||
Makefile.in
|
||||
295
libbackground/ChangeLog
Normal file
295
libbackground/ChangeLog
Normal file
@@ -0,0 +1,295 @@
|
||||
2002-09-24 Jody Goldber <jody@gnome.org>
|
||||
|
||||
* Release 2.0.2.91
|
||||
|
||||
2002-08-21 Jody Goldberg <jody@gnome.org>
|
||||
|
||||
* Release 2.1.0
|
||||
|
||||
2002-07-29 jacob berkman <jacob@ximian.com>
|
||||
|
||||
* applier.c (set_root_pixmap):
|
||||
(make_root_pixmap): fixes for building with gdk 2.0
|
||||
|
||||
2002-07-27 Mark McLoughlin <mark@skynet.ie>
|
||||
|
||||
Add support for rendering the wallpaper on
|
||||
a particular physical screen.
|
||||
|
||||
* applier.[ch]:
|
||||
(bg_applier_init): init screen and root_window.
|
||||
(bg_applier_class_init), (bg_applier_set_prop),
|
||||
(bg_applier_get_prop): add "screen" property.
|
||||
(bg_applier_new_for_screen): implement.
|
||||
(render_wallpaper), (render_to_screen),
|
||||
(create_pixmap), (wallpaper_full_cover_p): use the
|
||||
screen and root window information.
|
||||
(make_root_pixmap): add a GdkScreen arg, actually
|
||||
use the display we opened, use the correct root
|
||||
window and not the default one
|
||||
(set_root_pixmap): add a GdkScreen arg, use the
|
||||
default display, use the correct root window.
|
||||
|
||||
2002-06-18 Jody Goldberg <jody@gnome.org>
|
||||
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=85224
|
||||
* applier.c (render_wallpaper) : clamp to avoid underflow
|
||||
|
||||
2002-06-17 Jody Goldberg <jody@gnome.org>
|
||||
|
||||
* Release 2.0.0
|
||||
|
||||
2002-05-31 Damon Chaplin <damon@ximian.com>
|
||||
|
||||
* applier.c (bg_applier_apply_prefs): don't call set_root_pixmap() at
|
||||
all if nautilus is running. It didn't do anything in this case anyway.
|
||||
Removed the nice(20). A library function shouldn't do this. If
|
||||
gnome-settings-daemon wants to be niced then it should do it in main()
|
||||
or something like that.
|
||||
(set_root_pixmap): do a final check to see if nautilus is running
|
||||
before setting the pixmap.
|
||||
|
||||
Fixes part of #74311.
|
||||
|
||||
2002-05-21 jacob berkman <jacob@ximian.com>
|
||||
|
||||
* applier.c (render_to_screen): use a gc for the pixmap not the
|
||||
root window
|
||||
(bg_applier_get_preview_widget): don't create the pixmap until we
|
||||
are realized
|
||||
(make_root_pixmap): use gdk_get_display(), not getenv ("DISPLAY"),
|
||||
and set the colormap for our GdkPixmap so we can draw on it
|
||||
(preview_realized_cb): create the pixmap here, and set it on our
|
||||
GtkImage
|
||||
|
||||
fixes #73496
|
||||
|
||||
2002-05-16 jacob berkman <jacob@ximian.com>
|
||||
|
||||
* applier.c (bg_applier_apply_prefs): don't spew a warning when
|
||||
files can't be loaded (helps fix #76993)
|
||||
|
||||
2002-04-19 Jody Goldberg <jody@gnome.org>
|
||||
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=79149
|
||||
* preferences.c (bg_preferences_clone) : fix leaks and use
|
||||
gdk_color_free because some wiseguy thought GdkColours should use
|
||||
memchunks.
|
||||
(bg_preferences_load) : ditto.
|
||||
(bg_preferences_merge_entry) : ditto.
|
||||
(read_color_from_string) : ditto.
|
||||
(bg_preferences_finalize) : ditto. clean out pointers to protect
|
||||
against multiple calls.
|
||||
|
||||
2002-04-17 Rachel Hestilow <hestilow@ximian.com>
|
||||
|
||||
* applier.c (need_root_pixmap_p): Return TRUE if pixmap is NULL.
|
||||
(create_pixmap): Only set pixmap if not already set.
|
||||
|
||||
2002-04-17 Anders Carlsson <andersca@gnu.org>
|
||||
|
||||
* preferences.c: (bg_preferences_finalize), (bg_preferences_load):
|
||||
Plug leaks. Sigh.
|
||||
|
||||
2002-04-07 Rachel Hestilow <hestilow@ximian.com>
|
||||
|
||||
* applier.c (bg_applier_get_preview_widget): Connect to "realize"
|
||||
on preview.
|
||||
(preview_realized_cb): Added function to initialize preview pixmap.
|
||||
|
||||
2002-03-28 Richard Hestilow <hestilow@ximian.com>
|
||||
|
||||
* applier.c (bg_applier_set_prop): Only set size for preview modes.
|
||||
|
||||
2002-03-28 Richard Hestilow <hestilow@ximian.com>
|
||||
|
||||
* applier.c (MONITOR_CONTENTS_WIDTH, MONITOR_CONTENTS_HEIGHT):
|
||||
Rename to _DEFAULT_WIDTH, _DEFAULT_HEIGHT.
|
||||
(draw_disabled_message): Accept width and height as variables.
|
||||
(bg_applier_class_init): Install props preview_width, preview_height.
|
||||
(bg_applier_set_prop): Accept new size properties, only set to
|
||||
default width/height on mode PREVIEW if uninitialized.
|
||||
(bg_applier_new_at_size): Added.
|
||||
(bg_applier_apply_prefs): Call draw_disabled_message with actual
|
||||
width/height.
|
||||
(bg_applier_get_preview_width): Create pixmap based on set size.
|
||||
|
||||
2002-03-26 Dave Camp <dave@ximian.com>
|
||||
|
||||
* applier.c: (bg_applier_init): Don't initialize
|
||||
is_nautilus_running here (check it each time in appy_prefs).
|
||||
(bg_applier_apply_prefs): Don't try to apply the background if
|
||||
nautilus is running.
|
||||
|
||||
2002-03-19 Richard Hestilow <hestilow@ximian.com>
|
||||
|
||||
* preferences.h (wallpaper_type_t): Remove EMBOSSED since we
|
||||
don't support it.
|
||||
|
||||
* preferences.c:
|
||||
(_bg_wptype_values, _bg_orientation_values): Move name values
|
||||
to nick, change name to "correct" form.
|
||||
(read_wptype_from_string, bg_preferences_get_wptype_as_string):
|
||||
Remove EMBOSSSED option.
|
||||
|
||||
* preview-file-selection.[ch]: Add function
|
||||
preview_file_selection_intelligent_scale.
|
||||
|
||||
* applier.c: Change MONITOR_CONTENTS_WIDTH/HEIGHT to 64/48
|
||||
(correct monitor ratio).
|
||||
(bg_applier_apply_prefs): Disable wallpaper if WPTYPE_NONE.
|
||||
(bg_applier_get_preview_widget): Create to WIDTH/HEIGHT.
|
||||
(get_geometry): Remove reference to EMBOSSED.
|
||||
|
||||
2002-03-17 Darin Adler <darin@bentspoon.com>
|
||||
|
||||
* preferences.c: (bg_preferences_merge_entry):
|
||||
Use G_GNUC_FUNCTION so we're not gcc-specific.
|
||||
|
||||
2002-03-15 Seth Nickell <snickell@stanford.edu>
|
||||
|
||||
* preferences.c: (bg_preferences_load),
|
||||
(bg_preferences_merge_entry), (read_wptype_from_string),
|
||||
(read_color_from_string), (bg_preferences_get_wptype_as_string):
|
||||
* preferences.h:
|
||||
|
||||
Add an enum type for specifying that we don't know the type (i.e. the
|
||||
key was not available, or set to something invalid). Currently it
|
||||
was using -1, which barfs with some compilers that set enums
|
||||
to be uint.
|
||||
|
||||
2002-03-09 Richard Hestilow <hestilow@ximian.com>
|
||||
|
||||
* preview-file-selection.[ch]: Added.
|
||||
|
||||
* Makefile.am: Compile preview-file-selection.c.
|
||||
|
||||
* preferences.c (bg_preferences_init): Initialize adjust_opacity
|
||||
to FALSE.
|
||||
|
||||
2002-03-03 Alexander Larsson <alla@lysator.liu.se>
|
||||
|
||||
* preferences.c (bg_preferences_save):
|
||||
Save wallpaper-enabled too.
|
||||
|
||||
2002-02-22 Richard Hestilow <hestilow@ximian.com>
|
||||
|
||||
* preferences.[ch]: Add function bg_preferences_save.
|
||||
|
||||
2002-02-17 Bradford Hovinen <hovinen@ximian.com>
|
||||
|
||||
* applier.c (need_root_pixmap_p): We don't need a root pixmap if
|
||||
neither a wallpaper nor a gradient is enabled
|
||||
(render_to_screen): Use set_back_pixmap/set_background when just
|
||||
setting a color with a root applier
|
||||
(need_root_pixmap_p): If the last preferences structure had
|
||||
neither gradient nor wallpaper enabled, we need a new root pixmap
|
||||
(need_wallpaper_load_p): We need to reload the wallpaper pixbuf if
|
||||
it is enabled and not loaded
|
||||
(cleanup_cb): Free bg_applier->p->pixbuf too
|
||||
(bg_applier_apply_prefs): Only add the timeout for cleanup if we
|
||||
are in a root renderer; we don't need it for preview
|
||||
|
||||
2002-02-12 Lauris Kaplinski <lauris@ximian.com>
|
||||
|
||||
* applier.c (draw_disabled_message): Use g_object_unref for GdkGC
|
||||
(render_wallpaper): Use gdk_drawable_get_size
|
||||
(render_to_screen): Use gdk_get_default_root_window
|
||||
(wallpaper_full_cover_p): Ditto
|
||||
|
||||
* preferences.c (read_color_from_string): Use gdk_rgb_find_color
|
||||
|
||||
* applier.c (bg_applier_get_preview_widget): Use gnome_program_locate_file,
|
||||
replace GDK_ROOT_PARENT with gdk_get_default_root_window, deprecated
|
||||
gdk_window_* methods with gdk_drawable_* ones
|
||||
(bg_applier_get_preview_widget): Removed gtk_widget_push_visual,
|
||||
gtk_widget_pop_visual, use gtk_image instead of gtk_pixmap
|
||||
|
||||
2002-02-07 Richard Hestilow <hestilow@ximian.com>
|
||||
|
||||
* applier.c (BGApplierPrivate): Add "timeout" field.
|
||||
(bg_apply_cleanup_cb): Added.
|
||||
(bg_applier_apply_prefs): Add/reset timeout for cleanup function
|
||||
if we load a pixbuf.
|
||||
|
||||
2002-02-04 Lauris Kaplinski <lauris@ximian.com>
|
||||
|
||||
* preferences.c (read_wptype_from_string): Do not crash on NULL
|
||||
(read_orientation_from_string): Ditto
|
||||
|
||||
* applier.c (bg_applier_dispose): Replace deprecated methods
|
||||
(draw_disabled_message): Use gtk_image instead of gtk_pixmap,
|
||||
replace deprecated methods
|
||||
(render_wallpaper): Replace deprecated methods
|
||||
|
||||
2002-01-13 Seth Nickell <snickell@stanford.edu>
|
||||
|
||||
reviewed by: <delete if not using a buddy>
|
||||
|
||||
* Makefile.am:
|
||||
* applier.c: (bg_applier_apply_prefs),
|
||||
(bg_applier_get_preview_widget), (draw_disabled_message),
|
||||
(create_pixmap), (get_geometry):
|
||||
* preferences.c: (bg_preferences_load),
|
||||
(bg_preferences_merge_entry), (read_wptype_from_string),
|
||||
(read_orientation_from_string):
|
||||
* preferences.h:
|
||||
|
||||
2002-01-28 Richard Hestilow <hestilow@ximian.com>
|
||||
|
||||
* Makefile.am: Use libtool to create the static library, thus
|
||||
allowing shlibs to link to libbackground (needed for metatheme).
|
||||
|
||||
2002-01-10 Bradford Hovinen <hovinen@ximian.com>
|
||||
|
||||
Courtesy of Jean Schurger <jschurger@schurger.org>:
|
||||
* preferences.c (bg_preferences_merge_entry): Make sure the
|
||||
wallpaper filename is non-NULL before doing anything with it
|
||||
|
||||
2001-12-20 Bradford Hovinen <hovinen@ximian.com>
|
||||
|
||||
* applier.c (bg_applier_apply_prefs): Disable the wallpaper if we
|
||||
couldn't load it
|
||||
(bg_applier_apply_prefs): Create a clone of the preferences
|
||||
structure first and work off of that
|
||||
(wallpaper_full_cover_p): Return FALSE if the wallpaper pixbuf is NULL
|
||||
|
||||
* preferences.c (bg_preferences_merge_entry): Don't actually set
|
||||
the wallpaper to "enabled" unless we can load the thing
|
||||
|
||||
* applier.c: Eliminate compiler warnings
|
||||
|
||||
* applier.[ch]: Rename applier to bg_applier to avoid possible
|
||||
namespace collision
|
||||
|
||||
* preferences.[ch]: Rename preferences to bg_preferences to avoid
|
||||
possible namespace collision
|
||||
|
||||
2001-12-18 Bradford Hovinen <hovinen@ximian.com>
|
||||
|
||||
* preferences.c: Update GConf keys to use /desktop/gnome/background
|
||||
(preferences_load): Use gconf_client rather than gconf_engine
|
||||
|
||||
2001-12-17 Bradford Hovinen <hovinen@ximian.com>
|
||||
|
||||
* applier.c (set_root_pixmap): Set the pixmap_id correctly if
|
||||
pixmap is NULL or -1.
|
||||
|
||||
* preferences.c (preferences_merge_entry): Eliminate name; use
|
||||
entry->key on the warning
|
||||
(preferences_merge_entry): Use correct keys
|
||||
|
||||
* applier.c (applier_get_preview_widget): Make sure the pixmap is
|
||||
masked correctly
|
||||
(applier_apply_prefs): s/gtk_object_destroy/g_object_unref/
|
||||
|
||||
2001-12-07 Bradford Hovinen <hovinen@ximian.com>
|
||||
|
||||
* preferences.c (read_color_from_string): Check if string is
|
||||
non-NULL
|
||||
(preferences_load): Initialize the error structure
|
||||
|
||||
* applier.c (applier_class_init): Initialize object_class properly
|
||||
before using it; install property after {get|set}_property are set
|
||||
(applier_get_preview_widget): Construct the GC before using it
|
||||
|
||||
15
libbackground/Makefile.am
Normal file
15
libbackground/Makefile.am
Normal file
@@ -0,0 +1,15 @@
|
||||
EXTRA_DIST = ChangeLog
|
||||
|
||||
INCLUDES = \
|
||||
-DGNOMELOCALEDIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \
|
||||
-DGNOME_ICONDIR=\""${prefix}/share/pixmaps"\" \
|
||||
-DG_LOG_DOMAIN=\"capplet-common\" \
|
||||
-I$(top_srcdir)/ \
|
||||
@CAPPLET_CFLAGS@
|
||||
|
||||
noinst_LTLIBRARIES = libbackground.la
|
||||
|
||||
libbackground_la_SOURCES = \
|
||||
applier.c applier.h \
|
||||
preferences.c preferences.h \
|
||||
preview-file-selection.c preview-file-selection.h
|
||||
1662
libbackground/applier.c
Normal file
1662
libbackground/applier.c
Normal file
File diff suppressed because it is too large
Load Diff
77
libbackground/applier.h
Normal file
77
libbackground/applier.h
Normal file
@@ -0,0 +1,77 @@
|
||||
/* -*- mode: c; style: linux -*- */
|
||||
|
||||
/* applier.h
|
||||
* Copyright (C) 2000 Helix Code, Inc.
|
||||
*
|
||||
* Written by Bradford Hovinen <hovinen@helixcode.com>
|
||||
*
|
||||
* 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, 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __APPLIER_H
|
||||
#define __APPLIER_H
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
#include <gdk-pixbuf/gdk-pixbuf.h>
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
#include <pthread.h>
|
||||
|
||||
#include "preferences.h"
|
||||
|
||||
#define BG_APPLIER(obj) G_TYPE_CHECK_INSTANCE_CAST (obj, bg_applier_get_type (), BGApplier)
|
||||
#define BG_APPLIER_CLASS(klass) G_TYPE_CHECK_CLASS_CAST (klass, bg_applier_get_type (), BGApplierClass)
|
||||
#define IS_BG_APPLIER(obj) G_TYPE_CHECK_INSTANCE_TYPE (obj, bg_applier_get_type ())
|
||||
|
||||
typedef struct _BGApplier BGApplier;
|
||||
typedef struct _BGApplierClass BGApplierClass;
|
||||
|
||||
typedef struct _BGApplierPrivate BGApplierPrivate;
|
||||
|
||||
typedef enum _BGApplierType {
|
||||
BG_APPLIER_ROOT, BG_APPLIER_PREVIEW
|
||||
} BGApplierType;
|
||||
|
||||
struct _BGApplier
|
||||
{
|
||||
GObject object;
|
||||
BGApplierPrivate *p;
|
||||
};
|
||||
|
||||
struct _BGApplierClass
|
||||
{
|
||||
GObjectClass klass;
|
||||
};
|
||||
|
||||
GType bg_applier_get_type (void);
|
||||
|
||||
GObject *bg_applier_new (BGApplierType type);
|
||||
GObject *bg_applier_new_at_size (BGApplierType type,
|
||||
const guint width,
|
||||
const guint height);
|
||||
GObject *bg_applier_new_for_screen (BGApplierType type,
|
||||
GdkScreen *screen);
|
||||
|
||||
void bg_applier_apply_prefs (BGApplier *bg_applier,
|
||||
const BGPreferences *prefs);
|
||||
|
||||
gboolean bg_applier_render_color_p (const BGApplier *bg_applier,
|
||||
const BGPreferences *prefs);
|
||||
|
||||
GtkWidget *bg_applier_get_preview_widget (BGApplier *bg_applier);
|
||||
GdkPixbuf *bg_applier_get_wallpaper_pixbuf (BGApplier *bg_applier);
|
||||
|
||||
#endif /* __APPLIER_H */
|
||||
475
libbackground/preferences.c
Normal file
475
libbackground/preferences.c
Normal file
@@ -0,0 +1,475 @@
|
||||
/* -*- mode: c; style: linux -*- */
|
||||
|
||||
/* preferences.c
|
||||
* Copyright (C) 2001 Ximian, Inc.
|
||||
*
|
||||
* Written by Bradford Hovinen <hovinen@ximian.com>
|
||||
*
|
||||
* 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, 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include "config.h"
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <gnome.h>
|
||||
#include <bonobo.h>
|
||||
|
||||
#include "preferences.h"
|
||||
|
||||
static GObjectClass *parent_class;
|
||||
|
||||
static void bg_preferences_init (BGPreferences *prefs,
|
||||
BGPreferencesClass *class);
|
||||
static void bg_preferences_class_init (BGPreferencesClass *class);
|
||||
|
||||
static void bg_preferences_finalize (GObject *object);
|
||||
|
||||
static GdkColor *read_color_from_string (const gchar *string);
|
||||
static orientation_t read_orientation_from_string (gchar *string);
|
||||
static wallpaper_type_t read_wptype_from_string (gchar *string);
|
||||
|
||||
static GEnumValue _bg_wptype_values[] = {
|
||||
{ WPTYPE_TILED, "WPTYPE_TILED", "wallpaper"},
|
||||
{ WPTYPE_CENTERED, "WPTYPE_CENTERED", "centered"},
|
||||
{ WPTYPE_SCALED, "WPTYPE_SCALED", "scaled"},
|
||||
{ WPTYPE_STRETCHED, "WPTYPE_STRETCHED", "stretched"},
|
||||
{ WPTYPE_NONE, "WPTYPE_NONE", "none"},
|
||||
{ 0, NULL, NULL }
|
||||
};
|
||||
|
||||
static GEnumValue _bg_orientation_values[] = {
|
||||
{ ORIENTATION_SOLID, "ORIENTATION_SOLID", "solid"},
|
||||
{ ORIENTATION_HORIZ, "ORIENTATION_HORIZ", "horizontal-gradient"},
|
||||
{ ORIENTATION_VERT, "ORIENTATION_VERT", "vertical-gradient"},
|
||||
{ 0, NULL, NULL }
|
||||
};
|
||||
|
||||
GType
|
||||
bg_preferences_wptype_get_type (void)
|
||||
{
|
||||
static GType type = 0;
|
||||
|
||||
if (!type)
|
||||
{
|
||||
type = g_enum_register_static ("BgPreferencesWptype",
|
||||
_bg_wptype_values);
|
||||
}
|
||||
|
||||
return type;
|
||||
}
|
||||
|
||||
GType
|
||||
bg_preferences_orientation_get_type (void)
|
||||
{
|
||||
static GType type = 0;
|
||||
|
||||
if (!type)
|
||||
{
|
||||
type = g_enum_register_static ("BgPreferencesOrientation",
|
||||
_bg_orientation_values);
|
||||
}
|
||||
|
||||
return type;
|
||||
}
|
||||
|
||||
GType
|
||||
bg_preferences_get_type (void)
|
||||
{
|
||||
static GType bg_preferences_type = 0;
|
||||
|
||||
if (!bg_preferences_type) {
|
||||
GTypeInfo bg_preferences_info = {
|
||||
sizeof (BGPreferencesClass),
|
||||
NULL,
|
||||
NULL,
|
||||
(GClassInitFunc) bg_preferences_class_init,
|
||||
NULL,
|
||||
NULL,
|
||||
sizeof (BGPreferences),
|
||||
0,
|
||||
(GInstanceInitFunc) bg_preferences_init,
|
||||
};
|
||||
|
||||
bg_preferences_type =
|
||||
g_type_register_static (G_TYPE_OBJECT, "BGPreferences", &bg_preferences_info, 0);
|
||||
}
|
||||
|
||||
return bg_preferences_type;
|
||||
}
|
||||
|
||||
static void
|
||||
bg_preferences_init (BGPreferences *prefs,
|
||||
BGPreferencesClass *class)
|
||||
{
|
||||
prefs->frozen = FALSE;
|
||||
|
||||
/* Load default values */
|
||||
prefs->color1 = read_color_from_string ("#39374b");
|
||||
prefs->color2 = read_color_from_string ("#42528f");
|
||||
prefs->enabled = TRUE;
|
||||
prefs->wallpaper_enabled = FALSE;
|
||||
prefs->gradient_enabled = TRUE;
|
||||
prefs->orientation = ORIENTATION_VERT;
|
||||
prefs->wallpaper_type = WPTYPE_TILED;
|
||||
prefs->wallpaper_filename = NULL;
|
||||
prefs->wallpaper_sel_path = g_strdup (g_get_home_dir ());
|
||||
prefs->auto_apply = TRUE;
|
||||
prefs->wallpapers = NULL;
|
||||
prefs->adjust_opacity = TRUE;
|
||||
prefs->opacity = 255;
|
||||
}
|
||||
|
||||
static void
|
||||
bg_preferences_class_init (BGPreferencesClass *class)
|
||||
{
|
||||
GObjectClass *object_class;
|
||||
|
||||
object_class = (GObjectClass *) class;
|
||||
object_class->finalize = bg_preferences_finalize;
|
||||
|
||||
parent_class =
|
||||
G_OBJECT_CLASS (g_type_class_ref (G_TYPE_OBJECT));
|
||||
}
|
||||
|
||||
GObject *
|
||||
bg_preferences_new (void)
|
||||
{
|
||||
GObject *object;
|
||||
|
||||
object = g_object_new (bg_preferences_get_type (), NULL);
|
||||
BG_PREFERENCES (object)->enabled = TRUE;
|
||||
|
||||
return object;
|
||||
}
|
||||
|
||||
GObject *
|
||||
bg_preferences_clone (const BGPreferences *prefs)
|
||||
{
|
||||
GObject *object;
|
||||
BGPreferences *new_prefs;
|
||||
|
||||
g_return_val_if_fail (prefs != NULL, NULL);
|
||||
g_return_val_if_fail (IS_BG_PREFERENCES (prefs), NULL);
|
||||
|
||||
object = bg_preferences_new ();
|
||||
|
||||
new_prefs = BG_PREFERENCES (object);
|
||||
|
||||
new_prefs->enabled = prefs->enabled;
|
||||
new_prefs->gradient_enabled = prefs->gradient_enabled;
|
||||
new_prefs->wallpaper_enabled = prefs->wallpaper_enabled;
|
||||
new_prefs->orientation = prefs->orientation;
|
||||
new_prefs->wallpaper_type = prefs->wallpaper_type;
|
||||
|
||||
if (new_prefs->color1 != NULL)
|
||||
gdk_color_free (new_prefs->color1);
|
||||
new_prefs->color1 = (prefs->color1 != NULL)
|
||||
? gdk_color_copy (prefs->color1) : NULL;
|
||||
|
||||
if (new_prefs->color2 != NULL)
|
||||
gdk_color_free (new_prefs->color2);
|
||||
new_prefs->color2 = (prefs->color2 != NULL)
|
||||
? gdk_color_copy (prefs->color2) : NULL;
|
||||
|
||||
if (new_prefs->wallpaper_filename != NULL)
|
||||
g_free (new_prefs->wallpaper_filename);
|
||||
new_prefs->wallpaper_filename = g_strdup (prefs->wallpaper_filename);
|
||||
|
||||
if (new_prefs->wallpaper_sel_path != NULL)
|
||||
g_free (new_prefs->wallpaper_sel_path);
|
||||
new_prefs->wallpaper_sel_path = g_strdup (prefs->wallpaper_sel_path);;
|
||||
|
||||
new_prefs->auto_apply = prefs->auto_apply;
|
||||
new_prefs->adjust_opacity = prefs->adjust_opacity;
|
||||
new_prefs->opacity = prefs->opacity;
|
||||
|
||||
return object;
|
||||
}
|
||||
|
||||
static void
|
||||
bg_preferences_finalize (GObject *object)
|
||||
{
|
||||
BGPreferences *prefs;
|
||||
|
||||
g_return_if_fail (object != NULL);
|
||||
g_return_if_fail (IS_BG_PREFERENCES (object));
|
||||
|
||||
prefs = BG_PREFERENCES (object);
|
||||
|
||||
g_free (prefs->wallpaper_filename);
|
||||
prefs->wallpaper_filename = NULL;
|
||||
|
||||
g_free (prefs->wallpaper_sel_path);
|
||||
prefs->wallpaper_sel_path = NULL;
|
||||
|
||||
if (prefs->color1 != NULL) {
|
||||
gdk_color_free (prefs->color1);
|
||||
prefs->color1 = NULL;
|
||||
}
|
||||
if (prefs->color2 != NULL) {
|
||||
gdk_color_free (prefs->color2);
|
||||
prefs->color2 = NULL;
|
||||
}
|
||||
|
||||
parent_class->finalize (object);
|
||||
}
|
||||
|
||||
void
|
||||
bg_preferences_load (BGPreferences *prefs)
|
||||
{
|
||||
GConfClient *client;
|
||||
GError *error = NULL;
|
||||
char *tmp;
|
||||
g_return_if_fail (prefs != NULL);
|
||||
g_return_if_fail (IS_BG_PREFERENCES (prefs));
|
||||
|
||||
client = gconf_client_get_default ();
|
||||
|
||||
prefs->enabled = gconf_client_get_bool (client, BG_PREFERENCES_DRAW_BACKGROUND, &error);
|
||||
prefs->wallpaper_filename = gconf_client_get_string (client, BG_PREFERENCES_PICTURE_FILENAME, &error);
|
||||
|
||||
if (prefs->color1 != NULL)
|
||||
gdk_color_free (prefs->color1);
|
||||
tmp = gconf_client_get_string (client, BG_PREFERENCES_PRIMARY_COLOR, &error);
|
||||
prefs->color1 = read_color_from_string (tmp);
|
||||
g_free (tmp);
|
||||
|
||||
if (prefs->color2 != NULL)
|
||||
gdk_color_free (prefs->color2);
|
||||
tmp = gconf_client_get_string (client, BG_PREFERENCES_SECONDARY_COLOR, &error);
|
||||
prefs->color2 = read_color_from_string (tmp);
|
||||
g_free (tmp);
|
||||
|
||||
prefs->opacity = gconf_client_get_int (client, BG_PREFERENCES_PICTURE_OPACITY, &error);
|
||||
if (prefs->opacity >= 100 || prefs->opacity < 0)
|
||||
prefs->adjust_opacity = FALSE;
|
||||
|
||||
prefs->orientation = read_orientation_from_string (gconf_client_get_string (client, BG_PREFERENCES_COLOR_SHADING_TYPE, &error));
|
||||
if (prefs->orientation == ORIENTATION_SOLID)
|
||||
prefs->gradient_enabled = FALSE;
|
||||
else
|
||||
prefs->gradient_enabled = TRUE;
|
||||
|
||||
prefs->wallpaper_type = read_wptype_from_string (gconf_client_get_string (client, BG_PREFERENCES_PICTURE_OPTIONS, &error));
|
||||
|
||||
if (prefs->wallpaper_type == WPTYPE_UNSET) {
|
||||
prefs->wallpaper_enabled = FALSE;
|
||||
prefs->wallpaper_type = WPTYPE_CENTERED;
|
||||
} else {
|
||||
prefs->wallpaper_enabled = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
/* Parse the event name given (the event being notification of a property having
|
||||
* changed and apply that change to the bg_preferences structure. Eliminates the
|
||||
* need to reload the structure entirely on every event notification
|
||||
*/
|
||||
|
||||
void
|
||||
bg_preferences_merge_entry (BGPreferences *prefs,
|
||||
const GConfEntry *entry)
|
||||
{
|
||||
const GConfValue *value = gconf_entry_get_value (entry);
|
||||
|
||||
g_return_if_fail (prefs != NULL);
|
||||
g_return_if_fail (IS_BG_PREFERENCES (prefs));
|
||||
|
||||
if (!strcmp (entry->key, BG_PREFERENCES_PICTURE_OPTIONS)) {
|
||||
wallpaper_type_t wallpaper_type = read_wptype_from_string (g_strdup (gconf_value_get_string (value)));
|
||||
if (wallpaper_type == WPTYPE_UNSET) {
|
||||
prefs->wallpaper_enabled = FALSE;
|
||||
} else {
|
||||
prefs->wallpaper_type = wallpaper_type;
|
||||
prefs->wallpaper_enabled = TRUE;
|
||||
}
|
||||
}
|
||||
else if (!strcmp (entry->key, BG_PREFERENCES_PICTURE_FILENAME)) {
|
||||
prefs->wallpaper_filename = g_strdup (gconf_value_get_string (value));
|
||||
|
||||
if (prefs->wallpaper_filename != NULL &&
|
||||
strcmp (prefs->wallpaper_filename, "") != 0 &&
|
||||
strcmp (prefs->wallpaper_filename, "(none)") != 0)
|
||||
prefs->wallpaper_enabled = TRUE;
|
||||
else
|
||||
prefs->wallpaper_enabled = FALSE;
|
||||
}
|
||||
else if (!strcmp (entry->key, BG_PREFERENCES_PRIMARY_COLOR)) {
|
||||
if (prefs->color1 != NULL)
|
||||
gdk_color_free (prefs->color1);
|
||||
prefs->color1 = read_color_from_string (gconf_value_get_string (value));
|
||||
}
|
||||
else if (!strcmp (entry->key, BG_PREFERENCES_SECONDARY_COLOR)) {
|
||||
if (prefs->color2 != NULL)
|
||||
gdk_color_free (prefs->color2);
|
||||
prefs->color2 = read_color_from_string (gconf_value_get_string (value));
|
||||
}
|
||||
else if (!strcmp (entry->key, BG_PREFERENCES_PICTURE_OPACITY)) {
|
||||
prefs->opacity = gconf_value_get_int (value);
|
||||
|
||||
if (prefs->opacity >= 100)
|
||||
prefs->adjust_opacity = FALSE;
|
||||
}
|
||||
else if (!strcmp (entry->key, BG_PREFERENCES_COLOR_SHADING_TYPE)) {
|
||||
prefs->orientation = read_orientation_from_string (g_strdup (gconf_value_get_string (value)));
|
||||
|
||||
if (prefs->orientation == ORIENTATION_SOLID)
|
||||
prefs->gradient_enabled = FALSE;
|
||||
else
|
||||
prefs->gradient_enabled = TRUE;
|
||||
}
|
||||
else if (!strcmp (entry->key, BG_PREFERENCES_DRAW_BACKGROUND)) {
|
||||
if (gconf_value_get_bool (value) &&
|
||||
(prefs->wallpaper_filename != NULL) &&
|
||||
strcmp (prefs->wallpaper_filename, "") != 0 &&
|
||||
strcmp (prefs->wallpaper_filename, "(none)") != 0)
|
||||
prefs->wallpaper_enabled = TRUE;
|
||||
else
|
||||
prefs->enabled = FALSE;
|
||||
} else {
|
||||
g_warning ("%s: Unknown property: %s", G_GNUC_FUNCTION, entry->key);
|
||||
}
|
||||
}
|
||||
|
||||
static wallpaper_type_t
|
||||
read_wptype_from_string (gchar *string)
|
||||
{
|
||||
wallpaper_type_t type = WPTYPE_UNSET;
|
||||
|
||||
if (string) {
|
||||
if (!strncmp (string, "wallpaper", sizeof ("wallpaper"))) {
|
||||
type = WPTYPE_TILED;
|
||||
} else if (!strncmp (string, "centered", sizeof ("centered"))) {
|
||||
type = WPTYPE_CENTERED;
|
||||
} else if (!strncmp (string, "scaled", sizeof ("scaled"))) {
|
||||
type = WPTYPE_SCALED;
|
||||
} else if (!strncmp (string, "stretched", sizeof ("stretched"))) {
|
||||
type = WPTYPE_STRETCHED;
|
||||
}
|
||||
g_free (string);
|
||||
}
|
||||
|
||||
return type;
|
||||
}
|
||||
|
||||
static orientation_t
|
||||
read_orientation_from_string (gchar *string)
|
||||
{
|
||||
orientation_t type = ORIENTATION_SOLID;
|
||||
|
||||
if (string) {
|
||||
if (!strncmp (string, "vertical-gradient", sizeof ("vertical-gradient"))) {
|
||||
type = ORIENTATION_VERT;
|
||||
} else if (!strncmp (string, "horizontal-gradient", sizeof ("horizontal-gradient"))) {
|
||||
type = ORIENTATION_HORIZ;
|
||||
}
|
||||
g_free (string);
|
||||
}
|
||||
|
||||
return type;
|
||||
}
|
||||
|
||||
static GdkColor *
|
||||
read_color_from_string (const gchar *string)
|
||||
{
|
||||
GdkColor color;
|
||||
|
||||
/* If all else fails use black */
|
||||
if (string == NULL || !gdk_color_parse (string, &color))
|
||||
gdk_color_parse ("black", &color);
|
||||
gdk_rgb_find_color (gdk_rgb_get_colormap (), &color);
|
||||
return gdk_color_copy (&color);
|
||||
}
|
||||
|
||||
const gchar*
|
||||
bg_preferences_get_wptype_as_string (wallpaper_type_t wp)
|
||||
{
|
||||
switch (wp)
|
||||
{
|
||||
case WPTYPE_TILED:
|
||||
return "wallpaper";
|
||||
case WPTYPE_CENTERED:
|
||||
return "centered";
|
||||
case WPTYPE_SCALED:
|
||||
return "scaled";
|
||||
case WPTYPE_STRETCHED:
|
||||
return "stretched";
|
||||
case WPTYPE_NONE:
|
||||
return "none";
|
||||
case WPTYPE_UNSET:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const gchar*
|
||||
bg_preferences_get_orientation_as_string (orientation_t o)
|
||||
{
|
||||
switch (o)
|
||||
{
|
||||
case ORIENTATION_SOLID:
|
||||
return "solid";
|
||||
case ORIENTATION_HORIZ:
|
||||
return "horizontal-gradient";
|
||||
case ORIENTATION_VERT:
|
||||
return "vertical-gradient";
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void
|
||||
bg_preferences_save (BGPreferences *prefs)
|
||||
{
|
||||
GConfChangeSet *cs;
|
||||
gchar *tmp;
|
||||
|
||||
g_return_if_fail (prefs != NULL);
|
||||
g_return_if_fail (IS_BG_PREFERENCES (prefs));
|
||||
|
||||
cs = gconf_change_set_new ();
|
||||
gconf_change_set_set_bool (cs, BG_PREFERENCES_DRAW_BACKGROUND, prefs->enabled);
|
||||
if (prefs->wallpaper_enabled)
|
||||
gconf_change_set_set_string (cs, BG_PREFERENCES_PICTURE_OPTIONS, bg_preferences_get_wptype_as_string (prefs->wallpaper_type));
|
||||
else
|
||||
gconf_change_set_set_string (cs, BG_PREFERENCES_PICTURE_OPTIONS, "none");
|
||||
|
||||
gconf_change_set_set_string (cs, BG_PREFERENCES_PICTURE_FILENAME, prefs->wallpaper_filename);
|
||||
|
||||
tmp = g_strdup_printf ("#%02x%02x%02x",
|
||||
prefs->color1->red >> 8,
|
||||
prefs->color1->green >> 8,
|
||||
prefs->color1->blue >> 8);
|
||||
gconf_change_set_set_string (cs, BG_PREFERENCES_PRIMARY_COLOR, tmp);
|
||||
g_free (tmp);
|
||||
|
||||
tmp = g_strdup_printf ("#%02x%02x%02x",
|
||||
prefs->color2->red >> 8,
|
||||
prefs->color2->green >> 8,
|
||||
prefs->color2->blue >> 8);
|
||||
gconf_change_set_set_string (cs, BG_PREFERENCES_SECONDARY_COLOR, tmp);
|
||||
g_free (tmp);
|
||||
|
||||
gconf_change_set_set_string (cs, BG_PREFERENCES_COLOR_SHADING_TYPE, bg_preferences_get_orientation_as_string (prefs->orientation));
|
||||
|
||||
gconf_client_commit_change_set (gconf_client_get_default (), cs, TRUE, NULL);
|
||||
gconf_change_set_unref (cs);
|
||||
}
|
||||
|
||||
|
||||
108
libbackground/preferences.h
Normal file
108
libbackground/preferences.h
Normal file
@@ -0,0 +1,108 @@
|
||||
/* -*- mode: c; style: linux -*- */
|
||||
|
||||
/* preferences.h
|
||||
* Copyright (C) 2000 Helix Code, Inc.
|
||||
*
|
||||
* Written by Bradford Hovinen <hovinen@helixcode.com>
|
||||
*
|
||||
* 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, 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __BGPREFERENCES_H
|
||||
#define __BGPREFERENCES_H
|
||||
|
||||
#include <glib-object.h>
|
||||
#include <gdk-pixbuf/gdk-pixbuf.h>
|
||||
#include <gconf/gconf-client.h>
|
||||
|
||||
#define BG_PREFERENCES(obj) G_TYPE_CHECK_INSTANCE_CAST (obj, bg_preferences_get_type (), BGPreferences)
|
||||
#define BG_PREFERENCES_CLASS(klass) G_TYPE_CHECK_CLASS_CAST (klass, bg_preferences_get_type (), BGPreferencesClass)
|
||||
#define IS_BG_PREFERENCES(obj) G_TYPE_CHECK_INSTANCE_TYPE (obj, bg_preferences_get_type ())
|
||||
|
||||
#define BG_PREFERENCES_DRAW_BACKGROUND "/desktop/gnome/background/draw_background"
|
||||
#define BG_PREFERENCES_PRIMARY_COLOR "/desktop/gnome/background/primary_color"
|
||||
#define BG_PREFERENCES_SECONDARY_COLOR "/desktop/gnome/background/secondary_color"
|
||||
#define BG_PREFERENCES_COLOR_SHADING_TYPE "/desktop/gnome/background/color_shading_type"
|
||||
#define BG_PREFERENCES_PICTURE_OPTIONS "/desktop/gnome/background/picture_options"
|
||||
#define BG_PREFERENCES_PICTURE_OPACITY "/desktop/gnome/background/picture_opacity"
|
||||
#define BG_PREFERENCES_PICTURE_FILENAME "/desktop/gnome/background/picture_filename"
|
||||
|
||||
|
||||
typedef struct _BGPreferences BGPreferences;
|
||||
typedef struct _BGPreferencesClass BGPreferencesClass;
|
||||
|
||||
typedef enum _orientation_t {
|
||||
ORIENTATION_SOLID = 0,
|
||||
ORIENTATION_HORIZ,
|
||||
ORIENTATION_VERT
|
||||
} orientation_t;
|
||||
|
||||
typedef enum _wallpaper_type_t {
|
||||
WPTYPE_TILED = 0, WPTYPE_CENTERED, WPTYPE_SCALED,
|
||||
WPTYPE_STRETCHED, WPTYPE_NONE,
|
||||
WPTYPE_UNSET
|
||||
} wallpaper_type_t;
|
||||
|
||||
struct _BGPreferences
|
||||
{
|
||||
GObject object;
|
||||
|
||||
gint frozen;
|
||||
gboolean auto_apply;
|
||||
guint timeout_id;
|
||||
|
||||
gboolean enabled;
|
||||
gboolean gradient_enabled;
|
||||
gboolean wallpaper_enabled;
|
||||
orientation_t orientation;
|
||||
wallpaper_type_t wallpaper_type;
|
||||
|
||||
GdkColor *color1;
|
||||
GdkColor *color2;
|
||||
|
||||
gchar *wallpaper_filename;
|
||||
gchar *wallpaper_sel_path;
|
||||
|
||||
GSList *wallpapers;
|
||||
|
||||
gboolean adjust_opacity;
|
||||
gint opacity;
|
||||
};
|
||||
|
||||
struct _BGPreferencesClass
|
||||
{
|
||||
GObjectClass klass;
|
||||
};
|
||||
|
||||
GType bg_preferences_get_type (void);
|
||||
|
||||
GObject *bg_preferences_new (void);
|
||||
GObject *bg_preferences_clone (const BGPreferences *prefs);
|
||||
|
||||
void bg_preferences_load (BGPreferences *prefs);
|
||||
|
||||
void bg_preferences_merge_entry (BGPreferences *prefs,
|
||||
const GConfEntry *entry);
|
||||
|
||||
void bg_preferences_save (BGPreferences *prefs);
|
||||
|
||||
const gchar *bg_preferences_get_wptype_as_string (wallpaper_type_t wp);
|
||||
const gchar *bg_preferences_get_orientation_as_string (orientation_t o);
|
||||
GType bg_preferences_wptype_get_type (void);
|
||||
GType bg_preferences_orientation_get_type (void);
|
||||
|
||||
|
||||
#endif /* __PREFERENCES_H */
|
||||
280
libbackground/preview-file-selection.c
Normal file
280
libbackground/preview-file-selection.c
Normal file
@@ -0,0 +1,280 @@
|
||||
/* -*- mode: c; style: linux -*- */
|
||||
|
||||
/* preview-file-selection.c
|
||||
* Copyright (C) 2001 Ximian, Inc.
|
||||
*
|
||||
* Written by Rachel Hestilow <hestilow@ximian.com>
|
||||
*
|
||||
* 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, 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include "config.h"
|
||||
#endif
|
||||
|
||||
#include <libgnome/libgnome.h>
|
||||
#include <gtk/gtkimage.h>
|
||||
#include <gtk/gtkhbox.h>
|
||||
#include <gtk/gtkframe.h>
|
||||
#include <gtk/gtktreeview.h>
|
||||
#include <gtk/gtkmain.h>
|
||||
#include "preview-file-selection.h"
|
||||
|
||||
#define SCALE 100
|
||||
|
||||
struct _PreviewFileSelectionPrivate
|
||||
{
|
||||
GtkWidget *preview;
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
PROP_0,
|
||||
PROP_DO_PREVIEW
|
||||
};
|
||||
|
||||
static GObjectClass *parent_class;
|
||||
|
||||
static void preview_file_selection_set_property (GObject *object, guint arg_id, const GValue *value, GParamSpec *spec);
|
||||
static void preview_file_selection_get_property (GObject *object, guint arg_id, GValue *value, GParamSpec *spec);
|
||||
|
||||
static void
|
||||
preview_file_selection_finalize (GObject *object)
|
||||
{
|
||||
PreviewFileSelection *fsel = PREVIEW_FILE_SELECTION (object);
|
||||
|
||||
g_free (fsel->priv);
|
||||
|
||||
parent_class->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
preview_file_selection_class_init (GObjectClass *object_class)
|
||||
{
|
||||
parent_class = g_type_class_ref (GTK_TYPE_FILE_SELECTION);
|
||||
|
||||
object_class->set_property = preview_file_selection_set_property;
|
||||
object_class->get_property = preview_file_selection_get_property;
|
||||
object_class->finalize = preview_file_selection_finalize;
|
||||
|
||||
g_object_class_install_property
|
||||
(object_class, PROP_DO_PREVIEW,
|
||||
g_param_spec_boolean ("do_preview",
|
||||
"Preview images",
|
||||
"Whether to preview images",
|
||||
TRUE,
|
||||
G_PARAM_READWRITE |
|
||||
G_PARAM_CONSTRUCT_ONLY));
|
||||
}
|
||||
|
||||
static void
|
||||
preview_file_selection_init (GObject *object)
|
||||
{
|
||||
PreviewFileSelection *fsel = PREVIEW_FILE_SELECTION (object);
|
||||
|
||||
fsel->priv = g_new0 (PreviewFileSelectionPrivate, 1);
|
||||
}
|
||||
|
||||
GType
|
||||
preview_file_selection_get_type (void)
|
||||
{
|
||||
static GType type = 0;
|
||||
|
||||
if (!type)
|
||||
{
|
||||
GTypeInfo info =
|
||||
{
|
||||
sizeof (PreviewFileSelectionClass),
|
||||
NULL,
|
||||
NULL,
|
||||
(GClassInitFunc) preview_file_selection_class_init,
|
||||
NULL,
|
||||
NULL,
|
||||
sizeof (PreviewFileSelection),
|
||||
0,
|
||||
(GInstanceInitFunc) preview_file_selection_init,
|
||||
NULL
|
||||
};
|
||||
|
||||
type = g_type_register_static (GTK_TYPE_FILE_SELECTION,
|
||||
"PreviewFileSelection",
|
||||
&info, 0);
|
||||
}
|
||||
|
||||
return type;
|
||||
}
|
||||
|
||||
GtkWidget*
|
||||
preview_file_selection_new (const gchar *title, gboolean do_preview)
|
||||
{
|
||||
return GTK_WIDGET (
|
||||
g_object_new (PREVIEW_FILE_SELECTION_TYPE,
|
||||
"title", title,
|
||||
"do_preview", do_preview,
|
||||
NULL));
|
||||
}
|
||||
|
||||
GdkPixbuf*
|
||||
preview_file_selection_intelligent_scale (GdkPixbuf *buf, guint scale)
|
||||
{
|
||||
GdkPixbuf *scaled;
|
||||
int w, h;
|
||||
guint ow = gdk_pixbuf_get_width (buf);
|
||||
guint oh = gdk_pixbuf_get_height (buf);
|
||||
|
||||
if (ow <= scale && oh <= scale)
|
||||
scaled = gdk_pixbuf_ref (buf);
|
||||
else
|
||||
{
|
||||
if (ow > oh)
|
||||
{
|
||||
w = scale;
|
||||
h = scale * (((double)oh)/(double)ow);
|
||||
}
|
||||
else
|
||||
{
|
||||
h = scale;
|
||||
w = scale * (((double)ow)/(double)ow);
|
||||
}
|
||||
|
||||
scaled = gdk_pixbuf_scale_simple (buf, w, h, GDK_INTERP_BILINEAR);
|
||||
}
|
||||
|
||||
return scaled;
|
||||
}
|
||||
|
||||
static void
|
||||
preview_file_selection_update (PreviewFileSelection *fsel, gpointer data)
|
||||
{
|
||||
GdkPixbuf *buf;
|
||||
const gchar *filename;
|
||||
|
||||
g_return_if_fail (IS_PREVIEW_FILE_SELECTION (fsel));
|
||||
|
||||
filename = gtk_file_selection_get_filename (GTK_FILE_SELECTION (fsel));
|
||||
if (filename && (buf = gdk_pixbuf_new_from_file (filename, NULL)))
|
||||
{
|
||||
GdkPixbuf *scaled = preview_file_selection_intelligent_scale (buf, SCALE);
|
||||
gtk_image_set_from_pixbuf (GTK_IMAGE (fsel->priv->preview),
|
||||
scaled);
|
||||
g_object_unref (scaled);
|
||||
g_object_unref (buf);
|
||||
}
|
||||
else
|
||||
gtk_image_set_from_file (GTK_IMAGE (fsel->priv->preview), NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
preview_file_selection_add_preview (PreviewFileSelection *fsel)
|
||||
{
|
||||
GtkWidget *hbox, *frame;
|
||||
|
||||
g_return_if_fail (IS_PREVIEW_FILE_SELECTION (fsel));
|
||||
|
||||
hbox = GTK_FILE_SELECTION (fsel)->file_list;
|
||||
do
|
||||
{
|
||||
hbox = hbox->parent;
|
||||
if (!hbox)
|
||||
{
|
||||
g_warning (_("Can't find an hbox, using a normal file selection"));
|
||||
return;
|
||||
}
|
||||
} while (!GTK_IS_HBOX (hbox));
|
||||
|
||||
frame = gtk_frame_new (_("Preview"));
|
||||
gtk_widget_set_size_request (frame, SCALE + 10, SCALE + 10);
|
||||
gtk_widget_show (frame);
|
||||
gtk_box_pack_end (GTK_BOX (hbox), frame, FALSE, FALSE, 0);
|
||||
|
||||
fsel->priv->preview = gtk_image_new ();
|
||||
gtk_container_add (GTK_CONTAINER (frame), fsel->priv->preview);
|
||||
gtk_widget_show (fsel->priv->preview);
|
||||
|
||||
g_signal_connect_data (G_OBJECT (gtk_tree_view_get_selection (GTK_TREE_VIEW (GTK_FILE_SELECTION (fsel)->file_list))), "changed", (GCallback) preview_file_selection_update, fsel, NULL, G_CONNECT_AFTER | G_CONNECT_SWAPPED);
|
||||
|
||||
preview_file_selection_update (fsel, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
preview_file_selection_set_property (GObject *object, guint arg_id, const GValue *value, GParamSpec *spec)
|
||||
{
|
||||
PreviewFileSelection *fsel = PREVIEW_FILE_SELECTION (object);
|
||||
|
||||
switch (arg_id)
|
||||
{
|
||||
case PROP_DO_PREVIEW:
|
||||
if (g_value_get_boolean (value))
|
||||
preview_file_selection_add_preview (fsel);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void preview_file_selection_get_property (GObject *object, guint arg_id, GValue *value, GParamSpec *spec)
|
||||
{
|
||||
PreviewFileSelection *fsel = PREVIEW_FILE_SELECTION (object);
|
||||
|
||||
switch (arg_id)
|
||||
{
|
||||
case PROP_DO_PREVIEW:
|
||||
g_value_set_boolean (value, fsel->priv->preview != NULL);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
browse_dialog_ok (GtkWidget *button, GnomeFileEntry *entry)
|
||||
{
|
||||
gnome_file_entry_set_filename (entry, gtk_file_selection_get_filename (GTK_FILE_SELECTION (entry->fsw)));
|
||||
g_signal_emit_by_name (entry, "activate");
|
||||
gtk_widget_destroy (entry->fsw);
|
||||
}
|
||||
|
||||
static void
|
||||
browse_dialog_kill (GtkFileSelection *fsel, GnomeFileEntry *entry)
|
||||
{
|
||||
entry->fsw = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
browse_clicked_cb (GnomeFileEntry *entry, const gchar *title)
|
||||
{
|
||||
GtkFileSelection *fs = GTK_FILE_SELECTION (preview_file_selection_new (title, TRUE));
|
||||
|
||||
entry->fsw = GTK_WIDGET (fs);
|
||||
|
||||
g_signal_connect (fs->ok_button, "clicked",
|
||||
(GCallback) browse_dialog_ok, entry);
|
||||
|
||||
g_signal_connect_swapped (fs->cancel_button, "clicked",
|
||||
(GCallback) gtk_widget_destroy, fs);
|
||||
|
||||
g_signal_connect (fs, "destroy",
|
||||
(GCallback) browse_dialog_kill, entry);
|
||||
|
||||
if (gtk_grab_get_current ())
|
||||
gtk_grab_add (entry->fsw);
|
||||
}
|
||||
|
||||
void
|
||||
preview_file_selection_hookup_file_entry (GnomeFileEntry *entry, const gchar *title)
|
||||
{
|
||||
g_return_if_fail (GNOME_IS_FILE_ENTRY (entry));
|
||||
g_return_if_fail (title != NULL);
|
||||
|
||||
g_signal_connect (G_OBJECT (entry), "browse_clicked",
|
||||
(GCallback) browse_clicked_cb, (gpointer) title);
|
||||
}
|
||||
63
libbackground/preview-file-selection.h
Normal file
63
libbackground/preview-file-selection.h
Normal file
@@ -0,0 +1,63 @@
|
||||
/* -*- mode: c; style: linux -*- */
|
||||
|
||||
/* preview-file-selection.h
|
||||
* Copyright (C) 2001 Ximian, Inc.
|
||||
*
|
||||
* Written by Rachel Hestilow <hestilow@ximian.com>
|
||||
*
|
||||
* 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, 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __PREVIEW_FILE_SELECTION_H__
|
||||
#define __PREVIEW_FILE_SELECTION_H__
|
||||
|
||||
#include <gtk/gtkfilesel.h>
|
||||
#include <libgnomeui/gnome-file-entry.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define PREVIEW_FILE_SELECTION_TYPE preview_file_selection_get_type ()
|
||||
#define PREVIEW_FILE_SELECTION(obj) G_TYPE_CHECK_INSTANCE_CAST (obj, PREVIEW_FILE_SELECTION_TYPE, PreviewFileSelection)
|
||||
#define PREVIEW_FILE_SELECTION_CLASS(klass) G_TYPE_CHECK_CLASS_CAST (klass, PREVIEW_FILE_SELECTION_TYPE, PreviewFileSelectionClass)
|
||||
#define IS_PREVIEW_FILE_SELECTION(obj) G_TYPE_CHECK_INSTANCE_TYPE (obj, PREVIEW_FILE_SELECTION_TYPE)
|
||||
|
||||
typedef struct _PreviewFileSelection PreviewFileSelection;
|
||||
typedef struct _PreviewFileSelectionClass PreviewFileSelectionClass;
|
||||
typedef struct _PreviewFileSelectionPrivate PreviewFileSelectionPrivate;
|
||||
|
||||
struct _PreviewFileSelection
|
||||
{
|
||||
GtkFileSelection parent;
|
||||
|
||||
PreviewFileSelectionPrivate *priv;
|
||||
};
|
||||
|
||||
struct _PreviewFileSelectionClass
|
||||
{
|
||||
GtkFileSelectionClass parent_class;
|
||||
};
|
||||
|
||||
GType preview_file_selection_get_type (void);
|
||||
|
||||
GtkWidget *preview_file_selection_new (const gchar *title, gboolean do_preview);
|
||||
|
||||
void preview_file_selection_hookup_file_entry (GnomeFileEntry *entry, const gchar *title);
|
||||
|
||||
GdkPixbuf* preview_file_selection_intelligent_scale (GdkPixbuf *pixbuf, guint scale);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __PREVIEW_FILE_SELECTION_H__ */
|
||||
@@ -1,361 +0,0 @@
|
||||
<?xml version='1.0'?>
|
||||
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
|
||||
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
|
||||
|
||||
<refentry id="gnome-control-center">
|
||||
|
||||
<refentryinfo>
|
||||
<title>gnome-control-center</title>
|
||||
<productname>GNOME</productname>
|
||||
|
||||
<authorgroup>
|
||||
<author>
|
||||
<contrib>Maintainer</contrib>
|
||||
<firstname>Bastien</firstname>
|
||||
<surname>Nocera</surname>
|
||||
<email>hadess@hadess.net</email>
|
||||
</author>
|
||||
</authorgroup>
|
||||
|
||||
</refentryinfo>
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle>gnome-control-center</refentrytitle>
|
||||
<manvolnum>1</manvolnum>
|
||||
<refmiscinfo class="manual">User Commands</refmiscinfo>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname>gnome-control-center</refname>
|
||||
<refpurpose>Configure GNOME settings</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
<cmdsynopsis>
|
||||
<command>gnome-control-center <arg choice="opt" rep="repeat">OPTION</arg> <arg choice="opt">PANEL</arg> <arg choice="opt" rep="repeat">ARG</arg></command>
|
||||
</cmdsynopsis>
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para><command>gnome-control-center</command> is a graphical
|
||||
user interface to configure various aspects of GNOME.</para>
|
||||
|
||||
<para>When run without arguments, the shell displays the
|
||||
<firstterm>overview</firstterm>, which shows all available
|
||||
configuration panels. The overview allows to open individual
|
||||
panels by clicking on them. It also has a search entry
|
||||
to find panels by searching keywords.</para>
|
||||
|
||||
<para>It is also possible to specify a panel name
|
||||
as commandline argument to go directly to that panel.
|
||||
Individual panels may accept further arguments to specify
|
||||
which tab to open (for multi-tabbed panels) or which
|
||||
item to display (for panels with lists).</para>
|
||||
|
||||
<para>Note that <command>gnome-control-center</command>
|
||||
is not meant to expose each and every setting that is
|
||||
available. The settings that can be found here represent
|
||||
what is considered useful and commonly needed options.
|
||||
For more exotic or uncommon options, you can look at
|
||||
<command>gnome-tweak-tool</command> or the
|
||||
<command>gsettings</command> commandline utility.</para>
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Panels</title>
|
||||
|
||||
<para>The following panel names can be specified:</para>
|
||||
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term><option>background</option></term>
|
||||
|
||||
<listitem><para>The background panel lets you
|
||||
set your desktop background.</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>bluetooth</option></term>
|
||||
|
||||
<listitem><para>The bluetooth panel lets you
|
||||
configure your computer's Bluetooth adapter,
|
||||
and pair the computer with Bluetooth keyboards,
|
||||
phones, etc.</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>color</option></term>
|
||||
|
||||
<listitem><para>The color panel can calibrate
|
||||
monitors, web cams and printers for accurate
|
||||
color reproduction.</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>datetime</option></term>
|
||||
|
||||
<listitem><para>The datetime panel lets you
|
||||
set the timezone and time format.</para>
|
||||
<para>Some operations in this panel
|
||||
affect all user accounts on the computer
|
||||
and require privieges.</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>display</option></term>
|
||||
|
||||
<listitem><para>The display panel configures
|
||||
the resolution and arrangement of monitors
|
||||
and laptop panels. Note that monitors can be
|
||||
rearranged by drag-and-drop, and you can change
|
||||
which monitor is your main display by dragging
|
||||
the black bar.</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>info</option></term>
|
||||
|
||||
<listitem><para>The info panel shows a general
|
||||
overview of the system configuration. It also
|
||||
lets you change the default applications for
|
||||
various tasks and the handling of removable
|
||||
media.</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>keyboard</option></term>
|
||||
|
||||
<listitem><para>The keyboard panel can
|
||||
change how the keyboard reacts to key
|
||||
presses and lets you change keyboard
|
||||
shortcuts or create custom shortcuts.</para>
|
||||
<para>You can open this panel on a
|
||||
specific tab by passing <option>typing</option>
|
||||
or <option>shortcuts</option> as extra
|
||||
argument.</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>mouse</option></term>
|
||||
|
||||
<listitem><para>The mouse panel can change
|
||||
how mice and touchpads react to user
|
||||
input.</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>network</option></term>
|
||||
|
||||
<listitem><para>The network panel provides
|
||||
a view of available network devices (wired,
|
||||
wireless or mobile) and their current
|
||||
configuration. It also provides a way to
|
||||
create new VPN connections and configure
|
||||
proxy settings.</para>
|
||||
<para>You can open this panel on a
|
||||
specific dialog by passing
|
||||
<option>create-wifi</option>,
|
||||
<option>connect-hidden-wifi</option>,
|
||||
<option>connect-3g</option>,
|
||||
<option>connect-8021x-wifi</option> or
|
||||
<option>show-device</option> as extra
|
||||
argument. The last three parameters
|
||||
require an additional extra argument for
|
||||
the network object in the form
|
||||
<replaceable>/org/freedesktop/NetworkManager/Devices/0</replaceable>.
|
||||
</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>notifications</option></term>
|
||||
|
||||
<listitem><para>The notifications panel provides
|
||||
a way to control the display of notifications.
|
||||
</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>online-accounts</option></term>
|
||||
|
||||
<listitem><para>The online-accounts panel
|
||||
shows your configured online accounts and
|
||||
lets you add or remove accounts.</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>power</option></term>
|
||||
|
||||
<listitem><para>The power panel shows
|
||||
the fill level of batteries and can
|
||||
configure what happens when the computer
|
||||
is idle or runs out of battery.</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>printers</option></term>
|
||||
|
||||
<listitem><para>The printers panel shows
|
||||
all known printers and their status. It is
|
||||
possible to inspect queued print jobs and
|
||||
add new printers.</para>
|
||||
<para>Some operations in this panel require
|
||||
privileges.</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>privacy</option></term>
|
||||
|
||||
<listitem><para>The privacy panel allows
|
||||
to control visible file usage history, temporary
|
||||
files, and name.
|
||||
</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>region</option></term>
|
||||
|
||||
<listitem><para>The region panel
|
||||
contains regional settings such as
|
||||
the display language, formatting for
|
||||
times, dates, numbers, and input sources.
|
||||
</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>search</option></term>
|
||||
|
||||
<listitem><para>The search panel controls
|
||||
the results visible in the overview, and the
|
||||
files and folders to be indexed.
|
||||
</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>screen</option></term>
|
||||
|
||||
<listitem><para>The screen panel contains
|
||||
settings that control the screen brightness
|
||||
and screen lock behavior.</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>sharing</option></term>
|
||||
|
||||
<listitem><para>The sharing panel contains
|
||||
settings that control what is shared over the
|
||||
network.</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>sound</option></term>
|
||||
|
||||
<listitem><para>The sound panel shows
|
||||
all known sound devices and their configuration,
|
||||
including volume and balance settings.</para>
|
||||
<para>You can open this panel on a
|
||||
specific tab by passing
|
||||
<option>output</option>,
|
||||
<option>input</option>,
|
||||
<option>hardware</option>,
|
||||
<option>effects</option> or
|
||||
<option>applications</option> as extra
|
||||
argument.</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>universal-access</option></term>
|
||||
|
||||
<listitem><para>The universal-access panel
|
||||
contains settings for accessible technologies
|
||||
such as the screen reader, magnifier, screen
|
||||
keyboard and AccessX options.</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>user-accounts</option></term>
|
||||
|
||||
<listitem><para>The user-accounts panel
|
||||
shows all user accounts that exist on the
|
||||
computer and allows to change them in some
|
||||
ways, such as changing the user name, password
|
||||
or permissions. It also allows to create
|
||||
or remove accounts.</para>
|
||||
<para>Some operations in this panel require
|
||||
privileges.</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>wacom</option></term>
|
||||
|
||||
<listitem><para>the wacom panel shows
|
||||
connected Wacom graphics tablets and lets
|
||||
you calibrate and configure such devices.</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
</variablelist>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Options</title>
|
||||
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term><option>-?</option>, <option>--help</option></term>
|
||||
|
||||
<listitem><para>Prints a short help
|
||||
text and exits.</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>--version</option></term>
|
||||
|
||||
<listitem><para>Prints the program version
|
||||
and exits.</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>-v</option>, <option>--verbose</option></term>
|
||||
|
||||
<listitem><para>Enables verbose mode.</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>-l</option>, <option>--list</option></term>
|
||||
|
||||
<listitem><para>Lists the available panels
|
||||
and exits.</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>-o</option>, <option>--overview</option></term>
|
||||
|
||||
<listitem><para>Opens the overview.</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>-s</option> <replaceable>term</replaceable>, <option>--search</option> <replaceable>term</replaceable></term>
|
||||
|
||||
<listitem><para>Sets the following search term.</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
</variablelist>
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Exit status</title>
|
||||
|
||||
<para>On success 0 is returned, a non-zero failure
|
||||
code otherwise.</para>
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>See Also</title>
|
||||
<para>
|
||||
<citerefentry><refentrytitle>gsettings</refentrytitle><manvolnum>1</manvolnum></citerefentry>
|
||||
</para>
|
||||
</refsect1>
|
||||
|
||||
</refentry>
|
||||
@@ -1,26 +0,0 @@
|
||||
xsltproc = find_program('xsltproc', required: false)
|
||||
assert(xsltproc.found(), 'xsltproc is required to build documentation')
|
||||
|
||||
xsltproc_cmd = [
|
||||
xsltproc,
|
||||
'--output', '@OUTPUT@',
|
||||
'--nonet',
|
||||
'--stringparam', 'man.output.quietly', '1',
|
||||
'--stringparam', 'funcsynopsis.style', 'ansi',
|
||||
'--stringparam', 'man.th.extra1.suppress', '1',
|
||||
'--stringparam', 'man.authors.section.enabled', '0',
|
||||
'--stringparam', 'man.copyright.section.enabled', '0',
|
||||
'http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl',
|
||||
'@INPUT@'
|
||||
]
|
||||
|
||||
output = meson.project_name() + '.1'
|
||||
|
||||
custom_target(
|
||||
output,
|
||||
input : meson.project_name() + '.xml',
|
||||
output : output,
|
||||
command : xsltproc_cmd,
|
||||
install : true,
|
||||
install_dir : join_paths(control_center_mandir, 'man1')
|
||||
)
|
||||
287
meson.build
287
meson.build
@@ -1,287 +0,0 @@
|
||||
project(
|
||||
'gnome-control-center', 'c',
|
||||
version : '3.34.1',
|
||||
license : 'GPL2+',
|
||||
meson_version : '>= 0.50.0'
|
||||
)
|
||||
|
||||
control_center_prefix = get_option('prefix')
|
||||
control_center_bindir = join_paths(control_center_prefix, get_option('bindir'))
|
||||
control_center_datadir = join_paths(control_center_prefix, get_option('datadir'))
|
||||
control_center_libexecdir = join_paths(control_center_prefix, get_option('libexecdir'))
|
||||
control_center_localedir = join_paths(control_center_prefix, get_option('localedir'))
|
||||
control_center_mandir = join_paths(control_center_prefix, get_option('mandir'))
|
||||
control_center_sysconfdir = join_paths(control_center_prefix, get_option('sysconfdir'))
|
||||
|
||||
control_center_pkgdatadir = join_paths(control_center_datadir, meson.project_name())
|
||||
control_center_desktopdir = join_paths(control_center_datadir, 'applications')
|
||||
control_center_icondir = join_paths(control_center_datadir, 'icons')
|
||||
control_center_schemadir = join_paths (control_center_datadir, 'glib-2.0', 'schemas')
|
||||
|
||||
control_center_gettext = meson.project_name() + '-2.0'
|
||||
|
||||
host_is_linux = host_machine.system().contains('linux')
|
||||
host_is_linux_not_s390 = host_is_linux and not host_machine.cpu().contains('s390')
|
||||
|
||||
cc = meson.get_compiler('c')
|
||||
|
||||
# Tracing
|
||||
enable_tracing = get_option('tracing')
|
||||
|
||||
config_h = configuration_data()
|
||||
|
||||
py3 = import('python3')
|
||||
python = py3.find_python()
|
||||
|
||||
config_h.set_quoted('TEST_NM_PYTHON', python.path())
|
||||
|
||||
# defines
|
||||
set_defines = [
|
||||
# package
|
||||
['PACKAGE', meson.project_name()],
|
||||
['PACKAGE_VERSION', meson.project_version()],
|
||||
['VERSION', meson.project_version()],
|
||||
# i18n
|
||||
['GETTEXT_PACKAGE', control_center_gettext]
|
||||
]
|
||||
|
||||
foreach define: set_defines
|
||||
config_h.set_quoted(define[0], define[1])
|
||||
endforeach
|
||||
|
||||
# meson does not support octal values, so it must be handled as a
|
||||
# string. See: https://github.com/mesonbuild/meson/issues/2047
|
||||
config_h.set('USER_DIR_MODE', '0700',
|
||||
description: 'Permissions for creating the user\'s config, cache and data directories')
|
||||
|
||||
# compiler flags
|
||||
common_flags = ['-DHAVE_CONFIG_H']
|
||||
|
||||
# Only add this when optimizing is enabled (default)
|
||||
optimized_src = '''
|
||||
#if __OPTIMIZE__ == 0
|
||||
#error No optimization
|
||||
#endif
|
||||
'''
|
||||
|
||||
control_center_optimized = get_option('buildtype').contains('optimized') and cc.compiles(optimized_src)
|
||||
|
||||
if control_center_optimized
|
||||
common_flags += '-Wp,-D_FORTIFY_SOURCE=2'
|
||||
endif
|
||||
|
||||
if get_option('buildtype').contains('debug')
|
||||
test_cflags = [
|
||||
'-Wcast-align',
|
||||
'-Wmissing-field-initializers',
|
||||
'-Wmissing-declarations',
|
||||
'-Wmissing-prototypes',
|
||||
'-Wnested-externs',
|
||||
'-Wno-strict-aliasing',
|
||||
'-Wno-sign-compare'
|
||||
]
|
||||
|
||||
common_flags += cc.get_supported_arguments(test_cflags)
|
||||
endif
|
||||
|
||||
add_project_arguments(common_flags, language: 'c')
|
||||
|
||||
# Check that we meet the dependencies
|
||||
libgvc = subproject(
|
||||
'gvc',
|
||||
default_options: [
|
||||
'static=true',
|
||||
'alsa=false',
|
||||
]
|
||||
)
|
||||
libgvc_dep = libgvc.get_variable('libgvc_dep')
|
||||
|
||||
libhandy_dep = dependency('libhandy-0.0', version: '>= 0.0.9', required: false)
|
||||
if not libhandy_dep.found()
|
||||
libhandy = subproject(
|
||||
'libhandy',
|
||||
default_options: [
|
||||
'examples=false',
|
||||
'glade_catalog=disabled',
|
||||
'introspection=disabled',
|
||||
'static=true',
|
||||
'tests=false',
|
||||
'vapi=false',
|
||||
]
|
||||
)
|
||||
libhandy_dep = libhandy.get_variable('libhandy_dep')
|
||||
endif
|
||||
|
||||
goa_req_version = '>= 3.25.3'
|
||||
pulse_req_version = '>= 2.0'
|
||||
|
||||
accounts_dep = dependency('accountsservice', version: '>= 0.6.39')
|
||||
colord_dep = dependency('colord', version: '>= 0.1.34')
|
||||
gdk_pixbuf_dep = dependency('gdk-pixbuf-2.0', version: '>= 2.23.0')
|
||||
gio_dep = dependency('gio-2.0')
|
||||
glib_dep = dependency('glib-2.0', version: '>= 2.53.0')
|
||||
gnome_desktop_dep = dependency('gnome-desktop-3.0', version: '>= 3.27.90')
|
||||
gnome_settings_dep = dependency('gnome-settings-daemon', version: '>= 3.27.90')
|
||||
goa_dep = dependency('goa-1.0', version: goa_req_version)
|
||||
gsettings_desktop_dep = dependency('gsettings-desktop-schemas', version: '>= 3.31.0')
|
||||
libxml_dep = dependency('libxml-2.0')
|
||||
polkit_gobject_dep = dependency('polkit-gobject-1', version: '>= 0.103')
|
||||
pulse_dep = dependency('libpulse', version: pulse_req_version)
|
||||
pulse_mainloop_dep = dependency('libpulse-mainloop-glib', version: pulse_req_version)
|
||||
upower_glib_dep = dependency('upower-glib', version: '>= 0.99.8')
|
||||
gudev_dep = dependency('gudev-1.0')
|
||||
x11_dep = dependency('x11')
|
||||
xi_dep = dependency('xi', version: '>= 1.2')
|
||||
|
||||
m_dep = cc.find_library('m')
|
||||
|
||||
common_deps = [
|
||||
gio_dep,
|
||||
glib_dep,
|
||||
gsettings_desktop_dep,
|
||||
libhandy_dep,
|
||||
dependency('gio-unix-2.0'),
|
||||
dependency('gthread-2.0'),
|
||||
dependency('gtk+-3.0', version: '>= 3.22.20')
|
||||
]
|
||||
|
||||
# Check for CUPS 1.4 or newer
|
||||
cups_dep = dependency('cups', version : '>= 1.4', required: false)
|
||||
assert(cups_dep.found(), 'CUPS 1.4 or newer not found')
|
||||
|
||||
# https://bugzilla.gnome.org/show_bug.cgi?id=696766
|
||||
cups_cflags = []
|
||||
if cups_dep.version().version_compare('>= 1.6')
|
||||
cups_cflags += '-D_PPD_DEPRECATED=""'
|
||||
endif
|
||||
|
||||
# cups headers
|
||||
check_headers = [
|
||||
['HAVE_CUPS_CUPS_H', 'cups/cups.h'],
|
||||
['HAVE_CUPS_PPD_H', 'cups/ppd.h']
|
||||
]
|
||||
|
||||
foreach header: check_headers
|
||||
assert(cc.has_header(header[1], args: cups_cflags), 'CUPS headers not found: ' + header[1])
|
||||
endforeach
|
||||
|
||||
# Optional dependency for the user accounts panel
|
||||
enable_cheese = get_option('cheese')
|
||||
if enable_cheese
|
||||
cheese_deps = [
|
||||
dependency('cheese', version: '>= 3.28.0'),
|
||||
dependency('cheese-gtk', version: '>= 3.5.91')
|
||||
]
|
||||
endif
|
||||
config_h.set('HAVE_CHEESE', enable_cheese,
|
||||
description: 'Define to 1 to enable cheese webcam support')
|
||||
|
||||
# IBus support
|
||||
enable_ibus = get_option('ibus')
|
||||
if enable_ibus
|
||||
ibus_dep = dependency('ibus-1.0', version: '>= 1.5.2')
|
||||
endif
|
||||
config_h.set('HAVE_IBUS', enable_ibus,
|
||||
description: 'Defined if IBus support is enabled')
|
||||
|
||||
# thunderbolt
|
||||
config_h.set10('HAVE_FN_EXPLICIT_BZERO',
|
||||
cc.has_function('explicit_bzero', prefix: '''#include <string.h>'''),
|
||||
description: 'Define if explicit_bzero is available')
|
||||
|
||||
if host_is_linux
|
||||
# network manager
|
||||
network_manager_deps = [
|
||||
dependency('libnm', version: '>= 1.12.0'),
|
||||
dependency('libnma', version: '>= 1.8.0'),
|
||||
dependency('mm-glib', version: '>= 0.7')
|
||||
]
|
||||
endif
|
||||
config_h.set('BUILD_NETWORK', host_is_linux,
|
||||
description: 'Define to 1 to build the Network panel')
|
||||
config_h.set('HAVE_NETWORK_MANAGER', host_is_linux,
|
||||
description: 'Define to 1 if NetworkManager is available')
|
||||
|
||||
if host_is_linux_not_s390
|
||||
# gnome-bluetooth
|
||||
gnome_bluetooth_dep = dependency('gnome-bluetooth-1.0', version: '>= 3.18.2')
|
||||
|
||||
libwacom_dep = dependency('libwacom', version: '>= 0.7')
|
||||
|
||||
wacom_deps = [
|
||||
libwacom_dep,
|
||||
]
|
||||
config_h.set('HAVE_WACOM_3D_STYLUS', libwacom_dep.version().version_compare('>= 0.27'),
|
||||
description: 'Define to 1 if libwacom provides definition for 3D styli')
|
||||
else
|
||||
message('Bluetooth and Wacom panels will not be built (no USB support on this platform)')
|
||||
message('Thunderbolt panel will not be built (not supported on this platform)')
|
||||
endif
|
||||
config_h.set('BUILD_BLUETOOTH', host_is_linux_not_s390,
|
||||
description: 'Define to 1 to build the Bluetooth panel')
|
||||
config_h.set('HAVE_BLUETOOTH', host_is_linux_not_s390,
|
||||
description: 'Define to 1 if bluetooth support is available')
|
||||
config_h.set('BUILD_WACOM', host_is_linux_not_s390,
|
||||
description: 'Define to 1 to build the Wacom panel')
|
||||
config_h.set('HAVE_WACOM', host_is_linux_not_s390,
|
||||
description: 'Define to 1 if Wacom is supportted')
|
||||
config_h.set('BUILD_THUNDERBOLT', host_is_linux_not_s390,
|
||||
description: 'Define to 1 to build the Thunderbolt panel')
|
||||
|
||||
# Check for info panel
|
||||
gnome_session_libexecdir = get_option('gnome_session_libexecdir')
|
||||
if gnome_session_libexecdir == ''
|
||||
gnome_session_libexecdir = control_center_libexecdir
|
||||
endif
|
||||
|
||||
gnome = import('gnome')
|
||||
i18n = import('i18n')
|
||||
pkg = import('pkgconfig')
|
||||
|
||||
desktop_conf = configuration_data()
|
||||
desktop_conf.set('VERSION', meson.project_version())
|
||||
|
||||
po_dir = join_paths(meson.source_root(), 'po')
|
||||
its_dir = join_paths(meson.source_root(), 'gettext')
|
||||
|
||||
install_subdir(
|
||||
'gettext',
|
||||
install_dir: control_center_datadir
|
||||
)
|
||||
|
||||
top_inc = include_directories('.')
|
||||
shell_inc = include_directories('shell')
|
||||
|
||||
subdir('build-aux')
|
||||
subdir('data/icons')
|
||||
subdir('po')
|
||||
subdir('panels')
|
||||
subdir('shell')
|
||||
subdir('search-provider')
|
||||
subdir('tests')
|
||||
|
||||
if get_option('documentation')
|
||||
subdir('man')
|
||||
endif
|
||||
|
||||
configure_file(
|
||||
output: 'config.h',
|
||||
configuration: config_h
|
||||
)
|
||||
|
||||
output = ''
|
||||
output += '\n ' + meson.project_name() + ' - ' + meson.project_version() + '\n'
|
||||
output += ' ===================================\n'
|
||||
output += ' Options \n'
|
||||
output += ' Documentation .............................. ' + get_option('documentation').to_string() + '\n'
|
||||
output += ' Tracing .................................... ' + enable_tracing.to_string() + '\n'
|
||||
output += ' gnome-session libexecdir ................... ' + gnome_session_libexecdir + '\n'
|
||||
output += ' Optimized .................................. ' + control_center_optimized.to_string() + '\n'
|
||||
output += ' Panels \n'
|
||||
output += ' GNOME Bluetooth (Bluetooth panel) .......... ' + host_is_linux_not_s390.to_string() + '\n'
|
||||
output += ' Cheese (Users panel webcam support) ........ ' + enable_cheese.to_string() + '\n'
|
||||
output += ' IBus (Region panel IBus support) ........... ' + enable_ibus.to_string() + '\n'
|
||||
output += ' NetworkManager (Network panel) ............. ' + host_is_linux.to_string() + '\n'
|
||||
output += ' Wacom (Wacom tablet panel) ................. ' + host_is_linux_not_s390.to_string() + '\n'
|
||||
|
||||
message(output)
|
||||
@@ -1,6 +0,0 @@
|
||||
option('cheese', type: 'boolean', value: true, description: 'build with cheese webcam support')
|
||||
option('documentation', type: 'boolean', value: false, description: 'build documentation')
|
||||
option('gnome_session_libexecdir', type: 'string', value: '', description: 'Directory for gnome-session\'s libexecdir')
|
||||
option('ibus', type: 'boolean', value: true, description: 'build with IBus support')
|
||||
option('tracing', type: 'boolean', value: false, description: 'add extra debugging information')
|
||||
option('wayland', type: 'boolean', value: true, description: 'build with Wayland support')
|
||||
@@ -1,11 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<gresources>
|
||||
<gresource prefix="/org/gnome/control-center/applications">
|
||||
<file preprocess="xml-stripblanks">cc-action-row.ui</file>
|
||||
<file preprocess="xml-stripblanks">cc-applications-panel.ui</file>
|
||||
<file preprocess="xml-stripblanks">cc-applications-row.ui</file>
|
||||
<file preprocess="xml-stripblanks">cc-info-row.ui</file>
|
||||
<file preprocess="xml-stripblanks">cc-toggle-row.ui</file>
|
||||
<file>cc-applications-panel.css</file>
|
||||
</gresource>
|
||||
</gresources>
|
||||
@@ -1,218 +0,0 @@
|
||||
/* cc-action-row.c
|
||||
*
|
||||
* Copyright 2018 Matthias Clasen <matthias.clasen@gmail.com>
|
||||
*
|
||||
* 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 3 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <glib/gi18n.h>
|
||||
|
||||
#include "cc-action-row.h"
|
||||
#include "cc-applications-resources.h"
|
||||
|
||||
struct _CcActionRow
|
||||
{
|
||||
GtkListBoxRow parent;
|
||||
|
||||
GtkWidget *title;
|
||||
GtkWidget *subtitle;
|
||||
GtkWidget *button;
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE (CcActionRow, cc_action_row, GTK_TYPE_LIST_BOX_ROW)
|
||||
|
||||
static int activated_signal;
|
||||
|
||||
enum
|
||||
{
|
||||
PROP_0,
|
||||
PROP_TITLE,
|
||||
PROP_SUBTITLE,
|
||||
PROP_ACTION,
|
||||
PROP_ENABLED,
|
||||
PROP_DESTRUCTIVE
|
||||
};
|
||||
|
||||
static void
|
||||
clicked_cb (CcActionRow *row)
|
||||
{
|
||||
g_signal_emit (row, activated_signal, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
cc_action_row_get_property (GObject *object,
|
||||
guint prop_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
CcActionRow *row = CC_ACTION_ROW (object);
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_TITLE:
|
||||
g_value_set_string (value, gtk_label_get_label (GTK_LABEL (row->title)));
|
||||
break;
|
||||
|
||||
case PROP_SUBTITLE:
|
||||
g_value_set_string (value, gtk_label_get_label (GTK_LABEL (row->subtitle)));
|
||||
break;
|
||||
|
||||
case PROP_ACTION:
|
||||
g_value_set_string (value, gtk_button_get_label (GTK_BUTTON (row->button)));
|
||||
break;
|
||||
|
||||
case PROP_ENABLED:
|
||||
g_value_set_boolean (value, gtk_widget_get_sensitive (row->button));
|
||||
break;
|
||||
|
||||
case PROP_DESTRUCTIVE:
|
||||
g_value_set_boolean (value,
|
||||
gtk_style_context_has_class (gtk_widget_get_style_context (row->button), "destructive-action"));
|
||||
break;
|
||||
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
cc_action_row_set_property (GObject *object,
|
||||
guint prop_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
CcActionRow *row = CC_ACTION_ROW (object);
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_TITLE:
|
||||
gtk_label_set_label (GTK_LABEL (row->title), g_value_get_string (value));
|
||||
break;
|
||||
|
||||
case PROP_SUBTITLE:
|
||||
gtk_label_set_label (GTK_LABEL (row->subtitle), g_value_get_string (value));
|
||||
gtk_widget_set_visible (row->subtitle, strlen (g_value_get_string (value)) > 0);
|
||||
break;
|
||||
|
||||
case PROP_ACTION:
|
||||
gtk_button_set_label (GTK_BUTTON (row->button), g_value_get_string (value));
|
||||
break;
|
||||
|
||||
case PROP_ENABLED:
|
||||
gtk_widget_set_sensitive (row->button, g_value_get_boolean (value));
|
||||
break;
|
||||
|
||||
case PROP_DESTRUCTIVE:
|
||||
if (g_value_get_boolean (value))
|
||||
gtk_style_context_add_class (gtk_widget_get_style_context (row->button), "destructive-action");
|
||||
else
|
||||
gtk_style_context_remove_class (gtk_widget_get_style_context (row->button), "destructive-action");
|
||||
break;
|
||||
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
cc_action_row_class_init (CcActionRowClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
|
||||
|
||||
object_class->get_property = cc_action_row_get_property;
|
||||
object_class->set_property = cc_action_row_set_property;
|
||||
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_TITLE,
|
||||
g_param_spec_string ("title", "title", "title",
|
||||
NULL, G_PARAM_READWRITE));
|
||||
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_SUBTITLE,
|
||||
g_param_spec_string ("subtitle", "subtitle", "subtitle",
|
||||
NULL, G_PARAM_READWRITE));
|
||||
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_ACTION,
|
||||
g_param_spec_string ("action", "action", "action",
|
||||
NULL, G_PARAM_READWRITE));
|
||||
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_ENABLED,
|
||||
g_param_spec_boolean ("enabled", "enabled", "enabled",
|
||||
TRUE, G_PARAM_READWRITE));
|
||||
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_DESTRUCTIVE,
|
||||
g_param_spec_boolean ("destructive", "destructive", "destructive",
|
||||
FALSE, G_PARAM_READWRITE));
|
||||
|
||||
activated_signal = g_signal_new ("activated",
|
||||
G_OBJECT_CLASS_TYPE (object_class),
|
||||
G_SIGNAL_RUN_FIRST,
|
||||
0,
|
||||
NULL, NULL,
|
||||
NULL,
|
||||
G_TYPE_NONE, 0);
|
||||
|
||||
gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/applications/cc-action-row.ui");
|
||||
|
||||
gtk_widget_class_bind_template_child (widget_class, CcActionRow, title);
|
||||
gtk_widget_class_bind_template_child (widget_class, CcActionRow, subtitle);
|
||||
gtk_widget_class_bind_template_child (widget_class, CcActionRow, button);
|
||||
|
||||
gtk_widget_class_bind_template_callback (widget_class, clicked_cb);
|
||||
}
|
||||
|
||||
static void
|
||||
cc_action_row_init (CcActionRow *self)
|
||||
{
|
||||
gtk_widget_init_template (GTK_WIDGET (self));
|
||||
}
|
||||
|
||||
CcActionRow *
|
||||
cc_action_row_new (void)
|
||||
{
|
||||
return CC_ACTION_ROW (g_object_new (CC_TYPE_ACTION_ROW, NULL));
|
||||
}
|
||||
|
||||
void
|
||||
cc_action_row_set_title (CcActionRow *row,
|
||||
const gchar *name)
|
||||
{
|
||||
gtk_label_set_label (GTK_LABEL (row->title), name);
|
||||
}
|
||||
|
||||
void
|
||||
cc_action_row_set_subtitle (CcActionRow *row,
|
||||
const gchar *name)
|
||||
{
|
||||
gtk_label_set_label (GTK_LABEL (row->subtitle), name);
|
||||
gtk_widget_set_visible (row->subtitle, strlen (name) > 0);
|
||||
}
|
||||
|
||||
void
|
||||
cc_action_row_set_action (CcActionRow *row,
|
||||
const gchar *action,
|
||||
gboolean sensitive)
|
||||
{
|
||||
gtk_button_set_label (GTK_BUTTON (row->button), action);
|
||||
gtk_widget_set_sensitive (row->button, sensitive);
|
||||
}
|
||||
@@ -1,42 +0,0 @@
|
||||
/* cc-action-row.h
|
||||
*
|
||||
* Copyright 2018 Matthias Clasen <matthias.clasen@gmail.com>
|
||||
*
|
||||
* 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 3 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define CC_TYPE_ACTION_ROW (cc_action_row_get_type())
|
||||
G_DECLARE_FINAL_TYPE (CcActionRow, cc_action_row, CC, ACTION_ROW, GtkListBoxRow)
|
||||
|
||||
CcActionRow* cc_action_row_new (void);
|
||||
|
||||
void cc_action_row_set_title (CcActionRow *row,
|
||||
const gchar *label);
|
||||
|
||||
void cc_action_row_set_subtitle (CcActionRow *row,
|
||||
const gchar *label);
|
||||
|
||||
void cc_action_row_set_action (CcActionRow *row,
|
||||
const gchar *action,
|
||||
gboolean sensitive);
|
||||
|
||||
G_END_DECLS
|
||||
@@ -1,49 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<interface>
|
||||
<template class="CcActionRow" parent="GtkListBoxRow">
|
||||
<property name="visible">True</property>
|
||||
<property name="can-focus">True</property>
|
||||
<property name="activatable">False</property>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="visible">1</property>
|
||||
<property name="border-width">12</property>
|
||||
<property name="spacing">12</property>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="visible">1</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">4</property>
|
||||
<child>
|
||||
<object class="GtkLabel" id="title">
|
||||
<property name="visible">1</property>
|
||||
<property name="xalign">0</property>
|
||||
<property name="hexpand">1</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel" id="subtitle">
|
||||
<property name="visible">1</property>
|
||||
<property name="xalign">0</property>
|
||||
<property name="hexpand">1</property>
|
||||
<style>
|
||||
<class name="dim-label"/>
|
||||
</style>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="button">
|
||||
<property name="visible">1</property>
|
||||
<property name="valign">center</property>
|
||||
<signal name="clicked" handler="clicked_cb" swapped="yes"/>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</template>
|
||||
</interface>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,11 +0,0 @@
|
||||
.section-title {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.section-subtitle {
|
||||
opacity: 0.55;
|
||||
}
|
||||
|
||||
.sidebar-icon.fullcolor {
|
||||
opacity: 1;
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
/* cc-applications-panel.h
|
||||
*
|
||||
* Copyright 2018 Georges Basile Stavracas Neto <georges.stavracas@gmail.com>
|
||||
*
|
||||
* 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 3 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <shell/cc-panel.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define CC_TYPE_APPLICATIONS_PANEL (cc_applications_panel_get_type())
|
||||
G_DECLARE_FINAL_TYPE (CcApplicationsPanel, cc_applications_panel, CC, APPLICATIONS_PANEL, CcPanel)
|
||||
|
||||
G_END_DECLS
|
||||
@@ -1,598 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<interface>
|
||||
<template class="CcApplicationsPanel" parent="CcPanel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can-focus">False</property>
|
||||
<child>
|
||||
<object class="GtkScrolledWindow" id="main_scroll">
|
||||
<property name="visible">1</property>
|
||||
<property name="hscrollbar-policy">never</property>
|
||||
<child>
|
||||
<object class="HdyColumn">
|
||||
<property name="visible">True</property>
|
||||
<property name="maximum_width">600</property>
|
||||
<property name="linear_growth_width">400</property>
|
||||
<property name="margin_top">32</property>
|
||||
<property name="margin_bottom">32</property>
|
||||
<property name="margin_start">12</property>
|
||||
<property name="margin_end">12</property>
|
||||
<child>
|
||||
<object class="GtkStack" id="stack">
|
||||
<property name="visible">1</property>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="visible">1</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="valign">center</property>
|
||||
<child>
|
||||
<object class="GtkImage">
|
||||
<property name="visible">1</property>
|
||||
<property name="valign">start</property>
|
||||
<property name="pixel-size">80</property>
|
||||
<property name="icon-name">org.gnome.Software-symbolic</property>
|
||||
<style>
|
||||
<class name="dim-label"/>
|
||||
</style>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="fill">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">1</property>
|
||||
<property name="margin-bottom">15</property>
|
||||
<property name="label" translatable="yes">No applications</property>
|
||||
<style>
|
||||
<class name="dim-label"/>
|
||||
</style>
|
||||
<attributes>
|
||||
<attribute name="scale" value="1.2"/>
|
||||
</attributes>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton">
|
||||
<property name="label" translatable="yes">Install some…</property>
|
||||
<property name="visible">1</property>
|
||||
<property name="can-focus">1</property>
|
||||
<property name="receives-default">1</property>
|
||||
<property name="halign">center</property>
|
||||
<signal name="clicked" handler="open_software_cb"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="fill">0</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="name">empty</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="visible">1</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">24</property>
|
||||
<property name="hexpand">1</property>
|
||||
<child>
|
||||
<object class="GtkBox" id="permission_section">
|
||||
<property name="visible">1</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">12</property>
|
||||
<style>
|
||||
<class name="section"/>
|
||||
</style>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="visible">1</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">6</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">1</property>
|
||||
<property name="xalign">0</property>
|
||||
<property name="label" translatable="yes">Permissions & Access</property>
|
||||
<style>
|
||||
<class name="section-title"/>
|
||||
</style>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">1</property>
|
||||
<property name="xalign">0</property>
|
||||
<property name="wrap">1</property>
|
||||
<property name="max-width-chars">50</property>
|
||||
<property name="label" translatable="yes">Data and services that this app has asked for access to and permissions that it requires.</property>
|
||||
<style>
|
||||
<class name="section-subtitle"/>
|
||||
</style>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkListBox" id="permission_list">
|
||||
<property name="visible">1</property>
|
||||
<property name="selection-mode">none</property>
|
||||
<signal name="row-activated" handler="permission_row_activated_cb"/>
|
||||
<child>
|
||||
<object class="CcToggleRow" id="camera">
|
||||
<property name="title" translatable="yes">Camera</property>
|
||||
<signal name="notify::allowed" handler="camera_cb" swapped="yes"/>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="CcInfoRow" id="no_camera">
|
||||
<property name="title" translatable="yes">Camera</property>
|
||||
<property name="info" translatable="yes">Disabled</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="CcToggleRow" id="microphone">
|
||||
<property name="title" translatable="yes">Microphone</property>
|
||||
<signal name="notify::allowed" handler="microphone_cb" swapped="yes"/>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="CcInfoRow" id="no_microphone">
|
||||
<property name="title" translatable="yes">Microphone</property>
|
||||
<property name="info" translatable="yes">Disabled</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="CcToggleRow" id="location">
|
||||
<property name="title" translatable="yes">Location Services</property>
|
||||
<signal name="notify::allowed" handler="location_cb" swapped="yes"/>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="CcInfoRow" id="no_location">
|
||||
<property name="title" translatable="yes">Location Services</property>
|
||||
<property name="info" translatable="yes">Disabled</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="CcInfoRow" id="builtin">
|
||||
<property name="title" translatable="yes">Built-in Permissions</property>
|
||||
<property name="info" translatable="yes">Cannot be changed</property>
|
||||
<property name="has-expander">True</property>
|
||||
<property name="is-link">True</property>
|
||||
</object>
|
||||
</child>
|
||||
<style>
|
||||
<class name="view"/>
|
||||
<class name="frame"/>
|
||||
</style>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">1</property>
|
||||
<property name="xalign">0</property>
|
||||
<property name="wrap">1</property>
|
||||
<property name="max-width-chars">50</property>
|
||||
<property name="label" translatable="yes">Individual permissions for applications can be reviewed in the <a href="privacy">Privacy</a> Settings.</property>
|
||||
<property name="use-markup">1</property>
|
||||
<signal name="activate-link" handler="privacy_link_cb" swapped="yes"/>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox" id="integration_section">
|
||||
<property name="visible">1</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">12</property>
|
||||
<style>
|
||||
<class name="section"/>
|
||||
</style>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="visible">1</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">6</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">1</property>
|
||||
<property name="xalign">0</property>
|
||||
<property name="label" translatable="yes">Integration</property>
|
||||
<style>
|
||||
<class name="section-title"/>
|
||||
</style>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">1</property>
|
||||
<property name="xalign">0</property>
|
||||
<property name="wrap">1</property>
|
||||
<property name="max-width-chars">50</property>
|
||||
<property name="label" translatable="yes">System features used by this application.</property>
|
||||
<style>
|
||||
<class name="section-subtitle"/>
|
||||
</style>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkListBox" id="integration_list">
|
||||
<property name="visible">1</property>
|
||||
<property name="selection-mode">none</property>
|
||||
<child>
|
||||
<object class="CcToggleRow" id="search">
|
||||
<property name="title" translatable="yes">Search</property>
|
||||
<signal name="notify::allowed" handler="search_cb" swapped="yes"/>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="CcInfoRow" id="no_search">
|
||||
<property name="title" translatable="yes">Search</property>
|
||||
<property name="info" translatable="yes">Disabled</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="CcToggleRow" id="notification">
|
||||
<property name="title" translatable="yes">Notifications</property>
|
||||
<signal name="notify::allowed" handler="notification_cb" swapped="yes"/>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="CcToggleRow" id="sound">
|
||||
<property name="title" translatable="yes">Sounds</property>
|
||||
<signal name="notify::allowed" handler="sound_cb" swapped="yes"/>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="CcInfoRow" id="no_sound">
|
||||
<property name="title" translatable="yes">Sounds</property>
|
||||
<property name="info" translatable="yes">Disabled</property>
|
||||
</object>
|
||||
</child>
|
||||
<style>
|
||||
<class name="view"/>
|
||||
<class name="frame"/>
|
||||
</style>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox" id="handler_section">
|
||||
<property name="visible">1</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">12</property>
|
||||
<style>
|
||||
<class name="section"/>
|
||||
</style>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="visible">1</property>
|
||||
<property name="spacing">6</property>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="visible">1</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">6</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">1</property>
|
||||
<property name="xalign">0</property>
|
||||
<property name="label" translatable="yes">Default Handlers</property>
|
||||
<style>
|
||||
<class name="section-title"/>
|
||||
</style>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">1</property>
|
||||
<property name="xalign">0</property>
|
||||
<property name="wrap">1</property>
|
||||
<property name="max-width-chars">50</property>
|
||||
<property name="label" translatable="yes">Types of files and links that this application opens.</property>
|
||||
<style>
|
||||
<class name="section-subtitle"/>
|
||||
</style>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="handler_reset">
|
||||
<property name="visible">1</property>
|
||||
<property name="halign">end</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="label" translatable="yes">Reset</property>
|
||||
<signal name="clicked" handler="handler_reset_cb"/>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkListBox" id="handler_list">
|
||||
<property name="visible">1</property>
|
||||
<property name="selection-mode">none</property>
|
||||
<signal name="row-activated" handler="handler_row_activated_cb"/>
|
||||
<style>
|
||||
<class name="view"/>
|
||||
<class name="frame"/>
|
||||
</style>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox" id="usage_section">
|
||||
<property name="visible">1</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">12</property>
|
||||
<style>
|
||||
<class name="section"/>
|
||||
</style>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="visible">1</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">6</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">1</property>
|
||||
<property name="xalign">0</property>
|
||||
<property name="label" translatable="yes">Usage</property>
|
||||
<style>
|
||||
<class name="section-title"/>
|
||||
</style>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">1</property>
|
||||
<property name="xalign">0</property>
|
||||
<property name="wrap">1</property>
|
||||
<property name="max-width-chars">50</property>
|
||||
<property name="label" translatable="yes">How much resources this application is using.</property>
|
||||
<style>
|
||||
<class name="section-subtitle"/>
|
||||
</style>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkListBox" id="usage_list">
|
||||
<property name="visible">1</property>
|
||||
<property name="selection-mode">none</property>
|
||||
<signal name="row-activated" handler="storage_row_activated_cb"/>
|
||||
<child>
|
||||
<object class="CcInfoRow" id="storage">
|
||||
<property name="title" translatable="yes">Storage</property>
|
||||
<property name="info">unknown</property>
|
||||
<property name="has-expander">1</property>
|
||||
<property name="is-link">1</property>
|
||||
</object>
|
||||
</child>
|
||||
<style>
|
||||
<class name="view"/>
|
||||
<class name="frame"/>
|
||||
</style>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="name">settings</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</template>
|
||||
<object class="GtkLabel" id="title_label">
|
||||
<property name="visible">1</property>
|
||||
<property name="label" translatable="yes">Applications</property>
|
||||
<style>
|
||||
<class name="title"/>
|
||||
</style>
|
||||
</object>
|
||||
<object class="GtkButton" id="header_button">
|
||||
<property name="visible">1</property>
|
||||
<property name="label" translatable="yes">Open in Software</property>
|
||||
</object>
|
||||
|
||||
<!-- Sidebar -->
|
||||
<object class="GtkBox" id="sidebar_box">
|
||||
<property name="visible">True</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child>
|
||||
<object class="GtkSearchEntry" id="sidebar_search_entry">
|
||||
<property name="visible">True</property>
|
||||
<property name="can-focus">True</property>
|
||||
<property name="has-focus">True</property>
|
||||
<property name="margin">12</property>
|
||||
<property name="margin-bottom">6</property>
|
||||
<signal name="activate" handler="on_sidebar_search_entry_activated_cb" object="CcApplicationsPanel" swapped="no" />
|
||||
<signal name="search-changed" handler="on_sidebar_search_entry_search_changed_cb" object="CcApplicationsPanel" swapped="no" />
|
||||
<signal name="stop-search" handler="on_sidebar_search_entry_search_stopped_cb" object="CcApplicationsPanel" swapped="no" />
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkListBox" id="sidebar_listbox">
|
||||
<property name="visible">True</property>
|
||||
<property name="vexpand">True</property>
|
||||
<property name="selection-mode">browse</property>
|
||||
|
||||
<child type="placeholder">
|
||||
<object class="GtkBox" id="empty_search_placeholder">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="halign">center</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="expand">True</property>
|
||||
<property name="border_width">18</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">6</property>
|
||||
<child>
|
||||
<object class="GtkImage">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="pixel_size">64</property>
|
||||
<property name="icon_name">edit-find-symbolic</property>
|
||||
<style>
|
||||
<class name="dim-label"/>
|
||||
</style>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label" translatable="yes">No results found</property>
|
||||
<attributes>
|
||||
<attribute name="weight" value="bold"/>
|
||||
<attribute name="scale" value="1.44"/>
|
||||
</attributes>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label" translatable="yes">Try a different search</property>
|
||||
<style>
|
||||
<class name="dim-label"/>
|
||||
</style>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
|
||||
<!-- Built-in Permissions dialog -->
|
||||
<object class="GtkDialog" id="builtin_dialog">
|
||||
<property name="title" translatable="yes">Built-in Permissions</property>
|
||||
<property name="modal">1</property>
|
||||
<property name="type-hint">dialog</property>
|
||||
<property name="use-header-bar">1</property>
|
||||
<property name="resizable">0</property>
|
||||
<property name="border-width">24</property>
|
||||
<signal name="delete-event" handler="gtk_widget_hide_on_delete"/>
|
||||
<child internal-child="vbox">
|
||||
<object class="GtkBox">
|
||||
<property name="visible">1</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">12</property>
|
||||
<child>
|
||||
<object class="GtkLabel" id="builtin_label">
|
||||
<property name="visible">1</property>
|
||||
<property name="wrap">1</property>
|
||||
<property name="max-width-chars">50</property>
|
||||
<property name="label">Yadda Yadda</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkListBox" id="builtin_list">
|
||||
<property name="visible">1</property>
|
||||
<property name="selection-mode">none</property>
|
||||
<style>
|
||||
<class name="view"/>
|
||||
<class name="frame"/>
|
||||
</style>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
|
||||
<!-- Storage dialog -->
|
||||
<object class="GtkDialog" id="storage_dialog">
|
||||
<property name="title" translatable="yes">Storage</property>
|
||||
<property name="modal">1</property>
|
||||
<property name="type-hint">dialog</property>
|
||||
<property name="use-header-bar">1</property>
|
||||
<property name="resizable">0</property>
|
||||
<property name="border-width">24</property>
|
||||
<signal name="delete-event" handler="gtk_widget_hide_on_delete"/>
|
||||
<child internal-child="vbox">
|
||||
<object class="GtkBox">
|
||||
<property name="visible">1</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">12</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">1</property>
|
||||
<property name="wrap">1</property>
|
||||
<property name="max-width-chars">50</property>
|
||||
<property name="label" translatable="yes">How much disk space this application is occupying with app data and caches.</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkListBox" id="storage_list">
|
||||
<property name="visible">1</property>
|
||||
<property name="selection-mode">none</property>
|
||||
<child>
|
||||
<object class="CcInfoRow" id="app">
|
||||
<property name="title" translatable="yes">Application</property>
|
||||
<property name="info">Unknown</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="CcInfoRow" id="data">
|
||||
<property name="title" translatable="yes">Data</property>
|
||||
<property name="info">Unknown</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="CcInfoRow" id="cache">
|
||||
<property name="title" translatable="yes">Cache</property>
|
||||
<property name="info">Unknown</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="CcInfoRow" id="total">
|
||||
<property name="title" translatable="yes"><b>Total</b></property>
|
||||
<property name="use-markup">1</property>
|
||||
<property name="info">Unknown</property>
|
||||
</object>
|
||||
</child>
|
||||
<style>
|
||||
<class name="view"/>
|
||||
<class name="frame"/>
|
||||
</style>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="visible">1</property>
|
||||
<child>
|
||||
<object class="GtkButton" id="clear_cache_button">
|
||||
<property name="visible">1</property>
|
||||
<property name="label" translatable="yes">Clear Cache…</property>
|
||||
<signal name="clicked" handler="clear_cache_cb" swapped="yes"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="pack-type">end</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</interface>
|
||||
@@ -1,102 +0,0 @@
|
||||
/* cc-applications-row.c
|
||||
*
|
||||
* Copyright 2018 Matthias Clasen <matthias.clasen@gmail.com>
|
||||
*
|
||||
* 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 3 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <glib/gi18n.h>
|
||||
|
||||
#include "cc-applications-row.h"
|
||||
#include "cc-applications-resources.h"
|
||||
|
||||
struct _CcApplicationsRow
|
||||
{
|
||||
GtkListBoxRow parent;
|
||||
|
||||
GAppInfo *info;
|
||||
gchar *sortkey;
|
||||
|
||||
GtkWidget *box;
|
||||
GtkWidget *image;
|
||||
GtkWidget *label;
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE (CcApplicationsRow, cc_applications_row, GTK_TYPE_LIST_BOX_ROW)
|
||||
|
||||
static void
|
||||
cc_applications_row_finalize (GObject *object)
|
||||
{
|
||||
CcApplicationsRow *self = CC_APPLICATIONS_ROW (object);
|
||||
|
||||
g_object_unref (self->info);
|
||||
g_free (self->sortkey);
|
||||
|
||||
G_OBJECT_CLASS (cc_applications_row_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
cc_applications_row_class_init (CcApplicationsRowClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
|
||||
|
||||
object_class->finalize = cc_applications_row_finalize;
|
||||
|
||||
gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/applications/cc-applications-row.ui");
|
||||
|
||||
gtk_widget_class_bind_template_child (widget_class, CcApplicationsRow, box);
|
||||
gtk_widget_class_bind_template_child (widget_class, CcApplicationsRow, image);
|
||||
gtk_widget_class_bind_template_child (widget_class, CcApplicationsRow, label);
|
||||
}
|
||||
|
||||
static void
|
||||
cc_applications_row_init (CcApplicationsRow *self)
|
||||
{
|
||||
gtk_widget_init_template (GTK_WIDGET (self));
|
||||
}
|
||||
|
||||
CcApplicationsRow *
|
||||
cc_applications_row_new (GAppInfo *info)
|
||||
{
|
||||
CcApplicationsRow *self;
|
||||
g_autofree gchar *key = NULL;
|
||||
|
||||
self = g_object_new (CC_TYPE_APPLICATIONS_ROW, NULL);
|
||||
|
||||
self->info = g_object_ref (info);
|
||||
|
||||
key = g_utf8_casefold (g_app_info_get_display_name (info), -1);
|
||||
self->sortkey = g_utf8_collate_key (key, -1);
|
||||
|
||||
gtk_image_set_from_gicon (GTK_IMAGE (self->image), g_app_info_get_icon (info), GTK_ICON_SIZE_BUTTON);
|
||||
gtk_label_set_label (GTK_LABEL (self->label), g_app_info_get_display_name (info));
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
GAppInfo *
|
||||
cc_applications_row_get_info (CcApplicationsRow *self)
|
||||
{
|
||||
return self->info;
|
||||
}
|
||||
|
||||
const gchar *
|
||||
cc_applications_row_get_sort_key (CcApplicationsRow *self)
|
||||
{
|
||||
return self->sortkey;
|
||||
}
|
||||
@@ -1,36 +0,0 @@
|
||||
/* cc-applications-row.h
|
||||
*
|
||||
* Copyright 2018 Matthias Clasen <matthias.clasen@gmail.com>
|
||||
*
|
||||
* 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 3 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define CC_TYPE_APPLICATIONS_ROW (cc_applications_row_get_type())
|
||||
G_DECLARE_FINAL_TYPE (CcApplicationsRow, cc_applications_row, CC, APPLICATIONS_ROW, GtkListBoxRow)
|
||||
|
||||
CcApplicationsRow* cc_applications_row_new (GAppInfo *info);
|
||||
|
||||
GAppInfo* cc_applications_row_get_info (CcApplicationsRow *row);
|
||||
|
||||
const gchar* cc_applications_row_get_sort_key (CcApplicationsRow *row);
|
||||
|
||||
G_END_DECLS
|
||||
@@ -1,32 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<interface>
|
||||
<template class="CcApplicationsRow" parent="GtkListBoxRow">
|
||||
<property name="visible">True</property>
|
||||
<property name="can-focus">True</property>
|
||||
<child>
|
||||
<object class="GtkBox" id="box">
|
||||
<property name="visible">1</property>
|
||||
<property name="border-width">6</property>
|
||||
<property name="spacing">12</property>
|
||||
<child>
|
||||
<object class="GtkImage" id="image">
|
||||
<property name="visible">1</property>
|
||||
<property name="pixel-size">32</property>
|
||||
<style>
|
||||
<class name="sidebar-icon"/>
|
||||
<class name="fullcolor"/>
|
||||
<class name="lowres-icon"/>
|
||||
</style>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel" id="label">
|
||||
<property name="visible">1</property>
|
||||
<property name="xalign">0</property>
|
||||
<property name="ellipsize">end</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</template>
|
||||
</interface>
|
||||
@@ -1,215 +0,0 @@
|
||||
/* cc-info-row.c
|
||||
*
|
||||
* Copyright 2018 Matthias Clasen <matthias.clasen@gmail.com>
|
||||
*
|
||||
* 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 3 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <glib/gi18n.h>
|
||||
|
||||
#include "cc-info-row.h"
|
||||
#include "cc-applications-resources.h"
|
||||
|
||||
struct _CcInfoRow
|
||||
{
|
||||
GtkListBoxRow parent;
|
||||
|
||||
GtkWidget *title;
|
||||
GtkWidget *info;
|
||||
GtkWidget *expander;
|
||||
|
||||
gboolean expanded;
|
||||
gboolean link;
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE (CcInfoRow, cc_info_row, GTK_TYPE_LIST_BOX_ROW)
|
||||
|
||||
enum
|
||||
{
|
||||
PROP_0,
|
||||
PROP_TITLE,
|
||||
PROP_USE_MARKUP,
|
||||
PROP_INFO,
|
||||
PROP_HAS_EXPANDER,
|
||||
PROP_IS_LINK,
|
||||
PROP_EXPANDED
|
||||
};
|
||||
|
||||
static void
|
||||
cc_info_row_get_property (GObject *object,
|
||||
guint prop_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
CcInfoRow *row = CC_INFO_ROW (object);
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_TITLE:
|
||||
g_value_set_string (value, gtk_label_get_label (GTK_LABEL (row->title)));
|
||||
break;
|
||||
case PROP_INFO:
|
||||
g_value_set_string (value, gtk_label_get_label (GTK_LABEL (row->info)));
|
||||
break;
|
||||
case PROP_HAS_EXPANDER:
|
||||
g_value_set_boolean (value, gtk_widget_get_visible (row->expander));
|
||||
break;
|
||||
case PROP_USE_MARKUP:
|
||||
g_value_set_boolean (value, gtk_label_get_use_markup (GTK_LABEL (row->title)));
|
||||
break;
|
||||
case PROP_IS_LINK:
|
||||
g_value_set_boolean (value, row->link);
|
||||
break;
|
||||
case PROP_EXPANDED:
|
||||
g_value_set_boolean (value, cc_info_row_get_expanded (row));
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
update_expander (CcInfoRow *row)
|
||||
{
|
||||
if (row->link)
|
||||
gtk_image_set_from_icon_name (GTK_IMAGE (row->expander), "go-next-symbolic", GTK_ICON_SIZE_BUTTON);
|
||||
else if (row->expanded)
|
||||
gtk_image_set_from_icon_name (GTK_IMAGE (row->expander), "pan-down-symbolic", GTK_ICON_SIZE_BUTTON);
|
||||
else
|
||||
gtk_image_set_from_icon_name (GTK_IMAGE (row->expander), "pan-end-symbolic", GTK_ICON_SIZE_BUTTON);
|
||||
}
|
||||
|
||||
static void
|
||||
cc_info_row_set_property (GObject *object,
|
||||
guint prop_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
CcInfoRow *row = CC_INFO_ROW (object);
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_TITLE:
|
||||
gtk_label_set_label (GTK_LABEL (row->title), g_value_get_string (value));
|
||||
break;
|
||||
|
||||
case PROP_INFO:
|
||||
gtk_label_set_label (GTK_LABEL (row->info), g_value_get_string (value));
|
||||
break;
|
||||
|
||||
case PROP_HAS_EXPANDER:
|
||||
gtk_widget_set_visible (row->expander, g_value_get_boolean (value));
|
||||
gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row), g_value_get_boolean (value));
|
||||
break;
|
||||
|
||||
case PROP_USE_MARKUP:
|
||||
gtk_label_set_use_markup (GTK_LABEL (row->title), g_value_get_boolean (value));
|
||||
break;
|
||||
|
||||
case PROP_IS_LINK:
|
||||
row->link = g_value_get_boolean (value);
|
||||
update_expander (row);
|
||||
break;
|
||||
|
||||
case PROP_EXPANDED:
|
||||
cc_info_row_set_expanded (row, g_value_get_boolean (value));
|
||||
break;
|
||||
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
cc_info_row_class_init (CcInfoRowClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
|
||||
|
||||
object_class->get_property = cc_info_row_get_property;
|
||||
object_class->set_property = cc_info_row_set_property;
|
||||
|
||||
gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/applications/cc-info-row.ui");
|
||||
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_TITLE,
|
||||
g_param_spec_string ("title", "title", "title",
|
||||
NULL, G_PARAM_READWRITE));
|
||||
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_INFO,
|
||||
g_param_spec_string ("info", "info", "info",
|
||||
NULL, G_PARAM_READWRITE));
|
||||
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_USE_MARKUP,
|
||||
g_param_spec_boolean ("use-markup", "use-markup", "use-markup",
|
||||
FALSE, G_PARAM_READWRITE));
|
||||
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_HAS_EXPANDER,
|
||||
g_param_spec_boolean ("has-expander", "has-expander", "has-expander",
|
||||
FALSE, G_PARAM_READWRITE));
|
||||
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_EXPANDED,
|
||||
g_param_spec_boolean ("expanded", "expanded", "expanded",
|
||||
FALSE, G_PARAM_READWRITE));
|
||||
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_IS_LINK,
|
||||
g_param_spec_boolean ("is-link", "is-link", "is-link",
|
||||
FALSE, G_PARAM_READWRITE));
|
||||
|
||||
gtk_widget_class_bind_template_child (widget_class, CcInfoRow, title);
|
||||
gtk_widget_class_bind_template_child (widget_class, CcInfoRow, info);
|
||||
gtk_widget_class_bind_template_child (widget_class, CcInfoRow, expander);
|
||||
}
|
||||
|
||||
static void
|
||||
cc_info_row_init (CcInfoRow *self)
|
||||
{
|
||||
gtk_widget_init_template (GTK_WIDGET (self));
|
||||
}
|
||||
|
||||
CcInfoRow *
|
||||
cc_info_row_new (void)
|
||||
{
|
||||
return CC_INFO_ROW (g_object_new (CC_TYPE_INFO_ROW, NULL));
|
||||
}
|
||||
|
||||
gboolean
|
||||
cc_info_row_get_expanded (CcInfoRow *row)
|
||||
{
|
||||
return row->expanded;
|
||||
}
|
||||
|
||||
void
|
||||
cc_info_row_set_expanded (CcInfoRow *row,
|
||||
gboolean expanded)
|
||||
{
|
||||
if (row->expanded == expanded)
|
||||
return;
|
||||
|
||||
row->expanded = expanded;
|
||||
update_expander (row);
|
||||
|
||||
g_object_notify (G_OBJECT (row), "expanded");
|
||||
}
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
/* cc-info-row.h
|
||||
*
|
||||
* Copyright 2018 Matthias Clasen <matthias.clasen@gmail.com>
|
||||
*
|
||||
* 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 3 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define CC_TYPE_INFO_ROW (cc_info_row_get_type())
|
||||
G_DECLARE_FINAL_TYPE (CcInfoRow, cc_info_row, CC, INFO_ROW, GtkListBoxRow)
|
||||
|
||||
CcInfoRow* cc_info_row_new (void);
|
||||
|
||||
void cc_info_row_set_expanded (CcInfoRow *row,
|
||||
gboolean expanded);
|
||||
|
||||
gboolean cc_info_row_get_expanded (CcInfoRow *row);
|
||||
|
||||
G_END_DECLS
|
||||
@@ -1,40 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<interface>
|
||||
<template class="CcInfoRow" parent="GtkListBoxRow">
|
||||
<property name="visible">True</property>
|
||||
<property name="can-focus">True</property>
|
||||
<property name="activatable">False</property>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="visible">1</property>
|
||||
<property name="border-width">12</property>
|
||||
<property name="spacing">12</property>
|
||||
<child>
|
||||
<object class="GtkLabel" id="title">
|
||||
<property name="visible">1</property>
|
||||
<property name="xalign">0</property>
|
||||
<property name="hexpand">1</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel" id="info">
|
||||
<property name="visible">1</property>
|
||||
<property name="valign">center</property>
|
||||
<style>
|
||||
<class name="dim-label"/>
|
||||
</style>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkImage" id="expander">
|
||||
<property name="valign">center</property>
|
||||
<property name="icon-name">pan-end-symbolic</property>
|
||||
<style>
|
||||
<class name="dim-label"/>
|
||||
</style>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</template>
|
||||
</interface>
|
||||
@@ -1,144 +0,0 @@
|
||||
/* cc-toggle-row.c
|
||||
*
|
||||
* Copyright 2018 Matthias Clasen <matthias.clasen@gmail.com>
|
||||
*
|
||||
* 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 3 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <glib/gi18n.h>
|
||||
|
||||
#include "cc-toggle-row.h"
|
||||
#include "cc-applications-resources.h"
|
||||
|
||||
struct _CcToggleRow
|
||||
{
|
||||
GtkListBoxRow parent;
|
||||
|
||||
GtkWidget *title;
|
||||
GtkWidget *toggle;
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE (CcToggleRow, cc_toggle_row, GTK_TYPE_LIST_BOX_ROW)
|
||||
|
||||
enum
|
||||
{
|
||||
PROP_0,
|
||||
PROP_TITLE,
|
||||
PROP_ALLOWED
|
||||
};
|
||||
|
||||
static void
|
||||
changed_cb (CcToggleRow *row)
|
||||
{
|
||||
g_object_notify (G_OBJECT (row), "allowed");
|
||||
}
|
||||
|
||||
static void
|
||||
cc_toggle_row_get_property (GObject *object,
|
||||
guint prop_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
CcToggleRow *row = CC_TOGGLE_ROW (object);
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_TITLE:
|
||||
g_value_set_string (value, gtk_label_get_label (GTK_LABEL (row->title)));
|
||||
break;
|
||||
case PROP_ALLOWED:
|
||||
g_value_set_boolean (value, cc_toggle_row_get_allowed (row));
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
cc_toggle_row_set_property (GObject *object,
|
||||
guint prop_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
CcToggleRow *row = CC_TOGGLE_ROW (object);
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_TITLE:
|
||||
gtk_label_set_label (GTK_LABEL (row->title), g_value_get_string (value));
|
||||
break;
|
||||
case PROP_ALLOWED:
|
||||
cc_toggle_row_set_allowed (row, g_value_get_boolean (value));
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
cc_toggle_row_class_init (CcToggleRowClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
|
||||
|
||||
object_class->get_property = cc_toggle_row_get_property;
|
||||
object_class->set_property = cc_toggle_row_set_property;
|
||||
|
||||
gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/applications/cc-toggle-row.ui");
|
||||
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_TITLE,
|
||||
g_param_spec_string ("title", "title", "title",
|
||||
NULL, G_PARAM_READWRITE));
|
||||
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_ALLOWED,
|
||||
g_param_spec_boolean ("allowed", "allowed", "allowed",
|
||||
FALSE, G_PARAM_READWRITE));
|
||||
|
||||
gtk_widget_class_bind_template_child (widget_class, CcToggleRow, title);
|
||||
gtk_widget_class_bind_template_child (widget_class, CcToggleRow, toggle);
|
||||
|
||||
gtk_widget_class_bind_template_callback (widget_class, changed_cb);
|
||||
}
|
||||
|
||||
static void
|
||||
cc_toggle_row_init (CcToggleRow *self)
|
||||
{
|
||||
gtk_widget_init_template (GTK_WIDGET (self));
|
||||
}
|
||||
|
||||
CcToggleRow *
|
||||
cc_toggle_row_new (void)
|
||||
{
|
||||
return CC_TOGGLE_ROW (g_object_new (CC_TYPE_TOGGLE_ROW, NULL));
|
||||
}
|
||||
|
||||
void
|
||||
cc_toggle_row_set_allowed (CcToggleRow *self,
|
||||
gboolean allowed)
|
||||
{
|
||||
gtk_switch_set_active (GTK_SWITCH (self->toggle), allowed);
|
||||
}
|
||||
|
||||
gboolean
|
||||
cc_toggle_row_get_allowed (CcToggleRow *self)
|
||||
{
|
||||
return gtk_switch_get_active (GTK_SWITCH (self->toggle));
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
/* cc-toggle-row.h
|
||||
*
|
||||
* Copyright 2018 Matthias Clasen <matthias.clasen@gmail.com>
|
||||
*
|
||||
* 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 3 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define CC_TYPE_TOGGLE_ROW (cc_toggle_row_get_type())
|
||||
G_DECLARE_FINAL_TYPE (CcToggleRow, cc_toggle_row, CC, TOGGLE_ROW, GtkListBoxRow)
|
||||
|
||||
CcToggleRow* cc_toggle_row_new (void);
|
||||
|
||||
void cc_toggle_row_set_allowed (CcToggleRow *row,
|
||||
gboolean allowed);
|
||||
|
||||
gboolean cc_toggle_row_get_allowed (CcToggleRow *row);
|
||||
|
||||
G_END_DECLS
|
||||
@@ -1,29 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<interface>
|
||||
<template class="CcToggleRow" parent="GtkListBoxRow">
|
||||
<property name="visible">True</property>
|
||||
<property name="can-focus">True</property>
|
||||
<property name="activatable">False</property>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="visible">1</property>
|
||||
<property name="border-width">12</property>
|
||||
<property name="spacing">12</property>
|
||||
<child>
|
||||
<object class="GtkLabel" id="title">
|
||||
<property name="visible">1</property>
|
||||
<property name="xalign">0</property>
|
||||
<property name="hexpand">1</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSwitch" id="toggle">
|
||||
<property name="visible">1</property>
|
||||
<property name="valign">center</property>
|
||||
<signal name="notify::active" handler="changed_cb" swapped="yes"/>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</template>
|
||||
</interface>
|
||||
@@ -1,62 +0,0 @@
|
||||
/* globs.c
|
||||
*
|
||||
* Copyright 2018 Matthias Clasen <matthias.clasen@gmail.com>
|
||||
*
|
||||
* 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 3 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include "globs.h"
|
||||
|
||||
/* parse mime/globs and return a string->string hash table */
|
||||
GHashTable *
|
||||
parse_globs (void)
|
||||
{
|
||||
GHashTable *globs;
|
||||
const gchar * const *dirs;
|
||||
gint i;
|
||||
|
||||
globs = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
|
||||
|
||||
dirs = g_get_system_data_dirs ();
|
||||
|
||||
for (i = 0; dirs[i]; i++)
|
||||
{
|
||||
g_autofree gchar *file = g_build_filename (dirs[i], "mime", "globs", NULL);
|
||||
g_autofree gchar *contents = NULL;
|
||||
|
||||
if (g_file_get_contents (file, &contents, NULL, NULL))
|
||||
{
|
||||
g_auto(GStrv) strv = NULL;
|
||||
int i;
|
||||
|
||||
strv = g_strsplit (contents, "\n", 0);
|
||||
for (i = 0; strv[i]; i++)
|
||||
{
|
||||
g_auto(GStrv) parts = NULL;
|
||||
|
||||
if (strv[i][0] == '#' || strv[i][0] == '\0')
|
||||
continue;
|
||||
|
||||
parts = g_strsplit (strv[i], ":", 2);
|
||||
g_hash_table_insert (globs, g_strdup (parts[0]), g_strdup (parts[1]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return globs;
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
/* globs.h
|
||||
*
|
||||
* Copyright 2018 Matthias Clasen <matthias.clasen@gmail.com>
|
||||
*
|
||||
* 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 3 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <gio/gio.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
GHashTable* parse_globs (void);
|
||||
|
||||
G_END_DECLS
|
||||
@@ -1,15 +0,0 @@
|
||||
[Desktop Entry]
|
||||
Name=Applications
|
||||
Comment=Control various application permissions and settings
|
||||
Exec=gnome-control-center applications
|
||||
# FIXME
|
||||
# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
|
||||
Icon=application-x-executable
|
||||
Terminal=false
|
||||
Type=Application
|
||||
NoDisplay=true
|
||||
StartupNotify=true
|
||||
Categories=GNOME;GTK;Settings;DesktopSettings;X-GNOME-Settings-Panel;X-GNOME-AccountSettings;
|
||||
OnlyShowIn=GNOME;Unity;
|
||||
# Translators: Search terms to find the Privacy panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
|
||||
Keywords=application;flatpak;permission;setting;
|
||||
@@ -1,49 +0,0 @@
|
||||
panels_list += cappletname
|
||||
desktop = 'gnome-@0@-panel.desktop'.format(cappletname)
|
||||
|
||||
desktop_in = configure_file(
|
||||
input : desktop + '.in.in',
|
||||
output : desktop + '.in',
|
||||
configuration : desktop_conf
|
||||
)
|
||||
|
||||
i18n.merge_file(
|
||||
desktop,
|
||||
type : 'desktop',
|
||||
input : desktop_in,
|
||||
output : desktop,
|
||||
po_dir : po_dir,
|
||||
install : true,
|
||||
install_dir : control_center_desktopdir
|
||||
)
|
||||
|
||||
sources = files(
|
||||
'cc-applications-panel.c',
|
||||
'cc-applications-row.c',
|
||||
'cc-toggle-row.c',
|
||||
'cc-info-row.c',
|
||||
'cc-action-row.c',
|
||||
'globs.c',
|
||||
'search.c',
|
||||
'utils.c',
|
||||
)
|
||||
|
||||
resource_data = files('cc-applications-panel.ui')
|
||||
|
||||
sources += gnome.compile_resources(
|
||||
'cc-' + cappletname + '-resources',
|
||||
cappletname + '.gresource.xml',
|
||||
c_name : 'cc_' + cappletname,
|
||||
dependencies : resource_data,
|
||||
export : true
|
||||
)
|
||||
|
||||
cflags += '-DGNOMELOCALEDIR="@0@"'.format(control_center_localedir)
|
||||
|
||||
panels_libs += static_library(
|
||||
cappletname,
|
||||
sources : sources,
|
||||
include_directories : [ top_inc, common_inc ],
|
||||
dependencies : common_deps,
|
||||
c_args : cflags
|
||||
)
|
||||
@@ -1,133 +0,0 @@
|
||||
/* search.c
|
||||
*
|
||||
* Copyright 2018 Matthias Clasen <matthias.clasen@gmail.com>
|
||||
*
|
||||
* 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 3 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include "search.h"
|
||||
|
||||
|
||||
#define SHELL_PROVIDER_GROUP "Shell Search Provider"
|
||||
|
||||
static void
|
||||
add_one_provider (GHashTable *search_providers,
|
||||
GFile *file)
|
||||
{
|
||||
g_autoptr(GKeyFile) keyfile = NULL;
|
||||
g_autoptr(GError) error = NULL;
|
||||
g_autofree gchar *app_id = NULL;
|
||||
g_autofree gchar *path = NULL;
|
||||
gboolean default_disabled;
|
||||
|
||||
path = g_file_get_path (file);
|
||||
keyfile = g_key_file_new ();
|
||||
g_key_file_load_from_file (keyfile, path, G_KEY_FILE_NONE, &error);
|
||||
|
||||
if (error != NULL)
|
||||
{
|
||||
g_warning ("Error loading %s: %s - search provider will be ignored",
|
||||
path, error->message);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!g_key_file_has_group (keyfile, SHELL_PROVIDER_GROUP))
|
||||
{
|
||||
g_debug ("Shell search provider group missing from '%s', ignoring", path);
|
||||
return;
|
||||
}
|
||||
|
||||
app_id = g_key_file_get_string (keyfile, SHELL_PROVIDER_GROUP, "DesktopId", &error);
|
||||
|
||||
if (error != NULL)
|
||||
{
|
||||
g_warning ("Unable to read desktop ID from %s: %s - search provider will be ignored",
|
||||
path, error->message);
|
||||
return;
|
||||
}
|
||||
|
||||
if (g_str_has_suffix (app_id, ".desktop"))
|
||||
app_id[strlen (app_id) - strlen (".desktop")] = '\0';
|
||||
|
||||
default_disabled = g_key_file_get_boolean (keyfile, SHELL_PROVIDER_GROUP, "DefaultDisabled", NULL);
|
||||
|
||||
g_hash_table_insert (search_providers, g_strdup (app_id), GINT_TO_POINTER (default_disabled));
|
||||
}
|
||||
|
||||
static void
|
||||
parse_search_providers_one_dir (GHashTable *search_providers,
|
||||
const gchar *system_dir)
|
||||
{
|
||||
g_autoptr(GFileEnumerator) enumerator = NULL;
|
||||
g_autoptr(GError) error = NULL;
|
||||
g_autoptr(GFile) providers_location = NULL;
|
||||
g_autofree gchar *providers_path = NULL;
|
||||
|
||||
providers_path = g_build_filename (system_dir, "gnome-shell", "search-providers", NULL);
|
||||
providers_location = g_file_new_for_path (providers_path);
|
||||
|
||||
enumerator = g_file_enumerate_children (providers_location,
|
||||
"standard::type,standard::name,standard::content-type",
|
||||
G_FILE_QUERY_INFO_NONE,
|
||||
NULL, &error);
|
||||
|
||||
if (error != NULL)
|
||||
{
|
||||
if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND) &&
|
||||
!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
|
||||
g_warning ("Error opening %s: %s - search provider configuration won't be possible",
|
||||
providers_path, error->message);
|
||||
return;
|
||||
}
|
||||
|
||||
while (TRUE)
|
||||
{
|
||||
GFile *provider = NULL;
|
||||
|
||||
if (!g_file_enumerator_iterate (enumerator, NULL, &provider, NULL, &error))
|
||||
{
|
||||
g_warning ("Error while reading %s: %s - search provider configuration won't be possible",
|
||||
providers_path, error->message);
|
||||
return;
|
||||
}
|
||||
|
||||
if (provider == NULL)
|
||||
break;
|
||||
|
||||
add_one_provider (search_providers, provider);
|
||||
}
|
||||
}
|
||||
|
||||
/* parse gnome-shell/search-provider files and return a string->boolean hash table */
|
||||
GHashTable *
|
||||
parse_search_providers (void)
|
||||
{
|
||||
GHashTable *search_providers;
|
||||
const gchar * const *dirs;
|
||||
gint i;
|
||||
|
||||
search_providers = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
|
||||
|
||||
dirs = g_get_system_data_dirs ();
|
||||
|
||||
for (i = 0; dirs[i]; i++)
|
||||
parse_search_providers_one_dir (search_providers, dirs[i]);
|
||||
|
||||
return search_providers;
|
||||
}
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
/* globs.h
|
||||
*
|
||||
* Copyright 2018 Matthias Clasen <matthias.clasen@gmail.com>
|
||||
*
|
||||
* 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 3 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <gio/gio.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
GHashTable* parse_search_providers (void);
|
||||
|
||||
G_END_DECLS
|
||||
@@ -1,243 +0,0 @@
|
||||
/* utils.c
|
||||
*
|
||||
* Copyright 2018 Matthias Clasen <matthias.clasen@gmail.com>
|
||||
*
|
||||
* 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 3 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
#ifndef _XOPEN_SOURCE
|
||||
#define _XOPEN_SOURCE 600
|
||||
#endif
|
||||
|
||||
#include <config.h>
|
||||
#include <glib/gi18n.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include <ftw.h>
|
||||
|
||||
#include "utils.h"
|
||||
|
||||
static gint
|
||||
ftw_remove_cb (const gchar *path,
|
||||
const struct stat *sb,
|
||||
gint typeflags,
|
||||
struct FTW *ftwbuf)
|
||||
{
|
||||
remove (path);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
file_remove_thread_func (GTask *task,
|
||||
gpointer source_object,
|
||||
gpointer task_data,
|
||||
GCancellable *cancellable)
|
||||
{
|
||||
GFile *file = source_object;
|
||||
g_autofree gchar *path = g_file_get_path (file);
|
||||
|
||||
nftw (path, ftw_remove_cb, 20, FTW_DEPTH);
|
||||
|
||||
if (g_task_set_return_on_cancel (task, FALSE))
|
||||
g_task_return_boolean (task, TRUE);
|
||||
}
|
||||
|
||||
void
|
||||
file_remove_async (GFile *file,
|
||||
GCancellable *cancellable,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer data)
|
||||
{
|
||||
g_autoptr(GTask) task = g_task_new (file, cancellable, callback, data);
|
||||
g_task_set_return_on_cancel (task, TRUE);
|
||||
g_task_run_in_thread (task, file_remove_thread_func);
|
||||
}
|
||||
|
||||
gboolean
|
||||
file_remove_finish (GFile *file,
|
||||
GAsyncResult *result,
|
||||
GError **error)
|
||||
{
|
||||
g_return_val_if_fail (g_task_is_valid (result, file), FALSE);
|
||||
return g_task_propagate_boolean (G_TASK (result), error);
|
||||
}
|
||||
|
||||
static GPrivate size_key = G_PRIVATE_INIT (g_free);
|
||||
|
||||
static gint
|
||||
ftw_size_cb (const gchar *path,
|
||||
const struct stat *sb,
|
||||
gint typeflags,
|
||||
struct FTW *ftwbuf)
|
||||
{
|
||||
guint64 *size = (guint64*)g_private_get (&size_key);
|
||||
if (typeflags == FTW_F)
|
||||
*size += sb->st_size;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
file_size_thread_func (GTask *task,
|
||||
gpointer source_object,
|
||||
gpointer task_data,
|
||||
GCancellable *cancellable)
|
||||
{
|
||||
GFile *file = source_object;
|
||||
g_autofree gchar *path = g_file_get_path (file);
|
||||
guint64 *total;
|
||||
|
||||
g_private_replace (&size_key, g_new0 (guint64, 1));
|
||||
|
||||
nftw (path, ftw_size_cb, 20, FTW_DEPTH);
|
||||
|
||||
total = g_new0 (guint64, 1);
|
||||
*total = *(guint64*)g_private_get (&size_key);
|
||||
|
||||
if (g_task_set_return_on_cancel (task, FALSE))
|
||||
g_task_return_pointer (task, total, g_free);
|
||||
}
|
||||
|
||||
void
|
||||
file_size_async (GFile *file,
|
||||
GCancellable *cancellable,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer data)
|
||||
{
|
||||
g_autoptr(GTask) task = g_task_new (file, cancellable, callback, data);
|
||||
g_task_set_return_on_cancel (task, TRUE);
|
||||
g_task_run_in_thread (task, file_size_thread_func);
|
||||
}
|
||||
|
||||
gboolean
|
||||
file_size_finish (GFile *file,
|
||||
GAsyncResult *result,
|
||||
guint64 *size,
|
||||
GError **error)
|
||||
{
|
||||
g_autofree guint64 *data = NULL;
|
||||
|
||||
g_return_val_if_fail (g_task_is_valid (result, file), FALSE);
|
||||
data = g_task_propagate_pointer (G_TASK (result), error);
|
||||
if (data == NULL)
|
||||
return FALSE;
|
||||
if (size != NULL)
|
||||
*size = *data;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
container_remove_all (GtkContainer *container)
|
||||
{
|
||||
g_autoptr(GList) children = NULL;
|
||||
GList *l;
|
||||
|
||||
children = gtk_container_get_children (container);
|
||||
for (l = children; l; l = l->next)
|
||||
gtk_widget_destroy (GTK_WIDGET (l->data));
|
||||
}
|
||||
|
||||
static gchar *
|
||||
get_output_of (const gchar **argv)
|
||||
{
|
||||
g_autofree gchar *output = NULL;
|
||||
int status;
|
||||
|
||||
if (!g_spawn_sync (NULL,
|
||||
(gchar**) argv,
|
||||
NULL,
|
||||
G_SPAWN_SEARCH_PATH,
|
||||
NULL, NULL,
|
||||
&output, NULL,
|
||||
&status, NULL))
|
||||
return NULL;
|
||||
|
||||
if (!g_spawn_check_exit_status (status, NULL))
|
||||
return NULL;
|
||||
|
||||
return g_steal_pointer (&output);
|
||||
}
|
||||
|
||||
GKeyFile *
|
||||
get_flatpak_metadata (const gchar *app_id)
|
||||
{
|
||||
const gchar *argv[5] = { "flatpak", "info", "-m", "app", NULL };
|
||||
g_autofree gchar *data = NULL;
|
||||
g_autoptr(GError) error = NULL;
|
||||
g_autoptr(GKeyFile) keyfile = NULL;
|
||||
|
||||
argv[3] = app_id;
|
||||
|
||||
data = get_output_of (argv);
|
||||
if (data == NULL)
|
||||
return NULL;
|
||||
|
||||
keyfile = g_key_file_new ();
|
||||
if (!g_key_file_load_from_data (keyfile, data, -1, 0, &error))
|
||||
{
|
||||
g_warning ("%s", error->message);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return g_steal_pointer (&keyfile);
|
||||
}
|
||||
|
||||
guint64
|
||||
get_flatpak_app_size (const gchar *app_id)
|
||||
{
|
||||
const gchar *argv[5] = { "flatpak", "info", "-s", "app", NULL };
|
||||
g_autofree gchar *data = NULL;
|
||||
guint64 factor;
|
||||
double val;
|
||||
|
||||
argv[3] = app_id;
|
||||
|
||||
data = get_output_of (argv);
|
||||
if (data == NULL)
|
||||
return 0;
|
||||
|
||||
data = g_strstrip (data);
|
||||
|
||||
if (g_str_has_suffix (data, "kB") || g_str_has_suffix (data, "kb"))
|
||||
factor = 1000;
|
||||
else if (g_str_has_suffix (data, "MB") || g_str_has_suffix (data, "Mb"))
|
||||
factor = 1000 * 1000;
|
||||
else if (g_str_has_suffix (data, "GB") || g_str_has_suffix (data, "Gb"))
|
||||
factor = 1000 * 1000 * 1000;
|
||||
else if (g_str_has_suffix (data, "KiB") || g_str_has_suffix (data, "Kib"))
|
||||
factor = 1024;
|
||||
else if (g_str_has_suffix (data, "MiB") || g_str_has_suffix (data, "Mib"))
|
||||
factor = 1024 * 1024;
|
||||
else if (g_str_has_suffix (data, "GiB") || g_str_has_suffix (data, "Gib"))
|
||||
factor = 1024 * 1024 * 1024;
|
||||
else
|
||||
factor = 1;
|
||||
|
||||
val = g_ascii_strtod (data, NULL);
|
||||
|
||||
return (guint64)(val * factor);
|
||||
}
|
||||
|
||||
char *
|
||||
get_app_id (GAppInfo *info)
|
||||
{
|
||||
gchar *app_id = g_strdup (g_app_info_get_id (info));
|
||||
|
||||
if (g_str_has_suffix (app_id, ".desktop"))
|
||||
app_id[strlen (app_id) - strlen (".desktop")] = '\0';
|
||||
|
||||
return app_id;
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
/* utils.h
|
||||
*
|
||||
* Copyright 2018 Matthias Clasen <matthias.clasen@gmail.com>
|
||||
*
|
||||
* 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 3 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <gio/gio.h>
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
void file_remove_async (GFile *file,
|
||||
GCancellable *cancellable,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer data);
|
||||
|
||||
gboolean file_remove_finish (GFile *file,
|
||||
GAsyncResult *result,
|
||||
GError **error);
|
||||
|
||||
void file_size_async (GFile *file,
|
||||
GCancellable *cancellable,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer data);
|
||||
|
||||
gboolean file_size_finish (GFile *file,
|
||||
GAsyncResult *result,
|
||||
guint64 *size,
|
||||
GError **error);
|
||||
|
||||
void container_remove_all (GtkContainer *container);
|
||||
|
||||
GKeyFile* get_flatpak_metadata (const gchar *app_id);
|
||||
|
||||
guint64 get_flatpak_app_size (const gchar *app_id);
|
||||
|
||||
gchar* get_app_id (GAppInfo *info);
|
||||
|
||||
G_END_DECLS
|
||||
@@ -1,9 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<gresources>
|
||||
<gresource prefix="/org/gnome/control-center/background">
|
||||
<file preprocess="xml-stripblanks">cc-background-chooser.ui</file>
|
||||
<file preprocess="xml-stripblanks">cc-background-panel.ui</file>
|
||||
<file preprocess="xml-stripblanks">cc-background-preview.ui</file>
|
||||
<file>preview.css</file>
|
||||
</gresource>
|
||||
</gresources>
|
||||
@@ -1,219 +0,0 @@
|
||||
/* bg-colors-source.c */
|
||||
/*
|
||||
* Copyright (C) 2010 Intel, Inc
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Author: Thomas Wood <thomas.wood@intel.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include "bg-colors-source.h"
|
||||
|
||||
#include "cc-background-item.h"
|
||||
|
||||
#include <cairo-gobject.h>
|
||||
#include <glib/gi18n-lib.h>
|
||||
#include <gdesktop-enums.h>
|
||||
|
||||
struct _BgColorsSource
|
||||
{
|
||||
BgSource parent_instance;
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE (BgColorsSource, bg_colors_source, BG_TYPE_SOURCE)
|
||||
|
||||
struct {
|
||||
GDesktopBackgroundShading type;
|
||||
int orientation;
|
||||
const char *pcolor;
|
||||
} items[] = {
|
||||
{ G_DESKTOP_BACKGROUND_SHADING_SOLID, -1, "#000000" },
|
||||
{ G_DESKTOP_BACKGROUND_SHADING_SOLID, -1, "#db5d33" },
|
||||
{ G_DESKTOP_BACKGROUND_SHADING_SOLID, -1, "#008094" },
|
||||
{ G_DESKTOP_BACKGROUND_SHADING_SOLID, -1, "#5d479d" },
|
||||
{ G_DESKTOP_BACKGROUND_SHADING_SOLID, -1, "#ab2876" },
|
||||
{ G_DESKTOP_BACKGROUND_SHADING_SOLID, -1, "#fad166" },
|
||||
{ G_DESKTOP_BACKGROUND_SHADING_SOLID, -1, "#437740" },
|
||||
{ G_DESKTOP_BACKGROUND_SHADING_SOLID, -1, "#d272c4" },
|
||||
{ G_DESKTOP_BACKGROUND_SHADING_SOLID, -1, "#ed9116" },
|
||||
{ G_DESKTOP_BACKGROUND_SHADING_SOLID, -1, "#ff89a9" },
|
||||
{ G_DESKTOP_BACKGROUND_SHADING_SOLID, -1, "#7a8aa2" },
|
||||
{ G_DESKTOP_BACKGROUND_SHADING_SOLID, -1, "#888888" },
|
||||
{ G_DESKTOP_BACKGROUND_SHADING_SOLID, -1, "#475b52" },
|
||||
{ G_DESKTOP_BACKGROUND_SHADING_SOLID, -1, "#425265" },
|
||||
{ G_DESKTOP_BACKGROUND_SHADING_SOLID, -1, "#7a634b" },
|
||||
};
|
||||
|
||||
static gchar *
|
||||
get_colors_path (void)
|
||||
{
|
||||
return g_build_filename (g_get_user_config_dir (), "gnome-control-center", "backgrounds", "colors.ini", NULL);
|
||||
}
|
||||
|
||||
static char *
|
||||
get_colors_dir (void)
|
||||
{
|
||||
return g_build_filename (g_get_user_config_dir (), "gnome-control-center", "backgrounds", NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
bg_colors_source_add_color (BgColorsSource *self,
|
||||
GListStore *store,
|
||||
const char *color)
|
||||
{
|
||||
CcBackgroundItemFlags flags;
|
||||
g_autoptr(CcBackgroundItem) item = NULL;
|
||||
|
||||
item = cc_background_item_new (NULL);
|
||||
flags = CC_BACKGROUND_ITEM_HAS_PCOLOR |
|
||||
CC_BACKGROUND_ITEM_HAS_SCOLOR |
|
||||
CC_BACKGROUND_ITEM_HAS_SHADING |
|
||||
CC_BACKGROUND_ITEM_HAS_PLACEMENT |
|
||||
CC_BACKGROUND_ITEM_HAS_URI;
|
||||
/* It does have a URI, it's "none" */
|
||||
|
||||
g_object_set (G_OBJECT (item),
|
||||
"uri", "file:///" DATADIR "/gnome-control-center/pixmaps/noise-texture-light.png",
|
||||
"primary-color", color,
|
||||
"secondary-color", color,
|
||||
"shading", G_DESKTOP_BACKGROUND_SHADING_SOLID,
|
||||
"placement", G_DESKTOP_BACKGROUND_STYLE_WALLPAPER,
|
||||
"flags", flags,
|
||||
NULL);
|
||||
cc_background_item_load (item, NULL);
|
||||
|
||||
/* insert the item into the liststore */
|
||||
g_list_store_append (store, item);
|
||||
}
|
||||
|
||||
static void
|
||||
bg_colors_source_constructed (GObject *object)
|
||||
{
|
||||
BgColorsSource *self = BG_COLORS_SOURCE (object);
|
||||
guint i;
|
||||
GListStore *store;
|
||||
g_autoptr(GKeyFile) keyfile = NULL;
|
||||
g_autofree gchar *path = NULL;
|
||||
|
||||
G_OBJECT_CLASS (bg_colors_source_parent_class)->constructed (object);
|
||||
|
||||
store = bg_source_get_liststore (BG_SOURCE (self));
|
||||
|
||||
for (i = 0; i < G_N_ELEMENTS (items); i++)
|
||||
bg_colors_source_add_color (self, store, items[i].pcolor);
|
||||
|
||||
keyfile = g_key_file_new ();
|
||||
path = get_colors_path ();
|
||||
if (g_key_file_load_from_file (keyfile, path, G_KEY_FILE_NONE, NULL))
|
||||
{
|
||||
g_auto(GStrv) colors = NULL;
|
||||
|
||||
colors = g_key_file_get_string_list (keyfile, "Colors", "custom-colors", NULL, NULL);
|
||||
for (i = 0; colors != NULL && colors[i] != NULL; i++)
|
||||
bg_colors_source_add_color (self, store, colors[i]);
|
||||
}
|
||||
}
|
||||
|
||||
gboolean
|
||||
bg_colors_source_add (BgColorsSource *self,
|
||||
GdkRGBA *rgba,
|
||||
GtkTreeRowReference **ret_row_ref)
|
||||
{
|
||||
GListStore *store;
|
||||
g_autofree gchar *c = NULL;
|
||||
g_auto(GStrv) colors = NULL;
|
||||
gsize len;
|
||||
g_autoptr(GKeyFile) keyfile = NULL;
|
||||
g_autoptr(GError) error = NULL;
|
||||
g_autofree gchar *dir = NULL;
|
||||
g_autofree gchar *path = NULL;
|
||||
|
||||
c = g_strdup_printf ("#%02x%02x%02x",
|
||||
(int)(255*rgba->red),
|
||||
(int)(255*rgba->green),
|
||||
(int)(255*rgba->blue));
|
||||
|
||||
store = bg_source_get_liststore (BG_SOURCE (self));
|
||||
|
||||
bg_colors_source_add_color (self, store, c);
|
||||
|
||||
/* Save to the keyfile */
|
||||
dir = get_colors_dir ();
|
||||
g_mkdir_with_parents (dir, 0700);
|
||||
|
||||
path = get_colors_path ();
|
||||
colors = NULL;
|
||||
len = 0;
|
||||
|
||||
keyfile = g_key_file_new ();
|
||||
if (g_key_file_load_from_file (keyfile, path, G_KEY_FILE_NONE, NULL))
|
||||
colors = g_key_file_get_string_list (keyfile, "Colors", "custom-colors", &len, NULL);
|
||||
|
||||
if (len == 0 && colors != NULL)
|
||||
g_clear_pointer (&colors, g_strfreev);
|
||||
|
||||
if (colors == NULL)
|
||||
{
|
||||
colors = g_new0 (char *, 2);
|
||||
colors[0] = g_steal_pointer (&c);
|
||||
len = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
char **new_colors;
|
||||
guint i;
|
||||
|
||||
new_colors = g_new0 (char *, len + 2);
|
||||
for (i = 0; colors[i] != NULL; i++)
|
||||
{
|
||||
new_colors[i] = colors[i];
|
||||
colors[i] = NULL;
|
||||
}
|
||||
|
||||
new_colors[len] = g_steal_pointer (&c);
|
||||
len++;
|
||||
|
||||
g_strfreev (colors);
|
||||
colors = new_colors;
|
||||
}
|
||||
|
||||
g_key_file_set_string_list (keyfile, "Colors", "custom-colors", (const gchar * const*) colors, len);
|
||||
|
||||
if (!g_key_file_save_to_file (keyfile, path, &error))
|
||||
g_warning ("Could not save custom color: %s", error->message);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
bg_colors_source_init (BgColorsSource *self)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
bg_colors_source_class_init (BgColorsSourceClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
object_class->constructed = bg_colors_source_constructed;
|
||||
}
|
||||
|
||||
BgColorsSource *
|
||||
bg_colors_source_new (GtkWidget *widget)
|
||||
{
|
||||
return g_object_new (BG_TYPE_COLORS_SOURCE, "widget", widget, NULL);
|
||||
}
|
||||
|
||||
@@ -1,41 +0,0 @@
|
||||
/* bg-colors-source.h */
|
||||
/*
|
||||
* Copyright (C) 2010 Intel, Inc
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Author: Thomas Wood <thomas.wood@intel.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _BG_COLORS_SOURCE_H
|
||||
#define _BG_COLORS_SOURCE_H
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
#include "bg-source.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define BG_TYPE_COLORS_SOURCE (bg_colors_source_get_type ())
|
||||
G_DECLARE_FINAL_TYPE (BgColorsSource, bg_colors_source, BG, COLORS_SOURCE, BgSource)
|
||||
|
||||
BgColorsSource *bg_colors_source_new (GtkWidget *widget);
|
||||
|
||||
gboolean bg_colors_source_add (BgColorsSource *self,
|
||||
GdkRGBA *rgba,
|
||||
GtkTreeRowReference **ret_row_ref);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* _BG_COLORS_SOURCE_H */
|
||||
@@ -1,857 +0,0 @@
|
||||
/* bg-pictures-source.c */
|
||||
/*
|
||||
* Copyright (C) 2010 Intel, Inc
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Author: Thomas Wood <thomas.wood@intel.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include "bg-pictures-source.h"
|
||||
|
||||
#include "cc-background-grilo-miner.h"
|
||||
#include "cc-background-item.h"
|
||||
|
||||
#include <string.h>
|
||||
#include <cairo-gobject.h>
|
||||
#include <gio/gio.h>
|
||||
#include <grilo.h>
|
||||
#include <libgnome-desktop/gnome-desktop-thumbnail.h>
|
||||
#include <gdesktop-enums.h>
|
||||
|
||||
#define ATTRIBUTES G_FILE_ATTRIBUTE_STANDARD_NAME "," \
|
||||
G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE "," \
|
||||
G_FILE_ATTRIBUTE_TIME_MODIFIED
|
||||
|
||||
struct _BgPicturesSource
|
||||
{
|
||||
BgSource parent_instance;
|
||||
|
||||
GCancellable *cancellable;
|
||||
|
||||
CcBackgroundGriloMiner *grl_miner;
|
||||
|
||||
GFileMonitor *picture_dir_monitor;
|
||||
GFileMonitor *cache_dir_monitor;
|
||||
|
||||
GHashTable *known_items;
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE (BgPicturesSource, bg_pictures_source, BG_TYPE_SOURCE)
|
||||
|
||||
const char * const content_types[] = {
|
||||
"image/png",
|
||||
"image/jp2",
|
||||
"image/jpeg",
|
||||
"image/bmp",
|
||||
"image/svg+xml",
|
||||
"image/x-portable-anymap",
|
||||
NULL
|
||||
};
|
||||
|
||||
const char * const screenshot_types[] = {
|
||||
"image/png",
|
||||
NULL
|
||||
};
|
||||
|
||||
static char *bg_pictures_source_get_unique_filename (const char *uri);
|
||||
|
||||
static void picture_opened_for_read (GObject *source_object, GAsyncResult *res, gpointer user_data);
|
||||
|
||||
static void
|
||||
bg_pictures_source_dispose (GObject *object)
|
||||
{
|
||||
BgPicturesSource *source = BG_PICTURES_SOURCE (object);
|
||||
|
||||
if (source->cancellable)
|
||||
{
|
||||
g_cancellable_cancel (source->cancellable);
|
||||
g_clear_object (&source->cancellable);
|
||||
}
|
||||
|
||||
g_clear_object (&source->grl_miner);
|
||||
|
||||
G_OBJECT_CLASS (bg_pictures_source_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void
|
||||
bg_pictures_source_finalize (GObject *object)
|
||||
{
|
||||
BgPicturesSource *bg_source = BG_PICTURES_SOURCE (object);
|
||||
|
||||
g_clear_pointer (&bg_source->known_items, g_hash_table_destroy);
|
||||
|
||||
g_clear_object (&bg_source->picture_dir_monitor);
|
||||
g_clear_object (&bg_source->cache_dir_monitor);
|
||||
|
||||
G_OBJECT_CLASS (bg_pictures_source_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
bg_pictures_source_class_init (BgPicturesSourceClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
object_class->dispose = bg_pictures_source_dispose;
|
||||
object_class->finalize = bg_pictures_source_finalize;
|
||||
}
|
||||
|
||||
static void
|
||||
remove_placeholder (BgPicturesSource *bg_source,
|
||||
CcBackgroundItem *item)
|
||||
{
|
||||
GListStore *store;
|
||||
guint i;
|
||||
|
||||
store = bg_source_get_liststore (BG_SOURCE (bg_source));
|
||||
|
||||
for (i = 0; i < g_list_model_get_n_items (G_LIST_MODEL (store)); i++)
|
||||
{
|
||||
g_autoptr(CcBackgroundItem) item_n = NULL;
|
||||
|
||||
item_n = g_list_model_get_item (G_LIST_MODEL (store), i);
|
||||
|
||||
if (item_n == item)
|
||||
{
|
||||
g_list_store_remove (store, i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean
|
||||
picture_needs_rotation (GdkPixbuf *pixbuf)
|
||||
{
|
||||
const gchar *str;
|
||||
|
||||
str = gdk_pixbuf_get_option (pixbuf, "orientation");
|
||||
if (str == NULL)
|
||||
return FALSE;
|
||||
|
||||
if (*str == '5' || *str == '6' || *str == '7' || *str == '8')
|
||||
return TRUE;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static GdkPixbuf *
|
||||
swap_rotated_pixbuf (GdkPixbuf *pixbuf)
|
||||
{
|
||||
GdkPixbuf *tmp_pixbuf;
|
||||
|
||||
tmp_pixbuf = gdk_pixbuf_apply_embedded_orientation (pixbuf);
|
||||
if (tmp_pixbuf == NULL)
|
||||
return pixbuf;
|
||||
|
||||
g_object_unref (pixbuf);
|
||||
return tmp_pixbuf;
|
||||
}
|
||||
|
||||
static int
|
||||
sort_func (gconstpointer a,
|
||||
gconstpointer b,
|
||||
gpointer user_data)
|
||||
{
|
||||
CcBackgroundItem *item_a;
|
||||
CcBackgroundItem *item_b;
|
||||
guint64 modified_a;
|
||||
guint64 modified_b;
|
||||
int retval;
|
||||
|
||||
item_a = (CcBackgroundItem *) a;
|
||||
item_b = (CcBackgroundItem *) b;
|
||||
modified_a = cc_background_item_get_modified (item_a);
|
||||
modified_b = cc_background_item_get_modified (item_b);
|
||||
|
||||
retval = modified_b - modified_a;
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
static void
|
||||
picture_scaled (GObject *source_object,
|
||||
GAsyncResult *res,
|
||||
gpointer user_data)
|
||||
{
|
||||
BgPicturesSource *bg_source;
|
||||
CcBackgroundItem *item;
|
||||
g_autoptr(GError) error = NULL;
|
||||
g_autoptr(GdkPixbuf) pixbuf = NULL;
|
||||
const char *software;
|
||||
const char *uri;
|
||||
GListStore *store;
|
||||
cairo_surface_t *surface = NULL;
|
||||
int scale_factor;
|
||||
gboolean rotation_applied;
|
||||
|
||||
item = g_object_get_data (source_object, "item");
|
||||
pixbuf = gdk_pixbuf_new_from_stream_finish (res, &error);
|
||||
if (pixbuf == NULL)
|
||||
{
|
||||
if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
|
||||
{
|
||||
g_warning ("Failed to load image: %s", error->message);
|
||||
remove_placeholder (BG_PICTURES_SOURCE (user_data), item);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/* since we were not cancelled, we can now cast user_data
|
||||
* back to BgPicturesSource.
|
||||
*/
|
||||
bg_source = BG_PICTURES_SOURCE (user_data);
|
||||
store = bg_source_get_liststore (BG_SOURCE (bg_source));
|
||||
uri = cc_background_item_get_uri (item);
|
||||
if (uri == NULL)
|
||||
uri = cc_background_item_get_source_url (item);
|
||||
|
||||
/* Ignore screenshots */
|
||||
software = gdk_pixbuf_get_option (pixbuf, "tEXt::Software");
|
||||
if (software != NULL &&
|
||||
g_str_equal (software, "gnome-screenshot"))
|
||||
{
|
||||
g_debug ("Ignored URL '%s' as it's a screenshot from gnome-screenshot", uri);
|
||||
remove_placeholder (BG_PICTURES_SOURCE (user_data), item);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Process embedded orientation */
|
||||
rotation_applied = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (item), "rotation-applied"));
|
||||
|
||||
if (!rotation_applied && picture_needs_rotation (pixbuf))
|
||||
{
|
||||
/* the width and height of pixbuf we requested are wrong for EXIF
|
||||
* orientations 5, 6, 7 and 8. the file has to be reloaded. */
|
||||
g_autoptr(GFile) file = NULL;
|
||||
|
||||
file = g_file_new_for_uri (uri);
|
||||
g_object_set_data (G_OBJECT (item), "needs-rotation", GINT_TO_POINTER (TRUE));
|
||||
g_object_set_data_full (G_OBJECT (file), "item", g_object_ref (item), g_object_unref);
|
||||
g_file_read_async (G_FILE (file), G_PRIORITY_DEFAULT,
|
||||
bg_source->cancellable,
|
||||
picture_opened_for_read, bg_source);
|
||||
return;
|
||||
}
|
||||
|
||||
pixbuf = swap_rotated_pixbuf (pixbuf);
|
||||
|
||||
scale_factor = bg_source_get_scale_factor (BG_SOURCE (bg_source));
|
||||
surface = gdk_cairo_surface_create_from_pixbuf (pixbuf, scale_factor, NULL);
|
||||
cc_background_item_load (item, NULL);
|
||||
|
||||
/* insert the item into the liststore */
|
||||
g_list_store_insert_sorted (store, item, sort_func, bg_source);
|
||||
|
||||
g_hash_table_insert (bg_source->known_items,
|
||||
bg_pictures_source_get_unique_filename (uri),
|
||||
GINT_TO_POINTER (TRUE));
|
||||
|
||||
g_clear_pointer (&surface, cairo_surface_destroy);
|
||||
}
|
||||
|
||||
static void
|
||||
picture_opened_for_read (GObject *source_object,
|
||||
GAsyncResult *res,
|
||||
gpointer user_data)
|
||||
{
|
||||
BgPicturesSource *bg_source;
|
||||
CcBackgroundItem *item;
|
||||
g_autoptr(GFileInputStream) stream = NULL;
|
||||
g_autoptr(GError) error = NULL;
|
||||
gint thumbnail_height;
|
||||
gint thumbnail_width;
|
||||
gboolean needs_rotation;
|
||||
|
||||
item = g_object_get_data (source_object, "item");
|
||||
stream = g_file_read_finish (G_FILE (source_object), res, &error);
|
||||
if (stream == NULL)
|
||||
{
|
||||
if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
|
||||
{
|
||||
g_autofree gchar *filename = g_file_get_path (G_FILE (source_object));
|
||||
g_warning ("Failed to load picture '%s': %s", filename, error->message);
|
||||
remove_placeholder (BG_PICTURES_SOURCE (user_data), item);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/* since we were not cancelled, we can now cast user_data
|
||||
* back to BgPicturesSource.
|
||||
*/
|
||||
bg_source = BG_PICTURES_SOURCE (user_data);
|
||||
|
||||
needs_rotation = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (item), "needs-rotation"));
|
||||
if (needs_rotation)
|
||||
{
|
||||
/* swap width and height for EXIF orientations that need it */
|
||||
thumbnail_width = bg_source_get_thumbnail_height (BG_SOURCE (bg_source));
|
||||
thumbnail_height = bg_source_get_thumbnail_width (BG_SOURCE (bg_source));
|
||||
g_object_set_data (G_OBJECT (item), "rotation-applied", GINT_TO_POINTER (TRUE));
|
||||
}
|
||||
else
|
||||
{
|
||||
thumbnail_width = bg_source_get_thumbnail_width (BG_SOURCE (bg_source));
|
||||
thumbnail_height = bg_source_get_thumbnail_height (BG_SOURCE (bg_source));
|
||||
}
|
||||
|
||||
g_object_set_data_full (G_OBJECT (stream), "item", g_object_ref (item), g_object_unref);
|
||||
gdk_pixbuf_new_from_stream_at_scale_async (G_INPUT_STREAM (stream),
|
||||
thumbnail_width, thumbnail_height,
|
||||
TRUE,
|
||||
bg_source->cancellable,
|
||||
picture_scaled, bg_source);
|
||||
}
|
||||
|
||||
static void
|
||||
picture_copied_for_read (GObject *source_object,
|
||||
GAsyncResult *res,
|
||||
gpointer user_data)
|
||||
{
|
||||
BgPicturesSource *bg_source;
|
||||
CcBackgroundItem *item;
|
||||
g_autoptr(GError) error = NULL;
|
||||
GFile *thumbnail_file = G_FILE (source_object);
|
||||
GFile *native_file;
|
||||
|
||||
if (!g_file_copy_finish (thumbnail_file, res, &error))
|
||||
{
|
||||
if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
|
||||
return;
|
||||
else if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_EXISTS))
|
||||
{
|
||||
g_autofree gchar *uri = NULL;
|
||||
|
||||
uri = g_file_get_uri (thumbnail_file);
|
||||
g_warning ("Failed to download '%s': %s", uri, error->message);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
bg_source = BG_PICTURES_SOURCE (user_data);
|
||||
|
||||
native_file = g_object_get_data (G_OBJECT (thumbnail_file), "native-file");
|
||||
item = g_object_get_data (G_OBJECT (thumbnail_file), "item");
|
||||
g_object_set_data_full (G_OBJECT (native_file), "item", g_object_ref (item), g_object_unref);
|
||||
g_file_read_async (native_file,
|
||||
G_PRIORITY_DEFAULT,
|
||||
bg_source->cancellable,
|
||||
picture_opened_for_read,
|
||||
bg_source);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
in_content_types (const char *content_type)
|
||||
{
|
||||
guint i;
|
||||
for (i = 0; content_types[i]; i++)
|
||||
if (g_str_equal (content_types[i], content_type))
|
||||
return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static GFile *
|
||||
bg_pictures_source_get_cache_file (void)
|
||||
{
|
||||
g_autofree gchar *path = NULL;
|
||||
GFile *file;
|
||||
|
||||
path = bg_pictures_source_get_cache_path ();
|
||||
file = g_file_new_for_path (path);
|
||||
|
||||
return file;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
add_single_file (BgPicturesSource *bg_source,
|
||||
GFile *file,
|
||||
const gchar *content_type,
|
||||
guint64 mtime)
|
||||
{
|
||||
g_autoptr(CcBackgroundItem) item = NULL;
|
||||
CcBackgroundItemFlags flags = 0;
|
||||
g_autofree gchar *source_uri = NULL;
|
||||
g_autofree gchar *uri = NULL;
|
||||
gboolean needs_download;
|
||||
gboolean retval = FALSE;
|
||||
const gchar *pictures_path;
|
||||
g_autoptr(GFile) pictures_dir = NULL;
|
||||
g_autoptr(GFile) cache_dir = NULL;
|
||||
GrlMedia *media;
|
||||
|
||||
/* find png and jpeg files */
|
||||
if (!content_type)
|
||||
goto out;
|
||||
if (!in_content_types (content_type))
|
||||
goto out;
|
||||
|
||||
/* create a new CcBackgroundItem */
|
||||
uri = g_file_get_uri (file);
|
||||
|
||||
pictures_path = g_get_user_special_dir (G_USER_DIRECTORY_PICTURES);
|
||||
if (pictures_path == NULL)
|
||||
pictures_path = g_get_home_dir ();
|
||||
pictures_dir = g_file_new_for_path (pictures_path);
|
||||
cache_dir = bg_pictures_source_get_cache_file ();
|
||||
needs_download = !g_file_has_parent (file, pictures_dir) &&
|
||||
!g_file_has_parent (file, cache_dir);
|
||||
|
||||
if (!needs_download)
|
||||
{
|
||||
source_uri = g_strdup (uri);
|
||||
flags |= CC_BACKGROUND_ITEM_HAS_URI;
|
||||
}
|
||||
else
|
||||
{
|
||||
source_uri = g_steal_pointer (&uri);
|
||||
}
|
||||
|
||||
item = cc_background_item_new (uri);
|
||||
flags |= CC_BACKGROUND_ITEM_HAS_SHADING | CC_BACKGROUND_ITEM_HAS_PLACEMENT;
|
||||
g_object_set (G_OBJECT (item),
|
||||
"flags", flags,
|
||||
"shading", G_DESKTOP_BACKGROUND_SHADING_SOLID,
|
||||
"placement", G_DESKTOP_BACKGROUND_STYLE_ZOOM,
|
||||
"modified", mtime,
|
||||
"needs-download", needs_download,
|
||||
"source-url", source_uri,
|
||||
NULL);
|
||||
|
||||
media = g_object_get_data (G_OBJECT (file), "grl-media");
|
||||
if (media == NULL)
|
||||
{
|
||||
g_object_set_data_full (G_OBJECT (file), "item", g_object_ref (item), g_object_unref);
|
||||
g_file_read_async (file, G_PRIORITY_DEFAULT,
|
||||
bg_source->cancellable,
|
||||
picture_opened_for_read, bg_source);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_autoptr(GFile) native_file = NULL;
|
||||
g_autoptr(GFile) thumbnail_file = NULL;
|
||||
g_autofree gchar *native_dir = NULL;
|
||||
g_autofree gchar *native_path = NULL;
|
||||
const gchar *title;
|
||||
const gchar *thumbnail_uri;
|
||||
|
||||
title = grl_media_get_title (media);
|
||||
g_object_set (G_OBJECT (item), "name", title, NULL);
|
||||
|
||||
thumbnail_uri = grl_media_get_thumbnail (media);
|
||||
thumbnail_file = g_file_new_for_uri (thumbnail_uri);
|
||||
|
||||
native_path = gnome_desktop_thumbnail_path_for_uri (source_uri, GNOME_DESKTOP_THUMBNAIL_SIZE_LARGE);
|
||||
native_file = g_file_new_for_path (native_path);
|
||||
|
||||
native_dir = g_path_get_dirname (native_path);
|
||||
g_mkdir_with_parents (native_dir, USER_DIR_MODE);
|
||||
|
||||
g_object_set_data_full (G_OBJECT (thumbnail_file), "item", g_object_ref (item), g_object_unref);
|
||||
g_object_set_data_full (G_OBJECT (thumbnail_file),
|
||||
"native-file",
|
||||
g_object_ref (native_file),
|
||||
g_object_unref);
|
||||
g_file_copy_async (thumbnail_file,
|
||||
native_file,
|
||||
G_FILE_COPY_ALL_METADATA,
|
||||
G_PRIORITY_DEFAULT,
|
||||
bg_source->cancellable,
|
||||
NULL,
|
||||
NULL,
|
||||
picture_copied_for_read,
|
||||
bg_source);
|
||||
}
|
||||
|
||||
retval = TRUE;
|
||||
|
||||
out:
|
||||
return retval;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
add_single_file_from_info (BgPicturesSource *bg_source,
|
||||
GFile *file,
|
||||
GFileInfo *info)
|
||||
{
|
||||
const gchar *content_type;
|
||||
guint64 mtime;
|
||||
|
||||
content_type = g_file_info_get_content_type (info);
|
||||
mtime = g_file_info_get_attribute_uint64 (info, G_FILE_ATTRIBUTE_TIME_MODIFIED);
|
||||
return add_single_file (bg_source, file, content_type, mtime);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
add_single_file_from_media (BgPicturesSource *bg_source,
|
||||
GFile *file,
|
||||
GrlMedia *media)
|
||||
{
|
||||
GDateTime *mtime;
|
||||
const gchar *content_type;
|
||||
gint64 mtime_unix;
|
||||
|
||||
content_type = grl_media_get_mime (media);
|
||||
|
||||
/* only GRL_METADATA_KEY_CREATION_DATE is implemented in the Flickr
|
||||
* plugin, GRL_METADATA_KEY_MODIFICATION_DATE is not
|
||||
*/
|
||||
mtime = grl_media_get_creation_date (media);
|
||||
if (!mtime)
|
||||
mtime = grl_media_get_modification_date (media);
|
||||
if (mtime)
|
||||
mtime_unix = g_date_time_to_unix (mtime);
|
||||
else
|
||||
mtime_unix = g_get_real_time () / G_USEC_PER_SEC;
|
||||
|
||||
return add_single_file (bg_source, file, content_type, (guint64) mtime_unix);
|
||||
}
|
||||
|
||||
gboolean
|
||||
bg_pictures_source_add (BgPicturesSource *bg_source,
|
||||
const char *uri,
|
||||
GtkTreeRowReference **ret_row_ref)
|
||||
{
|
||||
g_autoptr(GFile) file = NULL;
|
||||
GFileInfo *info;
|
||||
gboolean retval;
|
||||
|
||||
file = g_file_new_for_uri (uri);
|
||||
info = g_file_query_info (file, ATTRIBUTES, G_FILE_QUERY_INFO_NONE, NULL, NULL);
|
||||
if (info == NULL)
|
||||
return FALSE;
|
||||
|
||||
retval = add_single_file_from_info (bg_source, file, info);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
gboolean
|
||||
bg_pictures_source_remove (BgPicturesSource *bg_source,
|
||||
const char *uri)
|
||||
{
|
||||
GListStore *store;
|
||||
gboolean retval;
|
||||
guint i;
|
||||
|
||||
retval = FALSE;
|
||||
store = bg_source_get_liststore (BG_SOURCE (bg_source));
|
||||
|
||||
for (i = 0; i < g_list_model_get_n_items (G_LIST_MODEL (store)); i++)
|
||||
{
|
||||
g_autoptr(CcBackgroundItem) tmp_item = NULL;
|
||||
const char *tmp_uri;
|
||||
|
||||
tmp_item = g_list_model_get_item (G_LIST_MODEL (store), i);
|
||||
tmp_uri = cc_background_item_get_uri (tmp_item);
|
||||
if (g_str_equal (tmp_uri, uri))
|
||||
{
|
||||
char *uuid;
|
||||
uuid = bg_pictures_source_get_unique_filename (uri);
|
||||
g_hash_table_insert (bg_source->known_items,
|
||||
uuid, NULL);
|
||||
|
||||
g_list_store_remove (store, i);
|
||||
retval = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int
|
||||
file_sort_func (gconstpointer a,
|
||||
gconstpointer b)
|
||||
{
|
||||
GFileInfo *file_a = G_FILE_INFO (a);
|
||||
GFileInfo *file_b = G_FILE_INFO (b);
|
||||
guint64 modified_a, modified_b;
|
||||
|
||||
modified_a = g_file_info_get_attribute_uint64 (file_a, G_FILE_ATTRIBUTE_TIME_MODIFIED);
|
||||
|
||||
modified_b = g_file_info_get_attribute_uint64 (file_b, G_FILE_ATTRIBUTE_TIME_MODIFIED);
|
||||
|
||||
return modified_b - modified_a;
|
||||
}
|
||||
|
||||
static void
|
||||
file_info_async_ready (GObject *source,
|
||||
GAsyncResult *res,
|
||||
gpointer user_data)
|
||||
{
|
||||
BgPicturesSource *bg_source;
|
||||
GList *files, *l;
|
||||
g_autoptr(GError) err = NULL;
|
||||
GFile *parent;
|
||||
|
||||
files = g_file_enumerator_next_files_finish (G_FILE_ENUMERATOR (source),
|
||||
res,
|
||||
&err);
|
||||
if (err)
|
||||
{
|
||||
if (!g_error_matches (err, G_IO_ERROR, G_IO_ERROR_CANCELLED))
|
||||
g_warning ("Could not get pictures file information: %s", err->message);
|
||||
|
||||
g_list_foreach (files, (GFunc) g_object_unref, NULL);
|
||||
g_list_free (files);
|
||||
return;
|
||||
}
|
||||
|
||||
bg_source = BG_PICTURES_SOURCE (user_data);
|
||||
|
||||
parent = g_file_enumerator_get_container (G_FILE_ENUMERATOR (source));
|
||||
|
||||
files = g_list_sort (files, file_sort_func);
|
||||
|
||||
/* iterate over the available files */
|
||||
for (l = files; l; l = g_list_next (l))
|
||||
{
|
||||
GFileInfo *info = l->data;
|
||||
g_autoptr(GFile) file = NULL;
|
||||
|
||||
file = g_file_get_child (parent, g_file_info_get_name (info));
|
||||
|
||||
add_single_file_from_info (bg_source, file, info);
|
||||
}
|
||||
|
||||
g_list_foreach (files, (GFunc) g_object_unref, NULL);
|
||||
g_list_free (files);
|
||||
}
|
||||
|
||||
static void
|
||||
dir_enum_async_ready (GObject *s,
|
||||
GAsyncResult *res,
|
||||
gpointer user_data)
|
||||
{
|
||||
BgPicturesSource *source = (BgPicturesSource *) user_data;
|
||||
g_autoptr(GFileEnumerator) enumerator = NULL;
|
||||
g_autoptr(GError) err = NULL;
|
||||
|
||||
enumerator = g_file_enumerate_children_finish (G_FILE (s), res, &err);
|
||||
|
||||
if (err)
|
||||
{
|
||||
if (!g_error_matches (err, G_IO_ERROR, G_IO_ERROR_CANCELLED))
|
||||
g_warning ("Could not fill pictures source: %s", err->message);
|
||||
return;
|
||||
}
|
||||
|
||||
/* get the files */
|
||||
g_file_enumerator_next_files_async (enumerator,
|
||||
G_MAXINT,
|
||||
G_PRIORITY_LOW,
|
||||
source->cancellable,
|
||||
file_info_async_ready,
|
||||
user_data);
|
||||
}
|
||||
|
||||
char *
|
||||
bg_pictures_source_get_cache_path (void)
|
||||
{
|
||||
return g_build_filename (g_get_user_cache_dir (),
|
||||
"gnome-control-center",
|
||||
"backgrounds",
|
||||
NULL);
|
||||
}
|
||||
|
||||
static char *
|
||||
bg_pictures_source_get_unique_filename (const char *uri)
|
||||
{
|
||||
g_autoptr(GChecksum) csum = NULL;
|
||||
char *ret;
|
||||
|
||||
csum = g_checksum_new (G_CHECKSUM_SHA256);
|
||||
g_checksum_update (csum, (guchar *) uri, -1);
|
||||
ret = g_strdup (g_checksum_get_string (csum));
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
char *
|
||||
bg_pictures_source_get_unique_path (const char *uri)
|
||||
{
|
||||
g_autoptr(GFile) parent = NULL;
|
||||
g_autoptr(GFile) file = NULL;
|
||||
g_autofree gchar *cache_path = NULL;
|
||||
g_autofree gchar *filename = NULL;
|
||||
|
||||
cache_path = bg_pictures_source_get_cache_path ();
|
||||
parent = g_file_new_for_path (cache_path);
|
||||
|
||||
filename = bg_pictures_source_get_unique_filename (uri);
|
||||
file = g_file_get_child (parent, filename);
|
||||
|
||||
return g_file_get_path (file);
|
||||
}
|
||||
|
||||
gboolean
|
||||
bg_pictures_source_is_known (BgPicturesSource *bg_source,
|
||||
const char *uri)
|
||||
{
|
||||
g_autofree gchar *uuid = NULL;
|
||||
|
||||
uuid = bg_pictures_source_get_unique_filename (uri);
|
||||
|
||||
return GPOINTER_TO_INT (g_hash_table_lookup (bg_source->known_items, uuid));
|
||||
}
|
||||
|
||||
static void
|
||||
file_info_ready (GObject *object,
|
||||
GAsyncResult *res,
|
||||
gpointer user_data)
|
||||
{
|
||||
GFileInfo *info;
|
||||
GError *error = NULL;
|
||||
GFile *file = G_FILE (object);
|
||||
|
||||
info = g_file_query_info_finish (file, res, &error);
|
||||
|
||||
if (!info)
|
||||
{
|
||||
if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
|
||||
g_warning ("Problem looking up file info: %s", error->message);
|
||||
g_clear_error (&error);
|
||||
return;
|
||||
}
|
||||
|
||||
add_single_file_from_info (BG_PICTURES_SOURCE (user_data), file, info);
|
||||
}
|
||||
|
||||
static void
|
||||
file_added (GFile *file,
|
||||
BgPicturesSource *self)
|
||||
{
|
||||
g_autofree gchar *uri = NULL;
|
||||
uri = g_file_get_uri (file);
|
||||
|
||||
if (!bg_pictures_source_is_known (self, uri))
|
||||
{
|
||||
g_file_query_info_async (file,
|
||||
ATTRIBUTES,
|
||||
G_FILE_QUERY_INFO_NONE,
|
||||
G_PRIORITY_LOW,
|
||||
NULL,
|
||||
file_info_ready,
|
||||
self);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
files_changed_cb (GFileMonitor *monitor,
|
||||
GFile *file,
|
||||
GFile *other_file,
|
||||
GFileMonitorEvent event_type,
|
||||
gpointer user_data)
|
||||
{
|
||||
BgPicturesSource *self = BG_PICTURES_SOURCE (user_data);
|
||||
g_autofree gchar *uri = NULL;
|
||||
|
||||
switch (event_type)
|
||||
{
|
||||
case G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT:
|
||||
file_added (file, self);
|
||||
break;
|
||||
|
||||
case G_FILE_MONITOR_EVENT_DELETED:
|
||||
uri = g_file_get_uri (file);
|
||||
bg_pictures_source_remove (self, uri);
|
||||
break;
|
||||
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
static GFileMonitor *
|
||||
monitor_path (BgPicturesSource *self,
|
||||
const char *path)
|
||||
{
|
||||
GFileMonitor *monitor;
|
||||
g_autoptr(GFile) dir = NULL;
|
||||
|
||||
g_mkdir_with_parents (path, USER_DIR_MODE);
|
||||
|
||||
dir = g_file_new_for_path (path);
|
||||
g_file_enumerate_children_async (dir,
|
||||
ATTRIBUTES,
|
||||
G_FILE_QUERY_INFO_NONE,
|
||||
G_PRIORITY_LOW, self->cancellable,
|
||||
dir_enum_async_ready, self);
|
||||
|
||||
monitor = g_file_monitor_directory (dir,
|
||||
G_FILE_MONITOR_NONE,
|
||||
self->cancellable,
|
||||
NULL);
|
||||
|
||||
if (monitor)
|
||||
g_signal_connect (monitor,
|
||||
"changed",
|
||||
G_CALLBACK (files_changed_cb),
|
||||
self);
|
||||
|
||||
return monitor;
|
||||
}
|
||||
|
||||
static void
|
||||
media_found_cb (BgPicturesSource *self, GrlMedia *media)
|
||||
{
|
||||
g_autoptr(GFile) file = NULL;
|
||||
const gchar *uri;
|
||||
|
||||
uri = grl_media_get_url (media);
|
||||
file = g_file_new_for_uri (uri);
|
||||
g_object_set_data_full (G_OBJECT (file), "grl-media", g_object_ref (media), g_object_unref);
|
||||
add_single_file_from_media (self, file, media);
|
||||
}
|
||||
|
||||
static void
|
||||
bg_pictures_source_init (BgPicturesSource *self)
|
||||
{
|
||||
const gchar *pictures_path;
|
||||
g_autofree gchar *cache_path = NULL;
|
||||
|
||||
self->cancellable = g_cancellable_new ();
|
||||
self->known_items = g_hash_table_new_full (g_str_hash,
|
||||
g_str_equal,
|
||||
(GDestroyNotify) g_free,
|
||||
NULL);
|
||||
|
||||
pictures_path = g_get_user_special_dir (G_USER_DIRECTORY_PICTURES);
|
||||
if (pictures_path == NULL)
|
||||
pictures_path = g_get_home_dir ();
|
||||
|
||||
self->picture_dir_monitor = monitor_path (self, pictures_path);
|
||||
|
||||
cache_path = bg_pictures_source_get_cache_path ();
|
||||
self->cache_dir_monitor = monitor_path (self, cache_path);
|
||||
|
||||
self->grl_miner = cc_background_grilo_miner_new ();
|
||||
g_signal_connect_swapped (self->grl_miner, "media-found", G_CALLBACK (media_found_cb), self);
|
||||
cc_background_grilo_miner_start (self->grl_miner);
|
||||
}
|
||||
|
||||
BgPicturesSource *
|
||||
bg_pictures_source_new (GtkWidget *widget)
|
||||
{
|
||||
return g_object_new (BG_TYPE_PICTURES_SOURCE, "widget", widget, NULL);
|
||||
}
|
||||
|
||||
const char * const *
|
||||
bg_pictures_get_support_content_types (void)
|
||||
{
|
||||
return content_types;
|
||||
}
|
||||
@@ -1,50 +0,0 @@
|
||||
/* bg-pictures-source.h */
|
||||
/*
|
||||
* Copyright (C) 2010 Intel, Inc
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Author: Thomas Wood <thomas.wood@intel.com>
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _BG_PICTURES_SOURCE_H
|
||||
#define _BG_PICTURES_SOURCE_H
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
#include "bg-source.h"
|
||||
#include "cc-background-item.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define BG_TYPE_PICTURES_SOURCE (bg_pictures_source_get_type ())
|
||||
G_DECLARE_FINAL_TYPE (BgPicturesSource, bg_pictures_source, BG, PICTURES_SOURCE, BgSource)
|
||||
|
||||
BgPicturesSource *bg_pictures_source_new (GtkWidget *widget);
|
||||
char *bg_pictures_source_get_cache_path (void);
|
||||
char *bg_pictures_source_get_unique_path(const char *uri);
|
||||
gboolean bg_pictures_source_add (BgPicturesSource *bg_source,
|
||||
const char *uri,
|
||||
GtkTreeRowReference **ret_row_ref);
|
||||
gboolean bg_pictures_source_remove (BgPicturesSource *bg_source,
|
||||
const char *uri);
|
||||
gboolean bg_pictures_source_is_known (BgPicturesSource *bg_source,
|
||||
const char *uri);
|
||||
|
||||
const char * const * bg_pictures_get_support_content_types (void);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* _BG_PICTURES_SOURCE_H */
|
||||
@@ -1,473 +0,0 @@
|
||||
/* bg-recent-source.c
|
||||
*
|
||||
* Copyright 2019 Georges Basile Stavracas Neto <georges.stavracas@gmail.com>
|
||||
*
|
||||
* 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 3 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
#define G_LOG_DOMAIN "bg-recent-source"
|
||||
|
||||
#include "bg-recent-source.h"
|
||||
#include "cc-background-item.h"
|
||||
|
||||
#define ATTRIBUTES G_FILE_ATTRIBUTE_STANDARD_NAME "," \
|
||||
G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE "," \
|
||||
G_FILE_ATTRIBUTE_TIME_MODIFIED
|
||||
|
||||
struct _BgRecentSource
|
||||
{
|
||||
BgSource parent;
|
||||
|
||||
GFile *backgrounds_folder;
|
||||
GFileMonitor *monitor;
|
||||
|
||||
GCancellable *cancellable;
|
||||
GHashTable *items;
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE (BgRecentSource, bg_recent_source, BG_TYPE_SOURCE)
|
||||
|
||||
|
||||
static const gchar * const content_types[] = {
|
||||
"image/png",
|
||||
"image/jp2",
|
||||
"image/jpeg",
|
||||
"image/bmp",
|
||||
"image/svg+xml",
|
||||
"image/x-portable-anymap",
|
||||
NULL
|
||||
};
|
||||
|
||||
static int
|
||||
sort_func (gconstpointer a,
|
||||
gconstpointer b,
|
||||
gpointer user_data)
|
||||
{
|
||||
CcBackgroundItem *item_a;
|
||||
CcBackgroundItem *item_b;
|
||||
guint64 modified_a;
|
||||
guint64 modified_b;
|
||||
int retval;
|
||||
|
||||
item_a = (CcBackgroundItem *) a;
|
||||
item_b = (CcBackgroundItem *) b;
|
||||
modified_a = cc_background_item_get_modified (item_a);
|
||||
modified_b = cc_background_item_get_modified (item_b);
|
||||
|
||||
retval = modified_b - modified_a;
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
static void
|
||||
add_file_from_info (BgRecentSource *self,
|
||||
GFile *file,
|
||||
GFileInfo *info)
|
||||
{
|
||||
g_autoptr(CcBackgroundItem) item = NULL;
|
||||
CcBackgroundItemFlags flags = 0;
|
||||
g_autofree gchar *source_uri = NULL;
|
||||
g_autofree gchar *uri = NULL;
|
||||
GListStore *store;
|
||||
const gchar *content_type;
|
||||
guint64 mtime;
|
||||
|
||||
content_type = g_file_info_get_content_type (info);
|
||||
mtime = g_file_info_get_attribute_uint64 (info, G_FILE_ATTRIBUTE_TIME_MODIFIED);
|
||||
|
||||
if (!content_type || !g_strv_contains (content_types, content_type))
|
||||
return;
|
||||
|
||||
uri = g_file_get_uri (file);
|
||||
item = cc_background_item_new (uri);
|
||||
flags |= CC_BACKGROUND_ITEM_HAS_SHADING | CC_BACKGROUND_ITEM_HAS_PLACEMENT;
|
||||
g_object_set (G_OBJECT (item),
|
||||
"flags", flags,
|
||||
"shading", G_DESKTOP_BACKGROUND_SHADING_SOLID,
|
||||
"placement", G_DESKTOP_BACKGROUND_STYLE_ZOOM,
|
||||
"modified", mtime,
|
||||
"needs-download", FALSE,
|
||||
"source-url", source_uri,
|
||||
NULL);
|
||||
|
||||
store = bg_source_get_liststore (BG_SOURCE (self));
|
||||
g_list_store_insert_sorted (store, item, sort_func, self);
|
||||
|
||||
g_hash_table_insert (self->items, g_strdup (uri), g_object_ref (item));
|
||||
}
|
||||
|
||||
static void
|
||||
remove_item (BgRecentSource *self,
|
||||
CcBackgroundItem *item)
|
||||
{
|
||||
GListStore *store;
|
||||
const gchar *uri;
|
||||
guint i;
|
||||
|
||||
g_return_if_fail (BG_IS_RECENT_SOURCE (self));
|
||||
g_return_if_fail (CC_IS_BACKGROUND_ITEM (item));
|
||||
|
||||
uri = cc_background_item_get_uri (item);
|
||||
store = bg_source_get_liststore (BG_SOURCE (self));
|
||||
|
||||
g_debug ("Removing wallpaper %s", uri);
|
||||
|
||||
for (i = 0; i < g_list_model_get_n_items (G_LIST_MODEL (store)); i++)
|
||||
{
|
||||
g_autoptr(CcBackgroundItem) tmp = NULL;
|
||||
|
||||
tmp = g_list_model_get_item (G_LIST_MODEL (store), i);
|
||||
|
||||
if (tmp == item)
|
||||
{
|
||||
g_list_store_remove (store, i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
g_hash_table_remove (self->items, cc_background_item_get_uri (item));
|
||||
}
|
||||
|
||||
static void
|
||||
query_info_finished_cb (GObject *source,
|
||||
GAsyncResult *result,
|
||||
gpointer user_data)
|
||||
{
|
||||
BgRecentSource *self;
|
||||
g_autoptr(GFileInfo) file_info = NULL;
|
||||
g_autoptr(GError) error = NULL;
|
||||
GFile *file = NULL;
|
||||
|
||||
file = G_FILE (source);
|
||||
file_info = g_file_query_info_finish (file, result, &error);
|
||||
if (error)
|
||||
{
|
||||
if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
|
||||
g_warning ("Could not get pictures file information: %s", error->message);
|
||||
return;
|
||||
}
|
||||
|
||||
self = BG_RECENT_SOURCE (user_data);
|
||||
|
||||
g_debug ("Adding wallpaper %s (%d)",
|
||||
g_file_info_get_name (file_info),
|
||||
G_IS_FILE (self->backgrounds_folder));
|
||||
|
||||
add_file_from_info (self, file, file_info);
|
||||
}
|
||||
|
||||
static void
|
||||
on_file_changed_cb (GFileMonitor *monitor,
|
||||
GFile *file,
|
||||
GFile *other_file,
|
||||
GFileMonitorEvent event_type,
|
||||
BgRecentSource *self)
|
||||
{
|
||||
g_autofree gchar *uri = NULL;
|
||||
|
||||
switch (event_type)
|
||||
{
|
||||
case G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT:
|
||||
g_file_query_info_async (file,
|
||||
ATTRIBUTES,
|
||||
G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
|
||||
G_PRIORITY_DEFAULT,
|
||||
self->cancellable,
|
||||
query_info_finished_cb,
|
||||
self);
|
||||
break;
|
||||
|
||||
case G_FILE_MONITOR_EVENT_DELETED:
|
||||
uri = g_file_get_uri (file);
|
||||
remove_item (self, g_hash_table_lookup (self->items, uri));
|
||||
break;
|
||||
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
file_sort_func (gconstpointer a,
|
||||
gconstpointer b)
|
||||
{
|
||||
GFileInfo *file_a = G_FILE_INFO (a);
|
||||
GFileInfo *file_b = G_FILE_INFO (b);
|
||||
guint64 modified_a, modified_b;
|
||||
|
||||
modified_a = g_file_info_get_attribute_uint64 (file_a, G_FILE_ATTRIBUTE_TIME_MODIFIED);
|
||||
modified_b = g_file_info_get_attribute_uint64 (file_b, G_FILE_ATTRIBUTE_TIME_MODIFIED);
|
||||
|
||||
return modified_b - modified_a;
|
||||
}
|
||||
|
||||
static void
|
||||
file_info_async_ready_cb (GObject *source,
|
||||
GAsyncResult *result,
|
||||
gpointer user_data)
|
||||
{
|
||||
BgRecentSource *self;
|
||||
g_autolist(GFileInfo) file_infos = NULL;
|
||||
g_autoptr(GError) error = NULL;
|
||||
GFile *parent = NULL;
|
||||
GList *l;
|
||||
|
||||
file_infos = g_file_enumerator_next_files_finish (G_FILE_ENUMERATOR (source),
|
||||
result,
|
||||
&error);
|
||||
if (error)
|
||||
{
|
||||
if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
|
||||
g_warning ("Could not get pictures file information: %s", error->message);
|
||||
return;
|
||||
}
|
||||
|
||||
self = BG_RECENT_SOURCE (user_data);
|
||||
parent = g_file_enumerator_get_container (G_FILE_ENUMERATOR (source));
|
||||
|
||||
file_infos = g_list_sort (file_infos, file_sort_func);
|
||||
|
||||
for (l = file_infos; l; l = l->next)
|
||||
{
|
||||
g_autoptr(GFile) file = NULL;
|
||||
GFileInfo *info;
|
||||
|
||||
info = l->data;
|
||||
file = g_file_get_child (parent, g_file_info_get_name (info));
|
||||
|
||||
g_debug ("Found recent wallpaper %s", g_file_info_get_name (info));
|
||||
|
||||
add_file_from_info (self, file, info);
|
||||
}
|
||||
|
||||
g_file_enumerator_close (G_FILE_ENUMERATOR (source), self->cancellable, &error);
|
||||
|
||||
if (error)
|
||||
g_warning ("Error closing file enumerator: %s", error->message);
|
||||
}
|
||||
|
||||
static void
|
||||
enumerate_children_finished_cb (GObject *source,
|
||||
GAsyncResult *result,
|
||||
gpointer user_data)
|
||||
{
|
||||
BgRecentSource *self = BG_RECENT_SOURCE (user_data);
|
||||
g_autoptr(GFileEnumerator) enumerator = NULL;
|
||||
g_autoptr(GError) error = NULL;
|
||||
|
||||
enumerator = g_file_enumerate_children_finish (G_FILE (source), result, &error);
|
||||
|
||||
if (error)
|
||||
{
|
||||
if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
|
||||
g_warning ("Could not fill pictures source: %s", error->message);
|
||||
return;
|
||||
}
|
||||
|
||||
g_file_enumerator_next_files_async (enumerator,
|
||||
G_MAXINT,
|
||||
G_PRIORITY_DEFAULT,
|
||||
self->cancellable,
|
||||
file_info_async_ready_cb,
|
||||
self);
|
||||
}
|
||||
|
||||
static void
|
||||
load_backgrounds (BgRecentSource *self)
|
||||
{
|
||||
g_autofree gchar *backgrounds_path = NULL;
|
||||
g_autoptr(GError) error = NULL;
|
||||
|
||||
if (!g_file_make_directory_with_parents (self->backgrounds_folder, self->cancellable, &error) &&
|
||||
!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_EXISTS))
|
||||
{
|
||||
g_critical ("Failed to create local background directory: %s", error->message);
|
||||
return;
|
||||
}
|
||||
|
||||
backgrounds_path = g_file_get_path (self->backgrounds_folder);
|
||||
g_debug ("Enumerating wallpapers under %s", backgrounds_path);
|
||||
|
||||
g_file_enumerate_children_async (self->backgrounds_folder,
|
||||
ATTRIBUTES,
|
||||
G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
|
||||
G_PRIORITY_DEFAULT,
|
||||
self->cancellable,
|
||||
enumerate_children_finished_cb,
|
||||
self);
|
||||
|
||||
self->monitor = g_file_monitor_directory (self->backgrounds_folder,
|
||||
G_FILE_MONITOR_WATCH_MOVES,
|
||||
self->cancellable,
|
||||
&error);
|
||||
|
||||
if (!self->monitor)
|
||||
{
|
||||
g_critical ("Failed to monitor background directory: %s", error->message);
|
||||
return;
|
||||
}
|
||||
|
||||
g_signal_connect (self->monitor, "changed", G_CALLBACK (on_file_changed_cb), self);
|
||||
}
|
||||
|
||||
/* Callbacks */
|
||||
|
||||
static void
|
||||
on_file_copied_cb (GObject *source,
|
||||
GAsyncResult *result,
|
||||
gpointer user_data)
|
||||
{
|
||||
BgRecentSource *self = BG_RECENT_SOURCE (user_data);
|
||||
g_autoptr(GError) error = NULL;
|
||||
|
||||
g_file_copy_finish (G_FILE (source), result, &error);
|
||||
|
||||
if (error)
|
||||
{
|
||||
if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
|
||||
g_critical ("Failed to copy file: %s", error->message);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_autofree gchar *original_file = g_file_get_path (G_FILE (source));
|
||||
g_debug ("Successfully copied wallpaper: %s", original_file);
|
||||
}
|
||||
|
||||
g_object_unref (self);
|
||||
}
|
||||
|
||||
static void
|
||||
on_file_deleted_cb (GObject *source,
|
||||
GAsyncResult *result,
|
||||
gpointer user_data)
|
||||
{
|
||||
BgRecentSource *self = BG_RECENT_SOURCE (user_data);
|
||||
g_autoptr(GError) error = NULL;
|
||||
|
||||
g_file_delete_finish (G_FILE (source), result, &error);
|
||||
|
||||
if (error)
|
||||
{
|
||||
if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
|
||||
g_critical ("Failed to delete wallpaper: %s", error->message);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_autofree gchar *original_file = g_file_get_path (G_FILE (source));
|
||||
g_debug ("Successfully deleted wallpaper: %s", original_file);
|
||||
}
|
||||
|
||||
g_object_unref (self);
|
||||
}
|
||||
|
||||
/* GObject overrides */
|
||||
|
||||
static void
|
||||
bg_recent_source_finalize (GObject *object)
|
||||
{
|
||||
BgRecentSource *self = (BgRecentSource *)object;
|
||||
|
||||
g_cancellable_cancel (self->cancellable);
|
||||
g_clear_object (&self->cancellable);
|
||||
g_clear_object (&self->monitor);
|
||||
|
||||
G_OBJECT_CLASS (bg_recent_source_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
bg_recent_source_class_init (BgRecentSourceClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
object_class->finalize = bg_recent_source_finalize;
|
||||
}
|
||||
|
||||
static void
|
||||
bg_recent_source_init (BgRecentSource *self)
|
||||
{
|
||||
g_autofree gchar *backgrounds_path = NULL;
|
||||
|
||||
backgrounds_path = g_build_filename (g_get_user_data_dir (), "backgrounds", NULL);
|
||||
|
||||
self->items = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
|
||||
self->cancellable = g_cancellable_new ();
|
||||
self->backgrounds_folder = g_file_new_for_path (backgrounds_path);
|
||||
|
||||
load_backgrounds (self);
|
||||
}
|
||||
|
||||
BgRecentSource*
|
||||
bg_recent_source_new (GtkWidget *widget)
|
||||
{
|
||||
return g_object_new (BG_TYPE_RECENT_SOURCE,
|
||||
"widget", widget,
|
||||
NULL);
|
||||
}
|
||||
|
||||
void
|
||||
bg_recent_source_add_file (BgRecentSource *self,
|
||||
const gchar *path)
|
||||
{
|
||||
g_autoptr(GDateTime) now = NULL;
|
||||
g_autofree gchar *destination_name = NULL;
|
||||
g_autofree gchar *formatted_now = NULL;
|
||||
g_autofree gchar *basename = NULL;
|
||||
g_autoptr(GFile) destination = NULL;
|
||||
g_autoptr(GFile) file = NULL;
|
||||
|
||||
g_return_if_fail (BG_IS_RECENT_SOURCE (self));
|
||||
g_return_if_fail (path && *path);
|
||||
|
||||
g_debug ("Importing wallpaper %s", path);
|
||||
|
||||
now = g_date_time_new_now_local ();
|
||||
formatted_now = g_date_time_format (now, "%Y-%m-%d-%H-%M-%S");
|
||||
|
||||
file = g_file_new_for_path (path);
|
||||
|
||||
basename = g_file_get_basename (file);
|
||||
destination_name = g_strdup_printf ("%s-%s", formatted_now, basename);
|
||||
destination = g_file_get_child (self->backgrounds_folder, destination_name);
|
||||
|
||||
g_file_copy_async (file,
|
||||
destination,
|
||||
G_FILE_COPY_NONE,
|
||||
G_PRIORITY_DEFAULT,
|
||||
self->cancellable,
|
||||
NULL, NULL,
|
||||
on_file_copied_cb,
|
||||
g_object_ref (self));
|
||||
}
|
||||
|
||||
void
|
||||
bg_recent_source_remove_item (BgRecentSource *self,
|
||||
CcBackgroundItem *item)
|
||||
{
|
||||
g_autoptr(GFile) file = NULL;
|
||||
const gchar *uri;
|
||||
|
||||
g_return_if_fail (BG_IS_RECENT_SOURCE (self));
|
||||
g_return_if_fail (CC_IS_BACKGROUND_ITEM (item));
|
||||
|
||||
uri = cc_background_item_get_uri (item);
|
||||
file = g_file_new_for_uri (uri);
|
||||
|
||||
g_file_delete_async (file,
|
||||
G_PRIORITY_DEFAULT,
|
||||
self->cancellable,
|
||||
on_file_deleted_cb,
|
||||
g_object_ref (self));
|
||||
}
|
||||
@@ -1,39 +0,0 @@
|
||||
/* bg-recent-source.h
|
||||
*
|
||||
* Copyright 2019 Georges Basile Stavracas Neto <georges.stavracas@gmail.com>
|
||||
*
|
||||
* 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 3 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "bg-source.h"
|
||||
#include "cc-background-item.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define BG_TYPE_RECENT_SOURCE (bg_recent_source_get_type())
|
||||
G_DECLARE_FINAL_TYPE (BgRecentSource, bg_recent_source, BG, RECENT_SOURCE, BgSource)
|
||||
|
||||
BgRecentSource* bg_recent_source_new (GtkWidget *widget);
|
||||
|
||||
void bg_recent_source_add_file (BgRecentSource *self,
|
||||
const gchar *path);
|
||||
|
||||
void bg_recent_source_remove_item (BgRecentSource *self,
|
||||
CcBackgroundItem *item);
|
||||
|
||||
G_END_DECLS
|
||||
@@ -1,213 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Intel, Inc
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Author: Thomas Wood <thomas.wood@intel.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#include "bg-source.h"
|
||||
#include "cc-background-item.h"
|
||||
|
||||
#include <cairo-gobject.h>
|
||||
|
||||
#define THUMBNAIL_WIDTH 256
|
||||
#define THUMBNAIL_HEIGHT (THUMBNAIL_WIDTH * 3 / 4)
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GnomeDesktopThumbnailFactory *thumbnail_factory;
|
||||
GListStore *store;
|
||||
GtkWidget *widget;
|
||||
gint thumbnail_height;
|
||||
gint thumbnail_width;
|
||||
} BgSourcePrivate;
|
||||
|
||||
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (BgSource, bg_source, G_TYPE_OBJECT)
|
||||
|
||||
enum
|
||||
{
|
||||
PROP_LISTSTORE = 1,
|
||||
PROP_WIDGET
|
||||
};
|
||||
|
||||
|
||||
static void
|
||||
bg_source_calculate_thumbnail_dimensions (BgSource *source)
|
||||
{
|
||||
BgSourcePrivate *priv = bg_source_get_instance_private (source);
|
||||
gint scale_factor;
|
||||
|
||||
priv->thumbnail_height = THUMBNAIL_HEIGHT;
|
||||
priv->thumbnail_width = THUMBNAIL_WIDTH;
|
||||
|
||||
if (priv->widget == NULL)
|
||||
return;
|
||||
|
||||
scale_factor = gtk_widget_get_scale_factor (priv->widget);
|
||||
if (scale_factor > 1)
|
||||
{
|
||||
priv->thumbnail_height *= scale_factor;
|
||||
priv->thumbnail_width *= scale_factor;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
bg_source_constructed (GObject *object)
|
||||
{
|
||||
G_OBJECT_CLASS (bg_source_parent_class)->constructed (object);
|
||||
|
||||
bg_source_calculate_thumbnail_dimensions (BG_SOURCE (object));
|
||||
}
|
||||
|
||||
static void
|
||||
bg_source_get_property (GObject *object,
|
||||
guint property_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
BgSource *source = BG_SOURCE (object);
|
||||
|
||||
switch (property_id)
|
||||
{
|
||||
case PROP_LISTSTORE:
|
||||
g_value_set_object (value, bg_source_get_liststore (source));
|
||||
break;
|
||||
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
bg_source_set_property (GObject *object,
|
||||
guint property_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
BgSource *source = BG_SOURCE (object);
|
||||
BgSourcePrivate *priv = bg_source_get_instance_private (source);
|
||||
|
||||
switch (property_id)
|
||||
{
|
||||
case PROP_WIDGET:
|
||||
priv->widget = GTK_WIDGET (g_value_get_object (value));
|
||||
break;
|
||||
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
bg_source_dispose (GObject *object)
|
||||
{
|
||||
BgSource *source = BG_SOURCE (object);
|
||||
BgSourcePrivate *priv = bg_source_get_instance_private (source);
|
||||
|
||||
g_clear_object (&priv->thumbnail_factory);
|
||||
g_clear_object (&priv->store);
|
||||
|
||||
G_OBJECT_CLASS (bg_source_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void
|
||||
bg_source_class_init (BgSourceClass *klass)
|
||||
{
|
||||
GParamSpec *pspec;
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
object_class->constructed = bg_source_constructed;
|
||||
object_class->get_property = bg_source_get_property;
|
||||
object_class->set_property = bg_source_set_property;
|
||||
object_class->dispose = bg_source_dispose;
|
||||
|
||||
pspec = g_param_spec_object ("liststore",
|
||||
"Liststore",
|
||||
"Liststore used in the source",
|
||||
G_TYPE_LIST_STORE,
|
||||
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
|
||||
g_object_class_install_property (object_class, PROP_LISTSTORE, pspec);
|
||||
|
||||
pspec = g_param_spec_object ("widget",
|
||||
"Widget",
|
||||
"Widget used to view the source",
|
||||
GTK_TYPE_WIDGET,
|
||||
G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
|
||||
g_object_class_install_property (object_class, PROP_WIDGET, pspec);
|
||||
}
|
||||
|
||||
static void
|
||||
bg_source_init (BgSource *self)
|
||||
{
|
||||
BgSourcePrivate *priv = bg_source_get_instance_private (self);
|
||||
priv->store = g_list_store_new (CC_TYPE_BACKGROUND_ITEM);
|
||||
priv->thumbnail_factory = gnome_desktop_thumbnail_factory_new (GNOME_DESKTOP_THUMBNAIL_SIZE_LARGE);
|
||||
}
|
||||
|
||||
GListStore*
|
||||
bg_source_get_liststore (BgSource *source)
|
||||
{
|
||||
BgSourcePrivate *priv;
|
||||
|
||||
g_return_val_if_fail (BG_IS_SOURCE (source), NULL);
|
||||
|
||||
priv = bg_source_get_instance_private (source);
|
||||
return priv->store;
|
||||
}
|
||||
|
||||
gint
|
||||
bg_source_get_scale_factor (BgSource *source)
|
||||
{
|
||||
BgSourcePrivate *priv;
|
||||
|
||||
g_return_val_if_fail (BG_IS_SOURCE (source), 1);
|
||||
|
||||
priv = bg_source_get_instance_private (source);
|
||||
return gtk_widget_get_scale_factor (priv->widget);
|
||||
}
|
||||
|
||||
gint
|
||||
bg_source_get_thumbnail_height (BgSource *source)
|
||||
{
|
||||
BgSourcePrivate *priv;
|
||||
|
||||
g_return_val_if_fail (BG_IS_SOURCE (source), THUMBNAIL_HEIGHT);
|
||||
|
||||
priv = bg_source_get_instance_private (source);
|
||||
return priv->thumbnail_height;
|
||||
}
|
||||
|
||||
gint
|
||||
bg_source_get_thumbnail_width (BgSource *source)
|
||||
{
|
||||
BgSourcePrivate *priv;
|
||||
|
||||
g_return_val_if_fail (BG_IS_SOURCE (source), THUMBNAIL_WIDTH);
|
||||
|
||||
priv = bg_source_get_instance_private (source);
|
||||
return priv->thumbnail_width;
|
||||
}
|
||||
|
||||
GnomeDesktopThumbnailFactory*
|
||||
bg_source_get_thumbnail_factory (BgSource *source)
|
||||
{
|
||||
BgSourcePrivate *priv;
|
||||
|
||||
g_return_val_if_fail (BG_IS_SOURCE (source), NULL);
|
||||
|
||||
priv = bg_source_get_instance_private (source);
|
||||
return priv->thumbnail_factory;
|
||||
}
|
||||
@@ -1,49 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Intel, Inc
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Author: Thomas Wood <thomas.wood@intel.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _BG_SOURCE_H
|
||||
#define _BG_SOURCE_H
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
#include <libgnome-desktop/gnome-desktop-thumbnail.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define BG_TYPE_SOURCE (bg_source_get_type ())
|
||||
G_DECLARE_DERIVABLE_TYPE (BgSource, bg_source, BG, SOURCE, GObject)
|
||||
|
||||
struct _BgSourceClass
|
||||
{
|
||||
GObjectClass parent_class;
|
||||
};
|
||||
|
||||
GListStore* bg_source_get_liststore (BgSource *source);
|
||||
|
||||
gint bg_source_get_scale_factor (BgSource *source);
|
||||
|
||||
gint bg_source_get_thumbnail_height (BgSource *source);
|
||||
|
||||
gint bg_source_get_thumbnail_width (BgSource *source);
|
||||
|
||||
GnomeDesktopThumbnailFactory* bg_source_get_thumbnail_factory (BgSource *source);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* _BG_SOURCE_H */
|
||||
@@ -1,139 +0,0 @@
|
||||
/* bg-wallpapers-source.c */
|
||||
/*
|
||||
* Copyright (C) 2010 Intel, Inc
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Author: Thomas Wood <thomas.wood@intel.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#include "bg-wallpapers-source.h"
|
||||
|
||||
#include "cc-background-item.h"
|
||||
#include "cc-background-xml.h"
|
||||
|
||||
#include <cairo-gobject.h>
|
||||
#include <gio/gio.h>
|
||||
|
||||
struct _BgWallpapersSource
|
||||
{
|
||||
BgSource parent_instance;
|
||||
CcBackgroundXml *xml;
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE (BgWallpapersSource, bg_wallpapers_source, BG_TYPE_SOURCE)
|
||||
|
||||
static void
|
||||
load_wallpapers (gchar *key,
|
||||
CcBackgroundItem *item,
|
||||
BgWallpapersSource *source)
|
||||
{
|
||||
GListStore *store = bg_source_get_liststore (BG_SOURCE (source));
|
||||
gboolean deleted;
|
||||
|
||||
g_object_get (G_OBJECT (item), "is-deleted", &deleted, NULL);
|
||||
|
||||
if (deleted)
|
||||
return;
|
||||
|
||||
g_list_store_append (store, item);
|
||||
}
|
||||
|
||||
static void
|
||||
list_load_cb (GObject *source_object,
|
||||
GAsyncResult *res,
|
||||
gpointer user_data)
|
||||
{
|
||||
g_autoptr(GError) error = NULL;
|
||||
if (!cc_background_xml_load_list_finish (CC_BACKGROUND_XML (source_object), res, &error))
|
||||
g_warning ("Failed to load background list: %s", error->message);
|
||||
}
|
||||
|
||||
static void
|
||||
item_added (CcBackgroundXml *xml,
|
||||
CcBackgroundItem *item,
|
||||
BgWallpapersSource *self)
|
||||
{
|
||||
load_wallpapers (NULL, item, self);
|
||||
}
|
||||
|
||||
static void
|
||||
load_default_bg (BgWallpapersSource *self)
|
||||
{
|
||||
const char * const *system_data_dirs;
|
||||
guint i;
|
||||
|
||||
/* FIXME We could do this nicer if we had the XML source in GSettings */
|
||||
|
||||
system_data_dirs = g_get_system_data_dirs ();
|
||||
for (i = 0; system_data_dirs[i]; i++) {
|
||||
g_autofree gchar *filename = NULL;
|
||||
|
||||
filename = g_build_filename (system_data_dirs[i],
|
||||
"gnome-background-properties",
|
||||
"adwaita.xml",
|
||||
NULL);
|
||||
if (cc_background_xml_load_xml (self->xml, filename))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
bg_wallpapers_source_constructed (GObject *object)
|
||||
{
|
||||
BgWallpapersSource *self = BG_WALLPAPERS_SOURCE (object);
|
||||
|
||||
G_OBJECT_CLASS (bg_wallpapers_source_parent_class)->constructed (object);
|
||||
|
||||
g_signal_connect (G_OBJECT (self->xml), "added",
|
||||
G_CALLBACK (item_added), self);
|
||||
|
||||
/* Try adding the default background first */
|
||||
load_default_bg (self);
|
||||
|
||||
cc_background_xml_load_list_async (self->xml, NULL, list_load_cb, self);
|
||||
}
|
||||
|
||||
static void
|
||||
bg_wallpapers_source_dispose (GObject *object)
|
||||
{
|
||||
BgWallpapersSource *self = BG_WALLPAPERS_SOURCE (object);
|
||||
|
||||
g_clear_object (&self->xml);
|
||||
|
||||
G_OBJECT_CLASS (bg_wallpapers_source_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void
|
||||
bg_wallpapers_source_init (BgWallpapersSource *self)
|
||||
{
|
||||
self->xml = cc_background_xml_new ();
|
||||
}
|
||||
|
||||
static void
|
||||
bg_wallpapers_source_class_init (BgWallpapersSourceClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
object_class->constructed = bg_wallpapers_source_constructed;
|
||||
object_class->dispose = bg_wallpapers_source_dispose;
|
||||
}
|
||||
|
||||
BgWallpapersSource *
|
||||
bg_wallpapers_source_new (GtkWidget *widget)
|
||||
{
|
||||
return g_object_new (BG_TYPE_WALLPAPERS_SOURCE, "widget", widget, NULL);
|
||||
}
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
/* bg-wallpapers-source.h */
|
||||
/*
|
||||
* Copyright (C) 2010 Intel, Inc
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Author: Thomas Wood <thomas.wood@intel.com>
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _BG_WALLPAPERS_SOURCE_H
|
||||
#define _BG_WALLPAPERS_SOURCE_H
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
#include "bg-source.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define BG_TYPE_WALLPAPERS_SOURCE (bg_wallpapers_source_get_type ())
|
||||
G_DECLARE_FINAL_TYPE (BgWallpapersSource, bg_wallpapers_source, BG, WALLPAPERS_SOURCE, BgSource)
|
||||
|
||||
BgWallpapersSource *bg_wallpapers_source_new (GtkWidget *widget);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* _BG_WALLPAPERS_SOURCE_H */
|
||||
@@ -1,387 +0,0 @@
|
||||
/* cc-background-chooser.c
|
||||
*
|
||||
* Copyright 2019 Georges Basile Stavracas Neto <georges.stavracas@gmail.com>
|
||||
*
|
||||
* 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 3 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
#define G_LOG_DOMAIN "cc-background-chooser"
|
||||
|
||||
#include <glib/gi18n.h>
|
||||
|
||||
#include "bg-colors-source.h"
|
||||
#include "bg-pictures-source.h"
|
||||
#include "bg-recent-source.h"
|
||||
#include "bg-wallpapers-source.h"
|
||||
#include "cc-background-chooser.h"
|
||||
|
||||
struct _CcBackgroundChooser
|
||||
{
|
||||
GtkBox parent;
|
||||
|
||||
GtkFlowBox *flowbox;
|
||||
GtkWidget *popover_recent_box;
|
||||
GtkWidget *recent_box;
|
||||
GtkFlowBox *recent_flowbox;
|
||||
GtkPopover *selection_popover;
|
||||
|
||||
gboolean recent_selected;
|
||||
|
||||
BgWallpapersSource *wallpapers_source;
|
||||
BgRecentSource *recent_source;
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE (CcBackgroundChooser, cc_background_chooser, GTK_TYPE_BOX)
|
||||
|
||||
enum
|
||||
{
|
||||
BACKGROUND_CHOSEN,
|
||||
N_SIGNALS,
|
||||
};
|
||||
|
||||
static guint signals [N_SIGNALS];
|
||||
|
||||
static void
|
||||
emit_background_chosen (CcBackgroundChooser *self,
|
||||
CcBackgroundSelectionFlags flags)
|
||||
{
|
||||
g_autoptr(GList) list = NULL;
|
||||
CcBackgroundItem *item;
|
||||
GtkFlowBox *flowbox;
|
||||
|
||||
flowbox = self->recent_selected ? self->recent_flowbox : self->flowbox;
|
||||
list = gtk_flow_box_get_selected_children (flowbox);
|
||||
g_assert (g_list_length (list) == 1);
|
||||
|
||||
item = g_object_get_data (list->data, "item");
|
||||
|
||||
g_signal_emit (self, signals[BACKGROUND_CHOSEN], 0, item, flags);
|
||||
|
||||
gtk_flow_box_unselect_all (flowbox);
|
||||
}
|
||||
|
||||
static GtkWidget*
|
||||
create_widget_func (gpointer model_item,
|
||||
gpointer user_data)
|
||||
{
|
||||
g_autoptr(GdkPixbuf) pixbuf = NULL;
|
||||
CcBackgroundItem *item;
|
||||
GtkWidget *overlay;
|
||||
GtkWidget *child;
|
||||
GtkWidget *image;
|
||||
GtkWidget *icon;
|
||||
BgSource *source;
|
||||
|
||||
source = BG_SOURCE (user_data);
|
||||
item = CC_BACKGROUND_ITEM (model_item);
|
||||
pixbuf = cc_background_item_get_thumbnail (item,
|
||||
bg_source_get_thumbnail_factory (source),
|
||||
bg_source_get_thumbnail_width (source),
|
||||
bg_source_get_thumbnail_height (source),
|
||||
bg_source_get_scale_factor (source));
|
||||
image = gtk_image_new_from_pixbuf (pixbuf);
|
||||
gtk_widget_show (image);
|
||||
|
||||
icon = g_object_new (GTK_TYPE_IMAGE,
|
||||
"icon-name", "slideshow-emblem",
|
||||
"pixel-size", 16,
|
||||
"margin", 8,
|
||||
"halign", GTK_ALIGN_END,
|
||||
"valign", GTK_ALIGN_END,
|
||||
"visible", cc_background_item_changes_with_time (item),
|
||||
NULL);
|
||||
gtk_style_context_add_class (gtk_widget_get_style_context (icon), "slideshow-emblem");
|
||||
|
||||
overlay = gtk_overlay_new ();
|
||||
gtk_container_add (GTK_CONTAINER (overlay), image);
|
||||
gtk_overlay_add_overlay (GTK_OVERLAY (overlay), icon);
|
||||
gtk_widget_show (overlay);
|
||||
|
||||
child = g_object_new (GTK_TYPE_FLOW_BOX_CHILD,
|
||||
"halign", GTK_ALIGN_CENTER,
|
||||
"valign", GTK_ALIGN_CENTER,
|
||||
NULL);
|
||||
gtk_container_add (GTK_CONTAINER (child), overlay);
|
||||
gtk_widget_show (child);
|
||||
|
||||
g_object_set_data_full (G_OBJECT (child), "item", g_object_ref (item), g_object_unref);
|
||||
|
||||
return child;
|
||||
}
|
||||
|
||||
static void
|
||||
update_recent_visibility (CcBackgroundChooser *self)
|
||||
{
|
||||
GListStore *store;
|
||||
gboolean has_items;
|
||||
|
||||
store = bg_source_get_liststore (BG_SOURCE (self->recent_source));
|
||||
has_items = g_list_model_get_n_items (G_LIST_MODEL (store)) != 0;
|
||||
|
||||
gtk_widget_set_visible (self->recent_box, has_items);
|
||||
}
|
||||
|
||||
static void
|
||||
setup_flowbox (CcBackgroundChooser *self)
|
||||
{
|
||||
GListStore *store;
|
||||
|
||||
store = bg_source_get_liststore (BG_SOURCE (self->wallpapers_source));
|
||||
|
||||
gtk_flow_box_bind_model (self->flowbox,
|
||||
G_LIST_MODEL (store),
|
||||
create_widget_func,
|
||||
self->wallpapers_source,
|
||||
NULL);
|
||||
|
||||
store = bg_source_get_liststore (BG_SOURCE (self->recent_source));
|
||||
|
||||
gtk_flow_box_bind_model (self->recent_flowbox,
|
||||
G_LIST_MODEL (store),
|
||||
create_widget_func,
|
||||
self->recent_source,
|
||||
NULL);
|
||||
|
||||
update_recent_visibility (self);
|
||||
g_signal_connect_object (store,
|
||||
"items-changed",
|
||||
G_CALLBACK (update_recent_visibility),
|
||||
self,
|
||||
G_CONNECT_SWAPPED);
|
||||
}
|
||||
|
||||
static void
|
||||
on_delete_background_clicked_cb (GtkButton *button,
|
||||
CcBackgroundChooser *self)
|
||||
{
|
||||
g_autoptr(GList) list = NULL;
|
||||
CcBackgroundItem *item;
|
||||
|
||||
list = gtk_flow_box_get_selected_children (self->recent_flowbox);
|
||||
g_assert (g_list_length (list) == 1);
|
||||
|
||||
item = g_object_get_data (list->data, "item");
|
||||
|
||||
bg_recent_source_remove_item (self->recent_source, item);
|
||||
}
|
||||
|
||||
static void
|
||||
on_selection_desktop_lock_clicked_cb (GtkButton *button,
|
||||
CcBackgroundChooser *self)
|
||||
{
|
||||
emit_background_chosen (self, CC_BACKGROUND_SELECTION_DESKTOP | CC_BACKGROUND_SELECTION_LOCK_SCREEN);
|
||||
gtk_popover_popdown (self->selection_popover);
|
||||
}
|
||||
|
||||
static void
|
||||
on_selection_desktop_clicked_cb (GtkButton *button,
|
||||
CcBackgroundChooser *self)
|
||||
{
|
||||
emit_background_chosen (self, CC_BACKGROUND_SELECTION_DESKTOP);
|
||||
gtk_popover_popdown (self->selection_popover);
|
||||
}
|
||||
|
||||
static void
|
||||
on_selection_lock_clicked_cb (GtkButton *button,
|
||||
CcBackgroundChooser *self)
|
||||
{
|
||||
emit_background_chosen (self, CC_BACKGROUND_SELECTION_LOCK_SCREEN);
|
||||
gtk_popover_popdown (self->selection_popover);
|
||||
}
|
||||
|
||||
static void
|
||||
on_item_activated_cb (GtkFlowBox *flowbox,
|
||||
GtkFlowBoxChild *child,
|
||||
CcBackgroundChooser *self)
|
||||
{
|
||||
self->recent_selected = flowbox == self->recent_flowbox;
|
||||
gtk_widget_set_visible (self->popover_recent_box, self->recent_selected);
|
||||
|
||||
gtk_popover_set_relative_to (self->selection_popover, GTK_WIDGET (child));
|
||||
gtk_popover_popup (self->selection_popover);
|
||||
}
|
||||
|
||||
static void
|
||||
on_file_chooser_response_cb (GtkDialog *filechooser,
|
||||
gint response,
|
||||
CcBackgroundChooser *self)
|
||||
{
|
||||
if (response == GTK_RESPONSE_ACCEPT)
|
||||
{
|
||||
g_autofree gchar *filename = NULL;
|
||||
|
||||
filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (filechooser));
|
||||
bg_recent_source_add_file (self->recent_source, filename);
|
||||
}
|
||||
|
||||
gtk_widget_destroy (GTK_WIDGET (filechooser));
|
||||
}
|
||||
|
||||
static void
|
||||
on_file_chooser_selection_changed_cb (GtkFileChooser *chooser,
|
||||
GnomeDesktopThumbnailFactory *thumbnail_factory)
|
||||
{
|
||||
g_autofree gchar *uri = NULL;
|
||||
|
||||
uri = gtk_file_chooser_get_uri (chooser);
|
||||
|
||||
if (uri)
|
||||
{
|
||||
g_autoptr(GFileInfo) file_info = NULL;
|
||||
g_autoptr(GdkPixbuf) pixbuf = NULL;
|
||||
g_autofree gchar *mime_type = NULL;
|
||||
g_autoptr(GFile) file = NULL;
|
||||
GtkWidget *preview;
|
||||
|
||||
preview = gtk_file_chooser_get_preview_widget (chooser);
|
||||
|
||||
file = g_file_new_for_uri (uri);
|
||||
file_info = g_file_query_info (file,
|
||||
"standard::*",
|
||||
G_FILE_QUERY_INFO_NONE,
|
||||
NULL,
|
||||
NULL);
|
||||
|
||||
if (file_info && g_file_info_get_file_type (file_info) != G_FILE_TYPE_DIRECTORY)
|
||||
mime_type = g_strdup (g_file_info_get_content_type (file_info));
|
||||
|
||||
if (mime_type)
|
||||
{
|
||||
pixbuf = gnome_desktop_thumbnail_factory_generate_thumbnail (thumbnail_factory,
|
||||
uri,
|
||||
mime_type);
|
||||
}
|
||||
|
||||
gtk_dialog_set_response_sensitive (GTK_DIALOG (chooser),
|
||||
GTK_RESPONSE_ACCEPT,
|
||||
pixbuf != NULL);
|
||||
|
||||
if (pixbuf)
|
||||
gtk_image_set_from_pixbuf (GTK_IMAGE (preview), pixbuf);
|
||||
else
|
||||
gtk_image_set_from_icon_name (GTK_IMAGE (preview), "dialog-question", GTK_ICON_SIZE_DIALOG);
|
||||
}
|
||||
|
||||
gtk_file_chooser_set_preview_widget_active (chooser, TRUE);
|
||||
}
|
||||
|
||||
/* GObject overrides */
|
||||
|
||||
static void
|
||||
cc_background_chooser_finalize (GObject *object)
|
||||
{
|
||||
CcBackgroundChooser *self = (CcBackgroundChooser *)object;
|
||||
|
||||
g_clear_object (&self->recent_source);
|
||||
g_clear_object (&self->wallpapers_source);
|
||||
|
||||
G_OBJECT_CLASS (cc_background_chooser_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
cc_background_chooser_class_init (CcBackgroundChooserClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
|
||||
|
||||
object_class->finalize = cc_background_chooser_finalize;
|
||||
|
||||
signals[BACKGROUND_CHOSEN] = g_signal_new ("background-chosen",
|
||||
CC_TYPE_BACKGROUND_CHOOSER,
|
||||
G_SIGNAL_RUN_FIRST,
|
||||
0, NULL, NULL, NULL,
|
||||
G_TYPE_NONE,
|
||||
2,
|
||||
CC_TYPE_BACKGROUND_ITEM,
|
||||
G_TYPE_INT);
|
||||
|
||||
gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/background/cc-background-chooser.ui");
|
||||
|
||||
gtk_widget_class_bind_template_child (widget_class, CcBackgroundChooser, flowbox);
|
||||
gtk_widget_class_bind_template_child (widget_class, CcBackgroundChooser, popover_recent_box);
|
||||
gtk_widget_class_bind_template_child (widget_class, CcBackgroundChooser, recent_box);
|
||||
gtk_widget_class_bind_template_child (widget_class, CcBackgroundChooser, recent_flowbox);
|
||||
gtk_widget_class_bind_template_child (widget_class, CcBackgroundChooser, selection_popover);
|
||||
|
||||
gtk_widget_class_bind_template_callback (widget_class, on_delete_background_clicked_cb);
|
||||
gtk_widget_class_bind_template_callback (widget_class, on_item_activated_cb);
|
||||
gtk_widget_class_bind_template_callback (widget_class, on_selection_desktop_lock_clicked_cb);
|
||||
gtk_widget_class_bind_template_callback (widget_class, on_selection_desktop_clicked_cb);
|
||||
gtk_widget_class_bind_template_callback (widget_class, on_selection_lock_clicked_cb);
|
||||
}
|
||||
|
||||
static void
|
||||
cc_background_chooser_init (CcBackgroundChooser *self)
|
||||
{
|
||||
gtk_widget_init_template (GTK_WIDGET (self));
|
||||
|
||||
self->recent_source = bg_recent_source_new (GTK_WIDGET (self));
|
||||
self->wallpapers_source = bg_wallpapers_source_new (GTK_WIDGET (self));
|
||||
setup_flowbox (self);
|
||||
}
|
||||
|
||||
void
|
||||
cc_background_chooser_select_file (CcBackgroundChooser *self)
|
||||
{
|
||||
g_autoptr(GnomeDesktopThumbnailFactory) factory = NULL;
|
||||
GtkFileFilter *filter;
|
||||
GtkWidget *filechooser;
|
||||
GtkWindow *toplevel;
|
||||
GtkWidget *preview;
|
||||
|
||||
g_return_if_fail (CC_IS_BACKGROUND_CHOOSER (self));
|
||||
|
||||
toplevel = (GtkWindow*) gtk_widget_get_toplevel (GTK_WIDGET (self));
|
||||
filechooser = gtk_file_chooser_dialog_new (_("Select a picture"),
|
||||
toplevel,
|
||||
GTK_FILE_CHOOSER_ACTION_OPEN,
|
||||
_("_Cancel"), GTK_RESPONSE_CANCEL,
|
||||
_("_Open"), GTK_RESPONSE_ACCEPT,
|
||||
NULL);
|
||||
gtk_window_set_modal (GTK_WINDOW (filechooser), TRUE);
|
||||
|
||||
preview = gtk_image_new ();
|
||||
gtk_widget_set_size_request (preview, 256, -1);
|
||||
gtk_file_chooser_set_preview_widget (GTK_FILE_CHOOSER (filechooser), preview);
|
||||
gtk_file_chooser_set_use_preview_label (GTK_FILE_CHOOSER (filechooser), FALSE);
|
||||
gtk_widget_show (preview);
|
||||
|
||||
factory = gnome_desktop_thumbnail_factory_new (GNOME_DESKTOP_THUMBNAIL_SIZE_LARGE);
|
||||
g_signal_connect_after (filechooser,
|
||||
"selection-changed",
|
||||
G_CALLBACK (on_file_chooser_selection_changed_cb),
|
||||
factory);
|
||||
|
||||
g_object_set_data_full (G_OBJECT (filechooser),
|
||||
"factory",
|
||||
g_object_ref (factory),
|
||||
g_object_unref);
|
||||
|
||||
filter = gtk_file_filter_new ();
|
||||
gtk_file_filter_add_pixbuf_formats (filter);
|
||||
gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (filechooser), filter);
|
||||
|
||||
gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (filechooser),
|
||||
g_get_user_special_dir (G_USER_DIRECTORY_PICTURES));
|
||||
|
||||
g_signal_connect_object (filechooser,
|
||||
"response",
|
||||
G_CALLBACK (on_file_chooser_response_cb),
|
||||
self,
|
||||
0);
|
||||
|
||||
gtk_window_present (GTK_WINDOW (filechooser));
|
||||
}
|
||||
@@ -1,39 +0,0 @@
|
||||
/* cc-background-chooser.h
|
||||
*
|
||||
* Copyright 2019 Georges Basile Stavracas Neto <georges.stavracas@gmail.com>
|
||||
*
|
||||
* 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 3 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
typedef enum
|
||||
{
|
||||
CC_BACKGROUND_SELECTION_NONE = 0,
|
||||
CC_BACKGROUND_SELECTION_DESKTOP = 1 << 0,
|
||||
CC_BACKGROUND_SELECTION_LOCK_SCREEN = 1 << 1,
|
||||
} CcBackgroundSelectionFlags;
|
||||
|
||||
#define CC_TYPE_BACKGROUND_CHOOSER (cc_background_chooser_get_type())
|
||||
G_DECLARE_FINAL_TYPE (CcBackgroundChooser, cc_background_chooser, CC, BACKGROUND_CHOOSER, GtkBox)
|
||||
|
||||
void cc_background_chooser_select_file (CcBackgroundChooser *self);
|
||||
|
||||
G_END_DECLS
|
||||
@@ -1,152 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<interface>
|
||||
<template class="CcBackgroundChooser" parent="GtkBox">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
|
||||
<child>
|
||||
<object class="GtkSeparator">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
</object>
|
||||
</child>
|
||||
|
||||
<child>
|
||||
<object class="GtkScrolledWindow">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="expand">True</property>
|
||||
<property name="shadow-type">none</property>
|
||||
<property name="hscrollbar-policy">never</property>
|
||||
<property name="vscrollbar-policy">automatic</property>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="expand">True</property>
|
||||
<style>
|
||||
<class name="view" />
|
||||
</style>
|
||||
|
||||
<!-- Recent -->
|
||||
<child>
|
||||
<object class="GtkBox" id="recent_box">
|
||||
<property name="visible">True</property>
|
||||
<property name="can-focus">True</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="halign">center</property>
|
||||
|
||||
<child>
|
||||
<object class="GtkFlowBox" id="recent_flowbox">
|
||||
<property name="visible">True</property>
|
||||
<property name="margin">12</property>
|
||||
<property name="column-spacing">12</property>
|
||||
<property name="row-spacing">12</property>
|
||||
<property name="homogeneous">True</property>
|
||||
<property name="halign">center</property>
|
||||
<property name="min-children-per-line">1</property>
|
||||
<property name="max-children-per-line">8</property>
|
||||
<property name="activate-on-single-click">True</property>
|
||||
<property name="selection-mode">single</property>
|
||||
<signal name="child-activated" handler="on_item_activated_cb" object="CcBackgroundChooser" swapped="no" />
|
||||
</object>
|
||||
</child>
|
||||
|
||||
<child>
|
||||
<object class="GtkSeparator">
|
||||
<property name="visible">True</property>
|
||||
<property name="can-focus">True</property>
|
||||
<property name="margin-top">12</property>
|
||||
<property name="margin-bottom">12</property>
|
||||
</object>
|
||||
</child>
|
||||
|
||||
</object>
|
||||
</child>
|
||||
|
||||
<child>
|
||||
<object class="GtkFlowBox" id="flowbox">
|
||||
<property name="visible">True</property>
|
||||
<property name="margin">12</property>
|
||||
<property name="column-spacing">12</property>
|
||||
<property name="row-spacing">12</property>
|
||||
<property name="homogeneous">True</property>
|
||||
<property name="halign">center</property>
|
||||
<property name="min-children-per-line">1</property>
|
||||
<property name="max-children-per-line">8</property>
|
||||
<property name="activate-on-single-click">True</property>
|
||||
<property name="selection-mode">single</property>
|
||||
<signal name="child-activated" handler="on_item_activated_cb" object="CcBackgroundChooser" swapped="no" />
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
|
||||
</template>
|
||||
|
||||
<!-- Desktop & Lock Screen Popover -->
|
||||
<object class="GtkPopover" id="selection_popover">
|
||||
<property name="position">bottom</property>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">6</property>
|
||||
<property name="margin">12</property>
|
||||
<child>
|
||||
<object class="GtkButton">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" translatable="yes">Set Background and Lock Screen</property>
|
||||
<signal name="clicked" handler="on_selection_desktop_lock_clicked_cb" object="CcBackgroundChooser" swapped="no" />
|
||||
<style>
|
||||
<class name="suggested-action" />
|
||||
</style>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" translatable="yes">Set Background</property>
|
||||
<signal name="clicked" handler="on_selection_desktop_clicked_cb" object="CcBackgroundChooser" swapped="no" />
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" translatable="yes">Set Lock Screen</property>
|
||||
<signal name="clicked" handler="on_selection_lock_clicked_cb" object="CcBackgroundChooser" swapped="no" />
|
||||
</object>
|
||||
</child>
|
||||
|
||||
<!-- Recent items section -->
|
||||
<child>
|
||||
<object class="GtkBox" id="popover_recent_box">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">6</property>
|
||||
<child>
|
||||
<object class="GtkSeparator">
|
||||
<property name="visible">True</property>
|
||||
<property name="margin-top">12</property>
|
||||
<property name="margin-bottom">12</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" translatable="yes">Remove Background</property>
|
||||
<signal name="clicked" handler="on_delete_background_clicked_cb" object="CcBackgroundChooser" swapped="no" />
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</interface>
|
||||
@@ -1,315 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2014 Red Hat, Inc.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include <gio/gio.h>
|
||||
#include <grilo.h>
|
||||
|
||||
#define GOA_API_IS_SUBJECT_TO_CHANGE
|
||||
#include <goa/goa.h>
|
||||
|
||||
#include "bg-pictures-source.h"
|
||||
#include "cc-background-grilo-miner.h"
|
||||
|
||||
struct _CcBackgroundGriloMiner
|
||||
{
|
||||
GObject parent_instance;
|
||||
|
||||
GCancellable *cancellable;
|
||||
GList *accounts;
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE (CcBackgroundGriloMiner, cc_background_grilo_miner, G_TYPE_OBJECT)
|
||||
|
||||
enum
|
||||
{
|
||||
MEDIA_FOUND,
|
||||
LAST_SIGNAL
|
||||
};
|
||||
|
||||
static guint signals[LAST_SIGNAL] = { 0 };
|
||||
|
||||
#define REMOTE_ITEM_COUNT 50
|
||||
|
||||
static gchar *
|
||||
get_grilo_id (GoaObject *goa_object)
|
||||
{
|
||||
GoaAccount *account;
|
||||
|
||||
account = goa_object_peek_account (goa_object);
|
||||
return g_strdup_printf ("grl-flickr-%s", goa_account_get_id (account));
|
||||
}
|
||||
|
||||
static void
|
||||
is_online_data_cached (GObject *object,
|
||||
GAsyncResult *res,
|
||||
gpointer user_data)
|
||||
{
|
||||
CcBackgroundGriloMiner *self;
|
||||
GError *error = NULL;
|
||||
GFileInfo *info = NULL;
|
||||
GFile *cache_file = G_FILE (object);
|
||||
GrlMedia *media;
|
||||
const gchar *uri;
|
||||
|
||||
info = g_file_query_info_finish (cache_file, res, &error);
|
||||
if (info == NULL)
|
||||
{
|
||||
if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
|
||||
goto out;
|
||||
}
|
||||
|
||||
self = CC_BACKGROUND_GRILO_MINER (user_data);
|
||||
|
||||
media = g_object_get_data (G_OBJECT (cache_file), "grl-media");
|
||||
uri = grl_media_get_url (media);
|
||||
|
||||
if (info != NULL)
|
||||
{
|
||||
g_debug ("Ignored URL '%s' as it is already in the cache", uri);
|
||||
goto out;
|
||||
}
|
||||
|
||||
g_signal_emit (self, signals[MEDIA_FOUND], 0, media);
|
||||
|
||||
out:
|
||||
g_clear_object (&info);
|
||||
g_clear_error (&error);
|
||||
}
|
||||
|
||||
static void
|
||||
searched_online_source (GrlSource *source,
|
||||
guint operation_id,
|
||||
GrlMedia *media,
|
||||
guint remaining,
|
||||
gpointer user_data,
|
||||
const GError *error)
|
||||
{
|
||||
CcBackgroundGriloMiner *self = CC_BACKGROUND_GRILO_MINER (user_data);
|
||||
g_autoptr(GFile) cache_file = NULL;
|
||||
const gchar *uri;
|
||||
g_autofree gchar *cache_path = NULL;
|
||||
|
||||
if (error != NULL)
|
||||
{
|
||||
const gchar *source_id;
|
||||
|
||||
source_id = grl_source_get_id (source);
|
||||
g_warning ("Error searching %s: %s", source_id, error->message);
|
||||
grl_operation_cancel (operation_id);
|
||||
remaining = 0;
|
||||
goto out;
|
||||
}
|
||||
|
||||
uri = grl_media_get_url (media);
|
||||
cache_path = bg_pictures_source_get_unique_path (uri);
|
||||
cache_file = g_file_new_for_path (cache_path);
|
||||
g_object_set_data_full (G_OBJECT (cache_file), "grl-media", media, g_object_unref);
|
||||
g_file_query_info_async (cache_file,
|
||||
G_FILE_ATTRIBUTE_STANDARD_TYPE,
|
||||
G_FILE_QUERY_INFO_NONE,
|
||||
G_PRIORITY_DEFAULT,
|
||||
self->cancellable,
|
||||
is_online_data_cached,
|
||||
self);
|
||||
|
||||
out:
|
||||
if (remaining == 0)
|
||||
g_object_unref (self);
|
||||
}
|
||||
|
||||
static void
|
||||
query_online_source (CcBackgroundGriloMiner *self, GrlSource *source)
|
||||
{
|
||||
const GList *keys;
|
||||
GrlCaps *caps;
|
||||
GrlOperationOptions *options;
|
||||
|
||||
keys = grl_source_supported_keys (source);
|
||||
caps = grl_source_get_caps (source, GRL_OP_BROWSE);
|
||||
options = grl_operation_options_new (caps);
|
||||
grl_operation_options_set_count (options, REMOTE_ITEM_COUNT);
|
||||
grl_operation_options_set_resolution_flags (options, GRL_RESOLVE_FAST_ONLY);
|
||||
grl_operation_options_set_type_filter (options, GRL_TYPE_FILTER_IMAGE);
|
||||
|
||||
grl_source_search (source, NULL, keys, options, searched_online_source, g_object_ref (self));
|
||||
g_object_unref (options);
|
||||
}
|
||||
|
||||
static void
|
||||
add_online_source_cb (CcBackgroundGriloMiner *self,
|
||||
GrlSource *source)
|
||||
{
|
||||
GList *l;
|
||||
gboolean found = FALSE;
|
||||
const gchar *source_id;
|
||||
|
||||
source_id = grl_source_get_id (source);
|
||||
for (l = self->accounts; l != NULL && !found; l = l->next)
|
||||
{
|
||||
GoaObject *goa_object = GOA_OBJECT (l->data);
|
||||
g_autofree gchar *account_id = NULL;
|
||||
|
||||
account_id = get_grilo_id (goa_object);
|
||||
if (g_strcmp0 (source_id, account_id) == 0)
|
||||
{
|
||||
query_online_source (self, source);
|
||||
found = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
client_async_ready (GObject *source,
|
||||
GAsyncResult *res,
|
||||
gpointer user_data)
|
||||
{
|
||||
CcBackgroundGriloMiner *self;
|
||||
g_autoptr(GError) error = NULL;
|
||||
GList *accounts = NULL;
|
||||
GList *photo_accounts = NULL;
|
||||
GList *l;
|
||||
GoaClient *client = NULL;
|
||||
GrlRegistry *registry;
|
||||
|
||||
client = goa_client_new_finish (res, &error);
|
||||
if (client == NULL)
|
||||
{
|
||||
if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
|
||||
g_warning ("Failed to create GoaClient: %s", error->message);
|
||||
goto out;
|
||||
}
|
||||
|
||||
self = CC_BACKGROUND_GRILO_MINER (user_data);
|
||||
|
||||
accounts = goa_client_get_accounts (client);
|
||||
for (l = accounts; l != NULL; l = l->next)
|
||||
{
|
||||
GoaObject *goa_object = GOA_OBJECT (l->data);
|
||||
GoaAccount *account;
|
||||
GoaPhotos *photos;
|
||||
const gchar *provider_type;
|
||||
|
||||
account = goa_object_peek_account (goa_object);
|
||||
provider_type = goa_account_get_provider_type (account);
|
||||
|
||||
photos = goa_object_peek_photos (goa_object);
|
||||
if (photos != NULL && g_strcmp0 (provider_type, "flickr") == 0)
|
||||
photo_accounts = g_list_prepend (photo_accounts, g_object_ref (goa_object));
|
||||
}
|
||||
|
||||
if (photo_accounts == NULL)
|
||||
goto out;
|
||||
|
||||
registry = grl_registry_get_default ();
|
||||
|
||||
for (l = photo_accounts; l != NULL; l = l->next)
|
||||
{
|
||||
GoaObject *goa_object = GOA_OBJECT (l->data);
|
||||
GrlSource *source;
|
||||
g_autofree gchar *account_id = NULL;
|
||||
|
||||
account_id = get_grilo_id (goa_object);
|
||||
source = grl_registry_lookup_source (registry, account_id);
|
||||
if (source != NULL)
|
||||
query_online_source (self, source);
|
||||
}
|
||||
|
||||
self->accounts = photo_accounts;
|
||||
photo_accounts = NULL;
|
||||
|
||||
g_signal_connect_object (registry, "source-added", G_CALLBACK (add_online_source_cb), self, G_CONNECT_SWAPPED);
|
||||
|
||||
out:
|
||||
g_list_free_full (photo_accounts, g_object_unref);
|
||||
g_list_free_full (accounts, g_object_unref);
|
||||
g_clear_object (&client);
|
||||
}
|
||||
|
||||
static void
|
||||
setup_online_accounts (CcBackgroundGriloMiner *self)
|
||||
{
|
||||
goa_client_new (self->cancellable, client_async_ready, self);
|
||||
}
|
||||
|
||||
static void
|
||||
cc_background_grilo_miner_dispose (GObject *object)
|
||||
{
|
||||
CcBackgroundGriloMiner *self = CC_BACKGROUND_GRILO_MINER (object);
|
||||
|
||||
if (self->cancellable)
|
||||
{
|
||||
g_cancellable_cancel (self->cancellable);
|
||||
g_clear_object (&self->cancellable);
|
||||
}
|
||||
|
||||
if (self->accounts)
|
||||
{
|
||||
g_list_free_full (self->accounts, g_object_unref);
|
||||
self->accounts = NULL;
|
||||
}
|
||||
|
||||
G_OBJECT_CLASS (cc_background_grilo_miner_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void
|
||||
cc_background_grilo_miner_init (CcBackgroundGriloMiner *self)
|
||||
{
|
||||
self->cancellable = g_cancellable_new ();
|
||||
}
|
||||
|
||||
static void
|
||||
cc_background_grilo_miner_class_init (CcBackgroundGriloMinerClass *klass)
|
||||
{
|
||||
g_autoptr(GError) error = NULL;
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
GrlRegistry *registry;
|
||||
|
||||
object_class->dispose = cc_background_grilo_miner_dispose;
|
||||
|
||||
signals[MEDIA_FOUND] = g_signal_new ("media-found",
|
||||
G_TYPE_FROM_CLASS (klass),
|
||||
G_SIGNAL_RUN_LAST,
|
||||
0, /* class_offset */
|
||||
NULL, /* accumulator */
|
||||
NULL, /* accu_data */
|
||||
g_cclosure_marshal_VOID__OBJECT,
|
||||
G_TYPE_NONE,
|
||||
1,
|
||||
GRL_TYPE_MEDIA);
|
||||
|
||||
grl_init (NULL, NULL);
|
||||
registry = grl_registry_get_default ();
|
||||
|
||||
error = NULL;
|
||||
if (!grl_registry_load_all_plugins (registry, FALSE, &error) ||
|
||||
!grl_registry_activate_plugin_by_id (registry, "grl-flickr", &error))
|
||||
g_warning ("%s", error->message);
|
||||
}
|
||||
|
||||
CcBackgroundGriloMiner *
|
||||
cc_background_grilo_miner_new (void)
|
||||
{
|
||||
return g_object_new (CC_TYPE_BACKGROUND_GRILO_MINER, NULL);
|
||||
}
|
||||
|
||||
void
|
||||
cc_background_grilo_miner_start (CcBackgroundGriloMiner *self)
|
||||
{
|
||||
setup_online_accounts (self);
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2014 Red Hat, Inc.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _CC_BACKGROUND_GRILO_MINER_H
|
||||
#define _CC_BACKGROUND_GRILO_MINER_H
|
||||
|
||||
#include <glib-object.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define CC_TYPE_BACKGROUND_GRILO_MINER (cc_background_grilo_miner_get_type ())
|
||||
G_DECLARE_FINAL_TYPE (CcBackgroundGriloMiner, cc_background_grilo_miner, CC, BACKGROUND_GRILO_MINER, GObject);
|
||||
|
||||
CcBackgroundGriloMiner *cc_background_grilo_miner_new (void);
|
||||
|
||||
void cc_background_grilo_miner_start (CcBackgroundGriloMiner *self);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* _CC_BACKGROUND_GRILO_MINER_H */
|
||||
@@ -1,973 +0,0 @@
|
||||
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
|
||||
*
|
||||
* Copyright (C) 2010-2011 Red Hat, Inc.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
#include <gio/gio.h>
|
||||
#include <glib/gi18n-lib.h>
|
||||
|
||||
#include <libgnome-desktop/gnome-bg.h>
|
||||
#include <gdesktop-enums.h>
|
||||
|
||||
#include "cc-background-item.h"
|
||||
#include "gdesktop-enums-types.h"
|
||||
|
||||
struct _CcBackgroundItem
|
||||
{
|
||||
GObject parent_instance;
|
||||
|
||||
/* properties */
|
||||
char *name;
|
||||
char *uri;
|
||||
char *size;
|
||||
GDesktopBackgroundStyle placement;
|
||||
GDesktopBackgroundShading shading;
|
||||
char *primary_color;
|
||||
char *secondary_color;
|
||||
char *source_url; /* Used by the Flickr source */
|
||||
char *source_xml; /* Used by the Wallpapers source */
|
||||
gboolean is_deleted;
|
||||
gboolean needs_download;
|
||||
CcBackgroundItemFlags flags;
|
||||
guint64 modified;
|
||||
|
||||
/* internal */
|
||||
GnomeBG *bg;
|
||||
char *mime_type;
|
||||
int width;
|
||||
int height;
|
||||
|
||||
struct {
|
||||
int width;
|
||||
int height;
|
||||
int frame;
|
||||
int scale_factor;
|
||||
GdkPixbuf *thumbnail;
|
||||
} cached_thumbnail;
|
||||
};
|
||||
|
||||
enum {
|
||||
PROP_0,
|
||||
PROP_NAME,
|
||||
PROP_URI,
|
||||
PROP_PLACEMENT,
|
||||
PROP_SHADING,
|
||||
PROP_PRIMARY_COLOR,
|
||||
PROP_SECONDARY_COLOR,
|
||||
PROP_IS_DELETED,
|
||||
PROP_SOURCE_URL,
|
||||
PROP_SOURCE_XML,
|
||||
PROP_FLAGS,
|
||||
PROP_SIZE,
|
||||
PROP_NEEDS_DOWNLOAD,
|
||||
PROP_MODIFIED
|
||||
};
|
||||
|
||||
static void cc_background_item_finalize (GObject *object);
|
||||
|
||||
G_DEFINE_TYPE (CcBackgroundItem, cc_background_item, G_TYPE_OBJECT)
|
||||
|
||||
static void
|
||||
set_bg_properties (CcBackgroundItem *item)
|
||||
{
|
||||
GdkRGBA pcolor = { 0, 0, 0, 0 };
|
||||
GdkRGBA scolor = { 0, 0, 0, 0 };
|
||||
|
||||
if (item->uri) {
|
||||
g_autoptr(GFile) file = NULL;
|
||||
g_autofree gchar *filename = NULL;
|
||||
|
||||
file = g_file_new_for_commandline_arg (item->uri);
|
||||
filename = g_file_get_path (file);
|
||||
gnome_bg_set_filename (item->bg, filename);
|
||||
}
|
||||
|
||||
if (item->primary_color != NULL) {
|
||||
gdk_rgba_parse (&pcolor, item->primary_color);
|
||||
}
|
||||
if (item->secondary_color != NULL) {
|
||||
gdk_rgba_parse (&scolor, item->secondary_color);
|
||||
}
|
||||
|
||||
gnome_bg_set_rgba (item->bg, item->shading, &pcolor, &scolor);
|
||||
gnome_bg_set_placement (item->bg, item->placement);
|
||||
}
|
||||
|
||||
|
||||
gboolean
|
||||
cc_background_item_changes_with_time (CcBackgroundItem *item)
|
||||
{
|
||||
gboolean changes;
|
||||
|
||||
g_return_val_if_fail (CC_IS_BACKGROUND_ITEM (item), FALSE);
|
||||
|
||||
changes = FALSE;
|
||||
if (item->bg != NULL) {
|
||||
changes = gnome_bg_changes_with_time (item->bg);
|
||||
}
|
||||
return changes;
|
||||
}
|
||||
|
||||
static void
|
||||
update_size (CcBackgroundItem *item)
|
||||
{
|
||||
g_clear_pointer (&item->size, g_free);
|
||||
|
||||
if (item->uri == NULL) {
|
||||
item->size = g_strdup ("");
|
||||
} else {
|
||||
if (gnome_bg_has_multiple_sizes (item->bg) || gnome_bg_changes_with_time (item->bg)) {
|
||||
item->size = g_strdup (_("multiple sizes"));
|
||||
} else {
|
||||
/* translators: 100 × 100px
|
||||
* Note that this is not an "x", but U+00D7 MULTIPLICATION SIGN */
|
||||
item->size = g_strdup_printf (_("%d × %d"),
|
||||
item->width,
|
||||
item->height);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static GdkPixbuf *
|
||||
render_at_size (GnomeBG *bg,
|
||||
gint width,
|
||||
gint height)
|
||||
{
|
||||
GdkPixbuf *pixbuf;
|
||||
|
||||
pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, width, height);
|
||||
gnome_bg_draw (bg, pixbuf, gdk_screen_get_default (), FALSE);
|
||||
|
||||
return pixbuf;
|
||||
}
|
||||
|
||||
GdkPixbuf *
|
||||
cc_background_item_get_frame_thumbnail (CcBackgroundItem *item,
|
||||
GnomeDesktopThumbnailFactory *thumbs,
|
||||
int width,
|
||||
int height,
|
||||
int scale_factor,
|
||||
int frame,
|
||||
gboolean force_size)
|
||||
{
|
||||
g_autoptr(GdkPixbuf) pixbuf = NULL;
|
||||
g_autoptr(GdkPixbuf) retval = NULL;
|
||||
|
||||
g_return_val_if_fail (CC_IS_BACKGROUND_ITEM (item), NULL);
|
||||
g_return_val_if_fail (width > 0 && height > 0, NULL);
|
||||
|
||||
/* Use the cached thumbnail if the sizes match */
|
||||
if (item->cached_thumbnail.thumbnail &&
|
||||
item->cached_thumbnail.width == width &&
|
||||
item->cached_thumbnail.height == height &&
|
||||
item->cached_thumbnail.scale_factor == scale_factor &&
|
||||
item->cached_thumbnail.frame == frame)
|
||||
return g_object_ref (item->cached_thumbnail.thumbnail);
|
||||
|
||||
set_bg_properties (item);
|
||||
|
||||
if (force_size) {
|
||||
/* FIXME: this doesn't play nice with slideshow stepping at all,
|
||||
* because it will always render the current slideshow frame, which
|
||||
* might not be what we want.
|
||||
* We're lacking an API to draw a high-res GnomeBG manually choosing
|
||||
* the slideshow frame though, so we can't do much better than this
|
||||
* for now.
|
||||
*/
|
||||
pixbuf = render_at_size (item->bg, width, height);
|
||||
} else {
|
||||
if (frame >= 0) {
|
||||
pixbuf = gnome_bg_create_frame_thumbnail (item->bg,
|
||||
thumbs,
|
||||
gdk_screen_get_default (),
|
||||
width,
|
||||
height,
|
||||
frame);
|
||||
} else {
|
||||
pixbuf = gnome_bg_create_thumbnail (item->bg,
|
||||
thumbs,
|
||||
gdk_screen_get_default (),
|
||||
width,
|
||||
height);
|
||||
}
|
||||
}
|
||||
|
||||
retval = g_steal_pointer (&pixbuf);
|
||||
|
||||
gnome_bg_get_image_size (item->bg,
|
||||
thumbs,
|
||||
width,
|
||||
height,
|
||||
&item->width,
|
||||
&item->height);
|
||||
|
||||
update_size (item);
|
||||
|
||||
/* Cache the new thumbnail */
|
||||
g_set_object (&item->cached_thumbnail.thumbnail, retval);
|
||||
item->cached_thumbnail.width = width;
|
||||
item->cached_thumbnail.height = height;
|
||||
item->cached_thumbnail.scale_factor = scale_factor;
|
||||
item->cached_thumbnail.frame = frame;
|
||||
|
||||
return g_steal_pointer (&retval);
|
||||
}
|
||||
|
||||
|
||||
GdkPixbuf *
|
||||
cc_background_item_get_thumbnail (CcBackgroundItem *item,
|
||||
GnomeDesktopThumbnailFactory *thumbs,
|
||||
int width,
|
||||
int height,
|
||||
int scale_factor)
|
||||
{
|
||||
return cc_background_item_get_frame_thumbnail (item, thumbs, width, height, scale_factor, -1, FALSE);
|
||||
}
|
||||
|
||||
static void
|
||||
update_info (CcBackgroundItem *item,
|
||||
GFileInfo *_info)
|
||||
{
|
||||
g_autoptr(GFileInfo) info = NULL;
|
||||
|
||||
if (_info == NULL) {
|
||||
g_autoptr(GFile) file = NULL;
|
||||
|
||||
file = g_file_new_for_uri (item->uri);
|
||||
|
||||
info = g_file_query_info (file,
|
||||
G_FILE_ATTRIBUTE_STANDARD_NAME ","
|
||||
G_FILE_ATTRIBUTE_STANDARD_SIZE ","
|
||||
G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE ","
|
||||
G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME ","
|
||||
G_FILE_ATTRIBUTE_TIME_MODIFIED,
|
||||
G_FILE_QUERY_INFO_NONE,
|
||||
NULL,
|
||||
NULL);
|
||||
} else {
|
||||
info = g_object_ref (_info);
|
||||
}
|
||||
|
||||
g_clear_pointer (&item->mime_type, g_free);
|
||||
|
||||
if (info == NULL
|
||||
|| g_file_info_get_content_type (info) == NULL) {
|
||||
if (item->uri == NULL) {
|
||||
item->mime_type = g_strdup ("image/x-no-data");
|
||||
g_free (item->name);
|
||||
item->name = g_strdup (_("No Desktop Background"));
|
||||
}
|
||||
} else {
|
||||
if (item->name == NULL)
|
||||
item->name = g_strdup (g_file_info_get_display_name (info));
|
||||
|
||||
item->mime_type = g_strdup (g_file_info_get_content_type (info));
|
||||
if (item->modified == 0)
|
||||
item->modified = g_file_info_get_attribute_uint64 (info, G_FILE_ATTRIBUTE_TIME_MODIFIED);
|
||||
}
|
||||
}
|
||||
|
||||
gboolean
|
||||
cc_background_item_load (CcBackgroundItem *item,
|
||||
GFileInfo *info)
|
||||
{
|
||||
g_return_val_if_fail (CC_IS_BACKGROUND_ITEM (item), FALSE);
|
||||
|
||||
if (item->uri == NULL)
|
||||
return TRUE;
|
||||
|
||||
update_info (item, info);
|
||||
|
||||
if (item->mime_type != NULL
|
||||
&& (g_str_has_prefix (item->mime_type, "image/")
|
||||
|| strcmp (item->mime_type, "application/xml") == 0)) {
|
||||
set_bg_properties (item);
|
||||
} else {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* FIXME we should handle XML files as well */
|
||||
if (item->mime_type != NULL &&
|
||||
g_str_has_prefix (item->mime_type, "image/")) {
|
||||
g_autofree gchar *filename = NULL;
|
||||
|
||||
filename = g_filename_from_uri (item->uri, NULL, NULL);
|
||||
gdk_pixbuf_get_file_info (filename,
|
||||
&item->width,
|
||||
&item->height);
|
||||
update_size (item);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
_set_name (CcBackgroundItem *item,
|
||||
const char *value)
|
||||
{
|
||||
g_free (item->name);
|
||||
item->name = g_strdup (value);
|
||||
}
|
||||
|
||||
const char *
|
||||
cc_background_item_get_name (CcBackgroundItem *item)
|
||||
{
|
||||
g_return_val_if_fail (CC_IS_BACKGROUND_ITEM (item), NULL);
|
||||
|
||||
return item->name;
|
||||
}
|
||||
|
||||
static void
|
||||
_set_uri (CcBackgroundItem *item,
|
||||
const char *value)
|
||||
{
|
||||
g_free (item->uri);
|
||||
if (value && *value == '\0') {
|
||||
item->uri = NULL;
|
||||
} else {
|
||||
if (value && strstr (value, "://") == NULL)
|
||||
g_warning ("URI '%s' is invalid", value);
|
||||
item->uri = g_strdup (value);
|
||||
}
|
||||
}
|
||||
|
||||
const char *
|
||||
cc_background_item_get_uri (CcBackgroundItem *item)
|
||||
{
|
||||
g_return_val_if_fail (CC_IS_BACKGROUND_ITEM (item), NULL);
|
||||
|
||||
return item->uri;
|
||||
}
|
||||
|
||||
static void
|
||||
_set_placement (CcBackgroundItem *item,
|
||||
GDesktopBackgroundStyle value)
|
||||
{
|
||||
item->placement = value;
|
||||
}
|
||||
|
||||
static void
|
||||
_set_shading (CcBackgroundItem *item,
|
||||
GDesktopBackgroundShading value)
|
||||
{
|
||||
item->shading = value;
|
||||
}
|
||||
|
||||
static void
|
||||
_set_primary_color (CcBackgroundItem *item,
|
||||
const char *value)
|
||||
{
|
||||
g_free (item->primary_color);
|
||||
item->primary_color = g_strdup (value);
|
||||
}
|
||||
|
||||
const char *
|
||||
cc_background_item_get_pcolor (CcBackgroundItem *item)
|
||||
{
|
||||
g_return_val_if_fail (CC_IS_BACKGROUND_ITEM (item), NULL);
|
||||
|
||||
return item->primary_color;
|
||||
}
|
||||
|
||||
static void
|
||||
_set_secondary_color (CcBackgroundItem *item,
|
||||
const char *value)
|
||||
{
|
||||
g_free (item->secondary_color);
|
||||
item->secondary_color = g_strdup (value);
|
||||
}
|
||||
|
||||
const char *
|
||||
cc_background_item_get_scolor (CcBackgroundItem *item)
|
||||
{
|
||||
g_return_val_if_fail (CC_IS_BACKGROUND_ITEM (item), NULL);
|
||||
|
||||
return item->secondary_color;
|
||||
}
|
||||
|
||||
GDesktopBackgroundStyle
|
||||
cc_background_item_get_placement (CcBackgroundItem *item)
|
||||
{
|
||||
g_return_val_if_fail (CC_IS_BACKGROUND_ITEM (item), G_DESKTOP_BACKGROUND_STYLE_SCALED);
|
||||
|
||||
return item->placement;
|
||||
}
|
||||
|
||||
GDesktopBackgroundShading
|
||||
cc_background_item_get_shading (CcBackgroundItem *item)
|
||||
{
|
||||
g_return_val_if_fail (CC_IS_BACKGROUND_ITEM (item), G_DESKTOP_BACKGROUND_SHADING_SOLID);
|
||||
|
||||
return item->shading;
|
||||
}
|
||||
|
||||
static void
|
||||
_set_is_deleted (CcBackgroundItem *item,
|
||||
gboolean value)
|
||||
{
|
||||
item->is_deleted = value;
|
||||
}
|
||||
|
||||
static void
|
||||
_set_source_url (CcBackgroundItem *item,
|
||||
const char *value)
|
||||
{
|
||||
g_free (item->source_url);
|
||||
item->source_url = g_strdup (value);
|
||||
}
|
||||
|
||||
const char *
|
||||
cc_background_item_get_source_url (CcBackgroundItem *item)
|
||||
{
|
||||
g_return_val_if_fail (CC_IS_BACKGROUND_ITEM (item), NULL);
|
||||
|
||||
return item->source_url;
|
||||
}
|
||||
|
||||
static void
|
||||
_set_source_xml (CcBackgroundItem *item,
|
||||
const char *value)
|
||||
{
|
||||
g_free (item->source_xml);
|
||||
item->source_xml = g_strdup (value);
|
||||
}
|
||||
|
||||
const char *
|
||||
cc_background_item_get_source_xml (CcBackgroundItem *item)
|
||||
{
|
||||
g_return_val_if_fail (CC_IS_BACKGROUND_ITEM (item), NULL);
|
||||
|
||||
return item->source_xml;
|
||||
}
|
||||
|
||||
static void
|
||||
_set_flags (CcBackgroundItem *item,
|
||||
CcBackgroundItemFlags value)
|
||||
{
|
||||
item->flags = value;
|
||||
}
|
||||
|
||||
CcBackgroundItemFlags
|
||||
cc_background_item_get_flags (CcBackgroundItem *item)
|
||||
{
|
||||
g_return_val_if_fail (CC_IS_BACKGROUND_ITEM (item), 0);
|
||||
|
||||
return item->flags;
|
||||
}
|
||||
|
||||
const char *
|
||||
cc_background_item_get_size (CcBackgroundItem *item)
|
||||
{
|
||||
g_return_val_if_fail (CC_IS_BACKGROUND_ITEM (item), NULL);
|
||||
|
||||
return item->size;
|
||||
}
|
||||
|
||||
static void
|
||||
_set_needs_download (CcBackgroundItem *item,
|
||||
gboolean value)
|
||||
{
|
||||
item->needs_download = value;
|
||||
}
|
||||
|
||||
gboolean
|
||||
cc_background_item_get_needs_download (CcBackgroundItem *item)
|
||||
{
|
||||
g_return_val_if_fail (CC_IS_BACKGROUND_ITEM (item), 0);
|
||||
|
||||
return item->needs_download;
|
||||
}
|
||||
|
||||
static void
|
||||
_set_modified (CcBackgroundItem *item,
|
||||
guint64 value)
|
||||
{
|
||||
item->modified = value;
|
||||
}
|
||||
|
||||
guint64
|
||||
cc_background_item_get_modified (CcBackgroundItem *item)
|
||||
{
|
||||
g_return_val_if_fail (CC_IS_BACKGROUND_ITEM (item), 0);
|
||||
|
||||
return item->modified;
|
||||
}
|
||||
|
||||
static void
|
||||
cc_background_item_set_property (GObject *object,
|
||||
guint prop_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
CcBackgroundItem *self;
|
||||
|
||||
self = CC_BACKGROUND_ITEM (object);
|
||||
|
||||
switch (prop_id) {
|
||||
case PROP_NAME:
|
||||
_set_name (self, g_value_get_string (value));
|
||||
break;
|
||||
case PROP_URI:
|
||||
_set_uri (self, g_value_get_string (value));
|
||||
break;
|
||||
case PROP_PLACEMENT:
|
||||
_set_placement (self, g_value_get_enum (value));
|
||||
break;
|
||||
case PROP_SHADING:
|
||||
_set_shading (self, g_value_get_enum (value));
|
||||
break;
|
||||
case PROP_PRIMARY_COLOR:
|
||||
_set_primary_color (self, g_value_get_string (value));
|
||||
break;
|
||||
case PROP_SECONDARY_COLOR:
|
||||
_set_secondary_color (self, g_value_get_string (value));
|
||||
break;
|
||||
case PROP_IS_DELETED:
|
||||
_set_is_deleted (self, g_value_get_boolean (value));
|
||||
break;
|
||||
case PROP_SOURCE_URL:
|
||||
_set_source_url (self, g_value_get_string (value));
|
||||
break;
|
||||
case PROP_SOURCE_XML:
|
||||
_set_source_xml (self, g_value_get_string (value));
|
||||
break;
|
||||
case PROP_FLAGS:
|
||||
_set_flags (self, g_value_get_flags (value));
|
||||
break;
|
||||
case PROP_NEEDS_DOWNLOAD:
|
||||
_set_needs_download (self, g_value_get_boolean (value));
|
||||
break;
|
||||
case PROP_MODIFIED:
|
||||
_set_modified (self, g_value_get_uint64 (value));
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
cc_background_item_get_property (GObject *object,
|
||||
guint prop_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
CcBackgroundItem *self;
|
||||
|
||||
self = CC_BACKGROUND_ITEM (object);
|
||||
|
||||
switch (prop_id) {
|
||||
case PROP_NAME:
|
||||
g_value_set_string (value, self->name);
|
||||
break;
|
||||
case PROP_URI:
|
||||
g_value_set_string (value, self->uri);
|
||||
break;
|
||||
case PROP_PLACEMENT:
|
||||
g_value_set_enum (value, self->placement);
|
||||
break;
|
||||
case PROP_SHADING:
|
||||
g_value_set_enum (value, self->shading);
|
||||
break;
|
||||
case PROP_PRIMARY_COLOR:
|
||||
g_value_set_string (value, self->primary_color);
|
||||
break;
|
||||
case PROP_SECONDARY_COLOR:
|
||||
g_value_set_string (value, self->secondary_color);
|
||||
break;
|
||||
case PROP_IS_DELETED:
|
||||
g_value_set_boolean (value, self->is_deleted);
|
||||
break;
|
||||
case PROP_SOURCE_URL:
|
||||
g_value_set_string (value, self->source_url);
|
||||
break;
|
||||
case PROP_SOURCE_XML:
|
||||
g_value_set_string (value, self->source_xml);
|
||||
break;
|
||||
case PROP_FLAGS:
|
||||
g_value_set_flags (value, self->flags);
|
||||
break;
|
||||
case PROP_SIZE:
|
||||
g_value_set_string (value, self->size);
|
||||
break;
|
||||
case PROP_NEEDS_DOWNLOAD:
|
||||
g_value_set_boolean (value, self->needs_download);
|
||||
break;
|
||||
case PROP_MODIFIED:
|
||||
g_value_set_uint64 (value, self->modified);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static GObject *
|
||||
cc_background_item_constructor (GType type,
|
||||
guint n_construct_properties,
|
||||
GObjectConstructParam *construct_properties)
|
||||
{
|
||||
CcBackgroundItem *background_item;
|
||||
|
||||
background_item = CC_BACKGROUND_ITEM (G_OBJECT_CLASS (cc_background_item_parent_class)->constructor (type,
|
||||
n_construct_properties,
|
||||
construct_properties));
|
||||
|
||||
return G_OBJECT (background_item);
|
||||
}
|
||||
|
||||
static void
|
||||
cc_background_item_class_init (CcBackgroundItemClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
object_class->get_property = cc_background_item_get_property;
|
||||
object_class->set_property = cc_background_item_set_property;
|
||||
object_class->constructor = cc_background_item_constructor;
|
||||
object_class->finalize = cc_background_item_finalize;
|
||||
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_NAME,
|
||||
g_param_spec_string ("name",
|
||||
"name",
|
||||
"name",
|
||||
NULL,
|
||||
G_PARAM_READWRITE));
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_URI,
|
||||
g_param_spec_string ("uri",
|
||||
"uri",
|
||||
"uri",
|
||||
NULL,
|
||||
G_PARAM_READWRITE));
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_PLACEMENT,
|
||||
g_param_spec_enum ("placement",
|
||||
"placement",
|
||||
"placement",
|
||||
G_DESKTOP_TYPE_DESKTOP_BACKGROUND_STYLE,
|
||||
G_DESKTOP_BACKGROUND_STYLE_SCALED,
|
||||
G_PARAM_READWRITE));
|
||||
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_SHADING,
|
||||
g_param_spec_enum ("shading",
|
||||
"shading",
|
||||
"shading",
|
||||
G_DESKTOP_TYPE_DESKTOP_BACKGROUND_SHADING,
|
||||
G_DESKTOP_BACKGROUND_SHADING_SOLID,
|
||||
G_PARAM_READWRITE));
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_PRIMARY_COLOR,
|
||||
g_param_spec_string ("primary-color",
|
||||
"primary-color",
|
||||
"primary-color",
|
||||
"#000000000000",
|
||||
G_PARAM_READWRITE));
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_SECONDARY_COLOR,
|
||||
g_param_spec_string ("secondary-color",
|
||||
"secondary-color",
|
||||
"secondary-color",
|
||||
"#000000000000",
|
||||
G_PARAM_READWRITE));
|
||||
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_IS_DELETED,
|
||||
g_param_spec_boolean ("is-deleted",
|
||||
NULL,
|
||||
NULL,
|
||||
FALSE,
|
||||
G_PARAM_READWRITE));
|
||||
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_SOURCE_URL,
|
||||
g_param_spec_string ("source-url",
|
||||
"source-url",
|
||||
"source-url",
|
||||
NULL,
|
||||
G_PARAM_READWRITE));
|
||||
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_SOURCE_XML,
|
||||
g_param_spec_string ("source-xml",
|
||||
"source-xml",
|
||||
"source-xml",
|
||||
NULL,
|
||||
G_PARAM_READWRITE));
|
||||
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_FLAGS,
|
||||
g_param_spec_flags ("flags",
|
||||
"flags",
|
||||
"flags",
|
||||
G_DESKTOP_TYPE_BACKGROUND_ITEM_FLAGS,
|
||||
0,
|
||||
G_PARAM_READWRITE));
|
||||
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_SIZE,
|
||||
g_param_spec_string ("size",
|
||||
"size",
|
||||
"size",
|
||||
NULL,
|
||||
G_PARAM_READABLE));
|
||||
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_NEEDS_DOWNLOAD,
|
||||
g_param_spec_boolean ("needs-download",
|
||||
NULL,
|
||||
NULL,
|
||||
TRUE,
|
||||
G_PARAM_READWRITE));
|
||||
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_MODIFIED,
|
||||
g_param_spec_uint64 ("modified",
|
||||
"modified",
|
||||
NULL,
|
||||
0,
|
||||
G_MAXUINT64,
|
||||
0,
|
||||
G_PARAM_READWRITE));
|
||||
}
|
||||
|
||||
static void
|
||||
cc_background_item_init (CcBackgroundItem *item)
|
||||
{
|
||||
item->bg = gnome_bg_new ();
|
||||
|
||||
item->shading = G_DESKTOP_BACKGROUND_SHADING_SOLID;
|
||||
item->placement = G_DESKTOP_BACKGROUND_STYLE_SCALED;
|
||||
item->primary_color = g_strdup ("#000000000000");
|
||||
item->secondary_color = g_strdup ("#000000000000");
|
||||
item->needs_download = TRUE;
|
||||
item->flags = 0;
|
||||
item->modified = 0;
|
||||
}
|
||||
|
||||
static void
|
||||
cc_background_item_finalize (GObject *object)
|
||||
{
|
||||
CcBackgroundItem *item;
|
||||
|
||||
g_return_if_fail (object != NULL);
|
||||
g_return_if_fail (CC_IS_BACKGROUND_ITEM (object));
|
||||
|
||||
item = CC_BACKGROUND_ITEM (object);
|
||||
|
||||
g_return_if_fail (item != NULL);
|
||||
|
||||
g_clear_object (&item->cached_thumbnail.thumbnail);
|
||||
g_free (item->name);
|
||||
g_free (item->uri);
|
||||
g_free (item->primary_color);
|
||||
g_free (item->secondary_color);
|
||||
g_free (item->mime_type);
|
||||
g_free (item->size);
|
||||
g_free (item->source_url);
|
||||
g_free (item->source_xml);
|
||||
|
||||
if (item->bg != NULL)
|
||||
g_object_unref (item->bg);
|
||||
|
||||
G_OBJECT_CLASS (cc_background_item_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
CcBackgroundItem *
|
||||
cc_background_item_new (const char *uri)
|
||||
{
|
||||
GObject *object;
|
||||
|
||||
object = g_object_new (CC_TYPE_BACKGROUND_ITEM,
|
||||
"uri", uri,
|
||||
NULL);
|
||||
|
||||
return CC_BACKGROUND_ITEM (object);
|
||||
}
|
||||
|
||||
CcBackgroundItem *
|
||||
cc_background_item_copy (CcBackgroundItem *item)
|
||||
{
|
||||
CcBackgroundItem *ret;
|
||||
|
||||
ret = cc_background_item_new (item->uri);
|
||||
ret->name = g_strdup (item->name);
|
||||
ret->size = g_strdup (item->size);
|
||||
ret->placement = item->placement;
|
||||
ret->shading = item->shading;
|
||||
ret->primary_color = g_strdup (item->primary_color);
|
||||
ret->secondary_color = g_strdup (item->secondary_color);
|
||||
ret->source_url = g_strdup (item->source_url);
|
||||
ret->source_xml = g_strdup (item->source_xml);
|
||||
ret->is_deleted = item->is_deleted;
|
||||
ret->needs_download = item->needs_download;
|
||||
ret->flags = item->flags;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const char *
|
||||
flags_to_str (CcBackgroundItemFlags flag)
|
||||
{
|
||||
GFlagsClass *fclass;
|
||||
GFlagsValue *value;
|
||||
|
||||
fclass = G_FLAGS_CLASS (g_type_class_peek (G_DESKTOP_TYPE_BACKGROUND_ITEM_FLAGS));
|
||||
value = g_flags_get_first_value (fclass, flag);
|
||||
|
||||
g_assert (value);
|
||||
|
||||
return value->value_nick;
|
||||
}
|
||||
|
||||
static const char *
|
||||
enum_to_str (GType type,
|
||||
int v)
|
||||
{
|
||||
GEnumClass *eclass;
|
||||
GEnumValue *value;
|
||||
|
||||
eclass = G_ENUM_CLASS (g_type_class_peek (type));
|
||||
value = g_enum_get_value (eclass, v);
|
||||
|
||||
g_assert (value);
|
||||
|
||||
return value->value_nick;
|
||||
}
|
||||
|
||||
void
|
||||
cc_background_item_dump (CcBackgroundItem *item)
|
||||
{
|
||||
g_autoptr(GString) flags = NULL;
|
||||
int i;
|
||||
|
||||
g_return_if_fail (CC_IS_BACKGROUND_ITEM (item));
|
||||
|
||||
g_debug ("name:\t\t\t%s", item->name);
|
||||
g_debug ("URI:\t\t\t%s", item->uri ? item->uri : "NULL");
|
||||
if (item->size)
|
||||
g_debug ("size:\t\t\t'%s'", item->size);
|
||||
flags = g_string_new (NULL);
|
||||
for (i = 0; i < 5; i++) {
|
||||
if (item->flags & (1 << i)) {
|
||||
g_string_append (flags, flags_to_str (1 << i));
|
||||
g_string_append_c (flags, ' ');
|
||||
}
|
||||
}
|
||||
if (flags->len == 0)
|
||||
g_string_append (flags, "-none-");
|
||||
g_debug ("flags:\t\t\t%s", flags->str);
|
||||
if (item->primary_color)
|
||||
g_debug ("pcolor:\t\t\t%s", item->primary_color);
|
||||
if (item->secondary_color)
|
||||
g_debug ("scolor:\t\t\t%s", item->secondary_color);
|
||||
g_debug ("placement:\t\t%s", enum_to_str (G_DESKTOP_TYPE_DESKTOP_BACKGROUND_STYLE, item->placement));
|
||||
g_debug ("shading:\t\t%s", enum_to_str (G_DESKTOP_TYPE_DESKTOP_BACKGROUND_SHADING, item->shading));
|
||||
if (item->source_url)
|
||||
g_debug ("source URL:\t\t%s", item->source_url);
|
||||
if (item->source_xml)
|
||||
g_debug ("source XML:\t\t%s", item->source_xml);
|
||||
g_debug ("deleted:\t\t%s", item->is_deleted ? "yes" : "no");
|
||||
if (item->mime_type)
|
||||
g_debug ("mime-type:\t\t%s", item->mime_type);
|
||||
g_debug ("dimensions:\t\t%d x %d", item->width, item->height);
|
||||
g_debug ("modified: %"G_GUINT64_FORMAT, item->modified);
|
||||
g_debug (" ");
|
||||
}
|
||||
|
||||
static gboolean
|
||||
files_equal (const char *a,
|
||||
const char *b)
|
||||
{
|
||||
g_autoptr(GFile) file1 = NULL;
|
||||
g_autoptr(GFile) file2 = NULL;
|
||||
gboolean retval;
|
||||
|
||||
if (a == NULL &&
|
||||
b == NULL)
|
||||
return TRUE;
|
||||
|
||||
if (a == NULL ||
|
||||
b == NULL)
|
||||
return FALSE;
|
||||
|
||||
file1 = g_file_new_for_commandline_arg (a);
|
||||
file2 = g_file_new_for_commandline_arg (b);
|
||||
if (g_file_equal (file1, file2) == FALSE)
|
||||
retval = FALSE;
|
||||
else
|
||||
retval = TRUE;
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
colors_equal (const char *a,
|
||||
const char *b)
|
||||
{
|
||||
GdkRGBA color1, color2;
|
||||
|
||||
gdk_rgba_parse (&color1, a);
|
||||
gdk_rgba_parse (&color2, b);
|
||||
|
||||
return gdk_rgba_equal (&color1, &color2);
|
||||
}
|
||||
|
||||
gboolean
|
||||
cc_background_item_compare (CcBackgroundItem *saved,
|
||||
CcBackgroundItem *configured)
|
||||
{
|
||||
CcBackgroundItemFlags flags;
|
||||
|
||||
flags = saved->flags;
|
||||
if (flags == 0)
|
||||
return FALSE;
|
||||
|
||||
if (flags & CC_BACKGROUND_ITEM_HAS_URI) {
|
||||
if (files_equal (saved->uri, configured->uri) == FALSE)
|
||||
return FALSE;
|
||||
}
|
||||
if (flags & CC_BACKGROUND_ITEM_HAS_SHADING) {
|
||||
if (saved->shading != configured->shading)
|
||||
return FALSE;
|
||||
}
|
||||
if (flags & CC_BACKGROUND_ITEM_HAS_PLACEMENT) {
|
||||
if (saved->placement != configured->placement)
|
||||
return FALSE;
|
||||
}
|
||||
if (flags & CC_BACKGROUND_ITEM_HAS_PCOLOR) {
|
||||
if (colors_equal (saved->primary_color,
|
||||
configured->primary_color) == FALSE) {
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
if (flags & CC_BACKGROUND_ITEM_HAS_SCOLOR) {
|
||||
if (colors_equal (saved->secondary_color,
|
||||
configured->secondary_color) == FALSE) {
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
@@ -1,86 +0,0 @@
|
||||
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
|
||||
*
|
||||
* Copyright (C) 2010-2011 Red Hat, Inc.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __CC_BACKGROUND_ITEM_H
|
||||
#define __CC_BACKGROUND_ITEM_H
|
||||
|
||||
#include <glib-object.h>
|
||||
#include <gdk-pixbuf/gdk-pixbuf.h>
|
||||
#include <libgnome-desktop/gnome-desktop-thumbnail.h>
|
||||
#include <gdesktop-enums.h>
|
||||
#include <libgnome-desktop/gnome-bg.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define CC_TYPE_BACKGROUND_ITEM (cc_background_item_get_type ())
|
||||
G_DECLARE_FINAL_TYPE (CcBackgroundItem, cc_background_item, CC, BACKGROUND_ITEM, GObject)
|
||||
|
||||
typedef enum {
|
||||
CC_BACKGROUND_ITEM_HAS_SHADING = 1 << 0,
|
||||
CC_BACKGROUND_ITEM_HAS_PLACEMENT = 1 << 1,
|
||||
CC_BACKGROUND_ITEM_HAS_PCOLOR = 1 << 2,
|
||||
CC_BACKGROUND_ITEM_HAS_SCOLOR = 1 << 3,
|
||||
CC_BACKGROUND_ITEM_HAS_URI = 1 << 4
|
||||
} CcBackgroundItemFlags;
|
||||
|
||||
#define CC_BACKGROUND_ITEM_HAS_ALL (CC_BACKGROUND_ITEM_HAS_SHADING & \
|
||||
CC_BACKGROUND_ITEM_HAS_PLACEMENT & \
|
||||
CC_BACKGROUND_ITEM_HAS_PCOLOR & \
|
||||
CC_BACKGROUND_ITEM_HAS_SCOLOR & \
|
||||
CC_BACKGROUND_ITEM_HAS_FNAME)
|
||||
|
||||
CcBackgroundItem * cc_background_item_new (const char *uri);
|
||||
CcBackgroundItem * cc_background_item_copy (CcBackgroundItem *item);
|
||||
gboolean cc_background_item_load (CcBackgroundItem *item,
|
||||
GFileInfo *info);
|
||||
gboolean cc_background_item_changes_with_time (CcBackgroundItem *item);
|
||||
|
||||
GdkPixbuf * cc_background_item_get_thumbnail (CcBackgroundItem *item,
|
||||
GnomeDesktopThumbnailFactory *thumbs,
|
||||
int width,
|
||||
int height,
|
||||
int scale_factor);
|
||||
GdkPixbuf * cc_background_item_get_frame_thumbnail (CcBackgroundItem *item,
|
||||
GnomeDesktopThumbnailFactory *thumbs,
|
||||
int width,
|
||||
int height,
|
||||
int scale_factor,
|
||||
int frame,
|
||||
gboolean force_size);
|
||||
|
||||
GDesktopBackgroundStyle cc_background_item_get_placement (CcBackgroundItem *item);
|
||||
GDesktopBackgroundShading cc_background_item_get_shading (CcBackgroundItem *item);
|
||||
const char * cc_background_item_get_uri (CcBackgroundItem *item);
|
||||
const char * cc_background_item_get_source_url (CcBackgroundItem *item);
|
||||
const char * cc_background_item_get_source_xml (CcBackgroundItem *item);
|
||||
CcBackgroundItemFlags cc_background_item_get_flags (CcBackgroundItem *item);
|
||||
const char * cc_background_item_get_pcolor (CcBackgroundItem *item);
|
||||
const char * cc_background_item_get_scolor (CcBackgroundItem *item);
|
||||
const char * cc_background_item_get_name (CcBackgroundItem *item);
|
||||
const char * cc_background_item_get_size (CcBackgroundItem *item);
|
||||
gboolean cc_background_item_get_needs_download (CcBackgroundItem *item);
|
||||
guint64 cc_background_item_get_modified (CcBackgroundItem *item);
|
||||
|
||||
gboolean cc_background_item_compare (CcBackgroundItem *saved,
|
||||
CcBackgroundItem *configured);
|
||||
void cc_background_item_dump (CcBackgroundItem *item);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __CC_BACKGROUND_ITEM_H */
|
||||
@@ -1,376 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Intel, Inc
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Author: Thomas Wood <thomas.wood@intel.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include <string.h>
|
||||
#include <glib.h>
|
||||
#include <glib/gi18n-lib.h>
|
||||
#include <glib/gstdio.h>
|
||||
|
||||
#include <gdesktop-enums.h>
|
||||
|
||||
#include "cc-background-panel.h"
|
||||
|
||||
#include "cc-background-chooser.h"
|
||||
#include "cc-background-item.h"
|
||||
#include "cc-background-preview.h"
|
||||
#include "cc-background-resources.h"
|
||||
#include "cc-background-xml.h"
|
||||
|
||||
#include "bg-pictures-source.h"
|
||||
|
||||
#define WP_PATH_ID "org.gnome.desktop.background"
|
||||
#define WP_LOCK_PATH_ID "org.gnome.desktop.screensaver"
|
||||
#define WP_URI_KEY "picture-uri"
|
||||
#define WP_OPTIONS_KEY "picture-options"
|
||||
#define WP_SHADING_KEY "color-shading-type"
|
||||
#define WP_PCOLOR_KEY "primary-color"
|
||||
#define WP_SCOLOR_KEY "secondary-color"
|
||||
|
||||
struct _CcBackgroundPanel
|
||||
{
|
||||
CcPanel parent_instance;
|
||||
|
||||
GDBusConnection *connection;
|
||||
|
||||
GSettings *settings;
|
||||
GSettings *lock_settings;
|
||||
|
||||
GnomeDesktopThumbnailFactory *thumb_factory;
|
||||
|
||||
CcBackgroundItem *current_background;
|
||||
CcBackgroundItem *current_lock_background;
|
||||
|
||||
GCancellable *copy_cancellable;
|
||||
|
||||
CcBackgroundChooser *background_chooser;
|
||||
GtkWidget *add_picture_button;
|
||||
CcBackgroundPreview *desktop_preview;
|
||||
CcBackgroundPreview *lock_screen_preview;
|
||||
|
||||
GtkWidget *spinner;
|
||||
GtkWidget *chooser;
|
||||
};
|
||||
|
||||
CC_PANEL_REGISTER (CcBackgroundPanel, cc_background_panel)
|
||||
|
||||
static CcBackgroundItem *
|
||||
get_current_background (CcBackgroundPanel *panel,
|
||||
GSettings *settings)
|
||||
{
|
||||
if (settings == panel->settings)
|
||||
return panel->current_background;
|
||||
else
|
||||
return panel->current_lock_background;
|
||||
}
|
||||
|
||||
static void
|
||||
update_preview (CcBackgroundPanel *panel,
|
||||
GSettings *settings,
|
||||
CcBackgroundItem *item)
|
||||
{
|
||||
CcBackgroundItem *current_background;
|
||||
|
||||
current_background = get_current_background (panel, settings);
|
||||
|
||||
if (item && current_background)
|
||||
{
|
||||
g_object_unref (current_background);
|
||||
current_background = cc_background_item_copy (item);
|
||||
if (settings == panel->settings)
|
||||
panel->current_background = current_background;
|
||||
else
|
||||
panel->current_lock_background = current_background;
|
||||
cc_background_item_load (current_background, NULL);
|
||||
}
|
||||
|
||||
if (settings == panel->settings)
|
||||
cc_background_preview_set_item (panel->desktop_preview, current_background);
|
||||
else
|
||||
cc_background_preview_set_item (panel->lock_screen_preview, current_background);
|
||||
}
|
||||
|
||||
static gchar *
|
||||
get_save_path (CcBackgroundPanel *panel, GSettings *settings)
|
||||
{
|
||||
return g_build_filename (g_get_user_config_dir (),
|
||||
"gnome-control-center",
|
||||
"backgrounds",
|
||||
settings == panel->settings ? "last-edited.xml" : "last-edited-lock.xml",
|
||||
NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
reload_current_bg (CcBackgroundPanel *panel,
|
||||
GSettings *settings)
|
||||
{
|
||||
g_autoptr(CcBackgroundItem) saved = NULL;
|
||||
CcBackgroundItem *configured;
|
||||
g_autofree gchar *uri = NULL;
|
||||
g_autofree gchar *pcolor = NULL;
|
||||
g_autofree gchar *scolor = NULL;
|
||||
|
||||
/* Load the saved configuration */
|
||||
uri = get_save_path (panel, settings);
|
||||
saved = cc_background_xml_get_item (uri);
|
||||
|
||||
/* initalise the current background information from settings */
|
||||
uri = g_settings_get_string (settings, WP_URI_KEY);
|
||||
if (uri && *uri == '\0')
|
||||
g_clear_pointer (&uri, g_free);
|
||||
|
||||
configured = cc_background_item_new (uri);
|
||||
|
||||
pcolor = g_settings_get_string (settings, WP_PCOLOR_KEY);
|
||||
scolor = g_settings_get_string (settings, WP_SCOLOR_KEY);
|
||||
g_object_set (G_OBJECT (configured),
|
||||
"name", _("Current background"),
|
||||
"placement", g_settings_get_enum (settings, WP_OPTIONS_KEY),
|
||||
"shading", g_settings_get_enum (settings, WP_SHADING_KEY),
|
||||
"primary-color", pcolor,
|
||||
"secondary-color", scolor,
|
||||
NULL);
|
||||
|
||||
if (saved != NULL && cc_background_item_compare (saved, configured))
|
||||
{
|
||||
CcBackgroundItemFlags flags;
|
||||
flags = cc_background_item_get_flags (saved);
|
||||
/* Special case for colours */
|
||||
if (cc_background_item_get_placement (saved) == G_DESKTOP_BACKGROUND_STYLE_NONE)
|
||||
flags &=~ (CC_BACKGROUND_ITEM_HAS_PCOLOR | CC_BACKGROUND_ITEM_HAS_SCOLOR);
|
||||
g_object_set (G_OBJECT (configured),
|
||||
"name", cc_background_item_get_name (saved),
|
||||
"flags", flags,
|
||||
"source-url", cc_background_item_get_source_url (saved),
|
||||
"source-xml", cc_background_item_get_source_xml (saved),
|
||||
NULL);
|
||||
}
|
||||
|
||||
if (settings == panel->settings)
|
||||
{
|
||||
g_clear_object (&panel->current_background);
|
||||
panel->current_background = configured;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_clear_object (&panel->current_lock_background);
|
||||
panel->current_lock_background = configured;
|
||||
}
|
||||
cc_background_item_load (configured, NULL);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
create_save_dir (void)
|
||||
{
|
||||
g_autofree char *path = NULL;
|
||||
|
||||
path = g_build_filename (g_get_user_config_dir (),
|
||||
"gnome-control-center",
|
||||
"backgrounds",
|
||||
NULL);
|
||||
if (g_mkdir_with_parents (path, USER_DIR_MODE) < 0)
|
||||
{
|
||||
g_warning ("Failed to create directory '%s'", path);
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
set_background (CcBackgroundPanel *panel,
|
||||
GSettings *settings,
|
||||
CcBackgroundItem *item)
|
||||
{
|
||||
GDesktopBackgroundStyle style;
|
||||
CcBackgroundItemFlags flags;
|
||||
g_autofree gchar *filename = NULL;
|
||||
const char *uri;
|
||||
|
||||
if (item == NULL)
|
||||
return;
|
||||
|
||||
uri = cc_background_item_get_uri (item);
|
||||
flags = cc_background_item_get_flags (item);
|
||||
|
||||
g_settings_set_string (settings, WP_URI_KEY, uri);
|
||||
|
||||
/* Also set the placement if we have a URI and the previous value was none */
|
||||
if (flags & CC_BACKGROUND_ITEM_HAS_PLACEMENT)
|
||||
{
|
||||
g_settings_set_enum (settings, WP_OPTIONS_KEY, cc_background_item_get_placement (item));
|
||||
}
|
||||
else if (uri != NULL)
|
||||
{
|
||||
style = g_settings_get_enum (settings, WP_OPTIONS_KEY);
|
||||
if (style == G_DESKTOP_BACKGROUND_STYLE_NONE)
|
||||
g_settings_set_enum (settings, WP_OPTIONS_KEY, cc_background_item_get_placement (item));
|
||||
}
|
||||
|
||||
if (flags & CC_BACKGROUND_ITEM_HAS_SHADING)
|
||||
g_settings_set_enum (settings, WP_SHADING_KEY, cc_background_item_get_shading (item));
|
||||
|
||||
g_settings_set_string (settings, WP_PCOLOR_KEY, cc_background_item_get_pcolor (item));
|
||||
g_settings_set_string (settings, WP_SCOLOR_KEY, cc_background_item_get_scolor (item));
|
||||
|
||||
/* Apply all changes */
|
||||
g_settings_apply (settings);
|
||||
|
||||
/* Save the source XML if there is one */
|
||||
filename = get_save_path (panel, settings);
|
||||
if (create_save_dir ())
|
||||
cc_background_xml_save (get_current_background (panel, settings), filename);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
on_chooser_background_chosen_cb (CcBackgroundChooser *chooser,
|
||||
CcBackgroundItem *item,
|
||||
CcBackgroundSelectionFlags flags,
|
||||
CcBackgroundPanel *self)
|
||||
{
|
||||
|
||||
if (flags & CC_BACKGROUND_SELECTION_DESKTOP)
|
||||
set_background (self, self->settings, item);
|
||||
|
||||
if (flags & CC_BACKGROUND_SELECTION_LOCK_SCREEN)
|
||||
set_background (self, self->lock_settings, item);
|
||||
}
|
||||
|
||||
static void
|
||||
on_add_picture_button_clicked_cb (GtkWidget *button,
|
||||
CcBackgroundPanel *self)
|
||||
{
|
||||
cc_background_chooser_select_file (self->background_chooser);
|
||||
}
|
||||
|
||||
static const char *
|
||||
cc_background_panel_get_help_uri (CcPanel *panel)
|
||||
{
|
||||
return "help:gnome-help/look-background";
|
||||
}
|
||||
|
||||
static void
|
||||
cc_background_panel_constructed (GObject *object)
|
||||
{
|
||||
CcBackgroundPanel *self;
|
||||
CcShell *shell;
|
||||
|
||||
self = CC_BACKGROUND_PANEL (object);
|
||||
shell = cc_panel_get_shell (CC_PANEL (self));
|
||||
|
||||
cc_shell_embed_widget_in_header (shell, self->add_picture_button, GTK_POS_RIGHT);
|
||||
|
||||
G_OBJECT_CLASS (cc_background_panel_parent_class)->constructed (object);
|
||||
}
|
||||
|
||||
static void
|
||||
cc_background_panel_dispose (GObject *object)
|
||||
{
|
||||
CcBackgroundPanel *panel = CC_BACKGROUND_PANEL (object);
|
||||
|
||||
/* cancel any copy operation */
|
||||
g_cancellable_cancel (panel->copy_cancellable);
|
||||
|
||||
g_clear_object (&panel->settings);
|
||||
g_clear_object (&panel->lock_settings);
|
||||
g_clear_object (&panel->copy_cancellable);
|
||||
g_clear_object (&panel->thumb_factory);
|
||||
|
||||
g_clear_pointer (&panel->chooser, gtk_widget_destroy);
|
||||
|
||||
G_OBJECT_CLASS (cc_background_panel_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void
|
||||
cc_background_panel_finalize (GObject *object)
|
||||
{
|
||||
CcBackgroundPanel *panel = CC_BACKGROUND_PANEL (object);
|
||||
|
||||
g_clear_object (&panel->current_background);
|
||||
g_clear_object (&panel->current_lock_background);
|
||||
|
||||
G_OBJECT_CLASS (cc_background_panel_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
cc_background_panel_class_init (CcBackgroundPanelClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
CcPanelClass *panel_class = CC_PANEL_CLASS (klass);
|
||||
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
|
||||
|
||||
g_type_ensure (CC_TYPE_BACKGROUND_CHOOSER);
|
||||
g_type_ensure (CC_TYPE_BACKGROUND_PREVIEW);
|
||||
|
||||
panel_class->get_help_uri = cc_background_panel_get_help_uri;
|
||||
|
||||
object_class->constructed = cc_background_panel_constructed;
|
||||
object_class->dispose = cc_background_panel_dispose;
|
||||
object_class->finalize = cc_background_panel_finalize;
|
||||
|
||||
gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/background/cc-background-panel.ui");
|
||||
|
||||
gtk_widget_class_bind_template_child (widget_class, CcBackgroundPanel, add_picture_button);
|
||||
gtk_widget_class_bind_template_child (widget_class, CcBackgroundPanel, background_chooser);
|
||||
gtk_widget_class_bind_template_child (widget_class, CcBackgroundPanel, desktop_preview);
|
||||
gtk_widget_class_bind_template_child (widget_class, CcBackgroundPanel, lock_screen_preview);
|
||||
|
||||
gtk_widget_class_bind_template_callback (widget_class, on_chooser_background_chosen_cb);
|
||||
gtk_widget_class_bind_template_callback (widget_class, on_add_picture_button_clicked_cb);
|
||||
}
|
||||
|
||||
static void
|
||||
on_settings_changed (GSettings *settings,
|
||||
gchar *key,
|
||||
CcBackgroundPanel *panel)
|
||||
{
|
||||
reload_current_bg (panel, settings);
|
||||
update_preview (panel, settings, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
cc_background_panel_init (CcBackgroundPanel *panel)
|
||||
{
|
||||
g_resources_register (cc_background_get_resource ());
|
||||
|
||||
gtk_widget_init_template (GTK_WIDGET (panel));
|
||||
|
||||
panel->connection = g_application_get_dbus_connection (g_application_get_default ());
|
||||
|
||||
panel->copy_cancellable = g_cancellable_new ();
|
||||
panel->thumb_factory = gnome_desktop_thumbnail_factory_new (GNOME_DESKTOP_THUMBNAIL_SIZE_LARGE);
|
||||
|
||||
panel->settings = g_settings_new (WP_PATH_ID);
|
||||
g_settings_delay (panel->settings);
|
||||
|
||||
panel->lock_settings = g_settings_new (WP_LOCK_PATH_ID);
|
||||
g_settings_delay (panel->lock_settings);
|
||||
|
||||
/* Load the backgrounds */
|
||||
reload_current_bg (panel, panel->settings);
|
||||
update_preview (panel, panel->settings, NULL);
|
||||
reload_current_bg (panel, panel->lock_settings);
|
||||
update_preview (panel, panel->lock_settings, NULL);
|
||||
|
||||
/* Background settings */
|
||||
g_signal_connect (panel->settings, "changed", G_CALLBACK (on_settings_changed), panel);
|
||||
g_signal_connect (panel->lock_settings, "changed", G_CALLBACK (on_settings_changed), panel);
|
||||
}
|
||||
@@ -1,34 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Intel, Inc
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Author: Thomas Wood <thomas.wood@intel.com>
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _CC_BACKGROUND_PANEL_H
|
||||
#define _CC_BACKGROUND_PANEL_H
|
||||
|
||||
#include <shell/cc-panel.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define CC_TYPE_BACKGROUND_PANEL (cc_background_panel_get_type ())
|
||||
G_DECLARE_FINAL_TYPE (CcBackgroundPanel, cc_background_panel, CC, BACKGROUND_PANEL, CcPanel)
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* _CC_BACKGROUND_PANEL_H */
|
||||
@@ -1,66 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<interface>
|
||||
<!-- interface-requires gtk+ 3.0 -->
|
||||
<template class="CcBackgroundPanel" parent="CcPanel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
|
||||
<child>
|
||||
<object class="HdyColumn">
|
||||
<property name="visible">1</property>
|
||||
<property name="maximum_width">600</property>
|
||||
<property name="linear_growth_width">400</property>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="spacing">24</property>
|
||||
<property name="margin-start">12</property>
|
||||
<property name="margin-end">12</property>
|
||||
<property name="margin-top">18</property>
|
||||
<property name="margin-bottom">18</property>
|
||||
<property name="hexpand">True</property>
|
||||
<child>
|
||||
<object class="CcBackgroundPreview" id="desktop_preview">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="valign">center</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="CcBackgroundPreview" id="lock_screen_preview">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="is-lock-screen">True</property>
|
||||
<property name="valign">center</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
|
||||
<child>
|
||||
<object class="CcBackgroundChooser" id="background_chooser">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="expand">True</property>
|
||||
<signal name="background-chosen" handler="on_chooser_background_chosen_cb" object="CcBackgroundPanel" swapped="no" />
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</template>
|
||||
|
||||
<!-- Header button -->
|
||||
<object class="GtkButton" id="add_picture_button">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" translatable="yes">Add Picture…</property>
|
||||
<signal name="clicked" handler="on_add_picture_button_clicked_cb" object="CcBackgroundPanel" swapped="no" />
|
||||
</object>
|
||||
</interface>
|
||||
@@ -1,377 +0,0 @@
|
||||
/* cc-background-preview.c
|
||||
*
|
||||
* Copyright 2019 Georges Basile Stavracas Neto <georges.stavracas@gmail.com>
|
||||
*
|
||||
* 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 3 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
#include "cc-background-preview.h"
|
||||
|
||||
struct _CcBackgroundPreview
|
||||
{
|
||||
GtkBox parent;
|
||||
|
||||
GtkWidget *animated_background_icon;
|
||||
GtkLabel *desktop_clock_label;
|
||||
GtkWidget *drawing_area;
|
||||
GtkLabel *lock_screen_label;
|
||||
GtkStack *stack;
|
||||
|
||||
GnomeDesktopThumbnailFactory *thumbnail_factory;
|
||||
|
||||
CcBackgroundItem *item;
|
||||
GSettings *desktop_settings;
|
||||
|
||||
guint lock_screen_time_timeout_id;
|
||||
gboolean is_lock_screen;
|
||||
GDateTime *previous_time;
|
||||
gboolean is_24h_format;
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE (CcBackgroundPreview, cc_background_preview, GTK_TYPE_BOX)
|
||||
|
||||
enum
|
||||
{
|
||||
PROP_0,
|
||||
PROP_IS_LOCK_SCREEN,
|
||||
PROP_ITEM,
|
||||
N_PROPS
|
||||
};
|
||||
|
||||
static GParamSpec *properties [N_PROPS];
|
||||
|
||||
/* Auxiliary methods */
|
||||
|
||||
static void
|
||||
update_lock_screen_label (CcBackgroundPreview *self,
|
||||
gboolean force)
|
||||
{
|
||||
g_autoptr(GDateTime) now = NULL;
|
||||
g_autofree gchar *label = NULL;
|
||||
|
||||
now = g_date_time_new_now_local ();
|
||||
|
||||
/* Don't update the label if the hour:minute pair did not change */
|
||||
if (!force && self->previous_time &&
|
||||
g_date_time_get_hour (now) == g_date_time_get_hour (self->previous_time) &&
|
||||
g_date_time_get_minute (now) == g_date_time_get_minute (self->previous_time))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (self->is_24h_format)
|
||||
label = g_date_time_format (now, "%R");
|
||||
else
|
||||
label = g_date_time_format (now, "%I:%M %p");
|
||||
|
||||
gtk_label_set_label (self->lock_screen_label, label);
|
||||
gtk_label_set_label (self->desktop_clock_label, label);
|
||||
|
||||
g_clear_pointer (&self->previous_time, g_date_time_unref);
|
||||
self->previous_time = g_steal_pointer (&now);
|
||||
}
|
||||
|
||||
static void
|
||||
update_clock_format (CcBackgroundPreview *self)
|
||||
{
|
||||
g_autofree gchar *clock_format = NULL;
|
||||
gboolean is_24h_format;
|
||||
|
||||
clock_format = g_settings_get_string (self->desktop_settings, "clock-format");
|
||||
is_24h_format = g_strcmp0 (clock_format, "24h") == 0;
|
||||
|
||||
if (is_24h_format != self->is_24h_format)
|
||||
{
|
||||
self->is_24h_format = is_24h_format;
|
||||
update_lock_screen_label (self, TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
load_custom_css (CcBackgroundPreview *self)
|
||||
{
|
||||
g_autoptr(GtkCssProvider) provider = NULL;
|
||||
|
||||
/* use custom CSS */
|
||||
provider = gtk_css_provider_new ();
|
||||
gtk_css_provider_load_from_resource (provider, "/org/gnome/control-center/background/preview.css");
|
||||
gtk_style_context_add_provider_for_screen (gdk_screen_get_default (),
|
||||
GTK_STYLE_PROVIDER (provider),
|
||||
GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
|
||||
|
||||
}
|
||||
|
||||
static gboolean
|
||||
update_clock_cb (gpointer data)
|
||||
{
|
||||
CcBackgroundPreview *self = data;
|
||||
|
||||
update_lock_screen_label (self, FALSE);
|
||||
|
||||
return G_SOURCE_CONTINUE;
|
||||
}
|
||||
|
||||
static void
|
||||
start_monitor_time (CcBackgroundPreview *self)
|
||||
{
|
||||
if (self->lock_screen_time_timeout_id > 0)
|
||||
return;
|
||||
|
||||
self->lock_screen_time_timeout_id = g_timeout_add_seconds (1,
|
||||
update_clock_cb,
|
||||
self);
|
||||
}
|
||||
|
||||
static void
|
||||
stop_monitor_time (CcBackgroundPreview *self)
|
||||
{
|
||||
if (self->lock_screen_time_timeout_id > 0)
|
||||
{
|
||||
g_source_remove (self->lock_screen_time_timeout_id);
|
||||
self->lock_screen_time_timeout_id = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Callbacks */
|
||||
|
||||
static gboolean
|
||||
on_preview_draw_cb (GtkWidget *widget,
|
||||
cairo_t *cr,
|
||||
CcBackgroundPreview *self)
|
||||
{
|
||||
g_autoptr(GdkPixbuf) pixbuf = NULL;
|
||||
GtkAllocation allocation;
|
||||
gint scale_factor;
|
||||
|
||||
if (!self->item)
|
||||
return FALSE;
|
||||
|
||||
scale_factor = gtk_widget_get_scale_factor (widget);
|
||||
gtk_widget_get_allocation (widget, &allocation);
|
||||
pixbuf = cc_background_item_get_frame_thumbnail (self->item,
|
||||
self->thumbnail_factory,
|
||||
allocation.width,
|
||||
allocation.height,
|
||||
scale_factor,
|
||||
0,
|
||||
TRUE);
|
||||
|
||||
|
||||
gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0);
|
||||
cairo_paint (cr);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* GObject overrides */
|
||||
|
||||
static void
|
||||
cc_background_preview_finalize (GObject *object)
|
||||
{
|
||||
CcBackgroundPreview *self = (CcBackgroundPreview *)object;
|
||||
|
||||
g_clear_object (&self->desktop_settings);
|
||||
g_clear_object (&self->item);
|
||||
g_clear_object (&self->thumbnail_factory);
|
||||
|
||||
g_clear_pointer (&self->previous_time, g_date_time_unref);
|
||||
|
||||
stop_monitor_time (self);
|
||||
|
||||
G_OBJECT_CLASS (cc_background_preview_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
cc_background_preview_get_property (GObject *object,
|
||||
guint prop_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
CcBackgroundPreview *self = CC_BACKGROUND_PREVIEW (object);
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_IS_LOCK_SCREEN:
|
||||
g_value_set_boolean (value, self->is_lock_screen);
|
||||
break;
|
||||
|
||||
case PROP_ITEM:
|
||||
g_value_set_object (value, self->item);
|
||||
break;
|
||||
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
cc_background_preview_set_property (GObject *object,
|
||||
guint prop_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
CcBackgroundPreview *self = CC_BACKGROUND_PREVIEW (object);
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_IS_LOCK_SCREEN:
|
||||
self->is_lock_screen = g_value_get_boolean (value);
|
||||
gtk_stack_set_visible_child_name (self->stack,
|
||||
self->is_lock_screen ? "lock" : "desktop");
|
||||
break;
|
||||
|
||||
case PROP_ITEM:
|
||||
cc_background_preview_set_item (self, g_value_get_object (value));
|
||||
break;
|
||||
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
}
|
||||
}
|
||||
|
||||
static GtkSizeRequestMode
|
||||
cc_background_preview_get_request_mode (GtkWidget *widget)
|
||||
{
|
||||
return GTK_SIZE_REQUEST_HEIGHT_FOR_WIDTH;
|
||||
}
|
||||
|
||||
static gfloat
|
||||
get_primary_monitor_aspect_ratio (void)
|
||||
{
|
||||
GdkDisplay *display;
|
||||
GdkMonitor *primary_monitor;
|
||||
gfloat aspect_ratio;
|
||||
|
||||
display = gdk_display_get_default ();
|
||||
primary_monitor = gdk_display_get_primary_monitor (display);
|
||||
aspect_ratio = 16.0 / 9.0;
|
||||
|
||||
if (primary_monitor)
|
||||
{
|
||||
GdkRectangle monitor_layout;
|
||||
gdk_monitor_get_geometry (primary_monitor, &monitor_layout);
|
||||
aspect_ratio = monitor_layout.width / (gfloat) monitor_layout.height;
|
||||
}
|
||||
|
||||
return aspect_ratio;
|
||||
}
|
||||
|
||||
static void
|
||||
cc_background_preview_get_preferred_height_for_width (GtkWidget *widget,
|
||||
gint width,
|
||||
gint *minimum,
|
||||
gint *natural)
|
||||
{
|
||||
gfloat aspect_ratio = get_primary_monitor_aspect_ratio ();
|
||||
|
||||
*minimum = *natural = MAX (2, width / aspect_ratio);
|
||||
}
|
||||
|
||||
static void
|
||||
cc_background_preview_get_preferred_width_for_height (GtkWidget *widget,
|
||||
gint height,
|
||||
gint *minimum,
|
||||
gint *natural)
|
||||
{
|
||||
gfloat aspect_ratio = get_primary_monitor_aspect_ratio ();
|
||||
|
||||
*minimum = *natural = MAX (2, height * aspect_ratio);
|
||||
}
|
||||
|
||||
static void
|
||||
cc_background_preview_class_init (CcBackgroundPreviewClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
|
||||
|
||||
object_class->finalize = cc_background_preview_finalize;
|
||||
object_class->get_property = cc_background_preview_get_property;
|
||||
object_class->set_property = cc_background_preview_set_property;
|
||||
|
||||
widget_class->get_request_mode = cc_background_preview_get_request_mode;
|
||||
widget_class->get_preferred_height_for_width = cc_background_preview_get_preferred_height_for_width;
|
||||
widget_class->get_preferred_width_for_height = cc_background_preview_get_preferred_width_for_height;
|
||||
|
||||
properties[PROP_IS_LOCK_SCREEN] = g_param_spec_boolean ("is-lock-screen",
|
||||
"Lock screen",
|
||||
"Whether the preview is of the lock screen",
|
||||
FALSE,
|
||||
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
|
||||
|
||||
properties[PROP_ITEM] = g_param_spec_object ("item",
|
||||
"Item",
|
||||
"Background item",
|
||||
CC_TYPE_BACKGROUND_ITEM,
|
||||
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
|
||||
|
||||
g_object_class_install_properties (object_class, N_PROPS, properties);
|
||||
|
||||
gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/background/cc-background-preview.ui");
|
||||
|
||||
gtk_widget_class_bind_template_child (widget_class, CcBackgroundPreview, animated_background_icon);
|
||||
gtk_widget_class_bind_template_child (widget_class, CcBackgroundPreview, desktop_clock_label);
|
||||
gtk_widget_class_bind_template_child (widget_class, CcBackgroundPreview, drawing_area);
|
||||
gtk_widget_class_bind_template_child (widget_class, CcBackgroundPreview, lock_screen_label);
|
||||
gtk_widget_class_bind_template_child (widget_class, CcBackgroundPreview, stack);
|
||||
|
||||
gtk_widget_class_bind_template_callback (widget_class, on_preview_draw_cb);
|
||||
}
|
||||
|
||||
static void
|
||||
cc_background_preview_init (CcBackgroundPreview *self)
|
||||
{
|
||||
gtk_widget_init_template (GTK_WIDGET (self));
|
||||
|
||||
self->thumbnail_factory = gnome_desktop_thumbnail_factory_new (GNOME_DESKTOP_THUMBNAIL_SIZE_LARGE);
|
||||
self->desktop_settings = g_settings_new ("org.gnome.desktop.interface");
|
||||
|
||||
g_signal_connect_object (self->desktop_settings,
|
||||
"changed::clock-format",
|
||||
G_CALLBACK (update_clock_format),
|
||||
self,
|
||||
G_CONNECT_SWAPPED);
|
||||
|
||||
update_clock_format (self);
|
||||
load_custom_css (self);
|
||||
start_monitor_time (self);
|
||||
}
|
||||
|
||||
CcBackgroundItem*
|
||||
cc_background_preview_get_item (CcBackgroundPreview *self)
|
||||
{
|
||||
g_return_val_if_fail (CC_IS_BACKGROUND_PREVIEW (self), NULL);
|
||||
|
||||
return self->item;
|
||||
}
|
||||
|
||||
void
|
||||
cc_background_preview_set_item (CcBackgroundPreview *self,
|
||||
CcBackgroundItem *item)
|
||||
{
|
||||
g_return_if_fail (CC_IS_BACKGROUND_PREVIEW (self));
|
||||
g_return_if_fail (CC_IS_BACKGROUND_ITEM (item));
|
||||
|
||||
if (!g_set_object (&self->item, item))
|
||||
return;
|
||||
|
||||
gtk_widget_set_visible (self->animated_background_icon,
|
||||
cc_background_item_changes_with_time (item));
|
||||
|
||||
gtk_widget_queue_draw (self->drawing_area);
|
||||
|
||||
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_ITEM]);
|
||||
}
|
||||
@@ -1,36 +0,0 @@
|
||||
/* cc-background-preview.h
|
||||
*
|
||||
* Copyright 2019 Georges Basile Stavracas Neto <georges.stavracas@gmail.com>
|
||||
*
|
||||
* 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 3 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
#include "cc-background-item.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define CC_TYPE_BACKGROUND_PREVIEW (cc_background_preview_get_type())
|
||||
G_DECLARE_FINAL_TYPE (CcBackgroundPreview, cc_background_preview, CC, BACKGROUND_PREVIEW, GtkBox)
|
||||
|
||||
CcBackgroundItem* cc_background_preview_get_item (CcBackgroundPreview *self);
|
||||
void cc_background_preview_set_item (CcBackgroundPreview *self,
|
||||
CcBackgroundItem *item);
|
||||
|
||||
G_END_DECLS
|
||||
@@ -1,158 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<interface>
|
||||
<!-- interface-requires gtk+ 3.0 -->
|
||||
<template class="CcBackgroundPreview" parent="GtkBox">
|
||||
<property name="visible">True</property>
|
||||
<property name="can-focus">False</property>
|
||||
<property name="hexpand">True</property>
|
||||
<property name="vexpand">False</property>
|
||||
<style>
|
||||
<class name="frame" />
|
||||
</style>
|
||||
|
||||
<child>
|
||||
<object class="GtkOverlay">
|
||||
<property name="visible">True</property>
|
||||
<property name="can-focus">False</property>
|
||||
<property name="hexpand">True</property>
|
||||
|
||||
<!-- Wallpaper -->
|
||||
<child>
|
||||
<object class="GtkDrawingArea" id="drawing_area">
|
||||
<property name="visible">True</property>
|
||||
<property name="can-focus">False</property>
|
||||
<property name="expand">True</property>
|
||||
<signal name="draw" handler="on_preview_draw_cb" object="CcBackgroundPreview" swapped="no" />
|
||||
</object>
|
||||
</child>
|
||||
|
||||
<!-- Desktop / Lock Screen widgets -->
|
||||
<child type="overlay">
|
||||
<object class="GtkStack" id="stack">
|
||||
<property name="visible">True</property>
|
||||
<property name="can-focus">False</property>
|
||||
<property name="expand">True</property>
|
||||
|
||||
<child>
|
||||
<object class="GtkFrame">
|
||||
<property name="visible">True</property>
|
||||
<property name="can-focus">False</property>
|
||||
<property name="shadow-type">none</property>
|
||||
<property name="valign">start</property>
|
||||
<style>
|
||||
<class name="desktop-preview" />
|
||||
</style>
|
||||
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="visible">True</property>
|
||||
<property name="can-focus">False</property>
|
||||
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can-focus">False</property>
|
||||
<property name="label" translatable="yes">Activities</property>
|
||||
</object>
|
||||
</child>
|
||||
|
||||
<child type="center">
|
||||
<object class="GtkLabel" id="desktop_clock_label">
|
||||
<property name="visible">True</property>
|
||||
<property name="can-focus">False</property>
|
||||
</object>
|
||||
</child>
|
||||
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="visible">True</property>
|
||||
<property name="can-focus">False</property>
|
||||
<property name="spacing">4</property>
|
||||
|
||||
<child>
|
||||
<object class="GtkImage">
|
||||
<property name="visible">True</property>
|
||||
<property name="can-focus">False</property>
|
||||
<property name="icon-name">network-wireless-symbolic</property>
|
||||
<property name="pixel-size">6</property>
|
||||
</object>
|
||||
</child>
|
||||
|
||||
<child>
|
||||
<object class="GtkImage">
|
||||
<property name="visible">True</property>
|
||||
<property name="can-focus">False</property>
|
||||
<property name="icon-name">audio-volume-high-symbolic</property>
|
||||
<property name="pixel-size">6</property>
|
||||
</object>
|
||||
</child>
|
||||
|
||||
<child>
|
||||
<object class="GtkImage">
|
||||
<property name="visible">True</property>
|
||||
<property name="can-focus">False</property>
|
||||
<property name="icon-name">battery-low-symbolic</property>
|
||||
<property name="pixel-size">6</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="pack-type">end</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
|
||||
</object>
|
||||
<packing>
|
||||
<property name="name">desktop</property>
|
||||
</packing>
|
||||
</child>
|
||||
|
||||
|
||||
<child>
|
||||
<object class="GtkFrame">
|
||||
<property name="visible">True</property>
|
||||
<property name="can-focus">False</property>
|
||||
<property name="shadow-type">none</property>
|
||||
<child>
|
||||
<object class="GtkLabel" id="lock_screen_label">
|
||||
<property name="visible">True</property>
|
||||
<property name="can-focus">False</property>
|
||||
<property name="expand">True</property>
|
||||
<property name="xalign">0.5</property>
|
||||
<property name="yalign">0.5</property>
|
||||
</object>
|
||||
</child>
|
||||
<style>
|
||||
<class name="lock-screen-preview" />
|
||||
</style>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="name">lock</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
|
||||
<!-- Wallpaper -->
|
||||
<child type="overlay">
|
||||
<object class="GtkImage" id="animated_background_icon">
|
||||
<property name="visible">True</property>
|
||||
<property name="can-focus">False</property>
|
||||
<property name="halign">end</property>
|
||||
<property name="valign">end</property>
|
||||
<property name="margin-end">8</property>
|
||||
<property name="margin-bottom">8</property>
|
||||
<property name="pixel-size">16</property>
|
||||
<property name="icon-name">slideshow-emblem</property>
|
||||
<style>
|
||||
<class name="slideshow-icon" />
|
||||
</style>
|
||||
</object>
|
||||
</child>
|
||||
|
||||
</object>
|
||||
</child>
|
||||
</template>
|
||||
</interface>
|
||||
@@ -1,647 +0,0 @@
|
||||
/*
|
||||
* Authors: Rodney Dawes <dobey@ximian.com>
|
||||
* Bastien Nocera <hadess@hadess.net>
|
||||
*
|
||||
* Copyright 2003-2006 Novell, Inc. (www.novell.com)
|
||||
* Copyright 2011 Red Hat Inc.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <gio/gio.h>
|
||||
#include <string.h>
|
||||
#include <libxml/parser.h>
|
||||
#include <libgnome-desktop/gnome-bg.h>
|
||||
#include <gdesktop-enums.h>
|
||||
|
||||
#include "gdesktop-enums-types.h"
|
||||
#include "cc-background-item.h"
|
||||
#include "cc-background-xml.h"
|
||||
|
||||
/* The number of items we signal as "added" before
|
||||
* returning to the main loop */
|
||||
#define NUM_ITEMS_PER_BATCH 1
|
||||
|
||||
struct _CcBackgroundXml
|
||||
{
|
||||
GObject parent_instance;
|
||||
|
||||
GHashTable *wp_hash;
|
||||
GAsyncQueue *item_added_queue;
|
||||
guint item_added_id;
|
||||
GSList *monitors; /* GSList of GFileMonitor */
|
||||
};
|
||||
|
||||
enum {
|
||||
ADDED,
|
||||
LAST_SIGNAL
|
||||
};
|
||||
|
||||
static guint signals[LAST_SIGNAL] = { 0 };
|
||||
|
||||
G_DEFINE_TYPE (CcBackgroundXml, cc_background_xml, G_TYPE_OBJECT)
|
||||
|
||||
static gboolean
|
||||
cc_background_xml_get_bool (const xmlNode *parent,
|
||||
const gchar *prop_name)
|
||||
{
|
||||
xmlChar *prop;
|
||||
gboolean ret_val = FALSE;
|
||||
|
||||
g_return_val_if_fail (parent != NULL, FALSE);
|
||||
g_return_val_if_fail (prop_name != NULL, FALSE);
|
||||
|
||||
prop = xmlGetProp ((xmlNode *) parent, (xmlChar*)prop_name);
|
||||
if (prop != NULL) {
|
||||
if (!g_ascii_strcasecmp ((gchar *)prop, "true") || !g_ascii_strcasecmp ((gchar *)prop, "1")) {
|
||||
ret_val = TRUE;
|
||||
} else {
|
||||
ret_val = FALSE;
|
||||
}
|
||||
xmlFree (prop);
|
||||
}
|
||||
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
static struct {
|
||||
int value;
|
||||
const char *string;
|
||||
} lookups[] = {
|
||||
{ G_DESKTOP_BACKGROUND_SHADING_HORIZONTAL, "horizontal-gradient" },
|
||||
{ G_DESKTOP_BACKGROUND_SHADING_VERTICAL, "vertical-gradient" },
|
||||
};
|
||||
|
||||
static int
|
||||
enum_string_to_value (GType type,
|
||||
const char *string)
|
||||
{
|
||||
GEnumClass *eclass;
|
||||
GEnumValue *value;
|
||||
|
||||
eclass = G_ENUM_CLASS (g_type_class_peek (type));
|
||||
value = g_enum_get_value_by_nick (eclass, string);
|
||||
|
||||
/* Here's a bit of hand-made parsing, bad bad */
|
||||
if (value == NULL) {
|
||||
guint i;
|
||||
for (i = 0; i < G_N_ELEMENTS (lookups); i++) {
|
||||
if (g_str_equal (lookups[i].string, string))
|
||||
return lookups[i].value;
|
||||
}
|
||||
g_warning ("Unhandled value '%s' for enum '%s'",
|
||||
string, G_FLAGS_CLASS_TYPE_NAME (eclass));
|
||||
return 0;
|
||||
}
|
||||
|
||||
return value->value;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
idle_emit (CcBackgroundXml *xml)
|
||||
{
|
||||
gint i;
|
||||
|
||||
g_async_queue_lock (xml->item_added_queue);
|
||||
|
||||
for (i = 0; i < NUM_ITEMS_PER_BATCH; i++) {
|
||||
g_autoptr(GObject) item = NULL;
|
||||
|
||||
item = g_async_queue_try_pop_unlocked (xml->item_added_queue);
|
||||
if (item == NULL)
|
||||
break;
|
||||
g_signal_emit (G_OBJECT (xml), signals[ADDED], 0, item);
|
||||
}
|
||||
|
||||
g_async_queue_unlock (xml->item_added_queue);
|
||||
|
||||
if (g_async_queue_length (xml->item_added_queue) > 0) {
|
||||
return TRUE;
|
||||
} else {
|
||||
xml->item_added_id = 0;
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
emit_added_in_idle (CcBackgroundXml *xml,
|
||||
GObject *object)
|
||||
{
|
||||
g_async_queue_lock (xml->item_added_queue);
|
||||
g_async_queue_push_unlocked (xml->item_added_queue, object);
|
||||
if (xml->item_added_id == 0)
|
||||
xml->item_added_id = g_idle_add ((GSourceFunc) idle_emit, xml);
|
||||
g_async_queue_unlock (xml->item_added_queue);
|
||||
}
|
||||
|
||||
#define NONE "(none)"
|
||||
#define UNSET_FLAG(flag) G_STMT_START{ (flags&=~(flag)); }G_STMT_END
|
||||
#define SET_FLAG(flag) G_STMT_START{ (flags|=flag); }G_STMT_END
|
||||
|
||||
static gboolean
|
||||
cc_background_xml_load_xml_internal (CcBackgroundXml *xml,
|
||||
const gchar *filename,
|
||||
gboolean in_thread)
|
||||
{
|
||||
xmlDoc * wplist;
|
||||
xmlNode * root, * list, * wpa;
|
||||
xmlChar * nodelang;
|
||||
const gchar * const * syslangs;
|
||||
gint i;
|
||||
gboolean retval;
|
||||
|
||||
wplist = xmlParseFile (filename);
|
||||
retval = FALSE;
|
||||
|
||||
if (!wplist)
|
||||
return retval;
|
||||
|
||||
syslangs = g_get_language_names ();
|
||||
|
||||
root = xmlDocGetRootElement (wplist);
|
||||
|
||||
for (list = root->children; list != NULL; list = list->next) {
|
||||
if (!strcmp ((gchar *)list->name, "wallpaper")) {
|
||||
g_autoptr(CcBackgroundItem) item = NULL;
|
||||
CcBackgroundItemFlags flags;
|
||||
g_autofree gchar *uri = NULL;
|
||||
g_autofree gchar *cname = NULL;
|
||||
g_autofree gchar *id = NULL;
|
||||
|
||||
flags = 0;
|
||||
item = cc_background_item_new (NULL);
|
||||
|
||||
g_object_set (G_OBJECT (item),
|
||||
"is-deleted", cc_background_xml_get_bool (list, "deleted"),
|
||||
"source-xml", filename,
|
||||
NULL);
|
||||
|
||||
for (wpa = list->children; wpa != NULL; wpa = wpa->next) {
|
||||
if (wpa->type == XML_COMMENT_NODE) {
|
||||
continue;
|
||||
} else if (!strcmp ((gchar *)wpa->name, "filename")) {
|
||||
if (wpa->last != NULL && wpa->last->content != NULL) {
|
||||
gchar *content = g_strstrip ((gchar *)wpa->last->content);
|
||||
g_autofree gchar *bg_uri = NULL;
|
||||
|
||||
/* FIXME same rubbish as in other parts of the code */
|
||||
if (strcmp (content, NONE) == 0) {
|
||||
bg_uri = NULL;
|
||||
} else {
|
||||
g_autoptr(GFile) file = NULL;
|
||||
g_autofree gchar *dirname = NULL;
|
||||
|
||||
dirname = g_path_get_dirname (filename);
|
||||
file = g_file_new_for_commandline_arg_and_cwd (content, dirname);
|
||||
bg_uri = g_file_get_uri (file);
|
||||
}
|
||||
SET_FLAG(CC_BACKGROUND_ITEM_HAS_URI);
|
||||
g_object_set (G_OBJECT (item), "uri", bg_uri, NULL);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
} else if (!strcmp ((gchar *)wpa->name, "name")) {
|
||||
if (wpa->last != NULL && wpa->last->content != NULL) {
|
||||
g_autofree gchar *name = NULL;
|
||||
nodelang = xmlNodeGetLang (wpa->last);
|
||||
|
||||
g_object_get (G_OBJECT (item), "name", &name, NULL);
|
||||
|
||||
if (name == NULL && nodelang == NULL) {
|
||||
g_free (cname);
|
||||
cname = g_strdup (g_strstrip ((gchar *)wpa->last->content));
|
||||
g_object_set (G_OBJECT (item), "name", cname, NULL);
|
||||
} else {
|
||||
for (i = 0; syslangs[i] != NULL; i++) {
|
||||
if (!strcmp (syslangs[i], (gchar *)nodelang)) {
|
||||
g_object_set (G_OBJECT (item), "name",
|
||||
g_strstrip ((gchar *)wpa->last->content), NULL);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
xmlFree (nodelang);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
} else if (!strcmp ((gchar *)wpa->name, "options")) {
|
||||
if (wpa->last != NULL) {
|
||||
g_object_set (G_OBJECT (item), "placement",
|
||||
enum_string_to_value (G_DESKTOP_TYPE_DESKTOP_BACKGROUND_STYLE,
|
||||
g_strstrip ((gchar *)wpa->last->content)), NULL);
|
||||
SET_FLAG(CC_BACKGROUND_ITEM_HAS_PLACEMENT);
|
||||
}
|
||||
} else if (!strcmp ((gchar *)wpa->name, "shade_type")) {
|
||||
if (wpa->last != NULL) {
|
||||
g_object_set (G_OBJECT (item), "shading",
|
||||
enum_string_to_value (G_DESKTOP_TYPE_DESKTOP_BACKGROUND_SHADING,
|
||||
g_strstrip ((gchar *)wpa->last->content)), NULL);
|
||||
SET_FLAG(CC_BACKGROUND_ITEM_HAS_SHADING);
|
||||
}
|
||||
} else if (!strcmp ((gchar *)wpa->name, "pcolor")) {
|
||||
if (wpa->last != NULL) {
|
||||
g_object_set (G_OBJECT (item), "primary-color",
|
||||
g_strstrip ((gchar *)wpa->last->content), NULL);
|
||||
SET_FLAG(CC_BACKGROUND_ITEM_HAS_PCOLOR);
|
||||
}
|
||||
} else if (!strcmp ((gchar *)wpa->name, "scolor")) {
|
||||
if (wpa->last != NULL) {
|
||||
g_object_set (G_OBJECT (item), "secondary-color",
|
||||
g_strstrip ((gchar *)wpa->last->content), NULL);
|
||||
SET_FLAG(CC_BACKGROUND_ITEM_HAS_SCOLOR);
|
||||
}
|
||||
} else if (!strcmp ((gchar *)wpa->name, "source_url")) {
|
||||
if (wpa->last != NULL) {
|
||||
g_object_set (G_OBJECT (item),
|
||||
"source-url", g_strstrip ((gchar *)wpa->last->content),
|
||||
"needs-download", FALSE,
|
||||
NULL);
|
||||
}
|
||||
} else if (!strcmp ((gchar *)wpa->name, "text")) {
|
||||
/* Do nothing here, libxml2 is being weird */
|
||||
} else {
|
||||
g_warning ("Unknown Tag in %s: %s", filename, wpa->name);
|
||||
}
|
||||
}
|
||||
|
||||
/* Check whether the target file exists */
|
||||
{
|
||||
const char *uri;
|
||||
|
||||
uri = cc_background_item_get_uri (item);
|
||||
if (uri != NULL)
|
||||
{
|
||||
g_autoptr(GFile) file = NULL;
|
||||
|
||||
file = g_file_new_for_uri (uri);
|
||||
if (g_file_query_exists (file, NULL) == FALSE)
|
||||
{
|
||||
g_clear_pointer (&cname, g_free);
|
||||
g_clear_object (&item);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* FIXME, this is a broken way of doing,
|
||||
* need to use proper code here */
|
||||
uri = g_filename_to_uri (filename, NULL, NULL);
|
||||
id = g_strdup_printf ("%s#%s", uri, cname);
|
||||
|
||||
/* Make sure we don't already have this one and that filename exists */
|
||||
if (g_hash_table_lookup (xml->wp_hash, id) != NULL) {
|
||||
continue;
|
||||
}
|
||||
|
||||
g_object_set (G_OBJECT (item), "flags", flags, NULL);
|
||||
g_hash_table_insert (xml->wp_hash,
|
||||
g_strdup (id),
|
||||
g_object_ref (item));
|
||||
if (in_thread)
|
||||
emit_added_in_idle (xml, g_object_ref (G_OBJECT (item)));
|
||||
else
|
||||
g_signal_emit (G_OBJECT (xml), signals[ADDED], 0, item);
|
||||
retval = TRUE;
|
||||
}
|
||||
}
|
||||
xmlFreeDoc (wplist);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
static void
|
||||
gnome_wp_file_changed (GFileMonitor *monitor,
|
||||
GFile *file,
|
||||
GFile *other_file,
|
||||
GFileMonitorEvent event_type,
|
||||
CcBackgroundXml *data)
|
||||
{
|
||||
g_autofree gchar *filename = NULL;
|
||||
|
||||
switch (event_type) {
|
||||
case G_FILE_MONITOR_EVENT_CHANGED:
|
||||
case G_FILE_MONITOR_EVENT_CREATED:
|
||||
filename = g_file_get_path (file);
|
||||
cc_background_xml_load_xml_internal (data, filename, FALSE);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
cc_background_xml_add_monitor (GFile *directory,
|
||||
CcBackgroundXml *data)
|
||||
{
|
||||
GFileMonitor *monitor;
|
||||
g_autoptr(GError) error = NULL;
|
||||
|
||||
monitor = g_file_monitor_directory (directory,
|
||||
G_FILE_MONITOR_NONE,
|
||||
NULL,
|
||||
&error);
|
||||
if (error != NULL) {
|
||||
g_autofree gchar *path = NULL;
|
||||
|
||||
path = g_file_get_parse_name (directory);
|
||||
g_warning ("Unable to monitor directory %s: %s",
|
||||
path, error->message);
|
||||
return;
|
||||
}
|
||||
|
||||
g_signal_connect (monitor, "changed",
|
||||
G_CALLBACK (gnome_wp_file_changed),
|
||||
data);
|
||||
|
||||
data->monitors = g_slist_prepend (data->monitors, monitor);
|
||||
}
|
||||
|
||||
static void
|
||||
cc_background_xml_load_from_dir (const gchar *path,
|
||||
CcBackgroundXml *data,
|
||||
gboolean in_thread)
|
||||
{
|
||||
g_autoptr(GFile) directory = NULL;
|
||||
g_autoptr(GFileEnumerator) enumerator = NULL;
|
||||
g_autoptr(GError) error = NULL;
|
||||
|
||||
if (!g_file_test (path, G_FILE_TEST_IS_DIR)) {
|
||||
return;
|
||||
}
|
||||
|
||||
directory = g_file_new_for_path (path);
|
||||
enumerator = g_file_enumerate_children (directory,
|
||||
G_FILE_ATTRIBUTE_STANDARD_NAME,
|
||||
G_FILE_QUERY_INFO_NONE,
|
||||
NULL,
|
||||
&error);
|
||||
if (error != NULL) {
|
||||
g_warning ("Unable to check directory %s: %s", path, error->message);
|
||||
return;
|
||||
}
|
||||
|
||||
while (TRUE) {
|
||||
g_autoptr(GFileInfo) info = NULL;
|
||||
const gchar *filename;
|
||||
g_autofree gchar *fullpath = NULL;
|
||||
|
||||
info = g_file_enumerator_next_file (enumerator, NULL, NULL);
|
||||
if (info == NULL) {
|
||||
g_file_enumerator_close (enumerator, NULL, NULL);
|
||||
cc_background_xml_add_monitor (directory, data);
|
||||
return;
|
||||
}
|
||||
|
||||
filename = g_file_info_get_name (info);
|
||||
fullpath = g_build_filename (path, filename, NULL);
|
||||
|
||||
cc_background_xml_load_xml_internal (data, fullpath, in_thread);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
cc_background_xml_load_list (CcBackgroundXml *data,
|
||||
gboolean in_thread)
|
||||
{
|
||||
const char * const *system_data_dirs;
|
||||
g_autofree gchar *datadir = NULL;
|
||||
gint i;
|
||||
|
||||
datadir = g_build_filename (g_get_user_data_dir (),
|
||||
"gnome-background-properties",
|
||||
NULL);
|
||||
cc_background_xml_load_from_dir (datadir, data, in_thread);
|
||||
|
||||
system_data_dirs = g_get_system_data_dirs ();
|
||||
for (i = 0; system_data_dirs[i]; i++) {
|
||||
g_autofree gchar *sdatadir = NULL;
|
||||
sdatadir = g_build_filename (system_data_dirs[i],
|
||||
"gnome-background-properties",
|
||||
NULL);
|
||||
cc_background_xml_load_from_dir (sdatadir, data, in_thread);
|
||||
}
|
||||
}
|
||||
|
||||
gboolean
|
||||
cc_background_xml_load_list_finish (CcBackgroundXml *xml,
|
||||
GAsyncResult *result,
|
||||
GError **error)
|
||||
{
|
||||
g_return_val_if_fail (g_task_is_valid (result, xml), FALSE);
|
||||
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
|
||||
return g_task_propagate_boolean (G_TASK (result), error);
|
||||
}
|
||||
|
||||
static void
|
||||
load_list_thread (GTask *task,
|
||||
gpointer source_object,
|
||||
gpointer task_data,
|
||||
GCancellable *cancellable)
|
||||
{
|
||||
CcBackgroundXml *xml = CC_BACKGROUND_XML (source_object);
|
||||
cc_background_xml_load_list (xml, TRUE);
|
||||
g_task_return_boolean (task, TRUE);
|
||||
}
|
||||
|
||||
void
|
||||
cc_background_xml_load_list_async (CcBackgroundXml *xml,
|
||||
GCancellable *cancellable,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data)
|
||||
{
|
||||
g_autoptr(GTask) task = NULL;
|
||||
|
||||
g_return_if_fail (CC_IS_BACKGROUND_XML (xml));
|
||||
|
||||
task = g_task_new (xml, cancellable, callback, user_data);
|
||||
g_task_run_in_thread (task, load_list_thread);
|
||||
}
|
||||
|
||||
gboolean
|
||||
cc_background_xml_load_xml (CcBackgroundXml *xml,
|
||||
const gchar *filename)
|
||||
{
|
||||
g_return_val_if_fail (CC_IS_BACKGROUND_XML (xml), FALSE);
|
||||
|
||||
if (g_file_test (filename, G_FILE_TEST_IS_REGULAR) == FALSE)
|
||||
return FALSE;
|
||||
|
||||
return cc_background_xml_load_xml_internal (xml, filename, FALSE);
|
||||
}
|
||||
|
||||
static void
|
||||
single_xml_added (CcBackgroundXml *xml,
|
||||
CcBackgroundItem *item,
|
||||
CcBackgroundItem **ret)
|
||||
{
|
||||
g_assert (*ret == NULL);
|
||||
*ret = g_object_ref (item);
|
||||
}
|
||||
|
||||
CcBackgroundItem *
|
||||
cc_background_xml_get_item (const char *filename)
|
||||
{
|
||||
g_autoptr(CcBackgroundXml) xml = NULL;
|
||||
CcBackgroundItem *item = NULL;
|
||||
|
||||
if (g_file_test (filename, G_FILE_TEST_IS_REGULAR) == FALSE)
|
||||
return NULL;
|
||||
|
||||
xml = cc_background_xml_new ();
|
||||
g_signal_connect (G_OBJECT (xml), "added",
|
||||
G_CALLBACK (single_xml_added), &item);
|
||||
if (cc_background_xml_load_xml (xml, filename) == FALSE)
|
||||
return NULL;
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
static const char *
|
||||
enum_to_str (GType type,
|
||||
int v)
|
||||
{
|
||||
GEnumClass *eclass;
|
||||
GEnumValue *value;
|
||||
|
||||
eclass = G_ENUM_CLASS (g_type_class_peek (type));
|
||||
value = g_enum_get_value (eclass, v);
|
||||
|
||||
g_assert (value);
|
||||
|
||||
return value->value_nick;
|
||||
}
|
||||
|
||||
void
|
||||
cc_background_xml_save (CcBackgroundItem *item,
|
||||
const char *filename)
|
||||
{
|
||||
xmlDoc *wp;
|
||||
xmlNode *root, *wallpaper;
|
||||
xmlNode *xml_item G_GNUC_UNUSED;
|
||||
const char * none = "(none)";
|
||||
const char *placement_str, *shading_str;
|
||||
g_autofree gchar *name = NULL;
|
||||
g_autofree gchar *pcolor = NULL;
|
||||
g_autofree gchar *scolor = NULL;
|
||||
g_autofree gchar *uri = NULL;
|
||||
g_autofree gchar *source_url = NULL;
|
||||
CcBackgroundItemFlags flags;
|
||||
GDesktopBackgroundStyle placement;
|
||||
GDesktopBackgroundShading shading;
|
||||
|
||||
xmlKeepBlanksDefault (0);
|
||||
|
||||
wp = xmlNewDoc ((xmlChar *)"1.0");
|
||||
xmlCreateIntSubset (wp, (xmlChar *)"wallpapers", NULL, (xmlChar *)"gnome-wp-list.dtd");
|
||||
root = xmlNewNode (NULL, (xmlChar *)"wallpapers");
|
||||
xmlDocSetRootElement (wp, root);
|
||||
|
||||
g_object_get (G_OBJECT (item),
|
||||
"name", &name,
|
||||
"uri", &uri,
|
||||
"shading", &shading,
|
||||
"placement", &placement,
|
||||
"primary-color", &pcolor,
|
||||
"secondary-color", &scolor,
|
||||
"source-url", &source_url,
|
||||
"flags", &flags,
|
||||
NULL);
|
||||
|
||||
placement_str = enum_to_str (G_DESKTOP_TYPE_DESKTOP_BACKGROUND_STYLE, placement);
|
||||
shading_str = enum_to_str (G_DESKTOP_TYPE_DESKTOP_BACKGROUND_SHADING, shading);
|
||||
|
||||
wallpaper = xmlNewChild (root, NULL, (xmlChar *)"wallpaper", NULL);
|
||||
xml_item = xmlNewTextChild (wallpaper, NULL, (xmlChar *)"name", (xmlChar *)name);
|
||||
if (flags & CC_BACKGROUND_ITEM_HAS_URI &&
|
||||
uri != NULL)
|
||||
{
|
||||
g_autoptr(GFile) file = NULL;
|
||||
g_autofree gchar *fname = NULL;
|
||||
|
||||
file = g_file_new_for_commandline_arg (uri);
|
||||
fname = g_file_get_path (file);
|
||||
xml_item = xmlNewTextChild (wallpaper, NULL, (xmlChar *)"filename", (xmlChar *)fname);
|
||||
}
|
||||
else if (flags & CC_BACKGROUND_ITEM_HAS_URI)
|
||||
{
|
||||
xml_item = xmlNewTextChild (wallpaper, NULL, (xmlChar *)"filename", (xmlChar *)none);
|
||||
}
|
||||
|
||||
if (flags & CC_BACKGROUND_ITEM_HAS_PLACEMENT)
|
||||
xml_item = xmlNewTextChild (wallpaper, NULL, (xmlChar *)"options", (xmlChar *)placement_str);
|
||||
if (flags & CC_BACKGROUND_ITEM_HAS_SHADING)
|
||||
xml_item = xmlNewTextChild (wallpaper, NULL, (xmlChar *)"shade_type", (xmlChar *)shading_str);
|
||||
if (flags & CC_BACKGROUND_ITEM_HAS_PCOLOR)
|
||||
xml_item = xmlNewTextChild (wallpaper, NULL, (xmlChar *)"pcolor", (xmlChar *)pcolor);
|
||||
if (flags & CC_BACKGROUND_ITEM_HAS_SCOLOR)
|
||||
xml_item = xmlNewTextChild (wallpaper, NULL, (xmlChar *)"scolor", (xmlChar *)scolor);
|
||||
if (source_url != NULL)
|
||||
xml_item = xmlNewTextChild (wallpaper, NULL, (xmlChar *)"source_url", (xmlChar *)source_url);
|
||||
|
||||
xmlSaveFormatFile (filename, wp, 1);
|
||||
xmlFreeDoc (wp);
|
||||
}
|
||||
|
||||
static void
|
||||
cc_background_xml_finalize (GObject *object)
|
||||
{
|
||||
CcBackgroundXml *xml;
|
||||
|
||||
g_return_if_fail (object != NULL);
|
||||
g_return_if_fail (CC_IS_BACKGROUND_XML (object));
|
||||
|
||||
xml = CC_BACKGROUND_XML (object);
|
||||
|
||||
g_slist_free_full (xml->monitors, g_object_unref);
|
||||
|
||||
g_clear_pointer (&xml->wp_hash, g_hash_table_destroy);
|
||||
if (xml->item_added_id != 0) {
|
||||
g_source_remove (xml->item_added_id);
|
||||
xml->item_added_id = 0;
|
||||
}
|
||||
g_clear_pointer (&xml->item_added_queue, g_async_queue_unref);
|
||||
}
|
||||
|
||||
static void
|
||||
cc_background_xml_class_init (CcBackgroundXmlClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
object_class->finalize = cc_background_xml_finalize;
|
||||
|
||||
signals[ADDED] = g_signal_new ("added",
|
||||
G_OBJECT_CLASS_TYPE (object_class),
|
||||
G_SIGNAL_RUN_LAST,
|
||||
0,
|
||||
NULL, NULL,
|
||||
g_cclosure_marshal_VOID__OBJECT,
|
||||
G_TYPE_NONE, 1, CC_TYPE_BACKGROUND_ITEM);
|
||||
}
|
||||
|
||||
static void
|
||||
cc_background_xml_init (CcBackgroundXml *xml)
|
||||
{
|
||||
xml->wp_hash = g_hash_table_new_full (g_str_hash,
|
||||
g_str_equal,
|
||||
(GDestroyNotify) g_free,
|
||||
(GDestroyNotify) g_object_unref);
|
||||
xml->item_added_queue = g_async_queue_new_full ((GDestroyNotify) g_object_unref);
|
||||
}
|
||||
|
||||
CcBackgroundXml *
|
||||
cc_background_xml_new (void)
|
||||
{
|
||||
return CC_BACKGROUND_XML (g_object_new (CC_TYPE_BACKGROUND_XML, NULL));
|
||||
}
|
||||
@@ -1,51 +0,0 @@
|
||||
/*
|
||||
* Authors: Rodney Dawes <dobey@ximian.com>
|
||||
*
|
||||
* Copyright 2003-2012 Novell, Inc. (www.novell.com)
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef _CC_BACKGROUND_XML_H_
|
||||
#define _CC_BACKGROUND_XML_H_
|
||||
|
||||
#include <libgnome-desktop/gnome-desktop-thumbnail.h>
|
||||
#include <gtk/gtk.h>
|
||||
#include <gio/gio.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define CC_TYPE_BACKGROUND_XML (cc_background_xml_get_type ())
|
||||
G_DECLARE_FINAL_TYPE (CcBackgroundXml, cc_background_xml, CC, BACKGROUND_XML, GObject)
|
||||
|
||||
CcBackgroundXml *cc_background_xml_new (void);
|
||||
|
||||
void cc_background_xml_save (CcBackgroundItem *item,
|
||||
const char *filename);
|
||||
|
||||
CcBackgroundItem *cc_background_xml_get_item (const char *filename);
|
||||
gboolean cc_background_xml_load_xml (CcBackgroundXml *data,
|
||||
const char *filename);
|
||||
void cc_background_xml_load_list_async (CcBackgroundXml *xml,
|
||||
GCancellable *cancellable,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
gboolean cc_background_xml_load_list_finish (CcBackgroundXml *xml,
|
||||
GAsyncResult *result,
|
||||
GError **error);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
[Desktop Entry]
|
||||
Name=Background
|
||||
Comment=Change your background image to a wallpaper or photo
|
||||
Exec=gnome-control-center background
|
||||
# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
|
||||
Icon=preferences-desktop-wallpaper
|
||||
Terminal=false
|
||||
Type=Application
|
||||
NoDisplay=true
|
||||
StartupNotify=true
|
||||
Categories=GNOME;GTK;Settings;DesktopSettings;X-GNOME-Settings-Panel;X-GNOME-PersonalizationSettings;
|
||||
OnlyShowIn=GNOME;
|
||||
# Translators: Search terms to find the Background panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
|
||||
Keywords=Wallpaper;Screen;Desktop;
|
||||
@@ -1,112 +0,0 @@
|
||||
panels_list += cappletname
|
||||
desktop = 'gnome-@0@-panel.desktop'.format(cappletname)
|
||||
|
||||
desktop_in = configure_file(
|
||||
input: desktop + '.in.in',
|
||||
output: desktop + '.in',
|
||||
configuration: desktop_conf
|
||||
)
|
||||
|
||||
i18n.merge_file(
|
||||
desktop,
|
||||
type: 'desktop',
|
||||
input: desktop_in,
|
||||
output: desktop,
|
||||
po_dir: po_dir,
|
||||
install: true,
|
||||
install_dir: control_center_desktopdir
|
||||
)
|
||||
|
||||
install_data(
|
||||
'slideshow-symbolic.svg',
|
||||
install_dir: join_paths(control_center_icondir, 'hicolor', 'scalable', 'categories')
|
||||
)
|
||||
|
||||
install_data(
|
||||
'slideshow-emblem.svg',
|
||||
install_dir: join_paths(control_center_icondir, 'hicolor', 'scalable', 'emblems')
|
||||
)
|
||||
|
||||
install_data(
|
||||
'noise-texture-light.png',
|
||||
install_dir: join_paths(control_center_pkgdatadir, 'pixmaps')
|
||||
)
|
||||
|
||||
common_sources = []
|
||||
|
||||
enums = 'gdesktop-enums-types'
|
||||
enums_header = files(
|
||||
gsettings_desktop_dep.get_pkgconfig_variable('prefix') + '/include/gsettings-desktop-schemas/gdesktop-enums.h',
|
||||
'cc-background-item.h'
|
||||
)
|
||||
|
||||
common_sources += gnome.mkenums(
|
||||
enums + '.h',
|
||||
sources: enums_header,
|
||||
fhead: '#ifndef __GDESKTOP_ENUMS_TYPES_H__\n#define __GDESKTOP_ENUMS_TYPES_H__\n\n#include <glib-object.h>\n\nG_BEGIN_DECLS\n',
|
||||
fprod: '/* enumerations from "@filename@" */\n',
|
||||
vhead: 'GType @enum_name@_get_type (void) G_GNUC_CONST;\n#define G_DESKTOP_TYPE_@ENUMSHORT@ (@enum_name@_get_type())\n',
|
||||
ftail: 'G_END_DECLS\n\n#endif /* __GDESKTOP_ENUMS_TYPES_H__ */'
|
||||
)
|
||||
|
||||
common_sources += gnome.mkenums(
|
||||
enums + '.c',
|
||||
sources: enums_header,
|
||||
fhead: '#include <gdesktop-enums.h>\n#include "gdesktop-enums-types.h"\n#include "cc-background-item.h"',
|
||||
fprod: '\n/* enumerations from "@filename@" */',
|
||||
vhead: 'GType\n@enum_name@_get_type (void)\n{\n static GType etype = 0;\n if (etype == 0) {\n static const G@Type@Value values[] = {',
|
||||
vprod: ' { @VALUENAME@, "@VALUENAME@", "@valuenick@" },',
|
||||
vtail: ' { 0, NULL, NULL }\n };\n etype = g_@type@_register_static ("@EnumName@", values);\n }\n return etype;\n}\n'
|
||||
)
|
||||
|
||||
resource_data = files(
|
||||
'cc-background-chooser.ui',
|
||||
'cc-background-panel.ui',
|
||||
'cc-background-preview.ui',
|
||||
'preview.css',
|
||||
)
|
||||
|
||||
common_sources += gnome.compile_resources(
|
||||
'cc-@0@-resources'.format(cappletname),
|
||||
cappletname + '.gresource.xml',
|
||||
c_name: 'cc_' + cappletname,
|
||||
dependencies: resource_data,
|
||||
export: true
|
||||
)
|
||||
|
||||
sources = common_sources + files(
|
||||
'bg-colors-source.c',
|
||||
'bg-pictures-source.c',
|
||||
'bg-recent-source.c',
|
||||
'bg-source.c',
|
||||
'bg-wallpapers-source.c',
|
||||
'cc-background-chooser.c',
|
||||
'cc-background-grilo-miner.c',
|
||||
'cc-background-item.c',
|
||||
'cc-background-panel.c',
|
||||
'cc-background-preview.c',
|
||||
'cc-background-xml.c',
|
||||
)
|
||||
|
||||
deps = common_deps + [
|
||||
gdk_pixbuf_dep,
|
||||
gnome_desktop_dep,
|
||||
goa_dep,
|
||||
libxml_dep,
|
||||
dependency('cairo-gobject'),
|
||||
dependency('grilo-0.3', version: '>= 0.3.0')
|
||||
]
|
||||
|
||||
cflags += [
|
||||
'-DGNOMELOCALEDIR="@0@"'.format(control_center_localedir),
|
||||
'-DDATADIR="@0@"'.format(control_center_datadir),
|
||||
'-DGNOME_DESKTOP_USE_UNSTABLE_API'
|
||||
]
|
||||
|
||||
panels_libs += static_library(
|
||||
cappletname,
|
||||
sources: sources,
|
||||
include_directories: top_inc,
|
||||
dependencies: deps,
|
||||
c_args: cflags,
|
||||
)
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 68 KiB |
@@ -1,32 +0,0 @@
|
||||
frame.desktop-preview {
|
||||
min-height: 10px;
|
||||
padding: 0 4px;
|
||||
background-color: black;
|
||||
}
|
||||
|
||||
frame.desktop-preview image {
|
||||
color: white;
|
||||
}
|
||||
|
||||
frame.desktop-preview label {
|
||||
color: white;
|
||||
font-weight: bold;
|
||||
font-size: 6px;
|
||||
}
|
||||
|
||||
frame.lock-screen-preview {
|
||||
border: solid rgba(0, 0, 0, 0.33);
|
||||
border-width: 10px 0 0 0;
|
||||
}
|
||||
|
||||
frame.lock-screen-preview label {
|
||||
color: white;
|
||||
font-weight: bold;
|
||||
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);
|
||||
font-size: 1.2em;
|
||||
}
|
||||
|
||||
image.slideshow-icon {
|
||||
color: white;
|
||||
-gtk-icon-shadow: 0 1px 2px rgba(0, 0, 0, 0.33);
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user