/
index-3.html
1660 lines (1620 loc) · 186 KB
/
index-3.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html prefix="
" lang="de">
<head>
<meta charset="utf-8">
<meta name="description" content="Gute Absichten">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Merge and Destroy · Merge and Destroy (Ältere Einträge, Seite 3) </title>
<link href="assets/css/all.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" href="http://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700%7CAbril+Fatface">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/fork-awesome@1.1.7/css/fork-awesome.min.css" integrity="sha256-gsmEoJAws/Kd3CjuOQzLie5Q3yshhvmo7YNtBG7aaEY=" crossorigin="anonymous">
<meta content="#5670d4" name="theme-color">
<link rel="alternate" type="application/rss+xml" title="RSS (de)" href="rss.xml">
<link rel="alternate" type="application/rss+xml" title="RSS (en)" href="en/rss.xml">
<link rel="canonical" href="https://encarsia.github.io/index-3.html">
<link rel="icon" href="files/favicon.ico" sizes="48x48">
<link rel="prev" href="index-4.html" type="text/html">
<link rel="next" href="index-2.html" type="text/html">
<!--[if lt IE 9]><script src="assets/js/html5.js"></script><![endif]-->
</head>
<body class="theme-custom">
<a href="#content" class="sr-only sr-only-focusable">Springe zum Hauptinhalt</a>
<div class="hsidebar">
<div class="container sidebar-sticky">
<nav id="menu" role="navigation" class="sidebar-nav"><a class="sidebar-nav-item" href="index.html" title="Home"><i class="fa fa-home"></i>Home</a>
<a class="sidebar-nav-item" href="posts/tutorial-reihe-glade" title="Tutorials"><i class="fa fa-lightbulb-o"></i>Tutorials</a>
<a class="sidebar-nav-item" href="projects/index.html" title="Projects"><i class="fa fa-wrench"></i>Projects</a>
<a class="sidebar-nav-item" href="https://octodon.social/@encarsia" title="Mastodon"><i class="fa fa-mastodon"></i>Mastodon</a>
<a class="sidebar-nav-item" href="https://pixelfed.social/encarsia" title="Pixelfed"><i class="fa fa-pixelfed"></i>Pixelfed</a>
<a class="sidebar-nav-item" href="https://twitter.com/encarsia_" title="Twitter"><i class="fa fa-twitter"></i>Twitter</a>
<a class="sidebar-nav-item" href="https://github.com/encarsia" title="GitHub"><i class="fa fa-github"></i>GitHub</a>
<a class="sidebar-nav-item" href="pages/gplus_the_end" title="Google+"><i class="fa fa-google-plus-official"></i>Google+</a>
<a class="sidebar-nav-item" href="categories/index.html" title="Tags"><i class="fa fa-tags"></i>Tags</a>
<a class="sidebar-nav-item" href="archive.html" title="Archive"><i class="fa fa-folder-open"></i>Archive</a>
<a class="sidebar-nav-item" href="rss.xml" title="RSS"><i class="fa fa-feed"></i>RSS</a>
</nav><footer id="footer"><span class="copyright">
<hr>
Contents © 2021 <a href="mailto:An.Ke@bahnfreikartoffelbrei.de">Anke (encarsia)</a>
<br>
Powered by <a href="http://getnikola.com">Nikola</a> -
Hybrid theme
<a rel="me" href="https://octodon.social/@encarsia"></a>
</span>
</footer>
</div>
</div>
<div class="content container" id="content">
<div class="post">
<article class="post h-entry post-text"><header><h1 class="post-title p-name"><a href="posts/non-konsole/" class="u-url">NoN: Konsoledierung</a></h1>
<div class="metadata">
<p class="dateline">
<i class="fa fa-clock-o"></i> <time class="published dt-published" datetime="2017-10-05T22:45:19+02:00" title="2017-10-05 22:45">2017-10-05 22:45</time>
| <i class="fa fa-comment"></i> <a href="posts/non-konsole/#disqus_thread" data-disqus-identifier="cache/posts/non-konsoledierung.html">Kommentare</a>
</p>
</div>
</header><div class="p-summary entry-summary">
<div>
<p><strong>Knights of Ni - jetzt wird's schick</strong></p>
<p>Einmal eingerichtet, benötigt man für das Befeuern einer Nikola-angetriebenen Seite nur einen Dateimanager, einen Editor, ein Terminal und normalerweise zwei Kommandos.</p>
<p>Und weil ich es gern bequem habe, habe ich mir <a class="reference external" href="https://github.com/encarsia/non">etwas Unterstützung</a> dafür gebastelt.</p>
<div class="section" id="was-bisher-geschah">
<h2>Was bisher geschah</h2>
<p>Die per Button aufgerufenen Nikola-Kommandos wurden bisher folgendermaßen verarbeitet:</p>
<blockquote>
<ul class="simple">
<li><p><code class="docutils literal">nikola build</code> lief im Hintergrund als subprocess.run(cmd)</p></li>
<li><p><code class="docutils literal">nikola github_deploy</code> wurde im separaten Terminalfenster ausgeführt; dieses wurde nach der erfolgreichen Ausführung wieder geschlossen</p></li>
</ul>
</blockquote>
</div>
<div class="section" id="und-das-soll-jetzt-alles-vorbei-sein">
<h2>Und das soll jetzt alles vorbei sein?</h2>
<blockquote class="epigraph">
<p>Neu ist immer besser.</p>
<p class="attribution">—Barney Stinson</p>
</blockquote>
<p>Die Oberfläche ist nun per <a class="reference external" href="https://lazka.github.io/pgi-docs/Gtk-3.0/classes/Stack.html">Gtk.Stack</a> zweigeteilt. Per Gtk.StackSwitcher in der Headerbar lässt sich zwischen der normalen Oberfläche und einem Terminal hin- und herwechseln.</p>
<p>Dies hat mehrere Eigenschaften und Vorteile:</p>
<blockquote>
<ul class="simple">
<li><p>Das Teminal öffnet sich im aktuellen Verzeichnis der Nikola-Instanz.</p></li>
<li><p>Das Terminal kann beliebig verwendet werden.</p></li>
<li><p>Beim <code class="docutils literal">exit</code> wird es nur resettet.</p></li>
<li><p><code class="docutils literal">build</code> und <code class="docutils literal">github_deploy</code> werden in diesem Terminal ausgeführt, wenn sie über die Oberfläche (Buttons) gestartet werden.</p></li>
<li><p>Beim Ausführen über die Buttons wechselt der Focus auf das Terminal und nach Beenden des Tasks wieder zurück zur Oberfläche. Mit super Überblende (aktivierte Animationen erforderlich)!</p></li>
<li><p>Optisch aufgeräumter, da kein separates Fenster mehr benötigt wird.</p></li>
</ul>
</blockquote>
<img alt="/images/non/non_term.gif" src="images/non/non_term.gif">
</div>
<div class="section" id="chronik">
<h2>Chronik</h2>
<blockquote>
<ul class="simple">
<li><p><a class="reference external" href="posts/non-fortschritte/">NoN: Fortschritte</a></p></li>
<li><p><a class="reference external" href="posts/neues-projekt-knights-of-ni/">Neues Projekt: Knights of Ni</a></p></li>
</ul>
</blockquote>
<a class="discuss-on-gplus" href="https://plus.google.com/105146352752269764996/posts/6ER8kNNkCx9">Kommentieren auf <i class="fa fa-google-plus"></i></a>
</div>
</div>
</div>
</article><article class="post h-entry post-text"><header><h1 class="post-title p-name"><a href="posts/vlc-player/" class="u-url">Mediaplayer mit VLC</a></h1>
<div class="metadata">
<p class="dateline">
<i class="fa fa-clock-o"></i> <time class="published dt-published" datetime="2017-09-22T19:28:18+02:00" title="2017-09-22 19:28">2017-09-22 19:28</time>
|
<i class="fa fa-language"></i> Auch verfügbar in:
<a href="en/posts/vlc-player/" rel="alternate" hreflang="en">English</a>
| <i class="fa fa-comment"></i> <a href="posts/vlc-player/#disqus_thread" data-disqus-identifier="cache/posts/mediaplayer-mit-vlc.html">Kommentare</a>
</p>
</div>
</header><div class="p-summary entry-summary">
<div>
<div class="contents pull-right topic" id="inhalt">
<p class="topic-title">Inhalt</p>
<ul class="simple">
<li><p><a class="reference internal" href="posts/vlc-player/#libvlc" id="id5">LibVLC</a></p></li>
<li><p><a class="reference internal" href="posts/vlc-player/#glade" id="id6">Glade</a></p></li>
<li>
<p><a class="reference internal" href="posts/vlc-player/#python" id="id7">Python</a></p>
<ul>
<li><p><a class="reference internal" href="posts/vlc-player/#player-einrichten" id="id8">Player einrichten</a></p></li>
<li><p><a class="reference internal" href="posts/vlc-player/#medium-abspielen" id="id9">Medium abspielen</a></p></li>
<li><p><a class="reference internal" href="posts/vlc-player/#positionsanzeige" id="id10">Positionsanzeige</a></p></li>
</ul>
</li>
<li><p><a class="reference internal" href="posts/vlc-player/#moglichkeiten-und-limitierungen" id="id11">Möglichkeiten und Limitierungen</a></p></li>
<li><p><a class="reference internal" href="posts/vlc-player/#links" id="id12">Links</a></p></li>
<li>
<p><a class="reference internal" href="posts/vlc-player/#listings" id="id13">Listings</a></p>
<ul>
<li><p><a class="reference internal" href="posts/vlc-player/#id1" id="id14">Python</a></p></li>
<li><p><a class="reference internal" href="posts/vlc-player/#id2" id="id15">Glade</a></p></li>
<li><p><a class="reference internal" href="posts/vlc-player/#beispieldateien" id="id16">Beispieldateien</a></p></li>
</ul>
</li>
</ul>
</div>
<p><strong>Mediaplayer mit LibVLC realisieren</strong></p>
<p>VLC ist nicht nur ein Multimediaplayer, sondern auch ein Framework, zu dem Python-Bindings verfügbar sind. In diesem Beispiel wird analog zum <a class="reference external" href="posts/gst-player/">GStreamer-Artikel</a> ein einfacher Mediaplayer mittels LibVLC umgesetzt.</p>
<a class="reference external image-reference" href="images/20_vlc_player.png"><img alt="/images/20_vlc_player.thumbnail.png" src="images/20_vlc_player.thumbnail.png"></a>
<div class="section" id="libvlc">
<h2><a class="toc-backref" href="posts/vlc-player/#id5">LibVLC</a></h2>
<p>Voraussetzung für die Verwendung ist die Installation der Python-Bindings. Diese sind unter der Paketbezeichnung <code class="docutils literal"><span class="pre">python-vlc</span></code> zu finden.</p>
</div>
<div class="section" id="glade">
<h2><a class="toc-backref" href="posts/vlc-player/#id6">Glade</a></h2>
<blockquote>
<ul class="simple">
<li><p><strong>Darstellungsbereich der Mediendatei:</strong> Widget <em>Gtk.DrawingArea</em></p></li>
<li><p><strong>Steuerungselemente:</strong> Vor-/Zurückspulen (<em>Gtk.Button</em>), Pause (<em>Gtk.Togglebutton</em>)</p></li>
<li><p><strong>Medienauswahl:</strong> Buttons, um Video- oder Bilddatei anzuzeigen</p></li>
<li><p><strong>Playback manipulieren:</strong> Buttons zum Stummschalten und Drehen des Videos</p></li>
</ul>
</blockquote>
</div>
<div class="section" id="python">
<h2><a class="toc-backref" href="posts/vlc-player/#id7">Python</a></h2>
<div class="section" id="player-einrichten">
<h3><a class="toc-backref" href="posts/vlc-player/#id8">Player einrichten</a></h3>
<p>Der VLC-Player wird initiiert, sobald das dazugehörige Widget, in diesem Fall also <em>Gtk.DrawingArea</em> gezeichnet wird. Dazu wird das Signal <code class="docutils literal">realize</code> genutzt, das grundsätzlich für die Klasse der Widgets verfügbar ist.</p>
<pre class="code python"><a name="rest_code_a5662367bdbc42a7b76d5ec9486a1f5d-1"></a><span class="n">vlcOptions</span> <span class="o">=</span> <span class="s2">"--no-xlib"</span>
<a name="rest_code_a5662367bdbc42a7b76d5ec9486a1f5d-2"></a><span class="n">win_id</span> <span class="o">=</span> <span class="n">widget</span><span class="o">.</span><span class="n">get_window</span><span class="p">()</span><span class="o">.</span><span class="n">get_xid</span><span class="p">()</span>
<a name="rest_code_a5662367bdbc42a7b76d5ec9486a1f5d-3"></a><span class="n">setup_player</span><span class="p">(</span><span class="n">vlcOptions</span><span class="p">)</span>
<a name="rest_code_a5662367bdbc42a7b76d5ec9486a1f5d-4"></a><span class="n">vlcInstance</span> <span class="o">=</span> <span class="n">vlc</span><span class="o">.</span><span class="n">Instance</span><span class="p">(</span><span class="n">options</span><span class="p">)</span>
<a name="rest_code_a5662367bdbc42a7b76d5ec9486a1f5d-5"></a><span class="n">player</span> <span class="o">=</span> <span class="n">vlcInstance</span><span class="o">.</span><span class="n">media_player_new</span><span class="p">()</span>
<a name="rest_code_a5662367bdbc42a7b76d5ec9486a1f5d-6"></a><span class="n">player</span><span class="o">.</span><span class="n">set_xwindow</span><span class="p">(</span><span class="n">win_id</span><span class="p">)</span>
</pre>
<p>Als Optionen können Kommandozeilenoptionen von VLC übergeben werden. Im Beispiel wird beim Klick auf den "Rotate"-Button das Bild um 180° gedreht. Der Player wird erneut initiiert und die zusätzliche Option <code class="docutils literal"><span class="pre">--video-filter=transform{type=180}</span></code> übergeben.</p>
</div>
<div class="section" id="medium-abspielen">
<h3><a class="toc-backref" href="posts/vlc-player/#id9">Medium abspielen</a></h3>
<p>Wie auch der GStreamer-Player kann der VLC-Player viele Video-/Audio- oder Bild-Formate anzeigen bzw. abspielen.</p>
<pre class="code python"><a name="rest_code_db4a77e58d6d494f8090664b01af0e30-1"></a><span class="n">player</span><span class="o">.</span><span class="n">set_mrl</span><span class="p">(</span><span class="n">file_url</span><span class="p">)</span>
<a name="rest_code_db4a77e58d6d494f8090664b01af0e30-2"></a><span class="c1"># Datei abspielen</span>
<a name="rest_code_db4a77e58d6d494f8090664b01af0e30-3"></a><span class="n">player</span><span class="o">.</span><span class="n">play</span><span class="p">()</span>
<a name="rest_code_db4a77e58d6d494f8090664b01af0e30-4"></a><span class="c1"># Pause/Play-Schalter</span>
<a name="rest_code_db4a77e58d6d494f8090664b01af0e30-5"></a><span class="n">player</span><span class="o">.</span><span class="n">pause</span><span class="p">()</span>
</pre>
</div>
<div class="section" id="positionsanzeige">
<h3><a class="toc-backref" href="posts/vlc-player/#id10">Positionsanzeige</a></h3>
<p>Die Umsetzung des Fortschrittsbalkens und die Nutzung als Schiebereglers gestaltet sich ziemlich einfach.</p>
<pre class="code python"><a name="rest_code_dc1a8acbf1cd45b08bb93db2d6e6debb-1"></a><span class="c1"># Position abfragen</span>
<a name="rest_code_dc1a8acbf1cd45b08bb93db2d6e6debb-2"></a><span class="n">player</span><span class="o">.</span><span class="n">get_position</span><span class="p">()</span>
<a name="rest_code_dc1a8acbf1cd45b08bb93db2d6e6debb-3"></a><span class="c1"># Position bestimmen</span>
<a name="rest_code_dc1a8acbf1cd45b08bb93db2d6e6debb-4"></a><span class="n">player</span><span class="o">.</span><span class="n">set_position</span><span class="p">(</span><span class="n">val</span><span class="p">)</span>
</pre>
<p>Der Wertebereich liegt dabei zwischen 0 und 1. Das Problem bei diesen Funktionen ist, dass sie relativ ressourcenintensiv arbeiten und das Playback mitunter verruckelt ist.
Die Lösung im hiesigen Beispiel besteht darin, <code class="docutils literal">get_position</code>-Abfragen zu umgehen, indem die Regler-Position herangezogen wird.</p>
</div>
</div>
<div class="section" id="moglichkeiten-und-limitierungen">
<h2><a class="toc-backref" href="posts/vlc-player/#id11">Möglichkeiten und Limitierungen</a></h2>
<p>Die Nutzung der LibVLC-Python-Bindings erweist sich als einfach und angesichts der GStreamer-Umsetzung als geradezu intuitiv. Auch das <a class="reference external" href="https://plus.google.com/105146352752269764996/posts/jDcBAztBxM9">"Headerbar-Problem"</a> besteht nicht.</p>
<p>Auf der anderen Seite greift man hier auf großes Projekt zurück, man muss VLC und die Python-Bindings installiert haben anstatt einfach das GStreamer-Modul aus dem GObject Introspection-Repository zu verwenden. Auch ist im Test der Ressourcenverbrauch von VLC gegenüber GStreamer größer.</p>
</div>
<div class="section" id="links">
<h2><a class="toc-backref" href="posts/vlc-player/#id12">Links</a></h2>
<blockquote>
<ul class="simple">
<li><p><a class="reference external" href="https://www.olivieraubert.net/vlc/python-ctypes/doc/">LibVLC Python bindings documentation</a></p></li>
<li><p><a class="reference external" href="https://www.codementor.io/princerapa/python-media-player-vlc-gtk-favehuy2b">How to Build a Python Media Player using LibVLC and GTK+</a></p></li>
<li><p><a class="reference external" href="https://superuser.com/questions/650291/how-to-get-video-duration-in-seconds">How to get video duration in seconds?</a></p></li>
<li><p><a class="reference external" href="posts/gst-player/">Mediaplayer mit GStreamer</a></p></li>
<li><p><a class="reference external" href="posts/gtksink-player/">Mediaplayer mit GStreamer (gtksink-Edition)</a></p></li>
</ul>
</blockquote>
<p class="more"><a href="posts/vlc-player/">Weiterlesen…</a></p>
</div>
</div>
</div>
</article><article class="post h-entry post-text"><header><h1 class="post-title p-name"><a href="posts/gst-player/" class="u-url">Mediaplayer mit GStreamer</a></h1>
<div class="metadata">
<p class="dateline">
<i class="fa fa-clock-o"></i> <time class="published dt-published" datetime="2017-09-21T15:19:40+02:00" title="2017-09-21 15:19">2017-09-21 15:19</time>
|
<i class="fa fa-language"></i> Auch verfügbar in:
<a href="en/posts/gst-player/" rel="alternate" hreflang="en">English</a>
| <i class="fa fa-comment"></i> <a href="posts/gst-player/#disqus_thread" data-disqus-identifier="cache/posts/mediaplayer-mit-gstreamer.html">Kommentare</a>
</p>
</div>
</header><div class="p-summary entry-summary">
<div>
<div class="contents pull-right topic" id="inhalt">
<p class="topic-title">Inhalt</p>
<ul class="simple">
<li><p><a class="reference internal" href="posts/gst-player/#glade" id="id5">Glade</a></p></li>
<li>
<p><a class="reference internal" href="posts/gst-player/#python" id="id6">Python</a></p>
<ul>
<li>
<p><a class="reference internal" href="posts/gst-player/#player-einrichten" id="id7">Player einrichten</a></p>
<ul>
<li><p><a class="reference internal" href="posts/gst-player/#elemente-und-pipelines" id="id8">Elemente und Pipelines</a></p></li>
<li><p><a class="reference internal" href="posts/gst-player/#fertige-pipelines" id="id9">Fertige Pipelines</a></p></li>
</ul>
</li>
<li><p><a class="reference internal" href="posts/gst-player/#und-los" id="id10">Und los!</a></p></li>
<li><p><a class="reference internal" href="posts/gst-player/#fortschrittsanzeige" id="id11">Fortschrittsanzeige</a></p></li>
</ul>
</li>
<li><p><a class="reference internal" href="posts/gst-player/#moglichkeiten-und-limitierungen" id="id12">Möglichkeiten und Limitierungen</a></p></li>
<li><p><a class="reference internal" href="posts/gst-player/#links" id="id13">Links</a></p></li>
<li>
<p><a class="reference internal" href="posts/gst-player/#listings" id="id14">Listings</a></p>
<ul>
<li><p><a class="reference internal" href="posts/gst-player/#id1" id="id15">Python</a></p></li>
<li><p><a class="reference internal" href="posts/gst-player/#id2" id="id16">Glade</a></p></li>
<li><p><a class="reference internal" href="posts/gst-player/#beispieldateien" id="id17">Beispieldateien</a></p></li>
</ul>
</li>
</ul>
</div>
<p><strong>Mediaplayer mit GStreamer 1.x realisieren</strong></p>
<p><a class="reference external" href="https://gstreamer.freedesktop.org/">GStreamer</a> ist ein Multimedia-Framework, das zum Anzeigen und (De-)Kodieren von Mediendateien verwendet werden kann.</p>
<a class="reference external image-reference" href="images/19_gst_player.png"><img alt="/images/19_gst_player.thumbnail.png" src="images/19_gst_player.thumbnail.png"></a>
<div class="section" id="glade">
<h2><a class="toc-backref" href="posts/gst-player/#id5">Glade</a></h2>
<blockquote>
<ul class="simple">
<li><p><strong>Darstellungsbereich der Mediendatei:</strong> Widget <em>Gtk.DrawingArea</em></p></li>
<li><p><strong>Steuerungselemente:</strong> Vor-/Zurückspulen (<em>Gtk.utton</em>), Pause (<em>Gtk.Togglebutton</em>)</p></li>
<li><p><strong>Medienauswahl:</strong> Buttons, um Video- oder Bilddatei anzuzeigen</p></li>
</ul>
</blockquote>
</div>
<div class="section" id="python">
<h2><a class="toc-backref" href="posts/gst-player/#id6">Python</a></h2>
<div class="section" id="player-einrichten">
<h3><a class="toc-backref" href="posts/gst-player/#id7">Player einrichten</a></h3>
<div class="section" id="elemente-und-pipelines">
<h4><a class="toc-backref" href="posts/gst-player/#id8">Elemente und Pipelines</a></h4>
<p>GStreamer handhabt alle möglichen Arten von Medienflüssen. Jeder Schritt in dieser Verarbeitungskette wird per <em>Element</em> definiert und in <em>Pipelines</em> verbunden. Eine solche Pipeline besteht typischerweise aus "source"-, "filter"-/"decode"- und "sink"-Elementen.</p>
<pre class="code text"><a name="rest_code_9c6853c918274fff978cbc010aac7ea9-1"></a>------------------------------------------------------
<a name="rest_code_9c6853c918274fff978cbc010aac7ea9-2"></a>| Pipeline |
<a name="rest_code_9c6853c918274fff978cbc010aac7ea9-3"></a>| |
<a name="rest_code_9c6853c918274fff978cbc010aac7ea9-4"></a>| ------------- ---------------- -------------- |
<a name="rest_code_9c6853c918274fff978cbc010aac7ea9-5"></a>| | source | | filter | | sink | |
<a name="rest_code_9c6853c918274fff978cbc010aac7ea9-6"></a>| | |->>| decoder |->>| | |
<a name="rest_code_9c6853c918274fff978cbc010aac7ea9-7"></a>| | Quelle | | Verarbeitung | | Ausgabe | |
<a name="rest_code_9c6853c918274fff978cbc010aac7ea9-8"></a>| ------------- ---------------- -------------- |
<a name="rest_code_9c6853c918274fff978cbc010aac7ea9-9"></a>------------------------------------------------------
</pre>
<p>Nach diesem Prinzip wird dies mittels <em>Gst</em>-Modul umgesetzt:</p>
<pre class="code python"><a name="rest_code_562bfc9b81fd4b00b7449390b2d44758-1"></a><span class="c1"># init Gst and create pipeline</span>
<a name="rest_code_562bfc9b81fd4b00b7449390b2d44758-2"></a><span class="n">Gst</span><span class="o">.</span><span class="n">init</span><span class="p">()</span>
<a name="rest_code_562bfc9b81fd4b00b7449390b2d44758-3"></a><span class="n">pipeline</span> <span class="o">=</span> <span class="n">Gst</span><span class="o">.</span><span class="n">Pipeline</span><span class="p">()</span>
<a name="rest_code_562bfc9b81fd4b00b7449390b2d44758-4"></a>
<a name="rest_code_562bfc9b81fd4b00b7449390b2d44758-5"></a><span class="c1"># create elements</span>
<a name="rest_code_562bfc9b81fd4b00b7449390b2d44758-6"></a><span class="n">src</span> <span class="o">=</span> <span class="n">Gst</span><span class="o">.</span><span class="n">ElementFactory</span><span class="o">.</span><span class="n">make</span><span class="p">(</span><span class="s2">"filesrc"</span><span class="p">,</span> <span class="s2">"source"</span><span class="p">)</span>
<a name="rest_code_562bfc9b81fd4b00b7449390b2d44758-7"></a><span class="n">decode</span> <span class="o">=</span> <span class="n">Gst</span><span class="o">.</span><span class="n">ElementFactory</span><span class="o">.</span><span class="n">make</span><span class="p">(</span><span class="s2">"decodebin"</span><span class="p">,</span> <span class="s2">"decode"</span><span class="p">)</span>
<a name="rest_code_562bfc9b81fd4b00b7449390b2d44758-8"></a><span class="n">sink</span> <span class="o">=</span> <span class="n">Gst</span><span class="o">.</span><span class="n">ElementFactory</span><span class="o">.</span><span class="n">make</span><span class="p">(</span><span class="s2">"xvimagesink"</span><span class="p">)</span>
<a name="rest_code_562bfc9b81fd4b00b7449390b2d44758-9"></a>
<a name="rest_code_562bfc9b81fd4b00b7449390b2d44758-10"></a><span class="c1"># configure elements</span>
<a name="rest_code_562bfc9b81fd4b00b7449390b2d44758-11"></a><span class="n">src</span><span class="o">.</span><span class="n">set_property</span><span class="p">(</span><span class="s2">"location"</span><span class="p">,</span> <span class="n">file_location</span><span class="p">)</span>
<a name="rest_code_562bfc9b81fd4b00b7449390b2d44758-12"></a>
<a name="rest_code_562bfc9b81fd4b00b7449390b2d44758-13"></a><span class="c1"># add elements to pipeline</span>
<a name="rest_code_562bfc9b81fd4b00b7449390b2d44758-14"></a><span class="n">pipeline</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">src</span><span class="p">)</span>
<a name="rest_code_562bfc9b81fd4b00b7449390b2d44758-15"></a><span class="n">pipeline</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">decode</span><span class="p">)</span>
<a name="rest_code_562bfc9b81fd4b00b7449390b2d44758-16"></a><span class="n">pipeline</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">sink</span><span class="p">)</span>
<a name="rest_code_562bfc9b81fd4b00b7449390b2d44758-17"></a>
<a name="rest_code_562bfc9b81fd4b00b7449390b2d44758-18"></a><span class="c1">#link elements together</span>
<a name="rest_code_562bfc9b81fd4b00b7449390b2d44758-19"></a><span class="n">src</span><span class="o">.</span><span class="n">link</span><span class="p">(</span><span class="n">decode</span><span class="p">)</span>
<a name="rest_code_562bfc9b81fd4b00b7449390b2d44758-20"></a><span class="n">decode</span><span class="o">.</span><span class="n">link</span><span class="p">(</span><span class="n">sink</span><span class="p">)</span>
</pre>
</div>
<div class="section" id="fertige-pipelines">
<h4><a class="toc-backref" href="posts/gst-player/#id9">Fertige Pipelines</a></h4>
<p>Es besteht auch beispielsweise die Möglichkeit, Audio- und Videosignale voneinander getrennt werden, indem jeweils ein "videosink" und ein "audiosink" erstellt usw. Auf der anderen Seite gibt es vorgefertigte Pipelines für Standardaufgaben wie etwa das Abspielen von Medien.
Ein solches Element ist "playbin", das den Code signifikant vereinfacht:</p>
<pre class="code python"><a name="rest_code_db9b07b8e4294e758ece0ef148ec74b1-1"></a><span class="n">Gst</span><span class="o">.</span><span class="n">init</span><span class="p">(</span><span class="kc">None</span><span class="p">)</span>
<a name="rest_code_db9b07b8e4294e758ece0ef148ec74b1-2"></a><span class="n">player</span> <span class="o">=</span> <span class="n">Gst</span><span class="o">.</span><span class="n">ElementFactory</span><span class="o">.</span><span class="n">make</span><span class="p">(</span><span class="s2">"playbin"</span><span class="p">,</span> <span class="s2">"player"</span><span class="p">)</span>
<a name="rest_code_db9b07b8e4294e758ece0ef148ec74b1-3"></a><span class="n">sink</span> <span class="o">=</span> <span class="n">Gst</span><span class="o">.</span><span class="n">ElementFactory</span><span class="o">.</span><span class="n">make</span><span class="p">(</span><span class="s2">"xvimagesink"</span><span class="p">)</span>
<a name="rest_code_db9b07b8e4294e758ece0ef148ec74b1-4"></a><span class="n">player</span><span class="o">.</span><span class="n">set_property</span><span class="p">(</span><span class="s2">"uri"</span><span class="p">,</span> <span class="n">uri_of_file</span><span class="p">)</span>
<a name="rest_code_db9b07b8e4294e758ece0ef148ec74b1-5"></a><span class="n">player</span><span class="o">.</span><span class="n">set_property</span><span class="p">(</span><span class="s2">"video-sink"</span><span class="p">,</span> <span class="n">sink</span><span class="p">)</span>
</pre>
</div>
</div>
<div class="section" id="und-los">
<h3><a class="toc-backref" href="posts/gst-player/#id10">Und los!</a></h3>
<p>Eine Pipeline oder ein "playbin"-Element können nun über <em>Gst.STATE</em> gesteuert werden:</p>
<pre class="code python"><a name="rest_code_c46b8f31de8242cd9a347276d013b36b-1"></a><span class="n">player</span><span class="o">.</span><span class="n">set_state</span><span class="p">(</span><span class="n">Gst</span><span class="o">.</span><span class="n">State</span><span class="o">.</span><span class="n">PLAYING</span><span class="p">)</span>
<a name="rest_code_c46b8f31de8242cd9a347276d013b36b-2"></a><span class="n">player</span><span class="o">.</span><span class="n">set_state</span><span class="p">(</span><span class="n">Gst</span><span class="o">.</span><span class="n">State</span><span class="o">.</span><span class="n">PAUSED</span><span class="p">)</span>
</pre>
</div>
<div class="section" id="fortschrittsanzeige">
<h3><a class="toc-backref" href="posts/gst-player/#id11">Fortschrittsanzeige</a></h3>
<p>Die Fortschrittsanzeige ist an dieser Stelle keine <em>Gtk.ProgressBar</em> sondern eine horizontale <em>GtkScale</em>. Mit diesem Widget lässt sich nicht nur eine Position anzeigen, sondern auch per Maus setzen. Für letzteres wird das Signal <em>value-changed</em> benötigt. Streng genommen ist das Signal <em>change-value</em> an dieser Stelle die sauberere Lösung, die <a class="reference external" href="posts/vlc-player/">im nachfolgenden Beitrag</a> zur Umsetzung des Mediaplayers mit LibVLC verwendet wird.</p>
</div>
</div>
<div class="section" id="moglichkeiten-und-limitierungen">
<h2><a class="toc-backref" href="posts/gst-player/#id12">Möglichkeiten und Limitierungen</a></h2>
<p>Bei der Einarbeitung in GStreamer stolpert man (an dieser Stelle generalisiert die Autorin weitgehend und möglicherweise unbegründet) über diverse Hürden:</p>
<p>Es gibt eine Reihe von Tutorials. Die Umsetzung wird durch zwei Umstände erschwert:</p>
<ol class="arabic simple">
<li><p>Die primäre Sprache von und mit GStreamer ist C. Mit Python steht man eher auf experimentellem Boden.</p></li>
<li><p>Durch die Versionssprünge sowohl bei GStreamer (von 0.10 auf 1.x) als auch Python (2.x auf 3.x) funktionieren viele ältere Anleitungen nicht mehr ohne weiteres.</p></li>
</ol>
<p>Es gibt weiterhin Effekte, die sich nicht erschließen. Das in diesem Artikel aufgeführte Beispiel funktioniert nicht, wenn das Fenster eine Headerbar enthält. Des Weiteren ist die Videodarstellung unter Wayland fehlerhaft (Audio läuft). Beide Probleme sind mit der Verwendung von "gtksink" lösbar.</p>
</div>
<div class="section" id="links">
<h2><a class="toc-backref" href="posts/gst-player/#id13">Links</a></h2>
<blockquote>
<ul class="simple">
<li><p><a class="reference external" href="http://brettviren.github.io/pygst-tutorial-org/">Tutorial on using GStreamer Python Bindings in org-mode</a></p></li>
<li><p><a class="reference external" href="https://github.com/hadware/gstreamer-python-player/blob/master/seek.py">gstreamer-python-player/seek.py example</a></p></li>
<li><p><a class="reference external" href="https://gstreamer.freedesktop.org/documentation/plugins.html">GStreamer List of Elements and Plugins</a></p></li>
<li><p><a class="reference external" href="https://gstreamer.freedesktop.org/documentation/index.html">GStreamer documentation</a></p></li>
<li><p><a class="reference external" href="https://adnanalamkhan.wordpress.com/2015/03/01/using-gstreamer-1-0-with-python/">Using GStreamer 1.0 with Python</a></p></li>
<li><p><a class="reference external" href="posts/vlc-player/">Mediaplayer mit VLC</a></p></li>
<li><p><a class="reference external" href="posts/gtksink-player/">Mediaplayer mit GStreamer (gtksink-Edition)</a></p></li>
</ul>
</blockquote>
<p class="more"><a href="posts/gst-player/">Weiterlesen…</a></p>
</div>
</div>
</div>
</article><article class="post h-entry post-text"><header><h1 class="post-title p-name"><a href="posts/gpt-v04-release/" class="u-url">GPT: v0.4 Release</a></h1>
<div class="metadata">
<p class="dateline">
<i class="fa fa-clock-o"></i> <time class="published dt-published" datetime="2017-08-28T18:03:37+02:00" title="2017-08-28 18:03">2017-08-28 18:03</time>
|
<i class="fa fa-language"></i> Auch verfügbar in:
<a href="en/posts/gpt-v04-release/" rel="alternate" hreflang="en">English</a>
| <i class="fa fa-comment"></i> <a href="posts/gpt-v04-release/#disqus_thread" data-disqus-identifier="cache/posts/gpt-v04-release.html">Kommentare</a>
</p>
</div>
</header><div class="p-summary entry-summary">
<div>
<p><strong>JFTR: v0.4 des GoProTools veröffentlicht</strong></p>
<p>Das <a class="reference external" href="https://github.com/encarsia/gpt">GoProTool</a> hat ein wenig Zuneigung bekommen. In diesem Zuge habe ich aus dem aktuellen Stand den <a class="reference external" href="https://github.com/encarsia/gpt/releases/tag/v0.4">Release v0.4 "scarlatina"</a> erstellt.</p>
<p>NEU:</p>
<ul class="simple">
<li><p>Import von jedem Verzeichnis aus (vorher nur von erkannten Speicherkarten) mit praktischen Buttons in der Toolbar</p></li>
</ul>
<p>REPARIERT:</p>
<ul class="simple">
<li><p>Ordnerauswahl beim Import</p></li>
<li><p>Fortschrittsanzeige bei Videoimport</p></li>
</ul>
<p>"REPARIERT":</p>
<ul class="simple">
<li><p>Headerbar in der Vorschau-Version entfernt, weil Bild bei Playback nur funktioniert, wenn das Fenster keine Headerbar enthält (fragt nicht - isso, weil isso)</p></li>
</ul>
<div class="admonition note">
<p class="admonition-title">Bemerkung</p>
<p>Dies wird voraussichtlich beim Wechsel von GStreamer zu LibVLC behoben, siehe auch <a class="reference external" href="posts/vlc-player/">LibVLC-Artikel</a>.</p>
</div>
<a class="reference external image-reference" href="images/window_player_v0.4.png"><img alt="/images/window_player_v0.4.thumbnail.png" src="images/window_player_v0.4.thumbnail.png"></a>
</div>
</div>
</article><article class="post h-entry post-text"><header><h1 class="post-title p-name"><a href="posts/gsettings/" class="u-url">Das Konfigurationssystem GSettings</a></h1>
<div class="metadata">
<p class="dateline">
<i class="fa fa-clock-o"></i> <time class="published dt-published" datetime="2017-04-22T23:47:12+01:00" title="2017-04-22 23:47">2017-04-22 23:47</time>
|
<i class="fa fa-language"></i> Auch verfügbar in:
<a href="en/posts/gsettings/" rel="alternate" hreflang="en">English</a>
| <i class="fa fa-comment"></i> <a href="posts/gsettings/#disqus_thread" data-disqus-identifier="cache/posts/gsettings.html">Kommentare</a>
</p>
</div>
</header><div class="p-summary entry-summary">
<div>
<div class="contents pull-right topic" id="inhalt">
<p class="topic-title">Inhalt</p>
<ul class="simple">
<li><p><a class="reference internal" href="posts/gsettings/#schemas" id="id3">Schemas</a></p></li>
<li><p><a class="reference internal" href="posts/gsettings/#glade" id="id4">Glade</a></p></li>
<li>
<p><a class="reference internal" href="posts/gsettings/#python" id="id5">Python</a></p>
<ul>
<li><p><a class="reference internal" href="posts/gsettings/#globales-schema-laden" id="id6">Globales Schema laden</a></p></li>
<li><p><a class="reference internal" href="posts/gsettings/#lokales-schema-laden" id="id7">Lokales Schema laden</a></p></li>
<li><p><a class="reference internal" href="posts/gsettings/#widget-verknupfen" id="id8">Widget verknüpfen</a></p></li>
<li><p><a class="reference internal" href="posts/gsettings/#werte-abrufen-und-festlegen" id="id9">Werte abrufen und festlegen</a></p></li>
</ul>
</li>
<li><p><a class="reference internal" href="posts/gsettings/#links" id="id10">Links</a></p></li>
<li>
<p><a class="reference internal" href="posts/gsettings/#listings" id="id11">Listings</a></p>
<ul>
<li><p><a class="reference internal" href="posts/gsettings/#schema" id="id12">Schema</a></p></li>
<li><p><a class="reference internal" href="posts/gsettings/#id1" id="id13">Python</a></p></li>
<li><p><a class="reference internal" href="posts/gsettings/#id2" id="id14">Glade</a></p></li>
</ul>
</li>
</ul>
</div>
<p><strong>Das GNOME-eigene Konfigurationssystem GSettings</strong></p>
<p>GSettings ist GNOMEs zentrales Konfigurationssystem für Anwendungen. Es ist die Schnittstelle für verschiedenmögliche Backends, gemeinhin ist dies dconf.</p>
<p>Mittels grafischem (dconf-editor) oder Kommandozeilentool (gsettings) lassen sich Konfigurationen abfragen und manipulieren.</p>
<p>Das folgende Beispiel kann Hintergrundbilder laden, festlegen und bookmarken/favorisieren.</p>
<a class="reference external image-reference" href="images/17_gsettings.png"><img alt="/images/17_gsettings.thumbnail.png" src="images/17_gsettings.thumbnail.png"></a>
<div class="section" id="schemas">
<h2><a class="toc-backref" href="posts/gsettings/#id3">Schemas</a></h2>
<p>Um eine Konfiguration für eine Anwendung zu erstellen, muss diese in einer Schema-Datei definiert werden. Diese Datei ist eine XML-formatierte Datei, die anschließend in sein maschinenlesbares Äquivalent überführt werden muss.</p>
<p>Ein Beispiel für eine Schema-Datei mit einer festzulegenden Eigenschaft (key) wäre etwa:</p>
<pre class="code xml"><a name="rest_code_9cc67ff99fb64541892c3b81dc4deb6e-1"></a><span class="nt"><schemalist></span>
<a name="rest_code_9cc67ff99fb64541892c3b81dc4deb6e-2"></a> <span class="nt"><schema</span> <span class="na">id=</span><span class="s">"org.gtk.Test"</span> <span class="na">path=</span><span class="s">"/org/gtk/Test/"</span><span class="nt">></span>
<a name="rest_code_9cc67ff99fb64541892c3b81dc4deb6e-3"></a>
<a name="rest_code_9cc67ff99fb64541892c3b81dc4deb6e-4"></a> <span class="nt"><key</span> <span class="na">name=</span><span class="s">"string-key"</span> <span class="na">type=</span><span class="s">"s"</span><span class="nt">></span>
<a name="rest_code_9cc67ff99fb64541892c3b81dc4deb6e-5"></a> <span class="nt"><default></span>""<span class="nt"></default></span>
<a name="rest_code_9cc67ff99fb64541892c3b81dc4deb6e-6"></a> <span class="nt"><summary></span>A string<span class="nt"></summary></span>
<a name="rest_code_9cc67ff99fb64541892c3b81dc4deb6e-7"></a> <span class="nt"><description></span>
<a name="rest_code_9cc67ff99fb64541892c3b81dc4deb6e-8"></a> Configuration key defined for a string. Default value is set to an empty string.
<a name="rest_code_9cc67ff99fb64541892c3b81dc4deb6e-9"></a> <span class="nt"></description></span>
<a name="rest_code_9cc67ff99fb64541892c3b81dc4deb6e-10"></a> <span class="nt"></key></span>
<a name="rest_code_9cc67ff99fb64541892c3b81dc4deb6e-11"></a>
<a name="rest_code_9cc67ff99fb64541892c3b81dc4deb6e-12"></a> <span class="nt"></schema></span>
<a name="rest_code_9cc67ff99fb64541892c3b81dc4deb6e-13"></a><span class="nt"></schemalist></span>
</pre>
<p>Die Dateibenennung folgt der Vorgabe "<code class="docutils literal">schema.id.gschema.xml</code>". Das Standardinstallationsverzeichnis für Schema-Dateien ist <code class="docutils literal"><span class="pre">/usr/share/glib-2.0/schemas</span></code>. Schema-Dateien können auch außerhalb dieses Verzeichnisses genutzt werden (z.B. lokal, zu Testzwecken), sie werden dann aber nicht vom dconf-editor angezeigt.</p>
<p>Die erforderliche Kompilierung erfolgt mit</p>
<pre class="code console"><a name="rest_code_603dfee83f374b55ae847f51f12ee671-1"></a><span class="gp">$ </span>glib-compile-schemas /path/to/schema/files/
<a name="rest_code_603dfee83f374b55ae847f51f12ee671-2"></a><span class="gp">$ </span><span class="c1"># default directory</span>
<a name="rest_code_603dfee83f374b55ae847f51f12ee671-3"></a><span class="gp">$ </span>glib-compile-schemas /usr/share/glib-2.0/schemas/
</pre>
<p>Die kompilierte und nun von GSettings verwendete Datei ist <code class="docutils literal">gschemas.compiled</code>.</p>
</div>
<div class="section" id="glade">
<h2><a class="toc-backref" href="posts/gsettings/#id4">Glade</a></h2>
<p>Das Beispiel soll Bilder anzeigen, dafür wird das Widget <em>GtkImage</em> benötigt. Alle Steuerungselemente werden in der Headerbar untergebracht:</p>
<blockquote>
<ul class="simple">
<li><p>"Open File"-Button: öffnet einen <a class="reference external" href="posts/fcdialog/">FileChooserDialog</a></p></li>
<li><p>Switch: schaltet Desktop-Icons an oder ab</p></li>
<li><p>"Fav"-Togglebutton: bookmarkt angezeigte Dateien, zeigt an, ob angezeigte Datei als Favorit markiert ist</p></li>
<li><p>"Set as wallpaper"-Button: angezeigte Datei als Hintergrundbild verwenden</p></li>
<li><p><em>MenuButton</em>: unterhalb des Buttons wird eine Liste der favorisierten Dateien angezeigt, die von dort aus aufgerufen werden können</p></li>
</ul>
</blockquote>
</div>
<div class="section" id="python">
<h2><a class="toc-backref" href="posts/gsettings/#id5">Python</a></h2>
<div class="section" id="globales-schema-laden">
<h3><a class="toc-backref" href="posts/gsettings/#id6">Globales Schema laden</a></h3>
<p>Eine bestehende Konfiguration zu laden, geschieht einfach per</p>
<pre class="code python"><a name="rest_code_97aa651dd45b4e829a3087c63397e7d3-1"></a><span class="n">setting</span> <span class="o">=</span> <span class="n">Gio</span><span class="o">.</span><span class="n">Settings</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="s2">"full.schema.path"</span><span class="p">)</span>
<a name="rest_code_97aa651dd45b4e829a3087c63397e7d3-2"></a><span class="c1"># load desktop background configuration</span>
<a name="rest_code_97aa651dd45b4e829a3087c63397e7d3-3"></a><span class="n">setting</span> <span class="o">=</span> <span class="n">Gio</span><span class="o">.</span><span class="n">Settings</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="s2">"org.gnome.desktop.background"</span><span class="p">)</span>
</pre>
</div>
<div class="section" id="lokales-schema-laden">
<h3><a class="toc-backref" href="posts/gsettings/#id7">Lokales Schema laden</a></h3>
<p>Bei einem lokal gespeicherten Schema muss der Ort der <code class="docutils literal">schemas.compiled</code> angegeben werden, bevor die Konfiguration geladen werden kann:</p>
<pre class="code python"><a name="rest_code_d06998d1e58f4ca7bde3952b22a5d8f5-1"></a><span class="n">schema_source</span> <span class="o">=</span> <span class="n">Gio</span><span class="o">.</span><span class="n">SettingsSchemaSource</span><span class="o">.</span><span class="n">new_from_directory</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">getcwd</span><span class="p">(),</span>
<a name="rest_code_d06998d1e58f4ca7bde3952b22a5d8f5-2"></a> <span class="n">Gio</span><span class="o">.</span><span class="n">SettingsSchemaSource</span><span class="o">.</span><span class="n">get_default</span><span class="p">(),</span> <span class="kc">False</span><span class="p">)</span>
<a name="rest_code_d06998d1e58f4ca7bde3952b22a5d8f5-3"></a><span class="n">schema</span> <span class="o">=</span> <span class="n">Gio</span><span class="o">.</span><span class="n">SettingsSchemaSource</span><span class="o">.</span><span class="n">lookup</span><span class="p">(</span><span class="n">schema_source</span><span class="p">,</span> <span class="s2">"org.example.wallpaper-changer"</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
<a name="rest_code_d06998d1e58f4ca7bde3952b22a5d8f5-4"></a><span class="n">setting</span> <span class="o">=</span> <span class="n">Gio</span><span class="o">.</span><span class="n">Settings</span><span class="o">.</span><span class="n">new_full</span><span class="p">(</span><span class="n">schema</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</pre>
</div>
<div class="section" id="widget-verknupfen">
<h3><a class="toc-backref" href="posts/gsettings/#id8">Widget verknüpfen</a></h3>
<p>Es ist möglich, GSettings-Eigenschaften direkt an Widgets zu binden. Diese können dann bidirektional Zustände anzeigen bzw. man kann Änderungen an ihnen vornehmen:</p>
<pre class="code python"><a name="rest_code_bfe738a57c3847aaa373d9dc4653b9bd-1"></a><span class="n">setting</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="s2">"setting-key"</span><span class="p">,</span> <span class="n">widget</span><span class="p">,</span> <span class="nb">property</span><span class="p">,</span> <span class="n">Gio</span><span class="o">.</span><span class="n">SettingsBindFlags</span><span class="o">...</span><span class="p">)</span>
</pre>
<p>Im Beispiel wäre dies also</p>
<pre class="code python"><a name="rest_code_b32ed64e74a34b48a469b692aa8f44b8-1"></a><span class="bp">self</span><span class="o">.</span><span class="n">bg_setting</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="s2">"show-desktop-icons"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">(</span><span class="s2">"switch"</span><span class="p">),</span> <span class="s2">"active"</span><span class="p">,</span> <span class="n">Gio</span><span class="o">.</span><span class="n">SettingsBindFlags</span><span class="o">.</span><span class="n">DEFAULT</span><span class="p">)</span>
</pre>
<p>Der Schalter zeigt beim Start die aktuelle Einstellung an. Eine Änderung des Status ist sofort wirksam.</p>
</div>
<div class="section" id="werte-abrufen-und-festlegen">
<h3><a class="toc-backref" href="posts/gsettings/#id9">Werte abrufen und festlegen</a></h3>
<p>Eigenschaften können mit <code class="docutils literal">get_"type"</code> und <code class="docutils literal">set_"type"</code> ermittelt und festgelegt werden. Die relevante Funktion ist vom festgelegten Schlüsseltyp abhängig, also <code class="docutils literal">get_string</code> und <code class="docutils literal">set_string</code> für Zeichenketten, <code class="docutils literal">get_int</code> und <code class="docutils literal">set_int</code> für Ganzzahlen usw. (siehe <a class="reference external" href="https://lazka.github.io/pgi-docs/#Gio-2.0/classes/Settings.html">PyGObject API Reference</a>).</p>
<p>Wird der Wert einer Eigenschaft per <code class="docutils literal">get_value(key)</code> abgefragt, wird dies immer als Wert des Typs <a class="reference external" href="https://lazka.github.io/pgi-docs/#GLib-2.0/classes/Variant.html#GLib.Variant">GLib.Variant</a> zurückgegeben. Entsprechend erwartet die Funktion <code class="docutils literal">set_value(key)</code> ebenfalls diesen Typ.</p>
<p>Die Inhalte dieser Werte lassen sich einfach in simple Datentypen konvertieren, z.B.</p>
<pre class="code python"><a name="rest_code_e39f8b54040848fa90962cc84ad8455c-1"></a><span class="c1"># return string</span>
<a name="rest_code_e39f8b54040848fa90962cc84ad8455c-2"></a><span class="n">setting</span><span class="o">.</span><span class="n">get_value</span><span class="p">(</span><span class="n">key</span><span class="p">)</span><span class="o">.</span><span class="n">get_string</span><span class="p">()</span>
<a name="rest_code_e39f8b54040848fa90962cc84ad8455c-3"></a><span class="c1"># return anything (list, string, bool etc.)</span>
<a name="rest_code_e39f8b54040848fa90962cc84ad8455c-4"></a><span class="n">setting</span><span class="o">.</span><span class="n">get_value</span><span class="p">(</span><span class="n">key</span><span class="p">)</span><span class="o">.</span><span class="n">unpack</span><span class="p">()</span>
</pre>
<p>Umgekehrt lassen sich reguläre Datentypen nach folgendem Muster als <em>GLib.Variant</em>-Typ ausdrücken und an GSettings übergeben:</p>
<pre class="code python"><a name="rest_code_3ca134d77441428bafd728f016bbeaff-1"></a><span class="n">setting</span><span class="o">.</span><span class="n">set_value</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">GLib</span><span class="o">.</span><span class="n">Variant</span><span class="p">(</span><span class="n">string_type</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
</pre>
<p>Eine Liste der verfügbaren Stringtypen finden sich in der <a class="reference external" href="https://developer.gnome.org/glib/stable/gvariant-format-strings.html">GNOME Developer-Dokumentation</a>.</p>
<p>Im Beispiel wird auf diese Art die Favoritenliste aktualisiert:</p>
<pre class="code python"><a name="rest_code_7146c9fc63dc4d3eba6d0715d133fd3d-1"></a><span class="n">app_setting</span><span class="o">.</span><span class="n">set_value</span><span class="p">(</span><span class="s2">"favourites"</span><span class="p">,</span> <span class="n">GLib</span><span class="o">.</span><span class="n">Variant</span><span class="p">(</span><span class="s2">"as"</span><span class="p">,</span> <span class="n">fav_list</span><span class="p">))</span>
</pre>
</div>
</div>
<div class="section" id="links">
<h2><a class="toc-backref" href="posts/gsettings/#id10">Links</a></h2>
<blockquote>
<ul class="simple">
<li><p><a class="reference external" href="https://www.florian-diesch.de/doc/gnome3/standardeinstellungen-in-gsettings-aendern.html">Standardeinstellungen in GSettings ändern (German)</a></p></li>
<li><p><a class="reference external" href="http://zderadicka.eu/gsettings-flexible-configuration-system/">Introduction to GSettings in Python</a></p></li>
<li><p><a class="reference external" href="https://marianochavero.wordpress.com/2012/04/03/short-example-of-gsettings-bindings-in-python/">Short Example of GSettings Bindings with Python using a Gtk Switch</a></p></li>
<li><p><a class="reference external" href="http://zderadicka.eu/gsettings-flexible-configuration-system/">GSettings - flexible configuration system</a></p></li>
<li><p><a class="reference external" href="https://wiki.ubuntuusers.de/GNOME_Konfiguration/dconf/">dconf (ubuntuusers-Wiki)</a></p></li>
<li><p><a class="reference external" href="https://blog.gtk.org/2017/05/01/first-steps-with-gsettings/">First steps with GSettings</a></p></li>
</ul>
</blockquote>
</div>
<div class="section" id="listings">
<h2><a class="toc-backref" href="posts/gsettings/#id11">Listings</a></h2>
<div class="section" id="schema">
<h3><a class="toc-backref" href="posts/gsettings/#id12">Schema</a></h3>
<p><a class="reference external" href="listings/org.example.wallpaper-changer.gschema.xml.html">org.example.wallpaper-changer.gschema.xml</a> <a class="reference external" href="listings/org.example.wallpaper-changer.gschema.xml">(Source)</a></p>
<pre class="code xml"><a name="rest_code_4262834f954842488c8854738a5fc6b8-1"></a><span class="cp"><?xml version="1.0" encoding="utf-8"?></span>
<a name="rest_code_4262834f954842488c8854738a5fc6b8-2"></a>
<a name="rest_code_4262834f954842488c8854738a5fc6b8-3"></a><span class="nt"><schemalist></span>
<a name="rest_code_4262834f954842488c8854738a5fc6b8-4"></a>
<a name="rest_code_4262834f954842488c8854738a5fc6b8-5"></a> <span class="nt"><schema</span> <span class="na">path=</span><span class="s">"/org/example/wallpaper-changer/"</span> <span class="na">id=</span><span class="s">"org.example.wallpaper-changer"</span><span class="nt">></span>
<a name="rest_code_4262834f954842488c8854738a5fc6b8-6"></a>
<a name="rest_code_4262834f954842488c8854738a5fc6b8-7"></a> <span class="nt"><key</span> <span class="na">name=</span><span class="s">"favourites"</span> <span class="na">type=</span><span class="s">"as"</span><span class="nt">></span>
<a name="rest_code_4262834f954842488c8854738a5fc6b8-8"></a> <span class="nt"><default></span>[]<span class="nt"></default></span>
<a name="rest_code_4262834f954842488c8854738a5fc6b8-9"></a> <span class="nt"><summary></span>List of favourite wallpapers<span class="nt"></summary></span>
<a name="rest_code_4262834f954842488c8854738a5fc6b8-10"></a> <span class="nt"><description></span>
<a name="rest_code_4262834f954842488c8854738a5fc6b8-11"></a> Add or remove entry by pressing the 'fav' toggle button.
<a name="rest_code_4262834f954842488c8854738a5fc6b8-12"></a> <span class="nt"></description></span>
<a name="rest_code_4262834f954842488c8854738a5fc6b8-13"></a> <span class="nt"></key></span>
<a name="rest_code_4262834f954842488c8854738a5fc6b8-14"></a>
<a name="rest_code_4262834f954842488c8854738a5fc6b8-15"></a> <span class="nt"></schema></span>
<a name="rest_code_4262834f954842488c8854738a5fc6b8-16"></a>
<a name="rest_code_4262834f954842488c8854738a5fc6b8-17"></a><span class="nt"></schemalist></span>
</pre>
</div>
<div class="section" id="id1">
<h3><a class="toc-backref" href="posts/gsettings/#id13">Python</a></h3>
<p><a class="reference external" href="listings/17_gsettings.py.html">17_gsettings.py</a> <a class="reference external" href="listings/17_gsettings.py">(Source)</a></p>
<pre class="code python"><a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-1"></a><span class="ch">#!/usr/bin/python</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-2"></a><span class="c1"># -*- coding: utf-8 -*-</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-3"></a>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-4"></a><span class="kn">import</span> <span class="nn">os</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-5"></a><span class="kn">import</span> <span class="nn">sys</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-6"></a>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-7"></a><span class="kn">import</span> <span class="nn">gi</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-8"></a><span class="n">gi</span><span class="o">.</span><span class="n">require_version</span><span class="p">(</span><span class="s2">"Gtk"</span><span class="p">,</span> <span class="s2">"3.0"</span><span class="p">)</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-9"></a><span class="kn">from</span> <span class="nn">gi.repository</span> <span class="kn">import</span> <span class="n">Gtk</span><span class="p">,</span> <span class="n">Gio</span><span class="p">,</span> <span class="n">GLib</span><span class="p">,</span> <span class="n">GdkPixbuf</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-10"></a>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-11"></a>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-12"></a><span class="k">class</span> <span class="nc">Handler</span><span class="p">:</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-13"></a>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-14"></a> <span class="k">def</span> <span class="nf">on_window_destroy</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">window</span><span class="p">):</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-15"></a> <span class="n">window</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-16"></a>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-17"></a> <span class="k">def</span> <span class="nf">on_dialog_close</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">widget</span><span class="p">,</span> <span class="o">*</span><span class="n">event</span><span class="p">):</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-18"></a> <span class="n">widget</span><span class="o">.</span><span class="n">hide_on_delete</span><span class="p">()</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-19"></a> <span class="k">return</span> <span class="kc">True</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-20"></a>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-21"></a> <span class="k">def</span> <span class="nf">on_filechooser_dialog_response</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">widget</span><span class="p">,</span> <span class="n">response</span><span class="p">):</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-22"></a> <span class="k">if</span> <span class="n">response</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-23"></a> <span class="bp">self</span><span class="o">.</span><span class="n">on_dialog_close</span><span class="p">(</span><span class="n">widget</span><span class="p">)</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-24"></a> <span class="k">elif</span> <span class="n">response</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-25"></a> <span class="n">app</span><span class="o">.</span><span class="n">uri</span> <span class="o">=</span> <span class="n">widget</span><span class="o">.</span><span class="n">get_filename</span><span class="p">()</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-26"></a> <span class="n">app</span><span class="o">.</span><span class="n">draw_pixbuf</span><span class="p">(</span><span class="n">app</span><span class="o">.</span><span class="n">uri</span><span class="p">)</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-27"></a> <span class="n">app</span><span class="o">.</span><span class="n">handle_fav</span><span class="p">(</span><span class="n">app</span><span class="o">.</span><span class="n">uri</span><span class="p">)</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-28"></a> <span class="bp">self</span><span class="o">.</span><span class="n">on_dialog_close</span><span class="p">(</span><span class="n">widget</span><span class="p">)</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-29"></a>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-30"></a> <span class="k">def</span> <span class="nf">on_filechooser_dialog_file_activated</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">widget</span><span class="p">):</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-31"></a> <span class="bp">self</span><span class="o">.</span><span class="n">on_filechooser_dialog_response</span><span class="p">(</span><span class="n">widget</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-32"></a>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-33"></a> <span class="k">def</span> <span class="nf">on_open_button_clicked</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">widget</span><span class="p">):</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-34"></a> <span class="n">app</span><span class="o">.</span><span class="n">obj</span><span class="p">(</span><span class="s2">"filechooser_dialog"</span><span class="p">)</span><span class="o">.</span><span class="n">show_all</span><span class="p">()</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-35"></a>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-36"></a> <span class="k">def</span> <span class="nf">on_setwp_button_clicked</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">widget</span><span class="p">):</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-37"></a> <span class="n">app</span><span class="o">.</span><span class="n">bg_setting</span><span class="o">.</span><span class="n">set_string</span><span class="p">(</span><span class="s2">"picture-uri"</span><span class="p">,</span> <span class="s2">"file://</span><span class="si">{}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">app</span><span class="o">.</span><span class="n">uri</span><span class="p">))</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-38"></a>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-39"></a> <span class="k">def</span> <span class="nf">on_window_size_allocate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">widget</span><span class="p">,</span> <span class="n">size</span><span class="p">):</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-40"></a> <span class="n">app</span><span class="o">.</span><span class="n">draw_pixbuf</span><span class="p">(</span><span class="n">app</span><span class="o">.</span><span class="n">uri</span><span class="p">)</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-41"></a>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-42"></a> <span class="k">def</span> <span class="nf">on_filechooser_dialog_update_preview</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">widget</span><span class="p">):</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-43"></a> <span class="k">if</span> <span class="n">widget</span><span class="o">.</span><span class="n">get_filename</span><span class="p">()</span> <span class="o">!=</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">widget</span><span class="o">.</span><span class="n">get_filename</span><span class="p">()):</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-44"></a> <span class="n">pixbuf</span> <span class="o">=</span> <span class="n">GdkPixbuf</span><span class="o">.</span><span class="n">Pixbuf</span><span class="o">.</span><span class="n">new_from_file_at_scale</span><span class="p">(</span><span class="n">widget</span><span class="o">.</span><span class="n">get_filename</span><span class="p">(),</span><span class="mi">200</span><span class="p">,</span> <span class="mi">200</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-45"></a> <span class="n">app</span><span class="o">.</span><span class="n">obj</span><span class="p">(</span><span class="s2">"preview"</span><span class="p">)</span><span class="o">.</span><span class="n">set_from_pixbuf</span><span class="p">(</span><span class="n">pixbuf</span><span class="p">)</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-46"></a>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-47"></a> <span class="k">def</span> <span class="nf">on_fav_button_toggled</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">widget</span><span class="p">):</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-48"></a> <span class="k">if</span> <span class="n">widget</span><span class="o">.</span><span class="n">get_active</span><span class="p">():</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-49"></a> <span class="c1">#add file to fav_list if not in list</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-50"></a> <span class="k">if</span> <span class="n">app</span><span class="o">.</span><span class="n">uri</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">app</span><span class="o">.</span><span class="n">fav_list</span><span class="p">:</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-51"></a> <span class="n">app</span><span class="o">.</span><span class="n">fav_list</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">app</span><span class="o">.</span><span class="n">uri</span><span class="p">)</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-52"></a> <span class="k">else</span><span class="p">:</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-53"></a> <span class="c1">#remove file from fav_list if in list</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-54"></a> <span class="k">if</span> <span class="n">app</span><span class="o">.</span><span class="n">uri</span> <span class="ow">in</span> <span class="n">app</span><span class="o">.</span><span class="n">fav_list</span><span class="p">:</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-55"></a> <span class="n">app</span><span class="o">.</span><span class="n">fav_list</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">app</span><span class="o">.</span><span class="n">uri</span><span class="p">)</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-56"></a> <span class="c1">#update GSettings entry for favourites</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-57"></a> <span class="n">app</span><span class="o">.</span><span class="n">app_setting</span><span class="o">.</span><span class="n">set_value</span><span class="p">(</span><span class="s2">"favourites"</span><span class="p">,</span> <span class="n">GLib</span><span class="o">.</span><span class="n">Variant</span><span class="p">(</span><span class="s2">"as"</span><span class="p">,</span> <span class="n">app</span><span class="o">.</span><span class="n">fav_list</span><span class="p">))</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-58"></a> <span class="c1">#update fav list in popup menu</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-59"></a> <span class="n">popup</span> <span class="o">=</span> <span class="n">app</span><span class="o">.</span><span class="n">obj</span><span class="p">(</span><span class="s2">"menu"</span><span class="p">)</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-60"></a> <span class="c1">#remove all items</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-61"></a> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">popup</span><span class="o">.</span><span class="n">get_children</span><span class="p">():</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-62"></a> <span class="n">popup</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-63"></a> <span class="c1">#reload all items from fav_list</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-64"></a> <span class="k">for</span> <span class="n">fav</span> <span class="ow">in</span> <span class="n">app</span><span class="o">.</span><span class="n">fav_list</span><span class="p">:</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-65"></a> <span class="c1">#only label menuitem with filename instead of path</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-66"></a> <span class="n">item</span> <span class="o">=</span> <span class="n">Gtk</span><span class="o">.</span><span class="n">MenuItem</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">fav</span><span class="p">)[</span><span class="mi">1</span><span class="p">])</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-67"></a> <span class="n">item</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="s2">"activate"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">on_choose_fav_from_menu</span><span class="p">,</span> <span class="n">fav</span><span class="p">)</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-68"></a> <span class="n">popup</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-69"></a> <span class="n">popup</span><span class="o">.</span><span class="n">show_all</span><span class="p">()</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-70"></a>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-71"></a> <span class="k">def</span> <span class="nf">on_choose_fav_from_menu</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">widget</span><span class="p">,</span> <span class="n">filename</span><span class="p">):</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-72"></a> <span class="n">app</span><span class="o">.</span><span class="n">uri</span> <span class="o">=</span> <span class="n">filename</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-73"></a> <span class="n">app</span><span class="o">.</span><span class="n">draw_pixbuf</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-74"></a> <span class="n">app</span><span class="o">.</span><span class="n">handle_fav</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-75"></a>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-76"></a><span class="k">class</span> <span class="nc">ExampleApp</span><span class="p">:</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-77"></a>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-78"></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-79"></a>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-80"></a> <span class="bp">self</span><span class="o">.</span><span class="n">app</span> <span class="o">=</span> <span class="n">Gtk</span><span class="o">.</span><span class="n">Application</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="s2">"org.application.test"</span><span class="p">,</span> <span class="n">Gio</span><span class="o">.</span><span class="n">ApplicationFlags</span><span class="p">(</span><span class="mi">0</span><span class="p">))</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-81"></a> <span class="bp">self</span><span class="o">.</span><span class="n">app</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="s2">"activate"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">on_app_activate</span><span class="p">)</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-82"></a> <span class="bp">self</span><span class="o">.</span><span class="n">app</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="s2">"shutdown"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">on_app_shutdown</span><span class="p">)</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-83"></a>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-84"></a> <span class="k">def</span> <span class="nf">on_app_activate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">app</span><span class="p">):</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-85"></a> <span class="n">builder</span> <span class="o">=</span> <span class="n">Gtk</span><span class="o">.</span><span class="n">Builder</span><span class="p">()</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-86"></a> <span class="n">builder</span><span class="o">.</span><span class="n">add_from_file</span><span class="p">(</span><span class="s2">"17_gsettings.glade"</span><span class="p">)</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-87"></a> <span class="n">builder</span><span class="o">.</span><span class="n">connect_signals</span><span class="p">(</span><span class="n">Handler</span><span class="p">())</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-88"></a> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span> <span class="o">=</span> <span class="n">builder</span><span class="o">.</span><span class="n">get_object</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-89"></a>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-90"></a> <span class="c1">#load existing GSettings application config</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-91"></a> <span class="bp">self</span><span class="o">.</span><span class="n">bg_setting</span> <span class="o">=</span> <span class="n">Gio</span><span class="o">.</span><span class="n">Settings</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="s2">"org.gnome.desktop.background"</span><span class="p">)</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-92"></a> <span class="c1">#get_value returns Gio formatted file path</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-93"></a> <span class="n">file</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">bg_setting</span><span class="o">.</span><span class="n">get_value</span><span class="p">(</span><span class="s2">"picture-uri"</span><span class="p">)</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-94"></a> <span class="c1">#convert path into string</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-95"></a> <span class="bp">self</span><span class="o">.</span><span class="n">uri</span> <span class="o">=</span> <span class="n">file</span><span class="o">.</span><span class="n">get_string</span><span class="p">()[</span><span class="mi">7</span><span class="p">:]</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-96"></a> <span class="c1">#bind GSettings key to GTK+ object</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-97"></a> <span class="bp">self</span><span class="o">.</span><span class="n">bg_setting</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="s2">"show-desktop-icons"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">(</span><span class="s2">"switch"</span><span class="p">),</span> <span class="s2">"active"</span><span class="p">,</span> <span class="n">Gio</span><span class="o">.</span><span class="n">SettingsBindFlags</span><span class="o">.</span><span class="n">DEFAULT</span><span class="p">)</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-98"></a>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-99"></a> <span class="c1">#add GSettings schema from compiled XML file located in current directory (only recommended for test use, standard location: /usr/share/glib-2.0/schemas/)</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-100"></a> <span class="n">schema_source</span> <span class="o">=</span> <span class="n">Gio</span><span class="o">.</span><span class="n">SettingsSchemaSource</span><span class="o">.</span><span class="n">new_from_directory</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">getcwd</span><span class="p">(),</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-101"></a> <span class="n">Gio</span><span class="o">.</span><span class="n">SettingsSchemaSource</span><span class="o">.</span><span class="n">get_default</span><span class="p">(),</span> <span class="kc">False</span><span class="p">)</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-102"></a> <span class="n">schema</span> <span class="o">=</span> <span class="n">Gio</span><span class="o">.</span><span class="n">SettingsSchemaSource</span><span class="o">.</span><span class="n">lookup</span><span class="p">(</span><span class="n">schema_source</span><span class="p">,</span><span class="s2">"org.example.wallpaper-changer"</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-103"></a> <span class="bp">self</span><span class="o">.</span><span class="n">app_setting</span> <span class="o">=</span> <span class="n">Gio</span><span class="o">.</span><span class="n">Settings</span><span class="o">.</span><span class="n">new_full</span><span class="p">(</span><span class="n">schema</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-104"></a> <span class="c1">#convert value (GLib.Variant) into native list</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-105"></a> <span class="bp">self</span><span class="o">.</span><span class="n">fav_list</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">app_setting</span><span class="o">.</span><span class="n">get_value</span><span class="p">(</span><span class="s2">"favourites"</span><span class="p">)</span><span class="o">.</span><span class="n">unpack</span><span class="p">()</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-106"></a>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-107"></a> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">(</span><span class="s2">"window"</span><span class="p">)</span><span class="o">.</span><span class="n">set_application</span><span class="p">(</span><span class="n">app</span><span class="p">)</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-108"></a> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">(</span><span class="s2">"window"</span><span class="p">)</span><span class="o">.</span><span class="n">show_all</span><span class="p">()</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-109"></a>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-110"></a> <span class="bp">self</span><span class="o">.</span><span class="n">draw_pixbuf</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">uri</span><span class="p">)</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-111"></a> <span class="bp">self</span><span class="o">.</span><span class="n">handle_fav</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">uri</span><span class="p">)</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-112"></a>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-113"></a> <span class="k">def</span> <span class="nf">draw_pixbuf</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">file</span><span class="p">):</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-114"></a> <span class="n">size</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">(</span><span class="s2">"image_area"</span><span class="p">)</span><span class="o">.</span><span class="n">get_allocation</span><span class="p">()</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-115"></a> <span class="n">pixbuf</span> <span class="o">=</span> <span class="n">GdkPixbuf</span><span class="o">.</span><span class="n">Pixbuf</span><span class="o">.</span><span class="n">new_from_file_at_scale</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="n">size</span><span class="o">.</span><span class="n">width</span><span class="p">,</span> <span class="n">size</span><span class="o">.</span><span class="n">height</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-116"></a> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">(</span><span class="s2">"image_area"</span><span class="p">)</span><span class="o">.</span><span class="n">set_from_pixbuf</span><span class="p">(</span><span class="n">pixbuf</span><span class="p">)</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-117"></a>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-118"></a> <span class="k">def</span> <span class="nf">handle_fav</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">uri</span><span class="p">):</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-119"></a> <span class="c1">#set toggle button to correct state</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-120"></a> <span class="k">if</span> <span class="n">uri</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">fav_list</span><span class="p">:</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-121"></a> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">(</span><span class="s2">"fav_button"</span><span class="p">)</span><span class="o">.</span><span class="n">set_active</span><span class="p">(</span><span class="kc">True</span><span class="p">)</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-122"></a> <span class="k">else</span><span class="p">:</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-123"></a> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">(</span><span class="s2">"fav_button"</span><span class="p">)</span><span class="o">.</span><span class="n">set_active</span><span class="p">(</span><span class="kc">False</span><span class="p">)</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-124"></a>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-125"></a> <span class="k">def</span> <span class="nf">on_app_shutdown</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">app</span><span class="p">):</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-126"></a> <span class="bp">self</span><span class="o">.</span><span class="n">app</span><span class="o">.</span><span class="n">quit</span><span class="p">()</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-127"></a>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-128"></a> <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">argv</span><span class="p">):</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-129"></a> <span class="bp">self</span><span class="o">.</span><span class="n">app</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">argv</span><span class="p">)</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-130"></a>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-131"></a>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-132"></a><span class="n">app</span> <span class="o">=</span> <span class="n">ExampleApp</span><span class="p">()</span>
<a name="rest_code_fdb678e1a16b46d889b63cbfc6519cf8-133"></a><span class="n">app</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">)</span>
</pre>
</div>
<div class="section" id="id2">
<h3><a class="toc-backref" href="posts/gsettings/#id14">Glade</a></h3>
<p><a class="reference external" href="listings/17_gsettings.glade.html">17_gsettings.glade</a> <a class="reference external" href="listings/17_gsettings.glade">(Source)</a></p>
<pre class="code xml"><a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-1"></a><span class="cp"><?xml version="1.0" encoding="UTF-8"?></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-2"></a><span class="c"><!-- Generated with glade 3.20.0 --></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-3"></a><span class="nt"><interface></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-4"></a> <span class="nt"><requires</span> <span class="na">lib=</span><span class="s">"gtk+"</span> <span class="na">version=</span><span class="s">"3.20"</span><span class="nt">/></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-5"></a> <span class="nt"><object</span> <span class="na">class=</span><span class="s">"GtkFileFilter"</span> <span class="na">id=</span><span class="s">"filefilter"</span><span class="nt">></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-6"></a> <span class="nt"><mime-types></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-7"></a> <span class="nt"><mime-type></span>image/*<span class="nt"></mime-type></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-8"></a> <span class="nt"></mime-types></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-9"></a> <span class="nt"></object></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-10"></a> <span class="nt"><object</span> <span class="na">class=</span><span class="s">"GtkImage"</span> <span class="na">id=</span><span class="s">"image1"</span><span class="nt">></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-11"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"visible"</span><span class="nt">></span>True<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-12"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"can_focus"</span><span class="nt">></span>False<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-13"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"icon_name"</span><span class="nt">></span>emblem-favorite<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-14"></a> <span class="nt"></object></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-15"></a> <span class="nt"><object</span> <span class="na">class=</span><span class="s">"GtkMenu"</span> <span class="na">id=</span><span class="s">"menu"</span><span class="nt">></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-16"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"visible"</span><span class="nt">></span>True<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-17"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"can_focus"</span><span class="nt">></span>False<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-18"></a> <span class="nt"></object></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-19"></a> <span class="nt"><object</span> <span class="na">class=</span><span class="s">"GtkApplicationWindow"</span> <span class="na">id=</span><span class="s">"window"</span><span class="nt">></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-20"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"can_focus"</span><span class="nt">></span>False<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-21"></a> <span class="nt"><signal</span> <span class="na">name=</span><span class="s">"destroy"</span> <span class="na">handler=</span><span class="s">"on_window_destroy"</span> <span class="na">swapped=</span><span class="s">"no"</span><span class="nt">/></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-22"></a> <span class="nt"><signal</span> <span class="na">name=</span><span class="s">"size-allocate"</span> <span class="na">handler=</span><span class="s">"on_window_size_allocate"</span> <span class="na">swapped=</span><span class="s">"no"</span><span class="nt">/></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-23"></a> <span class="nt"><child></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-24"></a> <span class="nt"><object</span> <span class="na">class=</span><span class="s">"GtkImage"</span> <span class="na">id=</span><span class="s">"image_area"</span><span class="nt">></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-25"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"width_request"</span><span class="nt">></span>400<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-26"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"height_request"</span><span class="nt">></span>300<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-27"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"visible"</span><span class="nt">></span>True<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-28"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"can_focus"</span><span class="nt">></span>False<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-29"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"stock"</span><span class="nt">></span>gtk-missing-image<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-30"></a> <span class="nt"></object></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-31"></a> <span class="nt"></child></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-32"></a> <span class="nt"><child</span> <span class="na">type=</span><span class="s">"titlebar"</span><span class="nt">></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-33"></a> <span class="nt"><object</span> <span class="na">class=</span><span class="s">"GtkHeaderBar"</span><span class="nt">></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-34"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"visible"</span><span class="nt">></span>True<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-35"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"can_focus"</span><span class="nt">></span>False<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-36"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"title"</span><span class="nt">></span>Wallpaper changer<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-37"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"has_subtitle"</span><span class="nt">></span>False<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-38"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"show_close_button"</span><span class="nt">></span>True<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-39"></a> <span class="nt"><child></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-40"></a> <span class="nt"><object</span> <span class="na">class=</span><span class="s">"GtkButton"</span> <span class="na">id=</span><span class="s">"open_button"</span><span class="nt">></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-41"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"label"</span> <span class="na">translatable=</span><span class="s">"yes"</span><span class="nt">></span>Open file...<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-42"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"visible"</span><span class="nt">></span>True<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-43"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"can_focus"</span><span class="nt">></span>True<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-44"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"receives_default"</span><span class="nt">></span>True<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-45"></a> <span class="nt"><signal</span> <span class="na">name=</span><span class="s">"clicked"</span> <span class="na">handler=</span><span class="s">"on_open_button_clicked"</span> <span class="na">swapped=</span><span class="s">"no"</span><span class="nt">/></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-46"></a> <span class="nt"></object></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-47"></a> <span class="nt"></child></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-48"></a> <span class="nt"><child></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-49"></a> <span class="nt"><object</span> <span class="na">class=</span><span class="s">"GtkBox"</span><span class="nt">></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-50"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"visible"</span><span class="nt">></span>True<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-51"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"can_focus"</span><span class="nt">></span>False<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-52"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"orientation"</span><span class="nt">></span>vertical<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-53"></a> <span class="nt"><child></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-54"></a> <span class="nt"><object</span> <span class="na">class=</span><span class="s">"GtkLabel"</span><span class="nt">></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-55"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"visible"</span><span class="nt">></span>True<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-56"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"can_focus"</span><span class="nt">></span>False<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-57"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"label"</span> <span class="na">translatable=</span><span class="s">"yes"</span><span class="nt">></span>Desktop icons<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-58"></a> <span class="nt"></object></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-59"></a> <span class="nt"><packing></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-60"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"expand"</span><span class="nt">></span>False<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-61"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"fill"</span><span class="nt">></span>True<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-62"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"position"</span><span class="nt">></span>0<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-63"></a> <span class="nt"></packing></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-64"></a> <span class="nt"></child></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-65"></a> <span class="nt"><child></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-66"></a> <span class="nt"><object</span> <span class="na">class=</span><span class="s">"GtkSwitch"</span> <span class="na">id=</span><span class="s">"switch"</span><span class="nt">></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-67"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"visible"</span><span class="nt">></span>True<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-68"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"can_focus"</span><span class="nt">></span>True<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-69"></a> <span class="nt"></object></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-70"></a> <span class="nt"><packing></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-71"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"expand"</span><span class="nt">></span>False<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-72"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"fill"</span><span class="nt">></span>True<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-73"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"position"</span><span class="nt">></span>1<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-74"></a> <span class="nt"></packing></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-75"></a> <span class="nt"></child></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-76"></a> <span class="nt"></object></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-77"></a> <span class="nt"><packing></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-78"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"position"</span><span class="nt">></span>2<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-79"></a> <span class="nt"></packing></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-80"></a> <span class="nt"></child></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-81"></a> <span class="nt"><child></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-82"></a> <span class="nt"><object</span> <span class="na">class=</span><span class="s">"GtkMenuButton"</span> <span class="na">id=</span><span class="s">"fav_menu"</span><span class="nt">></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-83"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"visible"</span><span class="nt">></span>True<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-84"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"can_focus"</span><span class="nt">></span>True<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-85"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"receives_default"</span><span class="nt">></span>True<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-86"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"popup"</span><span class="nt">></span>menu<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-87"></a> <span class="nt"><child></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-88"></a> <span class="nt"><placeholder/></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-89"></a> <span class="nt"></child></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-90"></a> <span class="nt"></object></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-91"></a> <span class="nt"><packing></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-92"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"pack_type"</span><span class="nt">></span>end<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-93"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"position"</span><span class="nt">></span>1<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-94"></a> <span class="nt"></packing></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-95"></a> <span class="nt"></child></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-96"></a> <span class="nt"><child></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-97"></a> <span class="nt"><object</span> <span class="na">class=</span><span class="s">"GtkButton"</span> <span class="na">id=</span><span class="s">"setwp_button"</span><span class="nt">></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-98"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"label"</span> <span class="na">translatable=</span><span class="s">"yes"</span><span class="nt">></span>Set as wallpaper<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-99"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"visible"</span><span class="nt">></span>True<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-100"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"can_focus"</span><span class="nt">></span>True<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-101"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"receives_default"</span><span class="nt">></span>True<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-102"></a> <span class="nt"><signal</span> <span class="na">name=</span><span class="s">"clicked"</span> <span class="na">handler=</span><span class="s">"on_setwp_button_clicked"</span> <span class="na">swapped=</span><span class="s">"no"</span><span class="nt">/></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-103"></a> <span class="nt"></object></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-104"></a> <span class="nt"><packing></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-105"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"pack_type"</span><span class="nt">></span>end<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-106"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"position"</span><span class="nt">></span>3<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-107"></a> <span class="nt"></packing></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-108"></a> <span class="nt"></child></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-109"></a> <span class="nt"><child></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-110"></a> <span class="nt"><object</span> <span class="na">class=</span><span class="s">"GtkToggleButton"</span> <span class="na">id=</span><span class="s">"fav_button"</span><span class="nt">></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-111"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"visible"</span><span class="nt">></span>True<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-112"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"can_focus"</span><span class="nt">></span>True<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-113"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"receives_default"</span><span class="nt">></span>True<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-114"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"image"</span><span class="nt">></span>image1<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-115"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"always_show_image"</span><span class="nt">></span>True<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-116"></a> <span class="nt"><signal</span> <span class="na">name=</span><span class="s">"toggled"</span> <span class="na">handler=</span><span class="s">"on_fav_button_toggled"</span> <span class="na">swapped=</span><span class="s">"no"</span><span class="nt">/></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-117"></a> <span class="nt"></object></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-118"></a> <span class="nt"><packing></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-119"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"pack_type"</span><span class="nt">></span>end<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-120"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"position"</span><span class="nt">></span>3<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-121"></a> <span class="nt"></packing></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-122"></a> <span class="nt"></child></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-123"></a> <span class="nt"></object></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-124"></a> <span class="nt"></child></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-125"></a> <span class="nt"></object></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-126"></a> <span class="nt"><object</span> <span class="na">class=</span><span class="s">"GtkImage"</span> <span class="na">id=</span><span class="s">"preview"</span><span class="nt">></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-127"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"width_request"</span><span class="nt">></span>200<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-128"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"visible"</span><span class="nt">></span>True<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-129"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"can_focus"</span><span class="nt">></span>False<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-130"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"margin_right"</span><span class="nt">></span>5<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-131"></a> <span class="nt"></object></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-132"></a> <span class="nt"><object</span> <span class="na">class=</span><span class="s">"GtkFileChooserDialog"</span> <span class="na">id=</span><span class="s">"filechooser_dialog"</span><span class="nt">></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-133"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"width_request"</span><span class="nt">></span>800<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-134"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"height_request"</span><span class="nt">></span>600<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-135"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"can_focus"</span><span class="nt">></span>False<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-136"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"type_hint"</span><span class="nt">></span>dialog<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-137"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"transient_for"</span><span class="nt">></span>window<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-138"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"attached_to"</span><span class="nt">></span>window<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-139"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"filter"</span><span class="nt">></span>filefilter<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-140"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"preview_widget"</span><span class="nt">></span>preview<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-141"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"use_preview_label"</span><span class="nt">></span>False<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-142"></a> <span class="nt"><signal</span> <span class="na">name=</span><span class="s">"delete-event"</span> <span class="na">handler=</span><span class="s">"on_dialog_close"</span> <span class="na">swapped=</span><span class="s">"no"</span><span class="nt">/></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-143"></a> <span class="nt"><signal</span> <span class="na">name=</span><span class="s">"file-activated"</span> <span class="na">handler=</span><span class="s">"on_filechooser_dialog_file_activated"</span> <span class="na">swapped=</span><span class="s">"no"</span><span class="nt">/></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-144"></a> <span class="nt"><signal</span> <span class="na">name=</span><span class="s">"response"</span> <span class="na">handler=</span><span class="s">"on_filechooser_dialog_response"</span> <span class="na">swapped=</span><span class="s">"no"</span><span class="nt">/></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-145"></a> <span class="nt"><signal</span> <span class="na">name=</span><span class="s">"update-preview"</span> <span class="na">handler=</span><span class="s">"on_filechooser_dialog_update_preview"</span> <span class="na">swapped=</span><span class="s">"no"</span><span class="nt">/></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-146"></a> <span class="nt"><child</span> <span class="na">internal-child=</span><span class="s">"vbox"</span><span class="nt">></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-147"></a> <span class="nt"><object</span> <span class="na">class=</span><span class="s">"GtkBox"</span> <span class="na">id=</span><span class="s">"fcbox"</span><span class="nt">></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-148"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"can_focus"</span><span class="nt">></span>False<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-149"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"orientation"</span><span class="nt">></span>vertical<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-150"></a> <span class="nt"><child</span> <span class="na">internal-child=</span><span class="s">"action_area"</span><span class="nt">></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-151"></a> <span class="nt"><object</span> <span class="na">class=</span><span class="s">"GtkButtonBox"</span><span class="nt">></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-152"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"can_focus"</span><span class="nt">></span>False<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-153"></a> <span class="nt"><child></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-154"></a> <span class="nt"><placeholder/></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-155"></a> <span class="nt"></child></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-156"></a> <span class="nt"></object></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-157"></a> <span class="nt"><packing></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-158"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"expand"</span><span class="nt">></span>False<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-159"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"fill"</span><span class="nt">></span>False<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-160"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"position"</span><span class="nt">></span>0<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-161"></a> <span class="nt"></packing></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-162"></a> <span class="nt"></child></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-163"></a> <span class="nt"></object></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-164"></a> <span class="nt"></child></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-165"></a> <span class="nt"><child</span> <span class="na">type=</span><span class="s">"titlebar"</span><span class="nt">></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-166"></a> <span class="nt"><object</span> <span class="na">class=</span><span class="s">"GtkHeaderBar"</span><span class="nt">></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-167"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"visible"</span><span class="nt">></span>True<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-168"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"can_focus"</span><span class="nt">></span>False<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-169"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"title"</span><span class="nt">></span>Choose image file<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-170"></a> <span class="nt"><property</span> <span class="na">name=</span><span class="s">"show_close_button"</span><span class="nt">></span>True<span class="nt"></property></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-171"></a> <span class="nt"></object></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-172"></a> <span class="nt"></child></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-173"></a> <span class="nt"></object></span>
<a name="rest_code_37aa0a7514a6450aa9355c1ef3e1f3ef-174"></a><span class="nt"></interface></span>
</pre>
</div>
</div>
</div>
</div>
</article><article class="post h-entry post-text"><header><h1 class="post-title p-name"><a href="posts/herdentrieb/" class="u-url">Herdentrieb</a></h1>
<div class="metadata">
<p class="dateline">
<i class="fa fa-clock-o"></i> <time class="published dt-published" datetime="2017-04-16T12:45:25+02:00" title="2017-04-16 12:45">2017-04-16 12:45</time>
| <i class="fa fa-comment"></i> <a href="posts/herdentrieb/#disqus_thread" data-disqus-identifier="cache/posts/herdentrieb.html">Kommentare</a>
</p>
</div>
</header><div class="p-summary entry-summary">
<div>
<p><strong>Mastodon - get hype</strong></p>
<div class="admonition warning">
<p class="admonition-title">Warnung</p>
<p>Dieser Beitrag wird bedarfs- und kapazitätsabhängig aktualisiert. Da sich Mastodon in massiver, aktiver Entwicklung befindet, können Teile des Inhaltes veraltet sein.</p>
</div>
<div class="contents topic" id="inhalt">
<p class="topic-title">Inhalt</p>
<ul class="simple">
<li><p><a class="reference internal" href="posts/herdentrieb/#was-bisher-geschah" id="id1">Was bisher geschah</a></p></li>
<li><p><a class="reference internal" href="posts/herdentrieb/#was-passiert-gerade" id="id2">Was passiert gerade?</a></p></li>
<li><p><a class="reference internal" href="posts/herdentrieb/#welche-instanz-ist-die-richtige-fur-mich" id="id3">Welche Instanz ist die richtige für mich?</a></p></li>
<li>
<p><a class="reference internal" href="posts/herdentrieb/#okay-ich-bin-dabei-was-muss-ich-tun" id="id4">Okay, ich bin dabei, was muss ich tun?</a></p>
<ul>
<li><p><a class="reference internal" href="posts/herdentrieb/#hashtags" id="id5">Hashtags</a></p></li>
<li><p><a class="reference internal" href="posts/herdentrieb/#user-feed" id="id6">User-Feed</a></p></li>
<li><p><a class="reference internal" href="posts/herdentrieb/#sonstiges" id="id7">Sonstiges</a></p></li>
</ul>
</li>
<li><p><a class="reference internal" href="posts/herdentrieb/#klingt-irgendwie-nicht-nach-dem-groszen-twitter-killer" id="id8">Klingt irgendwie nicht nach dem großen Twitter-Killer</a></p></li>
<li><p><a class="reference internal" href="posts/herdentrieb/#find-mich-auf-mastodon" id="id9">Find mich auf Mastodon</a></p></li>
</ul>
</div>
<div class="section" id="was-bisher-geschah">
<h2><a class="toc-backref" href="posts/herdentrieb/#id1">Was bisher geschah</a></h2>
<p>Mastodon ist ein freies, verteiltes soziales Netzwerk und gleichzeitig der Name dessen Server-Komponente. Ein Mastodon-Server innhalb des gesamten Netzwerkes (<em>Fediverse</em>) ist eine Instanz.
Die Nutzung lehnt sich im Wesentlichen an Twitter an: ein Post (<em>Toot</em>, dt. <em>Tröt</em>) enthält bis zu 500 Zeichen, die wiederum favorisiert und erneut geteilt (<em>Boost</em>) werden können, es gibt das Follower-Prinzip und diverse Timelines (Nutzer, lokal, öffentlich).</p>
<ul class="simple">
<li><p><a class="reference external" href="https://github.com/tootsuite/mastodon">Mastodon bei GitHub</a></p></li>
<li><p><a class="reference external" href="https://en.wikipedia.org/wiki/Mastodon_(software)">Mastodon (Wikipedia)</a></p></li>
</ul>
</div>
<div class="section" id="was-passiert-gerade">
<h2><a class="toc-backref" href="posts/herdentrieb/#id2">Was passiert gerade?</a></h2>
<p>Ein junges, Open-Source-Netzwerk zieht naturgemäß primär technikaffines Volk an, gefolgt von den üblichen Early Adopter-Kandidaten. Das führt derzeit in eine inhaltliche Mischung aus Tech-Themen, darunter viel, was sich um Mastodon selbst dreht, Rollenspiele, Manga, Furries, NSFW-Content und lahme SJW-Ansprachen.</p>
<p>Wer bis jetzt noch nicht abgeschreckt ist, fragt sich:</p>
</div>
<div class="section" id="welche-instanz-ist-die-richtige-fur-mich">
<h2><a class="toc-backref" href="posts/herdentrieb/#id3">Welche Instanz ist die richtige für mich?</a></h2>
<div class="figure">
<a class="reference external image-reference" href="images/Mastodon/usercount.png"><img alt="/images/Mastodon/usercount.thumbnail.png" src="images/Mastodon/usercount.thumbnail.png"></a>
<p class="caption"><a class="reference external" href="https://social.lou.lt/@mastodonusercount">@mastodonusercount@social.lou.lt</a></p>
</div>
<p>Da prinzipbedingt jeder einen Mastodon-Server betreiben kann, tun dies auch viele. So explodiert aktuell die Zahl der Instanzen. Aber es ist eben auch damit zu rechnen, dass die Mehrheit nur kurzfristig aus Experimentierfreude existieren wird. Verschwindet eine Instanz, verschwinden auch alle Accounts (und deren Inhalte) in dieser.</p>
<p>Ein weiterer Punkt ist die Ausrichtung der Instanz, sei sie themenbezogen (Spaß/Memes/Aktivismus/Tech) oder lokal/landessprachlich oder der Grad an Moderation.</p>
<p>Hier zeichnet sich gerade eine Art Sortierungsbewegung ab: Benutzer migrieren zu Instanzen, die eher ihren Interessen bzw. ihrem Umfeld entsprechen.</p>
<div class="figure">
<a class="reference external image-reference" href="images/Mastodon/migration.png"><img alt="/images/Mastodon/migration.thumbnail.png" src="images/Mastodon/migration.thumbnail.png"></a>
<p class="caption"><a class="reference external" href="https://mastodon.technology/users/Chaos_99/updates/12809">@Chaos_99</a></p>
</div>
<p>Bisher ist es nicht möglich, die lokale Timeline einer Instanz ohne Registrierung anzusehen und man hier nahezu die Katze im Sack kauft. Jüngst gibt es aber Abhilfe unter</p>
<div class="figure">
<a class="reference external image-reference" href="images/Mastodon/tlpreview.png"><img alt="/images/Mastodon/tlpreview.thumbnail.png" src="images/Mastodon/tlpreview.thumbnail.png"></a>
<p class="caption"><a class="reference external" href="https://xoxo.zone/@KevinMarks/63431">@KevinMarks</a></p>
</div>
<ul class="simple">
<li><p><a class="reference external" href="http://www.unmung.com/mastoview">unmung.com/mastoview</a>.</p></li>
</ul>
<p>Wenn man also nicht genau eine Instanz favorisiert, weil sie thematisch passt oder man dort schon Nutzer kennt, sucht man sich am besten eine größere, allgemeine Instanz aus, bei der eine größere Chance besteht, die erste Euphoriewelle zu überleben.</p>
<ul class="simple">
<li><p><a class="reference external" href="https://instances.mastodon.xyz/list">Liste mit Instanzen</a></p></li>
<li><p><a class="reference external" href="http://mashable.com/2017/04/15/mastodon-has-instance-for-everyone/">Mashable: There's an instance for everyone in the rapidly expanding Mastodon fediverse</a></p></li>
<li><p><a class="reference external" href="https://motherboard.vice.com/en_us/article/from-witches-to-dolphins-these-are-the-communities-that-make-mastodon-great">Motherboard: From Witches to Dolphins, These Are the Communities That Make Mastodon Great</a></p></li>
</ul>
</div>
<div class="section" id="okay-ich-bin-dabei-was-muss-ich-tun">
<h2><a class="toc-backref" href="posts/herdentrieb/#id4">Okay, ich bin dabei, was muss ich tun?</a></h2>
<div class="section" id="hashtags">
<h3><a class="toc-backref" href="posts/herdentrieb/#id5">Hashtags</a></h3>
<p>Tags sind die (aktuell) beste Art, bei Mastodon nach Stichwörtern zu suchen. Entweder sucht man direkt in der Suchleiste in der linken Spalte oder man ruft die URL <code class="docutils literal"><span class="pre"><instance>/tags/<tag></span></code> auf. In den Suchergebnissen werden auch Beiträge anderer Instanzen angezeigt, dies erfolgt aber nicht kongruent, man vergleiche beispielsweise den Tag <em>#bicycle</em> auf</p>
<ul class="simple">
<li><p><a class="reference external" href="https://mastodon.social/tags/bicycle">mastodon.social</a></p></li>
<li><p><a class="reference external" href="https://mastodon.cloud/tags/bicycle">mastodon.cloud</a></p></li>
<li><p><a class="reference external" href="https://octodon.social/tags/bicycle">octodon.social</a></p></li>
</ul>
</div>
<div class="section" id="user-feed">
<h3><a class="toc-backref" href="posts/herdentrieb/#id6">User-Feed</a></h3>
<p>Für jeden Nutzer wird ein Atom-Feed bereitgestellt. Leider gibt es dies nicht für Tags.</p>
</div>
<div class="section" id="sonstiges">
<h3><a class="toc-backref" href="posts/herdentrieb/#id7">Sonstiges</a></h3>
<ul class="simple">
<li><p><a class="reference external" href="https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/Apps.md">Apps</a></p></li>
<li><p><a class="reference external" href="https://chaos.social/@blinry">blinrys</a> <a class="reference external" href="https://pad.stratum0.org/p/mastodon">Mastodon-Notizen</a></p></li>
</ul>