├── .gitignore
├── AUTHORS
├── COPYING
├── ChangeLog
├── INSTALL
├── Makefile.am
├── NEWS
├── README.md
├── autogen.sh
├── awf.desktop
├── awf.spec.in
├── configure.ac
├── debian
├── README.source
├── changelog
├── compat
├── control
├── copyright
├── docs
├── rules
└── source
│ └── format
├── icons
├── 128x128
│ ├── Makefile.am
│ └── awf.png
├── 16x16
│ ├── Makefile.am
│ └── awf.png
├── 22x22
│ ├── Makefile.am
│ └── awf.png
├── 24x24
│ ├── Makefile.am
│ └── awf.png
├── 32x32
│ ├── Makefile.am
│ └── awf.png
├── 48x48
│ ├── Makefile.am
│ └── awf.png
├── 64x64
│ ├── Makefile.am
│ └── awf.png
├── Makefile.am
└── scalable
│ ├── Makefile.am
│ └── awf.svg
└── src
├── Makefile.am
├── awf.c
├── gtk_empty.c
└── gtk_empty.h
/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | aclocal.m4
3 | awf.spec
4 | compile
5 | configure
6 | config.log
7 | config.status
8 | depcomp
9 | install-sh
10 | missing
11 | Makefile
12 | Makefile.in
13 | README
14 |
15 | autom4te.cache/
16 |
17 | icons/Makefile
18 | icons/Makefile.in
19 | icons/16x16/Makefile
20 | icons/16x16/Makefile.in
21 | icons/22x22/Makefile
22 | icons/22x22/Makefile.in
23 | icons/24x24/Makefile
24 | icons/24x24/Makefile.in
25 | icons/32x32/Makefile
26 | icons/32x32/Makefile.in
27 | icons/48x48/Makefile
28 | icons/48x48/Makefile.in
29 | icons/64x64/Makefile
30 | icons/64x64/Makefile.in
31 | icons/128x128/Makefile
32 | icons/128x128/Makefile.in
33 | icons/scalable/Makefile
34 | icons/scalable/Makefile.in
35 |
36 | src/Makefile
37 | src/Makefile.in
38 | src/.deps/
39 |
40 | src/awf-gtk2
41 | src/awf-gtk3
42 | src/*.o
43 |
--------------------------------------------------------------------------------
/AUTHORS:
--------------------------------------------------------------------------------
1 | Valère Monseur (valere dot monseur at ymail dot com)
2 |
--------------------------------------------------------------------------------
/COPYING:
--------------------------------------------------------------------------------
1 | GNU GENERAL PUBLIC LICENSE
2 | Version 3, 29 June 2007
3 |
4 | Copyright (C) 2007 Free Software Foundation, Inc.
5 | Everyone is permitted to copy and distribute verbatim copies
6 | of this license document, but changing it is not allowed.
7 |
8 | Preamble
9 |
10 | The GNU General Public License is a free, copyleft license for
11 | software and other kinds of works.
12 |
13 | The licenses for most software and other practical works are designed
14 | to take away your freedom to share and change the works. By contrast,
15 | the GNU General Public License is intended to guarantee your freedom to
16 | share and change all versions of a program--to make sure it remains free
17 | software for all its users. We, the Free Software Foundation, use the
18 | GNU General Public License for most of our software; it applies also to
19 | any other work released this way by its authors. You can apply it to
20 | your programs, too.
21 |
22 | When we speak of free software, we are referring to freedom, not
23 | price. Our General Public Licenses are designed to make sure that you
24 | have the freedom to distribute copies of free software (and charge for
25 | them if you wish), that you receive source code or can get it if you
26 | want it, that you can change the software or use pieces of it in new
27 | free programs, and that you know you can do these things.
28 |
29 | To protect your rights, we need to prevent others from denying you
30 | these rights or asking you to surrender the rights. Therefore, you have
31 | certain responsibilities if you distribute copies of the software, or if
32 | you modify it: responsibilities to respect the freedom of others.
33 |
34 | For example, if you distribute copies of such a program, whether
35 | gratis or for a fee, you must pass on to the recipients the same
36 | freedoms that you received. You must make sure that they, too, receive
37 | or can get the source code. And you must show them these terms so they
38 | know their rights.
39 |
40 | Developers that use the GNU GPL protect your rights with two steps:
41 | (1) assert copyright on the software, and (2) offer you this License
42 | giving you legal permission to copy, distribute and/or modify it.
43 |
44 | For the developers' and authors' protection, the GPL clearly explains
45 | that there is no warranty for this free software. For both users' and
46 | authors' sake, the GPL requires that modified versions be marked as
47 | changed, so that their problems will not be attributed erroneously to
48 | authors of previous versions.
49 |
50 | Some devices are designed to deny users access to install or run
51 | modified versions of the software inside them, although the manufacturer
52 | can do so. This is fundamentally incompatible with the aim of
53 | protecting users' freedom to change the software. The systematic
54 | pattern of such abuse occurs in the area of products for individuals to
55 | use, which is precisely where it is most unacceptable. Therefore, we
56 | have designed this version of the GPL to prohibit the practice for those
57 | products. If such problems arise substantially in other domains, we
58 | stand ready to extend this provision to those domains in future versions
59 | of the GPL, as needed to protect the freedom of users.
60 |
61 | Finally, every program is threatened constantly by software patents.
62 | States should not allow patents to restrict development and use of
63 | software on general-purpose computers, but in those that do, we wish to
64 | avoid the special danger that patents applied to a free program could
65 | make it effectively proprietary. To prevent this, the GPL assures that
66 | patents cannot be used to render the program non-free.
67 |
68 | The precise terms and conditions for copying, distribution and
69 | modification follow.
70 |
71 | TERMS AND CONDITIONS
72 |
73 | 0. Definitions.
74 |
75 | "This License" refers to version 3 of the GNU General Public License.
76 |
77 | "Copyright" also means copyright-like laws that apply to other kinds of
78 | works, such as semiconductor masks.
79 |
80 | "The Program" refers to any copyrightable work licensed under this
81 | License. Each licensee is addressed as "you". "Licensees" and
82 | "recipients" may be individuals or organizations.
83 |
84 | To "modify" a work means to copy from or adapt all or part of the work
85 | in a fashion requiring copyright permission, other than the making of an
86 | exact copy. The resulting work is called a "modified version" of the
87 | earlier work or a work "based on" the earlier work.
88 |
89 | A "covered work" means either the unmodified Program or a work based
90 | on the Program.
91 |
92 | To "propagate" a work means to do anything with it that, without
93 | permission, would make you directly or secondarily liable for
94 | infringement under applicable copyright law, except executing it on a
95 | computer or modifying a private copy. Propagation includes copying,
96 | distribution (with or without modification), making available to the
97 | public, and in some countries other activities as well.
98 |
99 | To "convey" a work means any kind of propagation that enables other
100 | parties to make or receive copies. Mere interaction with a user through
101 | a computer network, with no transfer of a copy, is not conveying.
102 |
103 | An interactive user interface displays "Appropriate Legal Notices"
104 | to the extent that it includes a convenient and prominently visible
105 | feature that (1) displays an appropriate copyright notice, and (2)
106 | tells the user that there is no warranty for the work (except to the
107 | extent that warranties are provided), that licensees may convey the
108 | work under this License, and how to view a copy of this License. If
109 | the interface presents a list of user commands or options, such as a
110 | menu, a prominent item in the list meets this criterion.
111 |
112 | 1. Source Code.
113 |
114 | The "source code" for a work means the preferred form of the work
115 | for making modifications to it. "Object code" means any non-source
116 | form of a work.
117 |
118 | A "Standard Interface" means an interface that either is an official
119 | standard defined by a recognized standards body, or, in the case of
120 | interfaces specified for a particular programming language, one that
121 | is widely used among developers working in that language.
122 |
123 | The "System Libraries" of an executable work include anything, other
124 | than the work as a whole, that (a) is included in the normal form of
125 | packaging a Major Component, but which is not part of that Major
126 | Component, and (b) serves only to enable use of the work with that
127 | Major Component, or to implement a Standard Interface for which an
128 | implementation is available to the public in source code form. A
129 | "Major Component", in this context, means a major essential component
130 | (kernel, window system, and so on) of the specific operating system
131 | (if any) on which the executable work runs, or a compiler used to
132 | produce the work, or an object code interpreter used to run it.
133 |
134 | The "Corresponding Source" for a work in object code form means all
135 | the source code needed to generate, install, and (for an executable
136 | work) run the object code and to modify the work, including scripts to
137 | control those activities. However, it does not include the work's
138 | System Libraries, or general-purpose tools or generally available free
139 | programs which are used unmodified in performing those activities but
140 | which are not part of the work. For example, Corresponding Source
141 | includes interface definition files associated with source files for
142 | the work, and the source code for shared libraries and dynamically
143 | linked subprograms that the work is specifically designed to require,
144 | such as by intimate data communication or control flow between those
145 | subprograms and other parts of the work.
146 |
147 | The Corresponding Source need not include anything that users
148 | can regenerate automatically from other parts of the Corresponding
149 | Source.
150 |
151 | The Corresponding Source for a work in source code form is that
152 | same work.
153 |
154 | 2. Basic Permissions.
155 |
156 | All rights granted under this License are granted for the term of
157 | copyright on the Program, and are irrevocable provided the stated
158 | conditions are met. This License explicitly affirms your unlimited
159 | permission to run the unmodified Program. The output from running a
160 | covered work is covered by this License only if the output, given its
161 | content, constitutes a covered work. This License acknowledges your
162 | rights of fair use or other equivalent, as provided by copyright law.
163 |
164 | You may make, run and propagate covered works that you do not
165 | convey, without conditions so long as your license otherwise remains
166 | in force. You may convey covered works to others for the sole purpose
167 | of having them make modifications exclusively for you, or provide you
168 | with facilities for running those works, provided that you comply with
169 | the terms of this License in conveying all material for which you do
170 | not control copyright. Those thus making or running the covered works
171 | for you must do so exclusively on your behalf, under your direction
172 | and control, on terms that prohibit them from making any copies of
173 | your copyrighted material outside their relationship with you.
174 |
175 | Conveying under any other circumstances is permitted solely under
176 | the conditions stated below. Sublicensing is not allowed; section 10
177 | makes it unnecessary.
178 |
179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
180 |
181 | No covered work shall be deemed part of an effective technological
182 | measure under any applicable law fulfilling obligations under article
183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or
184 | similar laws prohibiting or restricting circumvention of such
185 | measures.
186 |
187 | When you convey a covered work, you waive any legal power to forbid
188 | circumvention of technological measures to the extent such circumvention
189 | is effected by exercising rights under this License with respect to
190 | the covered work, and you disclaim any intention to limit operation or
191 | modification of the work as a means of enforcing, against the work's
192 | users, your or third parties' legal rights to forbid circumvention of
193 | technological measures.
194 |
195 | 4. Conveying Verbatim Copies.
196 |
197 | You may convey verbatim copies of the Program's source code as you
198 | receive it, in any medium, provided that you conspicuously and
199 | appropriately publish on each copy an appropriate copyright notice;
200 | keep intact all notices stating that this License and any
201 | non-permissive terms added in accord with section 7 apply to the code;
202 | keep intact all notices of the absence of any warranty; and give all
203 | recipients a copy of this License along with the Program.
204 |
205 | You may charge any price or no price for each copy that you convey,
206 | and you may offer support or warranty protection for a fee.
207 |
208 | 5. Conveying Modified Source Versions.
209 |
210 | You may convey a work based on the Program, or the modifications to
211 | produce it from the Program, in the form of source code under the
212 | terms of section 4, provided that you also meet all of these conditions:
213 |
214 | a) The work must carry prominent notices stating that you modified
215 | it, and giving a relevant date.
216 |
217 | b) The work must carry prominent notices stating that it is
218 | released under this License and any conditions added under section
219 | 7. This requirement modifies the requirement in section 4 to
220 | "keep intact all notices".
221 |
222 | c) You must license the entire work, as a whole, under this
223 | License to anyone who comes into possession of a copy. This
224 | License will therefore apply, along with any applicable section 7
225 | additional terms, to the whole of the work, and all its parts,
226 | regardless of how they are packaged. This License gives no
227 | permission to license the work in any other way, but it does not
228 | invalidate such permission if you have separately received it.
229 |
230 | d) If the work has interactive user interfaces, each must display
231 | Appropriate Legal Notices; however, if the Program has interactive
232 | interfaces that do not display Appropriate Legal Notices, your
233 | work need not make them do so.
234 |
235 | A compilation of a covered work with other separate and independent
236 | works, which are not by their nature extensions of the covered work,
237 | and which are not combined with it such as to form a larger program,
238 | in or on a volume of a storage or distribution medium, is called an
239 | "aggregate" if the compilation and its resulting copyright are not
240 | used to limit the access or legal rights of the compilation's users
241 | beyond what the individual works permit. Inclusion of a covered work
242 | in an aggregate does not cause this License to apply to the other
243 | parts of the aggregate.
244 |
245 | 6. Conveying Non-Source Forms.
246 |
247 | You may convey a covered work in object code form under the terms
248 | of sections 4 and 5, provided that you also convey the
249 | machine-readable Corresponding Source under the terms of this License,
250 | in one of these ways:
251 |
252 | a) Convey the object code in, or embodied in, a physical product
253 | (including a physical distribution medium), accompanied by the
254 | Corresponding Source fixed on a durable physical medium
255 | customarily used for software interchange.
256 |
257 | b) Convey the object code in, or embodied in, a physical product
258 | (including a physical distribution medium), accompanied by a
259 | written offer, valid for at least three years and valid for as
260 | long as you offer spare parts or customer support for that product
261 | model, to give anyone who possesses the object code either (1) a
262 | copy of the Corresponding Source for all the software in the
263 | product that is covered by this License, on a durable physical
264 | medium customarily used for software interchange, for a price no
265 | more than your reasonable cost of physically performing this
266 | conveying of source, or (2) access to copy the
267 | Corresponding Source from a network server at no charge.
268 |
269 | c) Convey individual copies of the object code with a copy of the
270 | written offer to provide the Corresponding Source. This
271 | alternative is allowed only occasionally and noncommercially, and
272 | only if you received the object code with such an offer, in accord
273 | with subsection 6b.
274 |
275 | d) Convey the object code by offering access from a designated
276 | place (gratis or for a charge), and offer equivalent access to the
277 | Corresponding Source in the same way through the same place at no
278 | further charge. You need not require recipients to copy the
279 | Corresponding Source along with the object code. If the place to
280 | copy the object code is a network server, the Corresponding Source
281 | may be on a different server (operated by you or a third party)
282 | that supports equivalent copying facilities, provided you maintain
283 | clear directions next to the object code saying where to find the
284 | Corresponding Source. Regardless of what server hosts the
285 | Corresponding Source, you remain obligated to ensure that it is
286 | available for as long as needed to satisfy these requirements.
287 |
288 | e) Convey the object code using peer-to-peer transmission, provided
289 | you inform other peers where the object code and Corresponding
290 | Source of the work are being offered to the general public at no
291 | charge under subsection 6d.
292 |
293 | A separable portion of the object code, whose source code is excluded
294 | from the Corresponding Source as a System Library, need not be
295 | included in conveying the object code work.
296 |
297 | A "User Product" is either (1) a "consumer product", which means any
298 | tangible personal property which is normally used for personal, family,
299 | or household purposes, or (2) anything designed or sold for incorporation
300 | into a dwelling. In determining whether a product is a consumer product,
301 | doubtful cases shall be resolved in favor of coverage. For a particular
302 | product received by a particular user, "normally used" refers to a
303 | typical or common use of that class of product, regardless of the status
304 | of the particular user or of the way in which the particular user
305 | actually uses, or expects or is expected to use, the product. A product
306 | is a consumer product regardless of whether the product has substantial
307 | commercial, industrial or non-consumer uses, unless such uses represent
308 | the only significant mode of use of the product.
309 |
310 | "Installation Information" for a User Product means any methods,
311 | procedures, authorization keys, or other information required to install
312 | and execute modified versions of a covered work in that User Product from
313 | a modified version of its Corresponding Source. The information must
314 | suffice to ensure that the continued functioning of the modified object
315 | code is in no case prevented or interfered with solely because
316 | modification has been made.
317 |
318 | If you convey an object code work under this section in, or with, or
319 | specifically for use in, a User Product, and the conveying occurs as
320 | part of a transaction in which the right of possession and use of the
321 | User Product is transferred to the recipient in perpetuity or for a
322 | fixed term (regardless of how the transaction is characterized), the
323 | Corresponding Source conveyed under this section must be accompanied
324 | by the Installation Information. But this requirement does not apply
325 | if neither you nor any third party retains the ability to install
326 | modified object code on the User Product (for example, the work has
327 | been installed in ROM).
328 |
329 | The requirement to provide Installation Information does not include a
330 | requirement to continue to provide support service, warranty, or updates
331 | for a work that has been modified or installed by the recipient, or for
332 | the User Product in which it has been modified or installed. Access to a
333 | network may be denied when the modification itself materially and
334 | adversely affects the operation of the network or violates the rules and
335 | protocols for communication across the network.
336 |
337 | Corresponding Source conveyed, and Installation Information provided,
338 | in accord with this section must be in a format that is publicly
339 | documented (and with an implementation available to the public in
340 | source code form), and must require no special password or key for
341 | unpacking, reading or copying.
342 |
343 | 7. Additional Terms.
344 |
345 | "Additional permissions" are terms that supplement the terms of this
346 | License by making exceptions from one or more of its conditions.
347 | Additional permissions that are applicable to the entire Program shall
348 | be treated as though they were included in this License, to the extent
349 | that they are valid under applicable law. If additional permissions
350 | apply only to part of the Program, that part may be used separately
351 | under those permissions, but the entire Program remains governed by
352 | this License without regard to the additional permissions.
353 |
354 | When you convey a copy of a covered work, you may at your option
355 | remove any additional permissions from that copy, or from any part of
356 | it. (Additional permissions may be written to require their own
357 | removal in certain cases when you modify the work.) You may place
358 | additional permissions on material, added by you to a covered work,
359 | for which you have or can give appropriate copyright permission.
360 |
361 | Notwithstanding any other provision of this License, for material you
362 | add to a covered work, you may (if authorized by the copyright holders of
363 | that material) supplement the terms of this License with terms:
364 |
365 | a) Disclaiming warranty or limiting liability differently from the
366 | terms of sections 15 and 16 of this License; or
367 |
368 | b) Requiring preservation of specified reasonable legal notices or
369 | author attributions in that material or in the Appropriate Legal
370 | Notices displayed by works containing it; or
371 |
372 | c) Prohibiting misrepresentation of the origin of that material, or
373 | requiring that modified versions of such material be marked in
374 | reasonable ways as different from the original version; or
375 |
376 | d) Limiting the use for publicity purposes of names of licensors or
377 | authors of the material; or
378 |
379 | e) Declining to grant rights under trademark law for use of some
380 | trade names, trademarks, or service marks; or
381 |
382 | f) Requiring indemnification of licensors and authors of that
383 | material by anyone who conveys the material (or modified versions of
384 | it) with contractual assumptions of liability to the recipient, for
385 | any liability that these contractual assumptions directly impose on
386 | those licensors and authors.
387 |
388 | All other non-permissive additional terms are considered "further
389 | restrictions" within the meaning of section 10. If the Program as you
390 | received it, or any part of it, contains a notice stating that it is
391 | governed by this License along with a term that is a further
392 | restriction, you may remove that term. If a license document contains
393 | a further restriction but permits relicensing or conveying under this
394 | License, you may add to a covered work material governed by the terms
395 | of that license document, provided that the further restriction does
396 | not survive such relicensing or conveying.
397 |
398 | If you add terms to a covered work in accord with this section, you
399 | must place, in the relevant source files, a statement of the
400 | additional terms that apply to those files, or a notice indicating
401 | where to find the applicable terms.
402 |
403 | Additional terms, permissive or non-permissive, may be stated in the
404 | form of a separately written license, or stated as exceptions;
405 | the above requirements apply either way.
406 |
407 | 8. Termination.
408 |
409 | You may not propagate or modify a covered work except as expressly
410 | provided under this License. Any attempt otherwise to propagate or
411 | modify it is void, and will automatically terminate your rights under
412 | this License (including any patent licenses granted under the third
413 | paragraph of section 11).
414 |
415 | However, if you cease all violation of this License, then your
416 | license from a particular copyright holder is reinstated (a)
417 | provisionally, unless and until the copyright holder explicitly and
418 | finally terminates your license, and (b) permanently, if the copyright
419 | holder fails to notify you of the violation by some reasonable means
420 | prior to 60 days after the cessation.
421 |
422 | Moreover, your license from a particular copyright holder is
423 | reinstated permanently if the copyright holder notifies you of the
424 | violation by some reasonable means, this is the first time you have
425 | received notice of violation of this License (for any work) from that
426 | copyright holder, and you cure the violation prior to 30 days after
427 | your receipt of the notice.
428 |
429 | Termination of your rights under this section does not terminate the
430 | licenses of parties who have received copies or rights from you under
431 | this License. If your rights have been terminated and not permanently
432 | reinstated, you do not qualify to receive new licenses for the same
433 | material under section 10.
434 |
435 | 9. Acceptance Not Required for Having Copies.
436 |
437 | You are not required to accept this License in order to receive or
438 | run a copy of the Program. Ancillary propagation of a covered work
439 | occurring solely as a consequence of using peer-to-peer transmission
440 | to receive a copy likewise does not require acceptance. However,
441 | nothing other than this License grants you permission to propagate or
442 | modify any covered work. These actions infringe copyright if you do
443 | not accept this License. Therefore, by modifying or propagating a
444 | covered work, you indicate your acceptance of this License to do so.
445 |
446 | 10. Automatic Licensing of Downstream Recipients.
447 |
448 | Each time you convey a covered work, the recipient automatically
449 | receives a license from the original licensors, to run, modify and
450 | propagate that work, subject to this License. You are not responsible
451 | for enforcing compliance by third parties with this License.
452 |
453 | An "entity transaction" is a transaction transferring control of an
454 | organization, or substantially all assets of one, or subdividing an
455 | organization, or merging organizations. If propagation of a covered
456 | work results from an entity transaction, each party to that
457 | transaction who receives a copy of the work also receives whatever
458 | licenses to the work the party's predecessor in interest had or could
459 | give under the previous paragraph, plus a right to possession of the
460 | Corresponding Source of the work from the predecessor in interest, if
461 | the predecessor has it or can get it with reasonable efforts.
462 |
463 | You may not impose any further restrictions on the exercise of the
464 | rights granted or affirmed under this License. For example, you may
465 | not impose a license fee, royalty, or other charge for exercise of
466 | rights granted under this License, and you may not initiate litigation
467 | (including a cross-claim or counterclaim in a lawsuit) alleging that
468 | any patent claim is infringed by making, using, selling, offering for
469 | sale, or importing the Program or any portion of it.
470 |
471 | 11. Patents.
472 |
473 | A "contributor" is a copyright holder who authorizes use under this
474 | License of the Program or a work on which the Program is based. The
475 | work thus licensed is called the contributor's "contributor version".
476 |
477 | A contributor's "essential patent claims" are all patent claims
478 | owned or controlled by the contributor, whether already acquired or
479 | hereafter acquired, that would be infringed by some manner, permitted
480 | by this License, of making, using, or selling its contributor version,
481 | but do not include claims that would be infringed only as a
482 | consequence of further modification of the contributor version. For
483 | purposes of this definition, "control" includes the right to grant
484 | patent sublicenses in a manner consistent with the requirements of
485 | this License.
486 |
487 | Each contributor grants you a non-exclusive, worldwide, royalty-free
488 | patent license under the contributor's essential patent claims, to
489 | make, use, sell, offer for sale, import and otherwise run, modify and
490 | propagate the contents of its contributor version.
491 |
492 | In the following three paragraphs, a "patent license" is any express
493 | agreement or commitment, however denominated, not to enforce a patent
494 | (such as an express permission to practice a patent or covenant not to
495 | sue for patent infringement). To "grant" such a patent license to a
496 | party means to make such an agreement or commitment not to enforce a
497 | patent against the party.
498 |
499 | If you convey a covered work, knowingly relying on a patent license,
500 | and the Corresponding Source of the work is not available for anyone
501 | to copy, free of charge and under the terms of this License, through a
502 | publicly available network server or other readily accessible means,
503 | then you must either (1) cause the Corresponding Source to be so
504 | available, or (2) arrange to deprive yourself of the benefit of the
505 | patent license for this particular work, or (3) arrange, in a manner
506 | consistent with the requirements of this License, to extend the patent
507 | license to downstream recipients. "Knowingly relying" means you have
508 | actual knowledge that, but for the patent license, your conveying the
509 | covered work in a country, or your recipient's use of the covered work
510 | in a country, would infringe one or more identifiable patents in that
511 | country that you have reason to believe are valid.
512 |
513 | If, pursuant to or in connection with a single transaction or
514 | arrangement, you convey, or propagate by procuring conveyance of, a
515 | covered work, and grant a patent license to some of the parties
516 | receiving the covered work authorizing them to use, propagate, modify
517 | or convey a specific copy of the covered work, then the patent license
518 | you grant is automatically extended to all recipients of the covered
519 | work and works based on it.
520 |
521 | A patent license is "discriminatory" if it does not include within
522 | the scope of its coverage, prohibits the exercise of, or is
523 | conditioned on the non-exercise of one or more of the rights that are
524 | specifically granted under this License. You may not convey a covered
525 | work if you are a party to an arrangement with a third party that is
526 | in the business of distributing software, under which you make payment
527 | to the third party based on the extent of your activity of conveying
528 | the work, and under which the third party grants, to any of the
529 | parties who would receive the covered work from you, a discriminatory
530 | patent license (a) in connection with copies of the covered work
531 | conveyed by you (or copies made from those copies), or (b) primarily
532 | for and in connection with specific products or compilations that
533 | contain the covered work, unless you entered into that arrangement,
534 | or that patent license was granted, prior to 28 March 2007.
535 |
536 | Nothing in this License shall be construed as excluding or limiting
537 | any implied license or other defenses to infringement that may
538 | otherwise be available to you under applicable patent law.
539 |
540 | 12. No Surrender of Others' Freedom.
541 |
542 | If conditions are imposed on you (whether by court order, agreement or
543 | otherwise) that contradict the conditions of this License, they do not
544 | excuse you from the conditions of this License. If you cannot convey a
545 | covered work so as to satisfy simultaneously your obligations under this
546 | License and any other pertinent obligations, then as a consequence you may
547 | not convey it at all. For example, if you agree to terms that obligate you
548 | to collect a royalty for further conveying from those to whom you convey
549 | the Program, the only way you could satisfy both those terms and this
550 | License would be to refrain entirely from conveying the Program.
551 |
552 | 13. Use with the GNU Affero General Public License.
553 |
554 | Notwithstanding any other provision of this License, you have
555 | permission to link or combine any covered work with a work licensed
556 | under version 3 of the GNU Affero General Public License into a single
557 | combined work, and to convey the resulting work. The terms of this
558 | License will continue to apply to the part which is the covered work,
559 | but the special requirements of the GNU Affero General Public License,
560 | section 13, concerning interaction through a network will apply to the
561 | combination as such.
562 |
563 | 14. Revised Versions of this License.
564 |
565 | The Free Software Foundation may publish revised and/or new versions of
566 | the GNU General Public License from time to time. Such new versions will
567 | be similar in spirit to the present version, but may differ in detail to
568 | address new problems or concerns.
569 |
570 | Each version is given a distinguishing version number. If the
571 | Program specifies that a certain numbered version of the GNU General
572 | Public License "or any later version" applies to it, you have the
573 | option of following the terms and conditions either of that numbered
574 | version or of any later version published by the Free Software
575 | Foundation. If the Program does not specify a version number of the
576 | GNU General Public License, you may choose any version ever published
577 | by the Free Software Foundation.
578 |
579 | If the Program specifies that a proxy can decide which future
580 | versions of the GNU General Public License can be used, that proxy's
581 | public statement of acceptance of a version permanently authorizes you
582 | to choose that version for the Program.
583 |
584 | Later license versions may give you additional or different
585 | permissions. However, no additional obligations are imposed on any
586 | author or copyright holder as a result of your choosing to follow a
587 | later version.
588 |
589 | 15. Disclaimer of Warranty.
590 |
591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
599 |
600 | 16. Limitation of Liability.
601 |
602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
610 | SUCH DAMAGES.
611 |
612 | 17. Interpretation of Sections 15 and 16.
613 |
614 | If the disclaimer of warranty and limitation of liability provided
615 | above cannot be given local legal effect according to their terms,
616 | reviewing courts shall apply local law that most closely approximates
617 | an absolute waiver of all civil liability in connection with the
618 | Program, unless a warranty or assumption of liability accompanies a
619 | copy of the Program in return for a fee.
620 |
621 | END OF TERMS AND CONDITIONS
622 |
--------------------------------------------------------------------------------
/ChangeLog:
--------------------------------------------------------------------------------
1 | 2017-05-26: version 1.4.0
2 |
3 | Merge PR #8: Refresh theme on SIGHUP
4 | Merge PR #9: Replace some gtk_container_add()s with gtk_box_pack_start()s
5 |
6 | 2016-08-03: version 1.3.1
7 |
8 | Fix issue #5: synchro progress bars between gtk2 and gtk3 versions of awf
9 | Fix COPYING
10 | Change desktop category into 'Utilities'
11 |
12 | 2014-01-26: version 1.3.0
13 |
14 | System and user themes are sorted alphabetically in menus
15 | Added a check button to show text of progress bars
16 | Added font, color and file chooser buttons
17 | Reworked link and switch buttons
18 | Added icon in scale button
19 | Added level bar in gtk3 version
20 | Duplicated the treeview, one with and another without scrollbars
21 |
22 | 2011-12-25: version 1.2.1
23 |
24 | Missing icons 22x22 and 24x24 added
25 |
26 | 2011-12-22: version 1.2.0
27 |
28 | Icons added
29 |
30 | 2011-12-14: version 1.1.0
31 |
32 | Stop the spinner when the scale range is below 1/2 and start it when it's above.
33 |
34 | 2011-12-14: version 1.0.4
35 |
36 | Ensure README exists before autoreconf
37 | Ensure minimum size of spinner otherwise it's not visible in gtk2
38 |
39 | 2011-12-13: version 1.0.3
40 |
41 | code cleaning
42 | reworked autotools to build both gtk2 and gtk3 in one run
43 |
44 | 2011-12-09: version 1.0.2
45 |
46 | fixed bug in gtk3 toolbar (missing primary-toolbar style)
47 | use list when loading available themes
48 |
49 | 2011-12-05: version 1.0.1
50 |
51 | fixed bug in refresh theme (didn't work at all)
52 | icon set in desktop file and changed in toolbar
53 | gtk version added in application title
54 | GTK_SUFFIX removed from CPP_FLAGS
55 | src directory created
56 | awf.c splitted into awf.c and gtk_empty.c,.h
57 |
58 | 2011-12-04: first version 1.0.0
59 |
--------------------------------------------------------------------------------
/INSTALL:
--------------------------------------------------------------------------------
1 | Installation Instructions
2 | *************************
3 |
4 | Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation,
5 | Inc.
6 |
7 | Copying and distribution of this file, with or without modification,
8 | are permitted in any medium without royalty provided the copyright
9 | notice and this notice are preserved. This file is offered as-is,
10 | without warranty of any kind.
11 |
12 | Basic Installation
13 | ==================
14 |
15 | Briefly, the shell command `./configure && make && make install'
16 | should configure, build, and install this package. The following
17 | more-detailed instructions are generic; see the `README' file for
18 | instructions specific to this package. Some packages provide this
19 | `INSTALL' file but do not implement all of the features documented
20 | below. The lack of an optional feature in a given package is not
21 | necessarily a bug. More recommendations for GNU packages can be found
22 | in *note Makefile Conventions: (standards)Makefile Conventions.
23 |
24 | The `configure' shell script attempts to guess correct values for
25 | various system-dependent variables used during compilation. It uses
26 | those values to create a `Makefile' in each directory of the package.
27 | It may also create one or more `.h' files containing system-dependent
28 | definitions. Finally, it creates a shell script `config.status' that
29 | you can run in the future to recreate the current configuration, and a
30 | file `config.log' containing compiler output (useful mainly for
31 | debugging `configure').
32 |
33 | It can also use an optional file (typically called `config.cache'
34 | and enabled with `--cache-file=config.cache' or simply `-C') that saves
35 | the results of its tests to speed up reconfiguring. Caching is
36 | disabled by default to prevent problems with accidental use of stale
37 | cache files.
38 |
39 | If you need to do unusual things to compile the package, please try
40 | to figure out how `configure' could check whether to do them, and mail
41 | diffs or instructions to the address given in the `README' so they can
42 | be considered for the next release. If you are using the cache, and at
43 | some point `config.cache' contains results you don't want to keep, you
44 | may remove or edit it.
45 |
46 | The file `configure.ac' (or `configure.in') is used to create
47 | `configure' by a program called `autoconf'. You need `configure.ac' if
48 | you want to change it or regenerate `configure' using a newer version
49 | of `autoconf'.
50 |
51 | The simplest way to compile this package is:
52 |
53 | 1. `cd' to the directory containing the package's source code and type
54 | `./configure' to configure the package for your system.
55 |
56 | Running `configure' might take a while. While running, it prints
57 | some messages telling which features it is checking for.
58 |
59 | 2. Type `make' to compile the package.
60 |
61 | 3. Optionally, type `make check' to run any self-tests that come with
62 | the package, generally using the just-built uninstalled binaries.
63 |
64 | 4. Type `make install' to install the programs and any data files and
65 | documentation. When installing into a prefix owned by root, it is
66 | recommended that the package be configured and built as a regular
67 | user, and only the `make install' phase executed with root
68 | privileges.
69 |
70 | 5. Optionally, type `make installcheck' to repeat any self-tests, but
71 | this time using the binaries in their final installed location.
72 | This target does not install anything. Running this target as a
73 | regular user, particularly if the prior `make install' required
74 | root privileges, verifies that the installation completed
75 | correctly.
76 |
77 | 6. You can remove the program binaries and object files from the
78 | source code directory by typing `make clean'. To also remove the
79 | files that `configure' created (so you can compile the package for
80 | a different kind of computer), type `make distclean'. There is
81 | also a `make maintainer-clean' target, but that is intended mainly
82 | for the package's developers. If you use it, you may have to get
83 | all sorts of other programs in order to regenerate files that came
84 | with the distribution.
85 |
86 | 7. Often, you can also type `make uninstall' to remove the installed
87 | files again. In practice, not all packages have tested that
88 | uninstallation works correctly, even though it is required by the
89 | GNU Coding Standards.
90 |
91 | 8. Some packages, particularly those that use Automake, provide `make
92 | distcheck', which can by used by developers to test that all other
93 | targets like `make install' and `make uninstall' work correctly.
94 | This target is generally not run by end users.
95 |
96 | Compilers and Options
97 | =====================
98 |
99 | Some systems require unusual options for compilation or linking that
100 | the `configure' script does not know about. Run `./configure --help'
101 | for details on some of the pertinent environment variables.
102 |
103 | You can give `configure' initial values for configuration parameters
104 | by setting variables in the command line or in the environment. Here
105 | is an example:
106 |
107 | ./configure CC=c99 CFLAGS=-g LIBS=-lposix
108 |
109 | *Note Defining Variables::, for more details.
110 |
111 | Compiling For Multiple Architectures
112 | ====================================
113 |
114 | You can compile the package for more than one kind of computer at the
115 | same time, by placing the object files for each architecture in their
116 | own directory. To do this, you can use GNU `make'. `cd' to the
117 | directory where you want the object files and executables to go and run
118 | the `configure' script. `configure' automatically checks for the
119 | source code in the directory that `configure' is in and in `..'. This
120 | is known as a "VPATH" build.
121 |
122 | With a non-GNU `make', it is safer to compile the package for one
123 | architecture at a time in the source code directory. After you have
124 | installed the package for one architecture, use `make distclean' before
125 | reconfiguring for another architecture.
126 |
127 | On MacOS X 10.5 and later systems, you can create libraries and
128 | executables that work on multiple system types--known as "fat" or
129 | "universal" binaries--by specifying multiple `-arch' options to the
130 | compiler but only a single `-arch' option to the preprocessor. Like
131 | this:
132 |
133 | ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
134 | CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
135 | CPP="gcc -E" CXXCPP="g++ -E"
136 |
137 | This is not guaranteed to produce working output in all cases, you
138 | may have to build one architecture at a time and combine the results
139 | using the `lipo' tool if you have problems.
140 |
141 | Installation Names
142 | ==================
143 |
144 | By default, `make install' installs the package's commands under
145 | `/usr/local/bin', include files under `/usr/local/include', etc. You
146 | can specify an installation prefix other than `/usr/local' by giving
147 | `configure' the option `--prefix=PREFIX', where PREFIX must be an
148 | absolute file name.
149 |
150 | You can specify separate installation prefixes for
151 | architecture-specific files and architecture-independent files. If you
152 | pass the option `--exec-prefix=PREFIX' to `configure', the package uses
153 | PREFIX as the prefix for installing programs and libraries.
154 | Documentation and other data files still use the regular prefix.
155 |
156 | In addition, if you use an unusual directory layout you can give
157 | options like `--bindir=DIR' to specify different values for particular
158 | kinds of files. Run `configure --help' for a list of the directories
159 | you can set and what kinds of files go in them. In general, the
160 | default for these options is expressed in terms of `${prefix}', so that
161 | specifying just `--prefix' will affect all of the other directory
162 | specifications that were not explicitly provided.
163 |
164 | The most portable way to affect installation locations is to pass the
165 | correct locations to `configure'; however, many packages provide one or
166 | both of the following shortcuts of passing variable assignments to the
167 | `make install' command line to change installation locations without
168 | having to reconfigure or recompile.
169 |
170 | The first method involves providing an override variable for each
171 | affected directory. For example, `make install
172 | prefix=/alternate/directory' will choose an alternate location for all
173 | directory configuration variables that were expressed in terms of
174 | `${prefix}'. Any directories that were specified during `configure',
175 | but not in terms of `${prefix}', must each be overridden at install
176 | time for the entire installation to be relocated. The approach of
177 | makefile variable overrides for each directory variable is required by
178 | the GNU Coding Standards, and ideally causes no recompilation.
179 | However, some platforms have known limitations with the semantics of
180 | shared libraries that end up requiring recompilation when using this
181 | method, particularly noticeable in packages that use GNU Libtool.
182 |
183 | The second method involves providing the `DESTDIR' variable. For
184 | example, `make install DESTDIR=/alternate/directory' will prepend
185 | `/alternate/directory' before all installation names. The approach of
186 | `DESTDIR' overrides is not required by the GNU Coding Standards, and
187 | does not work on platforms that have drive letters. On the other hand,
188 | it does better at avoiding recompilation issues, and works well even
189 | when some directory options were not specified in terms of `${prefix}'
190 | at `configure' time.
191 |
192 | Optional Features
193 | =================
194 |
195 | If the package supports it, you can cause programs to be installed
196 | with an extra prefix or suffix on their names by giving `configure' the
197 | option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
198 |
199 | Some packages pay attention to `--enable-FEATURE' options to
200 | `configure', where FEATURE indicates an optional part of the package.
201 | They may also pay attention to `--with-PACKAGE' options, where PACKAGE
202 | is something like `gnu-as' or `x' (for the X Window System). The
203 | `README' should mention any `--enable-' and `--with-' options that the
204 | package recognizes.
205 |
206 | For packages that use the X Window System, `configure' can usually
207 | find the X include and library files automatically, but if it doesn't,
208 | you can use the `configure' options `--x-includes=DIR' and
209 | `--x-libraries=DIR' to specify their locations.
210 |
211 | Some packages offer the ability to configure how verbose the
212 | execution of `make' will be. For these packages, running `./configure
213 | --enable-silent-rules' sets the default to minimal output, which can be
214 | overridden with `make V=1'; while running `./configure
215 | --disable-silent-rules' sets the default to verbose, which can be
216 | overridden with `make V=0'.
217 |
218 | Particular systems
219 | ==================
220 |
221 | On HP-UX, the default C compiler is not ANSI C compatible. If GNU
222 | CC is not installed, it is recommended to use the following options in
223 | order to use an ANSI C compiler:
224 |
225 | ./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
226 |
227 | and if that doesn't work, install pre-built binaries of GCC for HP-UX.
228 |
229 | HP-UX `make' updates targets which have the same time stamps as
230 | their prerequisites, which makes it generally unusable when shipped
231 | generated files such as `configure' are involved. Use GNU `make'
232 | instead.
233 |
234 | On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
235 | parse its `' header file. The option `-nodtk' can be used as
236 | a workaround. If GNU CC is not installed, it is therefore recommended
237 | to try
238 |
239 | ./configure CC="cc"
240 |
241 | and if that doesn't work, try
242 |
243 | ./configure CC="cc -nodtk"
244 |
245 | On Solaris, don't put `/usr/ucb' early in your `PATH'. This
246 | directory contains several dysfunctional programs; working variants of
247 | these programs are available in `/usr/bin'. So, if you need `/usr/ucb'
248 | in your `PATH', put it _after_ `/usr/bin'.
249 |
250 | On Haiku, software installed for all users goes in `/boot/common',
251 | not `/usr/local'. It is recommended to use the following options:
252 |
253 | ./configure --prefix=/boot/common
254 |
255 | Specifying the System Type
256 | ==========================
257 |
258 | There may be some features `configure' cannot figure out
259 | automatically, but needs to determine by the type of machine the package
260 | will run on. Usually, assuming the package is built to be run on the
261 | _same_ architectures, `configure' can figure that out, but if it prints
262 | a message saying it cannot guess the machine type, give it the
263 | `--build=TYPE' option. TYPE can either be a short name for the system
264 | type, such as `sun4', or a canonical name which has the form:
265 |
266 | CPU-COMPANY-SYSTEM
267 |
268 | where SYSTEM can have one of these forms:
269 |
270 | OS
271 | KERNEL-OS
272 |
273 | See the file `config.sub' for the possible values of each field. If
274 | `config.sub' isn't included in this package, then this package doesn't
275 | need to know the machine type.
276 |
277 | If you are _building_ compiler tools for cross-compiling, you should
278 | use the option `--target=TYPE' to select the type of system they will
279 | produce code for.
280 |
281 | If you want to _use_ a cross compiler, that generates code for a
282 | platform different from the build platform, you should specify the
283 | "host" platform (i.e., that on which the generated programs will
284 | eventually be run) with `--host=TYPE'.
285 |
286 | Sharing Defaults
287 | ================
288 |
289 | If you want to set default values for `configure' scripts to share,
290 | you can create a site shell script called `config.site' that gives
291 | default values for variables like `CC', `cache_file', and `prefix'.
292 | `configure' looks for `PREFIX/share/config.site' if it exists, then
293 | `PREFIX/etc/config.site' if it exists. Or, you can set the
294 | `CONFIG_SITE' environment variable to the location of the site script.
295 | A warning: not all `configure' scripts look for a site script.
296 |
297 | Defining Variables
298 | ==================
299 |
300 | Variables not defined in a site shell script can be set in the
301 | environment passed to `configure'. However, some packages may run
302 | configure again during the build, and the customized values of these
303 | variables may be lost. In order to avoid this problem, you should set
304 | them in the `configure' command line, using `VAR=value'. For example:
305 |
306 | ./configure CC=/usr/local2/bin/gcc
307 |
308 | causes the specified `gcc' to be used as the C compiler (unless it is
309 | overridden in the site shell script).
310 |
311 | Unfortunately, this technique does not work for `CONFIG_SHELL' due to
312 | an Autoconf limitation. Until the limitation is lifted, you can use
313 | this workaround:
314 |
315 | CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash
316 |
317 | `configure' Invocation
318 | ======================
319 |
320 | `configure' recognizes the following options to control how it
321 | operates.
322 |
323 | `--help'
324 | `-h'
325 | Print a summary of all of the options to `configure', and exit.
326 |
327 | `--help=short'
328 | `--help=recursive'
329 | Print a summary of the options unique to this package's
330 | `configure', and exit. The `short' variant lists options used
331 | only in the top level, while the `recursive' variant lists options
332 | also present in any nested packages.
333 |
334 | `--version'
335 | `-V'
336 | Print the version of Autoconf used to generate the `configure'
337 | script, and exit.
338 |
339 | `--cache-file=FILE'
340 | Enable the cache: use and save the results of the tests in FILE,
341 | traditionally `config.cache'. FILE defaults to `/dev/null' to
342 | disable caching.
343 |
344 | `--config-cache'
345 | `-C'
346 | Alias for `--cache-file=config.cache'.
347 |
348 | `--quiet'
349 | `--silent'
350 | `-q'
351 | Do not print messages saying which checks are being made. To
352 | suppress all normal output, redirect it to `/dev/null' (any error
353 | messages will still be shown).
354 |
355 | `--srcdir=DIR'
356 | Look for the package's source code in directory DIR. Usually
357 | `configure' can determine that directory automatically.
358 |
359 | `--prefix=DIR'
360 | Use DIR as the installation prefix. *note Installation Names::
361 | for more details, including other options available for fine-tuning
362 | the installation locations.
363 |
364 | `--no-create'
365 | `-n'
366 | Run the configure checks, but stop before creating any output
367 | files.
368 |
369 | `configure' also accepts some other, not widely useful, options. Run
370 | `configure --help' for more details.
371 |
--------------------------------------------------------------------------------
/Makefile.am:
--------------------------------------------------------------------------------
1 |
2 | SUBDIRS = src icons
3 |
4 | desktopdir = $(datadir)/applications
5 | desktop_DATA = awf.desktop
6 |
7 | EXTRA_DIST = $(desktop_DATA) \
8 | AUTHORS COPYING ChangeLog INSTALL NEWS README autogen.sh \
9 | awf.desktop awf.spec
10 |
11 | rpm: dist
12 | rpmbuild --clean -ta ${distdir}.tar.gz
13 |
--------------------------------------------------------------------------------
/NEWS:
--------------------------------------------------------------------------------
1 | 2017-05-26: version 1.4.0
2 |
3 | Merge PR #8: Refresh theme on SIGHUP
4 | Merge PR #9: Replace some gtk_container_add()s with gtk_box_pack_start()s
5 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | AWF - A Widget Factory
2 | ======================
3 |
4 | Description
5 | -----------
6 |
7 | A widget factory is a theme preview application for gtk2 and gtk3.
8 | It displays the various widget types provided by gtk2/gtk3 in a single window allowing to see the visual effect of the applied theme.
9 |
10 | Status
11 | ------
12 |
13 | **Warning**: it's quite some time I haven't looked at gtk3 to integrate the latest widgets, and I don't plan to work on this tool anymore.
14 | AWF was indeed created a long time ago when neither gtk2 nor gtk3 were providing such a tool.
15 | As part of gtk3 there is now [gtk3-widget-factory](https://developer.gnome.org/gtk3/stable/gtk3-widget-factory.html) and gtk4 will provide [gtk4-widget-factory](https://developer.gnome.org/gtk4/stable/gtk4-widget-factory.html).
16 |
17 | Features
18 | --------
19 |
20 | * Display widget types available in gtk2/gtk3 (remark: option menu widget type only exists in gtk2, switch and level bar widget types only exist in gtk3)
21 | * Menus to select the themes available either at system level or user level
22 | * Toolbar button to start the other gtk version of the tool
23 | * Toolbar button to refresh the current theme (not working anymore in latest versions of gtk3)
24 | * Refresh the current theme on SIGHUP
25 |
26 | Installation
27 | ------------
28 |
29 | * Ubuntu
30 |
31 | sudo apt-add-repository ppa:flexiondotorg/awf
32 | sudo apt update
33 | sudo apt install awf
34 |
35 | * Archlinux
36 |
37 | https://aur.archlinux.org/packages/awf-git/
38 |
39 | * RPM based distro
40 |
41 | There is no pre-built package (yet) but you can generate RPM like this:
42 |
43 | ./autogen.sh
44 | ./configure
45 | make rpm
46 |
47 | * From source
48 |
49 | ./autogen.sh
50 | ./configure
51 | make
52 | make install
53 |
54 | Dependencies
55 | ------------
56 |
57 | * gtk2 version 2.24
58 | * gtk3
59 |
60 | Screenshots
61 | -----------
62 |
63 | 
64 |
65 | 
66 |
67 | License
68 | -------
69 |
70 | A widget factory is provided under the terms of the GNU GPLv3 license.
71 | See the COPYING file for details.
72 |
73 | Author
74 | ------
75 |
76 | Valère Monseur (valere dot monseur at ymail dot com)
77 |
78 | Thanks to
79 | ---------
80 |
81 | * Ottoman Kent (for testing in ubuntu and bug report)
82 | * Dwight Engen (for rpm specification file: awf.spec.in)
83 | * Josef Radinger (for sorted menus, text in progress bars, treeviews with(out) scrollbars)
84 |
--------------------------------------------------------------------------------
/autogen.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | # Ensure README file exists
4 | if test ! -e README; then
5 | cp README.md README
6 | fi
7 |
8 | # Reconfigure all
9 | autoreconf -f -i
10 |
11 | # Check minimum required gtk2 version
12 | if which gtkdoc-depscan &> /dev/null; then
13 | echo "Minimum required version:"
14 | gtkdoc-depscan --book=gtk2 * | cut -d ' ' -f 2 | sort | uniq
15 | fi
16 |
17 | # Check minimum required gtk3 version
18 | if which gtkdoc-depscan &> /dev/null; then
19 | echo "Minimum required version:"
20 | gtkdoc-depscan --book=gtk3 * | cut -d ' ' -f 2 | sort | uniq
21 | fi
22 |
--------------------------------------------------------------------------------
/awf.desktop:
--------------------------------------------------------------------------------
1 | [Desktop Entry]
2 | Name=A widget factory
3 | Comment=A widget factory - a theme preview application for gtk2 and gtk3
4 | Exec=awf-gtk2
5 | Icon=awf
6 | Terminal=false
7 | Type=Application
8 | Categories=Utility;
9 | StartupNotify=true
10 |
--------------------------------------------------------------------------------
/awf.spec.in:
--------------------------------------------------------------------------------
1 | Name: @PACKAGE@
2 | Version: @VERSION@
3 | Release: 1%{?dist}
4 | Summary: %{name} : A tool for previewing GTK2/GTK3 widgets
5 | Group: Development/Tools
6 | License: GPLv3+
7 | URL: https://github.com/valr/awf
8 | Source: https://github.com/valr/awf/%{name}-%{version}.tar.gz
9 |
10 | BuildRoot: %{_tmppath}/%{name}-%{version}-build
11 | BuildRequires: gtk2-devel gtk3-devel
12 | Requires: gtk2 gtk3
13 |
14 | %description
15 | A Widget Factory is a program designed to show a wide range of widgets
16 | on a single window.
17 |
18 | %prep
19 | %setup
20 |
21 | %build
22 | %configure $args
23 | make %{?_smp_mflags}
24 |
25 | %install
26 | rm -rf %{buildroot}
27 | make DESTDIR=%{buildroot} install
28 | find %{buildroot} -type f -name '*.la' -exec rm -f {} ';'
29 |
30 | %clean
31 | rm -rf %{buildroot}
32 |
33 | %post
34 |
35 | %files
36 | %defattr(-,root,root)
37 | %{_bindir}/*
38 | %{_datadir}/*
39 |
40 | %changelog
41 | * Wed Aug 03 2016 Valère Monseur - Version 1.3.1
42 | - fix issue #5: synchro progress bars between gtk2 and gtk3 versions of awf.
43 | - fix COPYING.
44 | - change desktop category into 'Utilities'
45 |
46 | * Sun Jan 26 2014 Valère Monseur - Version 1.3.0
47 | - System and user themes are sorted alphabetically in menus.
48 | - Added a check button to show text of progress bars.
49 | - Added font, color and file chooser buttons.
50 | - Reworked link and switch buttons.
51 | - Added icon in scale button.
52 | - Added level bar in gtk3 version.
53 | - Duplicated the treeview, one with and another without scrollbars.
54 |
55 | * Wed Jan 09 2013 Dwight Engen - Version 1.2.1
56 | - Initial RPM release.
57 |
58 | # Local variables:
59 | # mode: shell-script
60 | # sh-shell: rpm
61 | # end:
62 |
--------------------------------------------------------------------------------
/configure.ac:
--------------------------------------------------------------------------------
1 | AC_INIT([A widget factory], [1.4.0])
2 | AC_CONFIG_SRCDIR([src/awf.c])
3 |
4 | AM_INIT_AUTOMAKE
5 |
6 | AC_PROG_CC
7 | AM_PROG_CC_C_O
8 | AC_PROG_INSTALL
9 |
10 | PKG_CHECK_MODULES(GTK3, gtk+-3.0, GTK3_SUFFIX=gtk3,
11 | AC_MSG_ERROR([gtk3 is required to compile awf]))
12 |
13 | AC_SUBST(GTK3_CFLAGS)
14 | AC_SUBST(GTK3_LIBS)
15 | AC_SUBST(GTK3_SUFFIX)
16 |
17 | PKG_CHECK_MODULES(GTK2, gtk+-2.0 >= 2.24, GTK2_SUFFIX=gtk2,
18 | AC_MSG_ERROR([gtk2.24 is required to compile awf]))
19 |
20 | AC_SUBST(GTK2_CFLAGS)
21 | AC_SUBST(GTK2_LIBS)
22 | AC_SUBST(GTK2_SUFFIX)
23 |
24 | AC_CONFIG_FILES([
25 | Makefile
26 | src/Makefile
27 | icons/Makefile
28 | icons/16x16/Makefile
29 | icons/22x22/Makefile
30 | icons/24x24/Makefile
31 | icons/32x32/Makefile
32 | icons/48x48/Makefile
33 | icons/64x64/Makefile
34 | icons/128x128/Makefile
35 | icons/scalable/Makefile
36 | awf.spec
37 | ])
38 |
39 | AC_OUTPUT
40 |
--------------------------------------------------------------------------------
/debian/README.source:
--------------------------------------------------------------------------------
1 | awf for Debian
2 | --------------
3 |
4 |
6 |
--------------------------------------------------------------------------------
/debian/changelog:
--------------------------------------------------------------------------------
1 | awf (1.3.1-2) UNRELEASED; urgency=medium
2 |
3 | * Update debian/* packaging.
4 |
5 | -- Martin Wimpress Wed, 12 Oct 2016 18:42:24 +0100
6 |
7 | awf (1.3.1-1) unstable; urgency=low
8 |
9 | * fix issue #5: synchro progress bars between gtk2 and gtk3 versions of awf.
10 | * fix COPYING.
11 | * change desktop category into 'Utilities'.
12 |
13 | -- Valère Monseur Wed, 03 Aug 2016 21:52:00 +0100
14 |
15 | awf (1.3.0-1) unstable; urgency=low
16 |
17 | * System and user themes are sorted alphabetically in menus.
18 | * Added a check button to show text of progress bars.
19 | * Added font, color and file chooser buttons.
20 | * Reworked link and switch buttons.
21 | * Added icon in scale button.
22 | * Added level bar in gtk3 version.
23 | * Duplicated the treeview, one with and another without scrollbars.
24 |
25 | -- Valère Monseur Sun, 26 Jan 2014 21:05:00 +0100
26 |
27 | awf (1.2.1-2) unstable; urgency=low
28 |
29 | * Initial release
30 |
31 | -- Valère Monseur Thu, 30 Oct 2012 22:44:00 +0100
32 |
--------------------------------------------------------------------------------
/debian/compat:
--------------------------------------------------------------------------------
1 | 9
2 |
--------------------------------------------------------------------------------
/debian/control:
--------------------------------------------------------------------------------
1 | Source: awf
2 | Section: x11
3 | Priority: extra
4 | Maintainer: Valère Monseur (valr)
5 | Build-Depends: autoconf,
6 | automake,
7 | debhelper (>= 9),
8 | libgtk-3-dev,
9 | libgtk2.0-dev,
10 | libtool,
11 | Standards-Version: 3.9.8
12 | Homepage: https://github.com/valr/awf
13 |
14 | Package: awf
15 | Architecture: any
16 | Depends: ${misc:Depends},
17 | ${shlibs:Depends},
18 | Description: A theme preview application for gtk2 and gtk3.
19 | It displays the various widget types provided by gtk2/gtk3 in a single
20 | window allowing to see the visual effect of the applied theme.
21 |
--------------------------------------------------------------------------------
/debian/copyright:
--------------------------------------------------------------------------------
1 | Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
2 | Upstream-Name: ubuntu-mate-welcome
3 | Upstream-Contact: Valère Monseur
4 | Source: https://github.com/valr/awf
5 |
6 | Files: debian/*
7 | Copyright: 2011-2016 Valère Monseur
8 | 2016 Martin Wimpress
9 | License: GPL-3+
10 |
11 | Files: *
12 | Copyright: 2011-2016 Valère Monseur
13 | License: GPL-3+
14 |
15 | License: GPL-3+
16 | This program is free software: you can redistribute it and/or modify
17 | it under the terms of the GNU General Public License as published by
18 | the Free Software Foundation, either version 3 of the License, or
19 | (at your option) any later version.
20 | .
21 | This package is distributed in the hope that it will be useful,
22 | but WITHOUT ANY WARRANTY; without even the implied warranty of
23 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24 | GNU General Public License for more details.
25 | .
26 | You should have received a copy of the GNU General Public License
27 | along with this program. If not, see .
28 | .
29 | On Debian systems, the complete text of the GNU General
30 | Public License version 3 can be found in `/usr/share/common-licenses/GPL-3'.
31 |
--------------------------------------------------------------------------------
/debian/docs:
--------------------------------------------------------------------------------
1 | NEWS
2 | README.md
3 |
--------------------------------------------------------------------------------
/debian/rules:
--------------------------------------------------------------------------------
1 | #!/usr/bin/make -f
2 | # -*- makefile -*-
3 | # Sample debian/rules that uses debhelper.
4 | # This file was originally written by Joey Hess and Craig Small.
5 | # As a special exception, when this file is copied by dh-make into a
6 | # dh-make output file, you may use that output file without restriction.
7 | # This special exception was added by Craig Small in version 0.37 of dh-make.
8 |
9 | # Uncomment this to turn on verbose mode.
10 | #export DH_VERBOSE=1
11 |
12 | %:
13 | dh $@
14 |
15 | override_dh_auto_configure:
16 | ./autogen.sh
17 | dh_auto_configure
18 |
--------------------------------------------------------------------------------
/debian/source/format:
--------------------------------------------------------------------------------
1 | 3.0 (native)
2 |
--------------------------------------------------------------------------------
/icons/128x128/Makefile.am:
--------------------------------------------------------------------------------
1 |
2 | iconsdir = $(datadir)/icons/hicolor/128x128/apps
3 |
4 | icons_DATA = awf.png
5 |
6 | EXTRA_DIST = $(icons_DATA)
7 |
--------------------------------------------------------------------------------
/icons/128x128/awf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/valr/awf/791a06842529461a5fa9edfa28d5d031f28cbfc3/icons/128x128/awf.png
--------------------------------------------------------------------------------
/icons/16x16/Makefile.am:
--------------------------------------------------------------------------------
1 |
2 | iconsdir = $(datadir)/icons/hicolor/16x16/apps
3 |
4 | icons_DATA = awf.png
5 |
6 | EXTRA_DIST = $(icons_DATA)
7 |
--------------------------------------------------------------------------------
/icons/16x16/awf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/valr/awf/791a06842529461a5fa9edfa28d5d031f28cbfc3/icons/16x16/awf.png
--------------------------------------------------------------------------------
/icons/22x22/Makefile.am:
--------------------------------------------------------------------------------
1 |
2 | iconsdir = $(datadir)/icons/hicolor/22x22/apps
3 |
4 | icons_DATA = awf.png
5 |
6 | EXTRA_DIST = $(icons_DATA)
7 |
--------------------------------------------------------------------------------
/icons/22x22/awf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/valr/awf/791a06842529461a5fa9edfa28d5d031f28cbfc3/icons/22x22/awf.png
--------------------------------------------------------------------------------
/icons/24x24/Makefile.am:
--------------------------------------------------------------------------------
1 |
2 | iconsdir = $(datadir)/icons/hicolor/24x24/apps
3 |
4 | icons_DATA = awf.png
5 |
6 | EXTRA_DIST = $(icons_DATA)
7 |
--------------------------------------------------------------------------------
/icons/24x24/awf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/valr/awf/791a06842529461a5fa9edfa28d5d031f28cbfc3/icons/24x24/awf.png
--------------------------------------------------------------------------------
/icons/32x32/Makefile.am:
--------------------------------------------------------------------------------
1 |
2 | iconsdir = $(datadir)/icons/hicolor/32x32/apps
3 |
4 | icons_DATA = awf.png
5 |
6 | EXTRA_DIST = $(icons_DATA)
7 |
--------------------------------------------------------------------------------
/icons/32x32/awf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/valr/awf/791a06842529461a5fa9edfa28d5d031f28cbfc3/icons/32x32/awf.png
--------------------------------------------------------------------------------
/icons/48x48/Makefile.am:
--------------------------------------------------------------------------------
1 |
2 | iconsdir = $(datadir)/icons/hicolor/48x48/apps
3 |
4 | icons_DATA = awf.png
5 |
6 | EXTRA_DIST = $(icons_DATA)
7 |
--------------------------------------------------------------------------------
/icons/48x48/awf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/valr/awf/791a06842529461a5fa9edfa28d5d031f28cbfc3/icons/48x48/awf.png
--------------------------------------------------------------------------------
/icons/64x64/Makefile.am:
--------------------------------------------------------------------------------
1 |
2 | iconsdir = $(datadir)/icons/hicolor/64x64/apps
3 |
4 | icons_DATA = awf.png
5 |
6 | EXTRA_DIST = $(icons_DATA)
7 |
--------------------------------------------------------------------------------
/icons/64x64/awf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/valr/awf/791a06842529461a5fa9edfa28d5d031f28cbfc3/icons/64x64/awf.png
--------------------------------------------------------------------------------
/icons/Makefile.am:
--------------------------------------------------------------------------------
1 |
2 | SUBDIRS = 16x16 22x22 24x24 32x32 48x48 64x64 128x128 scalable
3 |
4 | gtk_update_icon_cache = gtk-update-icon-cache -f -t $(datadir)/icons/hicolor
5 |
6 | install-data-hook:
7 | @-if test -z "$(DESTDIR)"; then \
8 | echo "Updating gtk icon cache."; \
9 | $(gtk_update_icon_cache); \
10 | else \
11 | echo "*** Icon cache not updated. Remember to run:"; \
12 | echo "***"; \
13 | echo "*** $(gtk_update_icon_cache)"; \
14 | echo "***"; \
15 | fi
16 |
17 | uninstall-local:
18 | rm -f $(DESTDIR)$(datadir)/icons/hicolor/icon-theme.cache;
19 |
--------------------------------------------------------------------------------
/icons/scalable/Makefile.am:
--------------------------------------------------------------------------------
1 |
2 | iconsdir = $(datadir)/icons/hicolor/scalable/apps
3 |
4 | icons_DATA = awf.svg
5 |
6 | EXTRA_DIST = $(icons_DATA)
7 |
--------------------------------------------------------------------------------
/icons/scalable/awf.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
212 |
--------------------------------------------------------------------------------
/src/Makefile.am:
--------------------------------------------------------------------------------
1 | bin_PROGRAMS = awf-@GTK3_SUFFIX@ awf-@GTK2_SUFFIX@
2 |
3 | awf_@GTK3_SUFFIX@_SOURCES = awf.c gtk_empty.c gtk_empty.h
4 | awf_@GTK3_SUFFIX@_CPPFLAGS = $(GTK3_CFLAGS)
5 | awf_@GTK3_SUFFIX@_LDADD = $(GTK3_LIBS)
6 |
7 | awf_@GTK2_SUFFIX@_SOURCES = awf.c gtk_empty.c gtk_empty.h
8 | awf_@GTK2_SUFFIX@_CPPFLAGS = $(GTK2_CFLAGS)
9 | awf_@GTK2_SUFFIX@_LDADD = $(GTK2_LIBS)
10 |
--------------------------------------------------------------------------------
/src/awf.c:
--------------------------------------------------------------------------------
1 | /*
2 | * awf : A Widget Factory
3 | *
4 | * A theme preview application for gtk2 and gtk3.
5 | *
6 | * Copyright (C) 2011-2017 Valère Monseur (valere dot monseur at ymail dot com)
7 | *
8 | * This file is part of awf.
9 | *
10 | * awf is free software: you can redistribute it and/or modify
11 | * it under the terms of the GNU General Public License as published by
12 | * the Free Software Foundation, either version 3 of the License, or
13 | * (at your option) any later version.
14 | *
15 | * awf is distributed in the hope that it will be useful,
16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 | * GNU General Public License for more details.
19 | *
20 | * You should have received a copy of the GNU General Public License
21 | * along with awf. If not, see .
22 | */
23 |
24 | /*
25 | * awf is based on the code from 'The Widget Factory'.
26 | *
27 | * The Widget Factory is a program designed to show a wide range of widgets
28 | * on a single window.
29 | *
30 | * Created by Richard Stellingwerff .
31 | */
32 |
33 | /*
34 | * Widgets difference between gtk2 and gtk3:
35 | * - gtk2: GtkOptionMenu exists. GtkSwitch doesn't exist yet.
36 | * - gtk3: GtkOptionMenu doesn't exist anymore. GtkSwitch exists.
37 | */
38 |
39 | /*
40 | * includes
41 | */
42 |
43 | #include
44 | #include
45 | #include "gtk_empty.h"
46 | #include
47 |
48 | /*
49 | * defines
50 | */
51 |
52 | #define EMPTY (gtk_empty_new ())
53 |
54 | /*
55 | * enums
56 | */
57 |
58 | enum {
59 | COLUMN1 = 0,
60 | COLUMN2,
61 | NUM_COLS
62 | } ;
63 |
64 | /*
65 | * global local variables :)
66 | */
67 |
68 | static GSList *list_system_theme = NULL;
69 | static GSList *list_user_theme = NULL;
70 |
71 | static gboolean refresh_theme = FALSE;
72 |
73 | static GtkWidget *window;
74 | static GtkWidget *progressbar1, *progressbar2, *progressbar3, *progressbar4;
75 | static GtkWidget *scale1, *scale2, *scale3, *scale4, *harmony, *showtext;
76 | static GtkWidget *spinner;
77 |
78 | /*
79 | * local functions
80 | */
81 |
82 | static GSList* awf_load_theme (gchar *directory);
83 | static void awf_exclude_theme (gpointer theme, gpointer unused);
84 | static gint awf_compare_theme (gconstpointer theme1, gconstpointer theme2);
85 | static void awf_set_theme (gpointer theme, guint callback_action, GtkWidget *unused);
86 | static void awf_refresh_theme (GtkWidget *widget, gpointer unused);
87 | static gboolean awf_check_refresh_theme (gpointer unused);
88 | static gboolean awf_sighup_handler (gpointer unused);
89 |
90 | static void awf_window_set_title (void);
91 |
92 | static GtkWidget* awf_build_menu (GtkWidget *widget);
93 | static void awf_add_menu_item (gpointer theme, gpointer menu);
94 |
95 | static void awf_run_me (GtkWidget *widget, gpointer unused);
96 | static void awf_run_me_set_environment (gpointer display);
97 |
98 | static void awf_on_scale_value_changed (GtkRange *range, gpointer unused);
99 |
100 | static void awf_showtext_clicked (GtkWidget *widget, gpointer unused);
101 |
102 | /*
103 | * run baby, run!
104 | */
105 |
106 | int main (int argc, char **argv)
107 | {
108 | gchar *directory;
109 | GtkWidget *menubar, *toolbar;
110 | GtkWidget *vbox_window, *vbox_widget;
111 | GtkWidget *vbox_label_treeview, *vbox_other_button, *vbox_progressbar_scale;
112 | GtkWidget *vbox_combo_entry_spin_check_radio_button;
113 | GtkWidget *vbox_combo_entry, *vbox_check_button, *vbox_radio_button;
114 | GtkWidget *vbox_progressbar, *vbox_scale;
115 | GtkWidget *vbox_buttonbox;
116 | GtkWidget *hbox1, *hbox_check_radio_button;
117 | GtkWidget *hbox_frame1, *hbox_frame2, *hbox_notebook1, *hbox_notebook2;
118 | GtkWidget *hbox_spin_button, *hbox_progressbar, *hbox_scale;
119 | GtkWidget *button1, *button2;
120 | GtkWidget *button3, *button4;
121 | GtkWidget *button5, *button6;
122 | GtkWidget *button7, *button8, *button9, *button10;
123 | GtkWidget *button11, *button12, *button13, *button14;
124 | GtkWidget *button15, *button16, *button17, *button18;
125 | GtkWidget *button19, *button20;
126 | GtkWidget *menu;
127 | GtkWidget *combo1, *combo2;
128 | GtkWidget *combo3, *combo4;
129 | GtkWidget *entry1, *entry2;
130 | GtkWidget *radio1, *radio2;
131 | GtkWidget *frame1, *frame2, *frame3, *frame4;
132 | GtkWidget *notebook1, *notebook2, *notebook3, *notebook4;
133 | GtkWidget *vseparator1, *vseparator2, *vseparator3;
134 | GtkWidget *hseparator1;
135 | GtkWidget *label1, *label2;
136 | GtkWidget *tooltip;
137 | GtkWidget *vpane1, *hpane1, *hpane2;
138 | GtkWidget *scrolled_window1, *scrolled_window2;
139 | GtkWidget *refresh, *awf, *icon1, *icon2, *icon3;
140 | GtkWidget *levelbar1, *levelbar2;
141 | GtkCellRenderer *renderer1, *renderer2;
142 | GtkTreeModel *model1, *model2;
143 | GtkWidget *view1, *view2;
144 | GtkListStore *store1, *store2;
145 | GtkTreeIter iter;
146 | GdkColor color;
147 |
148 | const gchar* scale_icons[] =
149 | {
150 | "awf",
151 | NULL
152 | };
153 |
154 | gtk_init (&argc, &argv);
155 |
156 | /* load themes available at system level */
157 |
158 | list_system_theme = awf_load_theme ("/usr/share/themes");
159 | list_system_theme = g_slist_sort (list_system_theme, (GCompareFunc) awf_compare_theme);
160 | /* load themes available at user level */
161 |
162 | directory = g_build_path ("/", g_getenv ("HOME"), ".themes", NULL);
163 | list_user_theme = awf_load_theme (directory);
164 | list_user_theme = g_slist_sort (list_user_theme, (GCompareFunc) awf_compare_theme);
165 | g_free (directory);
166 |
167 | /* exclude themes at system level also available at user level */
168 |
169 | g_slist_foreach (list_user_theme, awf_exclude_theme, NULL);
170 |
171 | /* window layout */
172 |
173 | window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
174 | g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL);
175 | awf_window_set_title ();
176 |
177 | #if GTK_CHECK_VERSION(3,2,0)
178 | vbox_window = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
179 | gtk_box_set_homogeneous (GTK_BOX (vbox_window), FALSE);
180 | #else
181 | vbox_window = gtk_vbox_new (FALSE, 0);
182 | #endif
183 | gtk_container_add (GTK_CONTAINER (window), vbox_window);
184 |
185 | menubar = awf_build_menu (window);
186 | gtk_box_pack_start (GTK_BOX (vbox_window), menubar, FALSE, FALSE, 0);
187 |
188 | toolbar = gtk_toolbar_new ();
189 | gtk_box_pack_start (GTK_BOX (vbox_window), toolbar, FALSE, FALSE, 0);
190 | #if GTK_CHECK_VERSION(3,0,0)
191 | gtk_style_context_add_class (gtk_widget_get_style_context (toolbar), "primary-toolbar");
192 | #endif
193 |
194 | #if GTK_CHECK_VERSION(3,2,0)
195 | vbox_widget = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
196 | gtk_box_set_homogeneous (GTK_BOX (vbox_widget), FALSE);
197 | #else
198 | vbox_widget = gtk_vbox_new (FALSE, 0);
199 | #endif
200 | gtk_box_pack_start (GTK_BOX (vbox_window), vbox_widget, TRUE, TRUE, 0);
201 |
202 | #if GTK_CHECK_VERSION(3,2,0)
203 | hbox1 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
204 | gtk_box_set_homogeneous (GTK_BOX (hbox1), FALSE);
205 | #else
206 | hbox1 = gtk_hbox_new (FALSE, 0);
207 | #endif
208 | gtk_container_add (GTK_CONTAINER (vbox_widget), hbox1);
209 |
210 | #if GTK_CHECK_VERSION(3,2,0)
211 | hseparator1 = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
212 | #else
213 | hseparator1 = gtk_hseparator_new ();
214 | #endif
215 | gtk_container_add (GTK_CONTAINER (vbox_widget), hseparator1);
216 |
217 | #if GTK_CHECK_VERSION(3,2,0)
218 | vpane1 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
219 | #else
220 | vpane1 = gtk_vpaned_new ();
221 | #endif
222 | gtk_box_pack_start (GTK_BOX (vbox_widget), vpane1, TRUE, TRUE, 0);
223 |
224 | #if GTK_CHECK_VERSION(3,2,0)
225 | hpane1 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
226 | #else
227 | hpane1 = gtk_hpaned_new ();
228 | #endif
229 | gtk_paned_pack1 (GTK_PANED (vpane1), hpane1, TRUE, FALSE);
230 |
231 | #if GTK_CHECK_VERSION(3,2,0)
232 | hpane2 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
233 | #else
234 | hpane2 = gtk_hpaned_new ();
235 | #endif
236 | gtk_paned_pack2 (GTK_PANED (vpane1), hpane2, TRUE, FALSE);
237 |
238 | #if GTK_CHECK_VERSION(3,2,0)
239 | hbox_frame1 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 3);
240 | hbox_frame2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 3);
241 | gtk_box_set_homogeneous (GTK_BOX (hbox_frame1), TRUE);
242 | gtk_box_set_homogeneous (GTK_BOX (hbox_frame2), TRUE);
243 | #else
244 | hbox_frame1 = gtk_hbox_new (TRUE, 3);
245 | hbox_frame2 = gtk_hbox_new (TRUE, 3);
246 | #endif
247 | gtk_widget_set_size_request (hbox_frame1, -1, 70);
248 | gtk_widget_set_size_request (hbox_frame2, -1, 70);
249 | gtk_container_set_border_width (GTK_CONTAINER (hbox_frame1), 10);
250 | gtk_container_set_border_width (GTK_CONTAINER (hbox_frame2), 10);
251 |
252 | #if GTK_CHECK_VERSION(3,2,0)
253 | hbox_notebook1 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 3);
254 | hbox_notebook2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 3);
255 | gtk_box_set_homogeneous (GTK_BOX (hbox_notebook1), TRUE);
256 | gtk_box_set_homogeneous (GTK_BOX (hbox_notebook2), TRUE);
257 | #else
258 | hbox_notebook1 = gtk_hbox_new (TRUE, 3);
259 | hbox_notebook2 = gtk_hbox_new (TRUE, 3);
260 | #endif
261 | gtk_container_set_border_width (GTK_CONTAINER (hbox_notebook1), 10);
262 | gtk_container_set_border_width (GTK_CONTAINER (hbox_notebook2), 10);
263 |
264 | gtk_paned_add1 (GTK_PANED (hpane1), hbox_frame1);
265 | gtk_paned_add2 (GTK_PANED (hpane1), hbox_frame2);
266 |
267 | gtk_paned_add1 (GTK_PANED (hpane2), hbox_notebook1);
268 | gtk_paned_add2 (GTK_PANED (hpane2), hbox_notebook2);
269 |
270 | #if GTK_CHECK_VERSION(3,2,0)
271 | vbox_combo_entry_spin_check_radio_button = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
272 | gtk_box_set_homogeneous (GTK_BOX (vbox_combo_entry_spin_check_radio_button), FALSE);
273 | #else
274 | vbox_combo_entry_spin_check_radio_button = gtk_vbox_new (FALSE, 0);
275 | #endif
276 | gtk_container_set_border_width(GTK_CONTAINER (vbox_combo_entry_spin_check_radio_button), 10);
277 | gtk_container_add (GTK_CONTAINER (hbox1), vbox_combo_entry_spin_check_radio_button);
278 |
279 | #if GTK_CHECK_VERSION(3,2,0)
280 | vseparator1 = gtk_separator_new (GTK_ORIENTATION_VERTICAL);
281 | #else
282 | vseparator1 = gtk_vseparator_new ();
283 | #endif
284 | gtk_container_add (GTK_CONTAINER (hbox1), vseparator1);
285 |
286 | #if GTK_CHECK_VERSION(3,2,0)
287 | vbox_other_button = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
288 | gtk_box_set_homogeneous (GTK_BOX (vbox_other_button), FALSE);
289 | #else
290 | vbox_other_button = gtk_vbox_new (FALSE, 0);
291 | #endif
292 | gtk_container_set_border_width(GTK_CONTAINER (vbox_other_button), 10);
293 | gtk_container_add (GTK_CONTAINER (hbox1), vbox_other_button);
294 |
295 | #if GTK_CHECK_VERSION(3,2,0)
296 | vseparator2 = gtk_separator_new (GTK_ORIENTATION_VERTICAL);
297 | #else
298 | vseparator2 = gtk_vseparator_new ();
299 | #endif
300 | gtk_container_add (GTK_CONTAINER (hbox1), vseparator2);
301 |
302 | #if GTK_CHECK_VERSION(3,2,0)
303 | vbox_progressbar_scale = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
304 | gtk_box_set_homogeneous (GTK_BOX (vbox_progressbar_scale), FALSE);
305 | #else
306 | vbox_progressbar_scale = gtk_vbox_new (FALSE, 10);
307 | #endif
308 | gtk_container_set_border_width(GTK_CONTAINER (vbox_progressbar_scale), 10);
309 | gtk_container_add (GTK_CONTAINER (hbox1), vbox_progressbar_scale);
310 |
311 | #if GTK_CHECK_VERSION(3,2,0)
312 | vseparator3 = gtk_separator_new (GTK_ORIENTATION_VERTICAL);
313 | #else
314 | vseparator3 = gtk_vseparator_new ();
315 | #endif
316 | gtk_container_add (GTK_CONTAINER (hbox1), vseparator3);
317 |
318 | #if GTK_CHECK_VERSION(3,2,0)
319 | vbox_label_treeview = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
320 | gtk_box_set_homogeneous (GTK_BOX (vbox_label_treeview), FALSE);
321 | #else
322 | vbox_label_treeview = gtk_vbox_new (FALSE, 0);
323 | #endif
324 | gtk_container_set_border_width(GTK_CONTAINER (vbox_label_treeview), 10);
325 | gtk_container_add (GTK_CONTAINER (hbox1), vbox_label_treeview);
326 |
327 | #if GTK_CHECK_VERSION(3,2,0)
328 | vbox_combo_entry = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
329 | gtk_box_set_homogeneous (GTK_BOX (vbox_combo_entry), FALSE);
330 | #else
331 | vbox_combo_entry = gtk_vbox_new (FALSE, 0);
332 | #endif
333 | gtk_container_add (GTK_CONTAINER (vbox_combo_entry_spin_check_radio_button), vbox_combo_entry);
334 |
335 | #if GTK_CHECK_VERSION(3,2,0)
336 | hbox_spin_button = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
337 | gtk_box_set_homogeneous (GTK_BOX (hbox_spin_button), TRUE);
338 | #else
339 | hbox_spin_button = gtk_hbox_new (TRUE, 0);
340 | #endif
341 | gtk_container_add (GTK_CONTAINER (vbox_combo_entry_spin_check_radio_button), hbox_spin_button);
342 |
343 | #if GTK_CHECK_VERSION(3,2,0)
344 | hbox_check_radio_button = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
345 | gtk_box_set_homogeneous (GTK_BOX (hbox_check_radio_button), FALSE);
346 | #else
347 | hbox_check_radio_button = gtk_hbox_new (FALSE, 0);
348 | #endif
349 | gtk_container_add (GTK_CONTAINER (vbox_combo_entry_spin_check_radio_button), hbox_check_radio_button);
350 |
351 | #if GTK_CHECK_VERSION(3,2,0)
352 | vbox_check_button = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
353 | gtk_box_set_homogeneous (GTK_BOX (vbox_check_button), FALSE);
354 | #else
355 | vbox_check_button = gtk_vbox_new (FALSE, 0);
356 | #endif
357 | gtk_container_add (GTK_CONTAINER (hbox_check_radio_button), vbox_check_button);
358 |
359 | #if GTK_CHECK_VERSION(3,2,0)
360 | vbox_radio_button = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
361 | gtk_box_set_homogeneous (GTK_BOX (vbox_radio_button), FALSE);
362 | #else
363 | vbox_radio_button = gtk_vbox_new (FALSE, 0);
364 | #endif
365 | gtk_container_add (GTK_CONTAINER (hbox_check_radio_button), vbox_radio_button);
366 |
367 | #if GTK_CHECK_VERSION(3,2,0)
368 | vbox_progressbar = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
369 | gtk_box_set_homogeneous (GTK_BOX (vbox_progressbar), FALSE);
370 | #else
371 | vbox_progressbar = gtk_vbox_new (FALSE, 0);
372 | #endif
373 | gtk_container_add (GTK_CONTAINER (vbox_progressbar_scale), vbox_progressbar);
374 |
375 | #if GTK_CHECK_VERSION(3,2,0)
376 | hbox_progressbar = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
377 | gtk_box_set_homogeneous (GTK_BOX (hbox_progressbar), TRUE);
378 | #else
379 | hbox_progressbar = gtk_hbox_new (TRUE, 0);
380 | #endif
381 | gtk_container_add (GTK_CONTAINER (vbox_progressbar_scale), hbox_progressbar);
382 |
383 | #if GTK_CHECK_VERSION(3,2,0)
384 | vbox_scale = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
385 | gtk_box_set_homogeneous (GTK_BOX (vbox_scale), FALSE);
386 | #else
387 | vbox_scale = gtk_vbox_new (FALSE, 0);
388 | #endif
389 | gtk_container_add (GTK_CONTAINER (vbox_progressbar_scale), vbox_scale);
390 |
391 | #if GTK_CHECK_VERSION(3,2,0)
392 | hbox_scale = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
393 | gtk_box_set_homogeneous (GTK_BOX (hbox_scale), TRUE);
394 | #else
395 | hbox_scale = gtk_hbox_new (TRUE, 0);
396 | #endif
397 | gtk_container_add (GTK_CONTAINER (vbox_progressbar_scale), hbox_scale);
398 |
399 | /* toolbar */
400 | awf = GTK_WIDGET (gtk_tool_button_new (gtk_image_new_from_icon_name ("awf", gtk_toolbar_get_icon_size (GTK_TOOLBAR(toolbar))), NULL));
401 | refresh = GTK_WIDGET (gtk_tool_button_new_from_stock (GTK_STOCK_REFRESH));
402 | icon1 = GTK_WIDGET (gtk_tool_button_new_from_stock (GTK_STOCK_GOTO_FIRST));
403 | icon2 = GTK_WIDGET (gtk_tool_button_new_from_stock (GTK_STOCK_GOTO_LAST));
404 | icon3 = GTK_WIDGET (gtk_toggle_tool_button_new_from_stock (GTK_STOCK_ADD));
405 |
406 | gtk_widget_set_tooltip_text (refresh, "Refresh theme");
407 | #if GTK_CHECK_VERSION(3,0,0)
408 | gtk_widget_set_tooltip_text (awf, "Run awf for gtk2");
409 | #else
410 | gtk_widget_set_tooltip_text (awf, "Run awf for gtk3");
411 | #endif
412 | gtk_widget_set_sensitive(icon2, FALSE);
413 | gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (icon3), TRUE);
414 | g_signal_connect (G_OBJECT(refresh), "clicked", G_CALLBACK (awf_refresh_theme), NULL);
415 | g_signal_connect (G_OBJECT(awf), "clicked", G_CALLBACK (awf_run_me), NULL);
416 |
417 | gtk_toolbar_insert (GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM (awf), -1);
418 | gtk_toolbar_insert (GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM (refresh), -1);
419 | gtk_toolbar_insert (GTK_TOOLBAR(toolbar), gtk_separator_tool_item_new (), -1);
420 | gtk_toolbar_insert (GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM (icon1), -1);
421 | gtk_toolbar_insert (GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM (icon2), -1);
422 | gtk_toolbar_insert (GTK_TOOLBAR(toolbar), gtk_separator_tool_item_new (), -1);
423 | gtk_toolbar_insert (GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM (icon3), -1);
424 |
425 | /* combo boxes and entries */
426 |
427 | combo1 = gtk_combo_box_text_new_with_entry ();
428 | gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo1), "Combo box entry");
429 | gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo1), "Item2");
430 | gtk_combo_box_set_active (GTK_COMBO_BOX (combo1), 0);
431 |
432 | combo2 = gtk_combo_box_text_new_with_entry ();
433 | gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo2), "Combo box entry (disabled)");
434 | gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo2), "Item2");
435 | gtk_combo_box_set_active (GTK_COMBO_BOX (combo2), 0);
436 | gtk_widget_set_sensitive (combo2, FALSE);
437 |
438 | combo3 = gtk_combo_box_text_new ();
439 | gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo3), "Combo box");
440 | gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo3), "Item2");
441 | gtk_combo_box_set_active (GTK_COMBO_BOX (combo3), 0);
442 |
443 | combo4 = gtk_combo_box_text_new ();
444 | gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo4), "Combo box (disabled)");
445 | gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo4), "Item2");
446 | gtk_combo_box_set_active (GTK_COMBO_BOX (combo4), 0);
447 | gtk_widget_set_sensitive (combo4, FALSE);
448 |
449 | entry1 = gtk_entry_new ();
450 | gtk_entry_set_text (GTK_ENTRY (entry1), "Entry");
451 |
452 | entry2 = gtk_entry_new ();
453 | gtk_entry_set_text (GTK_ENTRY (entry2), "Entry (disabled)");
454 | gtk_widget_set_sensitive (entry2, FALSE);
455 |
456 | gtk_box_pack_start (GTK_BOX (vbox_combo_entry), combo1, FALSE, FALSE, 0);
457 | gtk_box_pack_start (GTK_BOX (vbox_combo_entry), combo2, FALSE, FALSE, 0);
458 | gtk_box_pack_start (GTK_BOX (vbox_combo_entry), EMPTY, FALSE, FALSE, 0);
459 | gtk_box_pack_start (GTK_BOX (vbox_combo_entry), combo3, FALSE, FALSE, 0);
460 | gtk_box_pack_start (GTK_BOX (vbox_combo_entry), combo4, FALSE, FALSE, 0);
461 | gtk_box_pack_start (GTK_BOX (vbox_combo_entry), EMPTY, FALSE, FALSE, 0);
462 | gtk_box_pack_start (GTK_BOX (vbox_combo_entry), entry1, FALSE, FALSE, 0);
463 | gtk_box_pack_start (GTK_BOX (vbox_combo_entry), entry2, FALSE, FALSE, 0);
464 | gtk_box_pack_start (GTK_BOX (vbox_combo_entry), EMPTY, FALSE, FALSE, 0);
465 |
466 | /* spin buttons */
467 |
468 | button19 = gtk_spin_button_new_with_range (1, 10, 1);
469 | button20 = gtk_spin_button_new_with_range (1, 10, 1);
470 | gtk_widget_set_sensitive (button20, FALSE);
471 |
472 | gtk_box_pack_start (GTK_BOX (hbox_spin_button), button19, FALSE, FALSE, 0);
473 | gtk_box_pack_start (GTK_BOX (hbox_spin_button), button20, FALSE, FALSE, 0);
474 |
475 | /* Check buttons */
476 |
477 | button11 = gtk_check_button_new_with_label ("Check button1");
478 | button12 = gtk_check_button_new_with_label ("Check button2");
479 | button13 = gtk_check_button_new_with_label ("Check button3");
480 | button14 = gtk_check_button_new_with_label ("Check button4");
481 |
482 | gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button12), TRUE);
483 | gtk_widget_set_sensitive (button13, FALSE);
484 | gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button14), TRUE);
485 | gtk_widget_set_sensitive (button14, FALSE);
486 |
487 | gtk_box_pack_start (GTK_BOX (vbox_check_button), EMPTY, FALSE, FALSE, 0);
488 | gtk_box_pack_start (GTK_BOX (vbox_check_button), button11, FALSE, FALSE, 0);
489 | gtk_box_pack_start (GTK_BOX (vbox_check_button), button12, FALSE, FALSE, 0);
490 | gtk_box_pack_start (GTK_BOX (vbox_check_button), button13, FALSE, FALSE, 0);
491 | gtk_box_pack_start (GTK_BOX (vbox_check_button), button14, FALSE, FALSE, 0);
492 |
493 | /* radio buttons */
494 |
495 | radio1 = gtk_radio_button_new (NULL);
496 | radio2 = gtk_radio_button_new (NULL);
497 |
498 | button15 = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio1), "Radio button1");
499 | button16 = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio1), "Radio button2");
500 | button17 = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio2), "Radio button3");
501 | button18 = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio2), "Radio button4");
502 |
503 | gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button16), TRUE);
504 | gtk_widget_set_sensitive (button17, FALSE);
505 | gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button18), TRUE);
506 | gtk_widget_set_sensitive (button18, FALSE);
507 |
508 | gtk_box_pack_start (GTK_BOX (vbox_radio_button), EMPTY, FALSE, FALSE, 0);
509 | gtk_box_pack_start (GTK_BOX (vbox_radio_button), button15, FALSE, FALSE, 0);
510 | gtk_box_pack_start (GTK_BOX (vbox_radio_button), button16, FALSE, FALSE, 0);
511 | gtk_box_pack_start (GTK_BOX (vbox_radio_button), button17, FALSE, FALSE, 0);
512 | gtk_box_pack_start (GTK_BOX (vbox_radio_button), button18, FALSE, FALSE, 0);
513 |
514 | /* other buttons */
515 |
516 | button1 = gtk_button_new_with_label ("Button1");
517 | button2 = gtk_button_new_with_label ("Button2");
518 | gtk_widget_set_sensitive (button2, FALSE);
519 |
520 | button3 = gtk_toggle_button_new_with_label ("Toggle button1");
521 | button4 = gtk_toggle_button_new_with_label ("Toggle button2");
522 | gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button3), TRUE);
523 | gtk_widget_set_sensitive (button4, FALSE);
524 |
525 | button5 = gtk_font_button_new ();
526 |
527 | gdk_color_parse ("#7796ba", &color);
528 | button6 = gtk_color_button_new_with_color (&color);
529 |
530 | button7 = gtk_file_chooser_button_new ("Select file...", GTK_FILE_CHOOSER_ACTION_OPEN);
531 |
532 | #if GTK_CHECK_VERSION(3,0,0)
533 | button8 = gtk_switch_new ();
534 | gtk_switch_set_active (GTK_SWITCH (button8), TRUE);
535 | #else
536 | menu = gtk_menu_new ();
537 | gtk_menu_shell_append (GTK_MENU_SHELL (menu), gtk_menu_item_new_with_label ("Option menu"));
538 | gtk_menu_shell_append (GTK_MENU_SHELL (menu), gtk_menu_item_new_with_label ("Item"));
539 |
540 | button8 = gtk_option_menu_new ();
541 | gtk_option_menu_set_menu (GTK_OPTION_MENU (button8), menu);
542 | #endif
543 |
544 | button9 = gtk_link_button_new_with_label ("https://github.com/valr/awf", "Link button AWF");
545 | button10 = gtk_scale_button_new (GTK_ICON_SIZE_BUTTON, 1, 10, 1, scale_icons);
546 |
547 | gtk_box_pack_start (GTK_BOX (vbox_other_button), button1, FALSE, FALSE, 0);
548 | gtk_box_pack_start (GTK_BOX (vbox_other_button), button2, FALSE, FALSE, 0);
549 | gtk_box_pack_start (GTK_BOX (vbox_other_button), EMPTY, FALSE, FALSE, 0);
550 | gtk_box_pack_start (GTK_BOX (vbox_other_button), button3, FALSE, FALSE, 0);
551 | gtk_box_pack_start (GTK_BOX (vbox_other_button), button4, FALSE, FALSE, 0);
552 | gtk_box_pack_start (GTK_BOX (vbox_other_button), EMPTY, FALSE, FALSE, 0);
553 | gtk_box_pack_start (GTK_BOX (vbox_other_button), button5, FALSE, FALSE, 0);
554 | gtk_box_pack_start (GTK_BOX (vbox_other_button), button6, FALSE, FALSE, 0);
555 | gtk_box_pack_start (GTK_BOX (vbox_other_button), EMPTY, FALSE, FALSE, 0);
556 | gtk_box_pack_start (GTK_BOX (vbox_other_button), button7, FALSE, FALSE, 0);
557 | gtk_box_pack_start (GTK_BOX (vbox_other_button), button8, FALSE, FALSE, 0);
558 | gtk_box_pack_start (GTK_BOX (vbox_other_button), EMPTY, FALSE, FALSE, 0);
559 | gtk_box_pack_start (GTK_BOX (vbox_other_button), button9, FALSE, FALSE, 0);
560 | gtk_box_pack_start (GTK_BOX (vbox_other_button), button10, FALSE, FALSE, 0);
561 | gtk_box_pack_start (GTK_BOX (vbox_other_button), EMPTY, FALSE, FALSE, 0);
562 |
563 | #if GTK_CHECK_VERSION(3,6,0)
564 | levelbar1 = gtk_level_bar_new ();
565 | gtk_level_bar_set_mode (GTK_LEVEL_BAR (levelbar1), GTK_LEVEL_BAR_MODE_CONTINUOUS);
566 | gtk_level_bar_set_value (GTK_LEVEL_BAR (levelbar1), 0.6);
567 |
568 | levelbar2 = gtk_level_bar_new_for_interval (0, 5);
569 | gtk_level_bar_set_mode (GTK_LEVEL_BAR (levelbar2), GTK_LEVEL_BAR_MODE_DISCRETE);
570 | gtk_level_bar_set_value (GTK_LEVEL_BAR (levelbar2), 2);
571 |
572 | gtk_box_pack_start (GTK_BOX (vbox_other_button), levelbar1, FALSE, FALSE, 0);
573 | gtk_box_pack_start (GTK_BOX (vbox_other_button), levelbar2, FALSE, FALSE, 0);
574 | #endif
575 |
576 | /* progress bars */
577 |
578 | progressbar1 = gtk_progress_bar_new ();
579 | progressbar2 = gtk_progress_bar_new ();
580 | progressbar3 = gtk_progress_bar_new ();
581 | progressbar4 = gtk_progress_bar_new ();
582 |
583 | gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (progressbar1), 0.5);
584 | gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (progressbar2), 0.5);
585 | gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (progressbar3), 0.5);
586 | gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (progressbar4), 0.5);
587 |
588 | #if GTK_CHECK_VERSION(3,0,0)
589 | gtk_orientable_set_orientation (GTK_ORIENTABLE (progressbar1), GTK_ORIENTATION_HORIZONTAL);
590 | gtk_orientable_set_orientation (GTK_ORIENTABLE (progressbar2), GTK_ORIENTATION_HORIZONTAL);
591 | gtk_orientable_set_orientation (GTK_ORIENTABLE (progressbar3), GTK_ORIENTATION_VERTICAL);
592 | gtk_orientable_set_orientation (GTK_ORIENTABLE (progressbar4), GTK_ORIENTATION_VERTICAL);
593 |
594 | gtk_progress_bar_set_inverted (GTK_PROGRESS_BAR (progressbar2), TRUE);
595 | gtk_progress_bar_set_inverted (GTK_PROGRESS_BAR (progressbar4), TRUE);
596 |
597 | gtk_progress_bar_set_show_text (GTK_PROGRESS_BAR (progressbar1), FALSE);
598 | gtk_progress_bar_set_show_text (GTK_PROGRESS_BAR (progressbar3), FALSE);
599 | #else
600 | gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (progressbar1), GTK_PROGRESS_LEFT_TO_RIGHT);
601 | gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (progressbar2), GTK_PROGRESS_RIGHT_TO_LEFT);
602 | gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (progressbar3), GTK_PROGRESS_TOP_TO_BOTTOM);
603 | gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (progressbar4), GTK_PROGRESS_BOTTOM_TO_TOP);
604 |
605 | gtk_progress_bar_set_text (GTK_PROGRESS_BAR (progressbar1), "");
606 | gtk_progress_bar_set_text (GTK_PROGRESS_BAR (progressbar3), "");
607 | #endif
608 |
609 | gtk_box_pack_start (GTK_BOX (vbox_progressbar), progressbar1, FALSE, FALSE, 0);
610 | gtk_box_pack_start (GTK_BOX (vbox_progressbar), progressbar2, FALSE, FALSE, 0);
611 | gtk_box_pack_start (GTK_BOX (hbox_progressbar), progressbar3, FALSE, FALSE, 0);
612 | gtk_box_pack_start (GTK_BOX (hbox_progressbar), progressbar4, FALSE, FALSE, 0);
613 |
614 | /* scales */
615 |
616 | #if GTK_CHECK_VERSION(3,2,0)
617 | scale1 = gtk_scale_new_with_range (GTK_ORIENTATION_VERTICAL, 0, 100, 1);
618 | scale2 = gtk_scale_new_with_range (GTK_ORIENTATION_VERTICAL, 0, 100, 1);
619 | scale3 = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, 0, 100, 1);
620 | scale4 = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, 0, 100, 1);
621 | #else
622 | scale1 = gtk_vscale_new_with_range (0, 100, 1);
623 | scale2 = gtk_vscale_new_with_range (0, 100, 1);
624 | scale3 = gtk_hscale_new_with_range (0, 100, 1);
625 | scale4 = gtk_hscale_new_with_range (0, 100, 1);
626 | #endif
627 | gtk_widget_set_size_request (scale1, -1, 100);
628 | gtk_widget_set_size_request (scale2, -1, 100);
629 | gtk_widget_set_size_request (scale3, 100, -1);
630 | gtk_widget_set_size_request (scale4, 100, -1);
631 |
632 | gtk_scale_set_draw_value (GTK_SCALE (scale1), FALSE);
633 | gtk_scale_set_draw_value (GTK_SCALE (scale2), FALSE);
634 | gtk_scale_set_draw_value (GTK_SCALE (scale3), FALSE);
635 | gtk_scale_set_draw_value (GTK_SCALE (scale4), FALSE);
636 |
637 | gtk_range_set_value (GTK_RANGE (scale1), 50);
638 | gtk_range_set_value (GTK_RANGE (scale2), 50);
639 | gtk_range_set_value (GTK_RANGE (scale3), 50);
640 | gtk_range_set_value (GTK_RANGE (scale4), 50);
641 |
642 | gtk_range_set_inverted (GTK_RANGE (scale2), TRUE);
643 | gtk_range_set_inverted (GTK_RANGE (scale4), TRUE);
644 |
645 | g_signal_connect ((gpointer)scale1, "value_changed", G_CALLBACK (awf_on_scale_value_changed), NULL);
646 | g_signal_connect ((gpointer)scale2, "value_changed", G_CALLBACK (awf_on_scale_value_changed), NULL);
647 | g_signal_connect ((gpointer)scale3, "value_changed", G_CALLBACK (awf_on_scale_value_changed), NULL);
648 | g_signal_connect ((gpointer)scale4, "value_changed", G_CALLBACK (awf_on_scale_value_changed), NULL);
649 |
650 | gtk_box_pack_start (GTK_BOX (hbox_scale), scale1, FALSE, FALSE, 0);
651 | gtk_box_pack_start (GTK_BOX (hbox_scale), scale2, FALSE, FALSE, 0);
652 | gtk_box_pack_start (GTK_BOX (vbox_scale), scale3, FALSE, FALSE, 0);
653 | gtk_box_pack_start (GTK_BOX (vbox_scale), scale4, FALSE, FALSE, 0);
654 |
655 | vbox_buttonbox = gtk_vbutton_box_new ();
656 | gtk_button_box_set_layout (GTK_BUTTON_BOX (vbox_buttonbox), GTK_BUTTONBOX_START);
657 | gtk_box_pack_start (GTK_BOX (vbox_progressbar_scale), vbox_buttonbox, FALSE, FALSE, 0);
658 |
659 | harmony = gtk_check_button_new_with_label ("Move in harmony");
660 | gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (harmony), TRUE);
661 | gtk_box_pack_start (GTK_BOX (vbox_buttonbox), harmony, FALSE, FALSE, 0);
662 |
663 | showtext = gtk_check_button_new_with_label ("Show text");
664 | gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (showtext), FALSE);
665 | gtk_box_pack_start (GTK_BOX (vbox_buttonbox), showtext, FALSE, FALSE, 0);
666 | g_signal_connect (showtext, "clicked", G_CALLBACK(awf_showtext_clicked), NULL);
667 |
668 | /* treeview */
669 |
670 | view1 = gtk_tree_view_new ();
671 |
672 | renderer1 = gtk_cell_renderer_text_new ();
673 | gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (view1), -1, "Column1", renderer1, "text", COLUMN1, NULL);
674 |
675 | renderer1 = gtk_cell_renderer_text_new ();
676 | gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (view1), -1, "Column2", renderer1, "text", COLUMN2, NULL);
677 |
678 | store1 = gtk_list_store_new (NUM_COLS, G_TYPE_STRING, G_TYPE_STRING);
679 |
680 | gtk_list_store_append (store1, &iter);
681 | gtk_list_store_set (store1, &iter, COLUMN1, "Cell1.1", COLUMN2, "Cell1.2", -1);
682 | gtk_list_store_append (store1, &iter);
683 | gtk_list_store_set (store1, &iter, COLUMN1, "Cell2.1", COLUMN2, "Cell2.2", -1);
684 |
685 | model1 = GTK_TREE_MODEL (store1);
686 | gtk_tree_view_set_model (GTK_TREE_VIEW (view1), model1);
687 |
688 | scrolled_window1 = gtk_scrolled_window_new (NULL, NULL);
689 | gtk_widget_set_size_request (scrolled_window1, 200, -1);
690 | gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window1), GTK_POLICY_NEVER, GTK_POLICY_NEVER);
691 | gtk_container_add (GTK_CONTAINER (scrolled_window1), view1);
692 |
693 | gtk_box_pack_start (GTK_BOX (vbox_label_treeview), scrolled_window1, TRUE, TRUE, 0);
694 | gtk_box_pack_start (GTK_BOX (vbox_label_treeview), EMPTY, FALSE, FALSE, 0);
695 |
696 | view2 = gtk_tree_view_new ();
697 |
698 | renderer2 = gtk_cell_renderer_text_new ();
699 | gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (view2), -1, "Longer column1", renderer2, "text", COLUMN1, NULL);
700 |
701 | renderer2 = gtk_cell_renderer_text_new ();
702 | gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (view2), -1, "Longer column2", renderer2, "text", COLUMN2, NULL);
703 |
704 | store2 = gtk_list_store_new (NUM_COLS, G_TYPE_STRING, G_TYPE_STRING);
705 |
706 | gtk_list_store_append (store2, &iter);
707 | gtk_list_store_set (store2, &iter, COLUMN1, "Longer cell1.1", COLUMN2, "Longer cell1.2", -1);
708 | gtk_list_store_append (store2, &iter);
709 | gtk_list_store_set (store2, &iter, COLUMN1, "Longer cell2.1", COLUMN2, "Longer cell2.2", -1);
710 | gtk_list_store_append (store2, &iter);
711 | gtk_list_store_set (store2, &iter, COLUMN1, "Longer cell3.1", COLUMN2, "Longer cell3.2", -1);
712 | gtk_list_store_append (store2, &iter);
713 | gtk_list_store_set (store2, &iter, COLUMN1, "Longer cell4.1", COLUMN2, "Longer cell4.2", -1);
714 |
715 | model2 = GTK_TREE_MODEL (store2);
716 | gtk_tree_view_set_model (GTK_TREE_VIEW (view2), model2);
717 |
718 | scrolled_window2 = gtk_scrolled_window_new (NULL, NULL);
719 | gtk_widget_set_size_request (scrolled_window2, 200, -1);
720 | gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window2), GTK_POLICY_ALWAYS, GTK_POLICY_ALWAYS);
721 | gtk_container_add (GTK_CONTAINER (scrolled_window2), view2);
722 |
723 | gtk_box_pack_start (GTK_BOX (vbox_label_treeview), scrolled_window2, TRUE, TRUE, 0);
724 | gtk_box_pack_start (GTK_BOX (vbox_label_treeview), EMPTY, FALSE, FALSE, 0);
725 |
726 | /* labels, tooltip and spinner */
727 |
728 | label1 = gtk_label_new ("Label1");
729 | label2 = gtk_label_new ("Label2");
730 | gtk_widget_set_sensitive (label2, FALSE);
731 |
732 | tooltip = gtk_label_new ("Tooltip");
733 | gtk_widget_set_tooltip_text (tooltip, "Enjoy a widget factory!");
734 |
735 | spinner = gtk_spinner_new ();
736 | gtk_widget_set_size_request (spinner, 10, 10);
737 | gtk_spinner_start (GTK_SPINNER (spinner));
738 |
739 | gtk_box_pack_start (GTK_BOX (vbox_label_treeview), label1, FALSE, FALSE, 0);
740 | gtk_box_pack_start (GTK_BOX (vbox_label_treeview), label2, FALSE, FALSE, 0);
741 | gtk_box_pack_start (GTK_BOX (vbox_label_treeview), EMPTY, FALSE, FALSE, 0);
742 | gtk_box_pack_start (GTK_BOX (vbox_label_treeview), tooltip, FALSE, FALSE, 0);
743 | gtk_box_pack_start (GTK_BOX (vbox_label_treeview), EMPTY, FALSE, FALSE, 0);
744 | gtk_box_pack_start (GTK_BOX (vbox_label_treeview), spinner, FALSE, FALSE, 0);
745 | gtk_box_pack_start (GTK_BOX (vbox_label_treeview), EMPTY, FALSE, FALSE, 0);
746 |
747 | /* frames */
748 |
749 | frame1 = gtk_frame_new ("Frame (shadow in)");
750 | frame2 = gtk_frame_new ("Frame (shadow out)");
751 | frame3 = gtk_frame_new ("Frame (shadow etched in)");
752 | frame4 = gtk_frame_new ("Frame (shadow etched out)");
753 |
754 | gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_IN);
755 | gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_OUT);
756 | gtk_frame_set_shadow_type (GTK_FRAME (frame3), GTK_SHADOW_ETCHED_IN);
757 | gtk_frame_set_shadow_type (GTK_FRAME (frame4), GTK_SHADOW_ETCHED_OUT);
758 |
759 | gtk_box_pack_start (GTK_BOX (hbox_frame1), frame1, TRUE, TRUE, 0);
760 | gtk_box_pack_start (GTK_BOX (hbox_frame1), frame2, TRUE, TRUE, 0);
761 | gtk_box_pack_start (GTK_BOX (hbox_frame2), frame3, TRUE, TRUE, 0);
762 | gtk_box_pack_start (GTK_BOX (hbox_frame2), frame4, TRUE, TRUE, 0);
763 |
764 | /* notebooks */
765 |
766 | notebook1 = gtk_notebook_new ();
767 | notebook2 = gtk_notebook_new ();
768 | notebook3 = gtk_notebook_new ();
769 | notebook4 = gtk_notebook_new ();
770 |
771 | gtk_notebook_append_page (GTK_NOTEBOOK(notebook1), gtk_label_new (""), gtk_label_new ("tab1"));
772 | gtk_notebook_append_page (GTK_NOTEBOOK(notebook1), gtk_label_new (""), gtk_label_new ("tab2"));
773 | gtk_notebook_append_page (GTK_NOTEBOOK(notebook1), gtk_label_new (""), gtk_label_new ("tab3"));
774 | gtk_notebook_set_tab_pos (GTK_NOTEBOOK(notebook1), GTK_POS_TOP);
775 |
776 | gtk_notebook_append_page (GTK_NOTEBOOK(notebook2), gtk_label_new (""), gtk_label_new ("tab1"));
777 | gtk_notebook_append_page (GTK_NOTEBOOK(notebook2), gtk_label_new (""), gtk_label_new ("tab2"));
778 | gtk_notebook_append_page (GTK_NOTEBOOK(notebook2), gtk_label_new (""), gtk_label_new ("tab3"));
779 | gtk_notebook_set_tab_pos (GTK_NOTEBOOK(notebook2), GTK_POS_BOTTOM);
780 |
781 | gtk_notebook_append_page (GTK_NOTEBOOK(notebook3), gtk_label_new (""), gtk_label_new ("tab1"));
782 | gtk_notebook_append_page (GTK_NOTEBOOK(notebook3), gtk_label_new (""), gtk_label_new ("tab2"));
783 | gtk_notebook_append_page (GTK_NOTEBOOK(notebook3), gtk_label_new (""), gtk_label_new ("tab3"));
784 | gtk_notebook_set_tab_pos (GTK_NOTEBOOK(notebook3), GTK_POS_LEFT);
785 |
786 | gtk_notebook_append_page (GTK_NOTEBOOK(notebook4), gtk_label_new (""), gtk_label_new ("tab1"));
787 | gtk_notebook_append_page (GTK_NOTEBOOK(notebook4), gtk_label_new (""), gtk_label_new ("tab2"));
788 | gtk_notebook_append_page (GTK_NOTEBOOK(notebook4), gtk_label_new (""), gtk_label_new ("tab3"));
789 | gtk_notebook_set_tab_pos (GTK_NOTEBOOK(notebook4), GTK_POS_RIGHT);
790 |
791 | gtk_box_pack_start (GTK_BOX (hbox_notebook1), notebook1, FALSE, TRUE, 0);
792 | gtk_box_pack_start (GTK_BOX (hbox_notebook1), notebook2, FALSE, TRUE, 0);
793 | gtk_box_pack_start (GTK_BOX (hbox_notebook2), notebook3, FALSE, TRUE, 0);
794 | gtk_box_pack_start (GTK_BOX (hbox_notebook2), notebook4, FALSE, TRUE, 0);
795 |
796 | /* status bar */
797 |
798 | gtk_box_pack_start (GTK_BOX (vbox_window), gtk_statusbar_new (), FALSE, FALSE, 0);
799 |
800 | /* refresh on SIGHUP */
801 |
802 | g_unix_signal_add (SIGHUP, awf_sighup_handler, NULL);
803 | g_timeout_add_seconds (1, awf_check_refresh_theme, NULL);
804 |
805 | /* go! */
806 |
807 | switch (argc)
808 | {
809 | case 2:
810 | if (g_slist_find_custom (list_system_theme, (gconstpointer)argv[1], &awf_compare_theme) ||
811 | g_slist_find_custom (list_user_theme, (gconstpointer)argv[1], &awf_compare_theme))
812 | awf_set_theme (argv[1], 0, NULL);
813 |
814 | case 1:
815 | gtk_widget_show_all (window);
816 | gtk_main ();
817 | break;
818 |
819 | default:
820 | g_printf("Usage:\n");
821 | #if GTK_CHECK_VERSION(3,0,0)
822 | g_printf("\t%s\t\t\t%s\n", "awf-gtk3", "Run a widget factory");
823 | g_printf("\t%s %s\t\t%s\n", "awf-gtk3", "", "Run a widget factory with the specified theme");
824 | #else
825 | g_printf("\t%s\t\t\t%s\n", "awf-gtk2", "Run a widget factory");
826 | g_printf("\t%s %s\t\t%s\n", "awf-gtk2", "", "Run a widget factory with the specified theme");
827 | #endif
828 | break;
829 | }
830 |
831 | return 0;
832 | }
833 |
834 | static GSList*
835 | awf_load_theme (gchar *directory)
836 | {
837 | GSList *list = NULL;
838 |
839 | g_return_val_if_fail(directory != NULL, NULL);
840 |
841 | if (g_file_test (directory, G_FILE_TEST_EXISTS)) {
842 |
843 | GError *error = NULL;
844 | GDir *dir = g_dir_open (directory, 0, &error);
845 |
846 | if (dir) {
847 | gchar *theme = g_strdup (g_dir_read_name (dir));
848 |
849 | while (theme) {
850 | gchar *theme_path = g_build_path ("/", directory, g_strstrip (theme), NULL);
851 |
852 | if (g_file_test (theme_path, G_FILE_TEST_IS_DIR)) {
853 | #if GTK_CHECK_VERSION(3,0,0)
854 | gchar *theme_subpath = g_build_path ("/", theme_path, "gtk-3.0", NULL);
855 | #else
856 | gchar *theme_subpath = g_build_path ("/", theme_path, "gtk-2.0", NULL);
857 | #endif
858 | if (g_file_test (theme_subpath, G_FILE_TEST_IS_DIR))
859 | list = g_slist_prepend (list, theme);
860 |
861 | g_free (theme_subpath);
862 | }
863 |
864 | g_free (theme_path);
865 | /* don't free 'theme', it's the data part of GSList elements */
866 |
867 | theme = g_strdup (g_dir_read_name (dir));
868 | }
869 |
870 | g_dir_close (dir);
871 | }
872 |
873 | if (error) {
874 | g_fprintf (stderr, "unable to open directory: %s (%s)\n", directory, error->message);
875 | g_error_free (error); error = NULL;
876 | }
877 | }
878 |
879 | if (list)
880 | list = g_slist_reverse (list);
881 |
882 | return list;
883 | }
884 |
885 | static void
886 | awf_exclude_theme (gpointer theme, gpointer unused)
887 | {
888 | GSList *found_theme = g_slist_find_custom (list_system_theme, (gconstpointer)theme, &awf_compare_theme);
889 |
890 | if (found_theme) {
891 | g_free (found_theme->data);
892 | list_system_theme = g_slist_delete_link (list_system_theme, found_theme);
893 | }
894 | }
895 |
896 | static gint
897 | awf_compare_theme (gconstpointer theme1, gconstpointer theme2)
898 | {
899 | return g_strcmp0 ((gchar*)theme1, (gchar*)theme2);
900 | }
901 |
902 | static void
903 | awf_set_theme (gpointer theme, guint callback_action, GtkWidget *unused)
904 | {
905 | gtk_settings_set_string_property (gtk_settings_get_default (), "gtk-theme-name", (const gchar*)theme, "gtkrc:0");
906 | awf_window_set_title ();
907 | }
908 |
909 | static void
910 | awf_refresh_theme (GtkWidget *widget, gpointer unused)
911 | {
912 | gchar *default_theme = NULL, *current_theme = NULL;
913 |
914 | if (g_slist_find_custom (list_system_theme, "Default", &awf_compare_theme))
915 | default_theme = g_strdup ("Default");
916 | else if (g_slist_find_custom (list_system_theme, "Raleigh", &awf_compare_theme))
917 | default_theme = g_strdup ("Raleigh");
918 |
919 | if (default_theme) {
920 | g_object_get (gtk_settings_get_default (), "gtk-theme-name", ¤t_theme, NULL);
921 |
922 | gtk_settings_set_string_property (gtk_settings_get_default (), "gtk-theme-name", default_theme, NULL);
923 | g_usleep (G_USEC_PER_SEC);
924 | gtk_settings_set_string_property (gtk_settings_get_default (), "gtk-theme-name", (const gchar*)current_theme, NULL);
925 |
926 | g_free (current_theme);
927 | g_free (default_theme);
928 | } else
929 | g_warning ("No default theme found (neither \"Default\" nor \"Raleigh\"), refresh of theme might not work.");
930 | }
931 |
932 | static gboolean
933 | awf_check_refresh_theme (gpointer unused)
934 | {
935 | if (refresh_theme)
936 | {
937 | refresh_theme = FALSE;
938 | awf_refresh_theme(NULL, NULL);
939 | }
940 |
941 | return TRUE;
942 | }
943 |
944 | static gboolean
945 | awf_sighup_handler (gpointer unused)
946 | {
947 | refresh_theme = TRUE;
948 | return G_SOURCE_CONTINUE;
949 | }
950 |
951 | static void
952 | awf_window_set_title (void)
953 | {
954 | gchar *title, *theme;
955 |
956 | g_object_get (gtk_settings_get_default (), "gtk-theme-name", &theme, NULL);
957 |
958 | #if GTK_CHECK_VERSION(3,0,0)
959 | title = g_strjoin (" - ", "A widget factory", theme, "Gtk3", NULL);
960 | #else
961 | title = g_strjoin (" - ", "A widget factory", theme, "Gtk2", NULL);
962 | #endif
963 |
964 | gtk_window_set_title (GTK_WINDOW (window), title);
965 |
966 | g_free (title);
967 | g_free (theme);
968 | }
969 |
970 | static GtkWidget*
971 | awf_build_menu (GtkWidget *widget)
972 | {
973 | GtkAccelGroup *ag;
974 | GtkWidget *menubar;
975 | GtkWidget *menu;
976 | GtkWidget *menuitem;
977 | GtkWidget *menuimage;
978 | guint accelerator_key;
979 | GdkModifierType accelerator_mods;
980 | gint i;
981 |
982 | struct _MenuInfo {
983 | gint type;
984 | gchar mnemonic[32];
985 | gchar accelerator[32];
986 | gchar *image;
987 | void (*callback)(gpointer, guint, GtkWidget*);
988 | } info[9] = {
989 | { 0, "_System theme", "s", NULL , NULL },
990 | { 1, "" , "" , NULL , NULL },
991 | { 0, "_User theme" , "u", NULL , NULL },
992 | { 2, "" , "" , NULL , NULL },
993 | { 0, "_Test menu" , "t", NULL , NULL },
994 | { 3, "_Item1" , "i", GTK_STOCK_OPEN, NULL },
995 | { 3, "Item2" , "" , GTK_STOCK_SAVE, NULL },
996 | { 4, "" , "" , NULL , NULL },
997 | { 3, "Item3" , "" , NULL , NULL }
998 | };
999 |
1000 | ag = gtk_accel_group_new ();
1001 | gtk_window_add_accel_group (GTK_WINDOW (widget), ag);
1002 |
1003 | menubar = gtk_menu_bar_new ();
1004 |
1005 | for (i = 0; i < 9; i++) {
1006 | switch (info[i].type) {
1007 | case 0:
1008 | menu = gtk_menu_new ();
1009 | gtk_widget_show (menu);
1010 |
1011 | menuitem = gtk_menu_item_new_with_mnemonic (info[i].mnemonic);
1012 | gtk_menu_item_set_submenu (GTK_MENU_ITEM(menuitem), menu);
1013 |
1014 | gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
1015 | gtk_widget_show (menuitem);
1016 | break;
1017 |
1018 | case 1:
1019 | g_slist_foreach (list_system_theme, awf_add_menu_item, menu);
1020 | break;
1021 |
1022 | case 2:
1023 | g_slist_foreach (list_user_theme, awf_add_menu_item, menu);
1024 | break;
1025 |
1026 | case 3:
1027 | if (info[i].image) {
1028 | menuitem = gtk_image_menu_item_new_with_mnemonic (info[i].mnemonic);
1029 | menuimage = gtk_image_new_from_stock (info[i].image, GTK_ICON_SIZE_MENU);
1030 | gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), menuimage);
1031 | } else
1032 | menuitem = gtk_menu_item_new_with_mnemonic (info[i].mnemonic);
1033 |
1034 | gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
1035 | gtk_widget_show (menuitem);
1036 |
1037 | gtk_accelerator_parse (info[i].accelerator, &accelerator_key, &accelerator_mods);
1038 |
1039 | if (accelerator_key && accelerator_mods)
1040 | gtk_widget_add_accelerator(menuitem, "activate", ag,
1041 | accelerator_key, accelerator_mods, GTK_ACCEL_VISIBLE);
1042 |
1043 | if (info[i].callback)
1044 | g_signal_connect_swapped (G_OBJECT(menuitem), "activate",
1045 | G_CALLBACK(info[i].callback), widget);
1046 | break;
1047 |
1048 | case 4:
1049 | menuitem = gtk_separator_menu_item_new ();
1050 |
1051 | gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
1052 | gtk_widget_show (menuitem);
1053 | }
1054 | }
1055 |
1056 | return menubar;
1057 | }
1058 |
1059 | static void
1060 | awf_add_menu_item (gpointer theme, gpointer menu)
1061 | {
1062 | GtkWidget *menuitem = gtk_menu_item_new_with_mnemonic ((const gchar*)theme);
1063 |
1064 | gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
1065 | gtk_widget_show (menuitem);
1066 |
1067 | g_signal_connect_swapped (G_OBJECT(menuitem), "activate", G_CALLBACK(awf_set_theme), theme);
1068 | }
1069 |
1070 | static void
1071 | awf_run_me (GtkWidget *widget, gpointer unused)
1072 | {
1073 | gchar *awf;
1074 |
1075 | #if GTK_CHECK_VERSION(3,0,0)
1076 | awf = g_find_program_in_path ("awf-gtk2");
1077 | #else
1078 | awf = g_find_program_in_path ("awf-gtk3");
1079 | #endif
1080 |
1081 | if (awf) {
1082 | GError *error = NULL;
1083 | gchar *theme, *awf_with_theme;
1084 | gint argp; gchar **argv;
1085 | gchar *display;
1086 |
1087 | g_object_get (gtk_settings_get_default (), "gtk-theme-name", &theme, NULL);
1088 | awf_with_theme = g_strjoin (" ", awf, theme, NULL);
1089 | g_shell_parse_argv (awf_with_theme, &argp, &argv, &error);
1090 |
1091 | if (error) {
1092 | GtkWidget *dialog = gtk_message_dialog_new (GTK_WINDOW (window),
1093 | GTK_DIALOG_DESTROY_WITH_PARENT,
1094 | GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
1095 | "Unable to parse command: %s (%s)", awf_with_theme, error->message);
1096 |
1097 | gtk_dialog_run (GTK_DIALOG (dialog));
1098 | gtk_widget_destroy (dialog);
1099 |
1100 | g_strfreev (argv);
1101 | g_free (awf_with_theme);
1102 | g_free (theme);
1103 | g_free (awf);
1104 | g_error_free (error); error = NULL;
1105 | return;
1106 | }
1107 |
1108 | display = gdk_screen_make_display_name (gtk_window_get_screen (GTK_WINDOW (window)));
1109 |
1110 | g_spawn_async (NULL, argv, NULL,
1111 | G_SPAWN_SEARCH_PATH | G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_STDERR_TO_DEV_NULL,
1112 | awf_run_me_set_environment, display, NULL, &error);
1113 |
1114 | if (error) {
1115 | GtkWidget *dialog = gtk_message_dialog_new (GTK_WINDOW (window),
1116 | GTK_DIALOG_DESTROY_WITH_PARENT,
1117 | GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
1118 | "Unable to spawn command: %s (%s)", awf_with_theme, error->message);
1119 |
1120 | gtk_dialog_run (GTK_DIALOG (dialog));
1121 | gtk_widget_destroy (dialog);
1122 |
1123 | g_error_free (error); error = NULL;
1124 | }
1125 |
1126 | g_free (display);
1127 | g_strfreev (argv);
1128 | g_free (awf_with_theme);
1129 | g_free (theme);
1130 | g_free (awf);
1131 | } else {
1132 | GtkWidget *dialog = gtk_message_dialog_new (GTK_WINDOW (window),
1133 | GTK_DIALOG_DESTROY_WITH_PARENT,
1134 | GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
1135 | #if GTK_CHECK_VERSION(3,0,0)
1136 | "Unable to find awf-gtk2 in path");
1137 | #else
1138 | "Unable to find awf-gtk3 in path");
1139 | #endif
1140 |
1141 | gtk_dialog_run (GTK_DIALOG (dialog));
1142 | gtk_widget_destroy (dialog);
1143 | }
1144 | }
1145 |
1146 | static void
1147 | awf_run_me_set_environment (gpointer display)
1148 | {
1149 | g_setenv("DISPLAY", display, TRUE);
1150 | }
1151 |
1152 | static void
1153 | awf_on_scale_value_changed (GtkRange *range, gpointer unused)
1154 | {
1155 | gdouble value;
1156 |
1157 | if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (harmony)))
1158 | return;
1159 |
1160 | value = gtk_range_get_value (range);
1161 |
1162 | if (scale1 != (GtkWidget*)range) gtk_range_set_value (GTK_RANGE (scale1), value);
1163 | if (scale2 != (GtkWidget*)range) gtk_range_set_value (GTK_RANGE (scale2), value);
1164 | if (scale3 != (GtkWidget*)range) gtk_range_set_value (GTK_RANGE (scale3), value);
1165 | if (scale4 != (GtkWidget*)range) gtk_range_set_value (GTK_RANGE (scale4), value);
1166 |
1167 | gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (progressbar1), value / 100.0);
1168 | gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (progressbar2), value / 100.0);
1169 | gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (progressbar3), value / 100.0);
1170 | gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (progressbar4), value / 100.0);
1171 |
1172 | if (value >= 50.0)
1173 | gtk_spinner_start (GTK_SPINNER (spinner));
1174 | else
1175 | gtk_spinner_stop (GTK_SPINNER (spinner));
1176 |
1177 | if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (showtext))) {
1178 | #if !GTK_CHECK_VERSION(3,0,0)
1179 | gchar *progress_text;
1180 |
1181 | progress_text = g_strdup_printf ("%i %%", (int)value);
1182 |
1183 | gtk_progress_bar_set_text (GTK_PROGRESS_BAR (progressbar1), progress_text);
1184 | gtk_progress_bar_set_text (GTK_PROGRESS_BAR (progressbar3), progress_text);
1185 |
1186 | g_free (progress_text);
1187 | #endif
1188 | }
1189 | }
1190 |
1191 | static void
1192 | awf_showtext_clicked (GtkWidget *widget, gpointer unused)
1193 | {
1194 | gdouble progress_value;
1195 | gchar *progress_text;
1196 |
1197 | if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (showtext))) {
1198 | #if GTK_CHECK_VERSION(3,0,0)
1199 | gtk_progress_bar_set_show_text (GTK_PROGRESS_BAR (progressbar1), TRUE);
1200 | gtk_progress_bar_set_show_text (GTK_PROGRESS_BAR (progressbar3), TRUE);
1201 | #else
1202 | progress_value = gtk_range_get_value (GTK_RANGE (scale1));
1203 | progress_text = g_strdup_printf ("%i %%", (int)progress_value);
1204 |
1205 | gtk_progress_bar_set_text (GTK_PROGRESS_BAR (progressbar1), progress_text);
1206 | gtk_progress_bar_set_text (GTK_PROGRESS_BAR (progressbar3), progress_text);
1207 |
1208 | g_free (progress_text);
1209 | #endif
1210 | } else {
1211 | #if GTK_CHECK_VERSION(3,0,0)
1212 | gtk_progress_bar_set_show_text (GTK_PROGRESS_BAR (progressbar1), FALSE);
1213 | gtk_progress_bar_set_show_text (GTK_PROGRESS_BAR (progressbar3), FALSE);
1214 | #else
1215 | gtk_progress_bar_set_text (GTK_PROGRESS_BAR (progressbar1), "");
1216 | gtk_progress_bar_set_text (GTK_PROGRESS_BAR (progressbar3), "");
1217 | #endif
1218 | }
1219 | }
1220 |
--------------------------------------------------------------------------------
/src/gtk_empty.c:
--------------------------------------------------------------------------------
1 | /*
2 | * awf : A Widget Factory
3 | *
4 | * A theme preview application for gtk2 and gtk3.
5 | *
6 | * Copyright (C) 2011, Valère Monseur (valere dot monseur at ymail dot com)
7 | *
8 | * This file is part of awf.
9 | *
10 | * awf is free software: you can redistribute it and/or modify
11 | * it under the terms of the GNU General Public License as published by
12 | * the Free Software Foundation, either version 3 of the License, or
13 | * (at your option) any later version.
14 | *
15 | * awf is distributed in the hope that it will be useful,
16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 | * GNU General Public License for more details.
19 | *
20 | * You should have received a copy of the GNU General Public License
21 | * along with awf. If not, see .
22 | */
23 |
24 | #include "gtk_empty.h"
25 |
26 | /*
27 | * declarations
28 | */
29 |
30 | G_DEFINE_TYPE (GtkEmpty, gtk_empty, GTK_TYPE_DRAWING_AREA);
31 |
32 | static void gtk_empty_class_init (GtkEmptyClass *class);
33 | static void gtk_empty_init (GtkEmpty *empty);
34 | #if GTK_CHECK_VERSION(3,0,0)
35 | static void gtk_empty_get_preferred_width (GtkWidget *widget, gint *minimal_width, gint *natural_width);
36 | static void gtk_empty_get_preferred_height (GtkWidget *widget, gint *minimal_height, gint *natural_height);
37 | #else
38 | static void gtk_empty_size_request (GtkWidget *widget, GtkRequisition *requisition);
39 | #endif
40 |
41 | /*
42 | * definitions
43 | */
44 |
45 | GtkWidget*
46 | gtk_empty_new (void)
47 | {
48 | return g_object_new (GTK_TYPE_EMPTY, NULL);
49 | }
50 |
51 | static void
52 | gtk_empty_class_init (GtkEmptyClass *class)
53 | {
54 | GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
55 |
56 | #if GTK_CHECK_VERSION(3,0,0)
57 | widget_class->get_preferred_width = gtk_empty_get_preferred_width;
58 | widget_class->get_preferred_height = gtk_empty_get_preferred_height;
59 | #else
60 | widget_class->size_request = gtk_empty_size_request;
61 | #endif
62 | }
63 |
64 | static void
65 | gtk_empty_init (GtkEmpty *empty)
66 | {
67 | }
68 |
69 | #if GTK_CHECK_VERSION(3,0,0)
70 | static void
71 | gtk_empty_get_preferred_width (GtkWidget *widget, gint *minimal_width, gint *natural_width)
72 | {
73 | *minimal_width = *natural_width = 10;
74 | }
75 |
76 | static void
77 | gtk_empty_get_preferred_height (GtkWidget *widget, gint *minimal_height, gint *natural_height)
78 | {
79 | *minimal_height = *natural_height = 10;
80 | }
81 | #else
82 | static void
83 | gtk_empty_size_request (GtkWidget *widget, GtkRequisition *requisition)
84 | {
85 | requisition->width = 10;
86 | requisition->height = 10;
87 | }
88 | #endif
89 |
--------------------------------------------------------------------------------
/src/gtk_empty.h:
--------------------------------------------------------------------------------
1 | /*
2 | * awf : A Widget Factory
3 | *
4 | * A theme preview application for gtk2 and gtk3.
5 | *
6 | * Copyright (C) 2011, Valère Monseur (valere dot monseur at ymail dot com)
7 | *
8 | * This file is part of awf.
9 | *
10 | * awf is free software: you can redistribute it and/or modify
11 | * it under the terms of the GNU General Public License as published by
12 | * the Free Software Foundation, either version 3 of the License, or
13 | * (at your option) any later version.
14 | *
15 | * awf is distributed in the hope that it will be useful,
16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 | * GNU General Public License for more details.
19 | *
20 | * You should have received a copy of the GNU General Public License
21 | * along with awf. If not, see .
22 | */
23 |
24 | #ifndef __GTK_EMPTY_H__
25 | #define __GTK_EMPTY_H__
26 |
27 | #include
28 |
29 | #define GTK_TYPE_EMPTY (gtk_empty_get_type ())
30 | #define GTK_EMPTY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_EMPTY, GtkEmpty))
31 | #define GTK_EMPTY_CLASS(obj) (G_TYPE_CHECK_CLASS_CAST ((obj), GTK_EMPTY, GtkEmptyClass))
32 | #define GTK_IS_EMPTY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_EMPTY))
33 | #define GTK_IS_EMPTY_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE ((obj), GTK_TYPE_EMPTY))
34 | #define GTK_EMPTY_GET_CLASS (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_EMPTY, GtkEmptyClass))
35 |
36 | typedef struct _GtkEmpty GtkEmpty;
37 | typedef struct _GtkEmptyClass GtkEmptyClass;
38 |
39 | struct _GtkEmpty
40 | {
41 | GtkDrawingArea parent;
42 | };
43 |
44 | struct _GtkEmptyClass
45 | {
46 | GtkDrawingAreaClass parent_class;
47 | };
48 |
49 | GtkWidget* gtk_empty_new (void);
50 |
51 | #endif /* __GTK_EMPTY_H__ */
52 |
--------------------------------------------------------------------------------