{"id":1446,"date":"2013-07-26T19:09:47","date_gmt":"2013-07-27T02:09:47","guid":{"rendered":"https:\/\/dylanmc.ca\/\/-\/?p=1446"},"modified":"2021-12-01T11:26:18","modified_gmt":"2021-12-01T19:26:18","slug":"gnome-break-timer-week-6","status":"publish","type":"post","link":"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/26\/gnome-break-timer-week-6\/","title":{"rendered":"GNOME Break Timer: Week 6"},"content":{"rendered":"\n<p>It&#8217;s time to talk about my GSoC project again, where I&#8217;m making a new break timer app for GNOME. First, thank you, dear readers, for your feedback and support so far! It really helps to know other people are interested in this.<\/p>\n\n\n\n<p>The last two weeks have been about tying up loose ends so I don&#8217;t get bogged down later on. First, I removed all traces of the old working title. This application is called GNOME Break Timer, now, instead of having several different names (and things that looked like names) strewn about. It probably only bothered me, but I&#8217;m really glad to have some logic on that front.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>I got our cool introductory slideshow running. It appears if you launch Break Timer and breaks are not enabled. So, it will appear when you start Break Timer for the first time, and if you happen to turn it off at some point and want to start using it again. GtkStack was fantastic for this. It&#8217;s really nice to see GTK making animated transitions so easy, and apparently doing a pretty good job drawing them. I think it will be really exciting when applications are doing more of this in the future.<\/p>\n\n\n\n<p><video src=\"https:\/\/s1.dylanmccall.com\/gnome-break-timer\/screenshots\/gsoc-week6-screencast.webm\" controls=\"controls\" width=\"700\" height=\"436\"><br><\/video><\/p>\n\n\n\n<p>Incidentally, I updated the settings application to optionally support GTK 3.9+ with its very cool new <code>gtk_window_set_titlebar<\/code> function! I was a little disappointed to learn that I have to add the close button to the HeaderBar <em>myself<\/em> at the moment, which seems a little silly. So, I did some guessing about best practice (and borrowed some code from GNOME Clocks), then I made a little custom widget for the problem so I wouldn&#8217;t have to think about it any more.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted prettyprint\">#if HAS_GTK_3_10\nusing Gtk;\n#else\nusing Gd;\n#endif\n\n\/**\n * A Gtk.HeaderBar that expects to be set as the titlebar for a Gtk.Window.\n * If it is in titlebar mode, it adds a conventional close button and adjusts\n * its own titles accordingly.\n *\/\npublic class WindowHeaderBar : HeaderBar { \/\/ Gtk.HeaderBar or Gd.HeaderBar\n\tprivate weak Gtk.Window owner_window;\n\tprivate Gtk.Button close_button;\n\tprivate Gtk.Separator close_separator;\n\n\tprivate bool is_titlebar;\n\n\tpublic WindowHeaderBar(Gtk.Window window) {\n\t\tthis.owner_window = window;\n\n\t\tthis.close_separator = new Gtk.Separator (Gtk.Orientation.VERTICAL);\n\t\tthis.close_separator.valign = Gtk.Align.FILL;\n\n\t\tthis.close_button = new Gtk.Button();\n\t\tthis.close_button.set_image(\n\t\t\tnew Gtk.Image.from_icon_name(\"window-close-symbolic\", Gtk.IconSize.MENU)\n\t\t);\n\t\tthis.close_button.get_style_context().add_class(\"image-button\");\n\t\tthis.close_button.relief = Gtk.ReliefStyle.NONE;\n\t\tthis.close_button.valign = Gtk.Align.CENTER;\n\t\tthis.close_button.clicked.connect(this.on_close_button_clicked_cb);\n\n\t\tthis.realize.connect(() =&gt; {\n\t\t\tthis.pack_end(this.close_separator);\n\t\t\tthis.pack_end(this.close_button);\n\t\t});\n\t}\n\n\tpublic new void set_title(string? title) {\n\t\tif (this.is_titlebar &amp;&amp; title == null) {\n\t\t\ttitle = this.owner_window.title;\n\t\t}\n\t\tbase.set_title(title);\n\t}\n\n\tpublic void set_is_titlebar(bool is_titlebar) {\n\t\tthis.is_titlebar = is_titlebar;\n\t\tthis.close_separator.set_visible(is_titlebar);\n\t\tthis.close_button.set_visible(is_titlebar);\n\t\tthis.set_title(this.title);\n\t}\n\n\tprivate void on_close_button_clicked_cb() {\n\t\tvar event = new Gdk.Event (Gdk.EventType.DESTROY);\n\t\tevent.any.window = this.owner_window.get_window();\n\t\tevent.any.send_event = 1;\n\t\tGtk.main_do_event (event);\n\t}\n}<\/pre>\n\n\n\n<p>This widget belongs to a particular GtkWindow. When it is being used as a titlebar, it shows a Close button and borrows the title from that window when one is not set for the HeaderBar itself. You can see that happening in my video demo of the welcome slideshow. If it is not used as a titlebar, the widget behaves as usual &#8211; so, it looks like one of these:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"525\" height=\"75\" data-attachment-id=\"1505\" data-permalink=\"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/26\/gnome-break-timer-week-6\/screenshot-from-2013-07-26-192037\/\" data-orig-file=\"https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/Screenshot-from-2013-07-26-192037.png?fit=615%2C88&amp;ssl=1\" data-orig-size=\"615,88\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}\" data-image-title=\"Screenshot from 2013-07-26 19:20:37\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/Screenshot-from-2013-07-26-192037.png?fit=300%2C42&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/Screenshot-from-2013-07-26-192037.png?fit=525%2C75&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/Screenshot-from-2013-07-26-192037.png?resize=525%2C75&#038;ssl=1\" alt=\"Screenshot from 2013-07-26 19:20:37\" class=\"wp-image-1505\" srcset=\"https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/Screenshot-from-2013-07-26-192037.png?w=615&amp;ssl=1 615w, https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/Screenshot-from-2013-07-26-192037.png?resize=300%2C42&amp;ssl=1 300w\" sizes=\"auto, (max-width: 525px) 100vw, 525px\" \/><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"525\" height=\"75\" data-attachment-id=\"1504\" data-permalink=\"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/26\/gnome-break-timer-week-6\/screenshot-from-2013-07-26-192019\/\" data-orig-file=\"https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/Screenshot-from-2013-07-26-192019.png?fit=615%2C88&amp;ssl=1\" data-orig-size=\"615,88\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}\" data-image-title=\"Screenshot from 2013-07-26 19:20:19\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/Screenshot-from-2013-07-26-192019.png?fit=300%2C42&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/Screenshot-from-2013-07-26-192019.png?fit=525%2C75&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/Screenshot-from-2013-07-26-192019.png?resize=525%2C75&#038;ssl=1\" alt=\"Screenshot from 2013-07-26 19:20:19\" class=\"wp-image-1504\" srcset=\"https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/Screenshot-from-2013-07-26-192019.png?w=615&amp;ssl=1 615w, https:\/\/i0.wp.com\/dylanmc.ca\/wp-content\/uploads\/Screenshot-from-2013-07-26-192019.png?resize=300%2C42&amp;ssl=1 300w\" sizes=\"auto, (max-width: 525px) 100vw, 525px\" \/><\/figure><\/div>\n\n\n\n<p>Unfortunately, I can&#8217;t find a nice way for the widget to detect when it&#8217;s being used as a window&#8217;s titlebar, so it needs a <code>set_is_titlebar<\/code> method that gets called by the owner. Other than that, the ugliness is self-contained.<\/p>\n\n\n\n<p>Another small change I&#8217;m very happy with is to how the break notifications appear. They are persistent, now, so as long as you need to take a break there will be a notification for it in the message tray. This makes them much tidier, and harder to miss. Now I just wish there was a way to have a notification banner stay open without needing to mark it as &#8220;critical&#8221; priority. I hate the idea that a &#8220;take a break&#8221; notification could take priority over a &#8220;low battery&#8221; notification\u2026<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">How to install GNOME Break Timer<\/h3>\n\n\n\n<p>As always, I have been messing with my packages. If you want to try the latest test of GNOME Break Timer, there are two things you can do:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>You can download <a href=\"https:\/\/s1.dylanmccall.com\/gnome-break-timer\/code\/gnome-break-timer-1.0-gsoc-6.tar.xz\">this archive for the latest release<\/a> and do the usual <code>.\/configure<\/code>, <code>make<\/code> and <code>make install<\/code> thing. To build on Debian, it depends on libx11-dev, libxtst-dev, libxi-dev, as well as valac and libgtk3-dev (&gt;= 3.7) and the other usual suspects.<\/li><li>Or, if you&#8217;re running Ubuntu 13.10 (or 13.04 with GNOME 3.8 installed), there&#8217;s a working PPA, so open a terminal and enter <code>sudo add-apt-repository <a href=\"https:\/\/code.launchpad.net\/~brainbreak\/+archive\/experimental\">ppa:brainbreak\/experimental<\/a> &amp;&amp; sudo apt-get update &amp;&amp; sudo apt-get install gnome-break-timer<\/code>. Note that the package has a different name than before (even though the repository is the same), so if you installed the brainbreak-experimental package earlier (thank you very much, by the way!), you&#8217;ll need to install gnome-break-timer anyway.<\/li><\/ul>\n\n\n\n<p>Next week, I&#8217;m going to make a serious effort to gather feedback on how this is working. I&#8217;m thinking of <a href=\"http:\/\/piwik.org\/blog\/2012\/04\/how-to-use-piwik-to-track-mobile-apps-activity-clicks-phones-errors-etc\">hooking up Piwik<\/a> for some rudimentary statistics-gathering within the app. I&#8217;m not sure how much trouble it would be, or if it would be worth doing. We&#8217;ll see, anyway. I will also be looking at things outside Break Timer that could be changed to enable certain features, such as better lock screen notifications out of the box. GUADEC would be a perfect venue for that sort of thing, but unfortunately I won&#8217;t be there. (Next year, maybe?). Still, even if it&#8217;s just on IRC and mailing lists, it will be nice to poke my head outside this little corner I&#8217;ve been working in.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>It&#8217;s time to talk about my GSoC project again, where I&#8217;m making a new break timer app for GNOME. First, thank you, dear readers, for your feedback and support so far! It really helps to know other people are interested in this.<\/p>\n<p>The last two weeks have been about tying up loose ends so I don&#8217;t get bogged down later on. First, I removed all traces of the old working title. This application is called GNOME Break Timer, now, instead of having several different names (and things that looked like names) strewn about. It probably only bothered me, but I&#8217;m really glad to have some logic on that front&hellip;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":3,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"","footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[55],"tags":[],"class_list":["post-1446","post","type-post","status-publish","format-standard","hentry","category-gsoc-2013"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>GNOME Break Timer: Week 6 - Dylan McCall<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/26\/gnome-break-timer-week-6\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"GNOME Break Timer: Week 6 - Dylan McCall\" \/>\n<meta property=\"og:description\" content=\"It&#8217;s time to talk about my GSoC project again, where I&#8217;m making a new break timer app for GNOME. First, thank you, dear readers, for your feedback and support so far! It really helps to know other people are interested in this.  The last two weeks have been about tying up loose ends so I don&#8217;t get bogged down later on. First, I removed all traces of the old working title. This application is called GNOME Break Timer, now, instead of having several different names (and things that looked like names) strewn about. It probably only bothered me, but I&#8217;m really glad to have some logic on that front&hellip;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/26\/gnome-break-timer-week-6\/\" \/>\n<meta property=\"og:site_name\" content=\"Dylan McCall\" \/>\n<meta property=\"article:published_time\" content=\"2013-07-27T02:09:47+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-12-01T19:26:18+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/dylanmc.ca\/wp-content\/uploads\/Screenshot-from-2013-07-26-192037.png\" \/>\n<meta name=\"author\" content=\"Dylan McCall\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Dylan McCall\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/26\/gnome-break-timer-week-6\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/26\/gnome-break-timer-week-6\/\"},\"author\":{\"name\":\"Dylan McCall\",\"@id\":\"https:\/\/dylanmc.ca\/\/-\/#\/schema\/person\/c244419a779c5414c768bc53ac5fb2d5\"},\"headline\":\"GNOME Break Timer: Week 6\",\"datePublished\":\"2013-07-27T02:09:47+00:00\",\"dateModified\":\"2021-12-01T19:26:18+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/26\/gnome-break-timer-week-6\/\"},\"wordCount\":753,\"image\":{\"@id\":\"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/26\/gnome-break-timer-week-6\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/dylanmc.ca\/wp-content\/uploads\/Screenshot-from-2013-07-26-192037.png\",\"articleSection\":[\"GSoC 2013\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/26\/gnome-break-timer-week-6\/\",\"url\":\"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/26\/gnome-break-timer-week-6\/\",\"name\":\"GNOME Break Timer: Week 6 - Dylan McCall\",\"isPartOf\":{\"@id\":\"https:\/\/dylanmc.ca\/\/-\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/26\/gnome-break-timer-week-6\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/26\/gnome-break-timer-week-6\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/dylanmc.ca\/wp-content\/uploads\/Screenshot-from-2013-07-26-192037.png\",\"datePublished\":\"2013-07-27T02:09:47+00:00\",\"dateModified\":\"2021-12-01T19:26:18+00:00\",\"author\":{\"@id\":\"https:\/\/dylanmc.ca\/\/-\/#\/schema\/person\/c244419a779c5414c768bc53ac5fb2d5\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/26\/gnome-break-timer-week-6\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/26\/gnome-break-timer-week-6\/#primaryimage\",\"url\":\"https:\/\/dylanmc.ca\/wp-content\/uploads\/Screenshot-from-2013-07-26-192037.png\",\"contentUrl\":\"https:\/\/dylanmc.ca\/wp-content\/uploads\/Screenshot-from-2013-07-26-192037.png\"},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/dylanmc.ca\/\/-\/#website\",\"url\":\"https:\/\/dylanmc.ca\/\/-\/\",\"name\":\"Dylan McCall\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/dylanmc.ca\/\/-\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/dylanmc.ca\/\/-\/#\/schema\/person\/c244419a779c5414c768bc53ac5fb2d5\",\"name\":\"Dylan McCall\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/dylanmc.ca\/\/-\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/c94ab3a7e6a884542205e0408711cd54bb1fd5f4e90e7a5f621a54656a18a037?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/c94ab3a7e6a884542205e0408711cd54bb1fd5f4e90e7a5f621a54656a18a037?s=96&d=mm&r=g\",\"caption\":\"Dylan McCall\"},\"description\":\"Software developer, tea drinker, GNOME contributor. Occasionally a raving fanatic.\",\"sameAs\":[\"https:\/\/dylanmc.ca\/\/-\"],\"url\":\"https:\/\/dylanmc.ca\/\/-\/blog\/author\/dylan\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"GNOME Break Timer: Week 6 - Dylan McCall","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/26\/gnome-break-timer-week-6\/","og_locale":"en_US","og_type":"article","og_title":"GNOME Break Timer: Week 6 - Dylan McCall","og_description":"It&#8217;s time to talk about my GSoC project again, where I&#8217;m making a new break timer app for GNOME. First, thank you, dear readers, for your feedback and support so far! It really helps to know other people are interested in this.  The last two weeks have been about tying up loose ends so I don&#8217;t get bogged down later on. First, I removed all traces of the old working title. This application is called GNOME Break Timer, now, instead of having several different names (and things that looked like names) strewn about. It probably only bothered me, but I&#8217;m really glad to have some logic on that front&hellip;","og_url":"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/26\/gnome-break-timer-week-6\/","og_site_name":"Dylan McCall","article_published_time":"2013-07-27T02:09:47+00:00","article_modified_time":"2021-12-01T19:26:18+00:00","og_image":[{"url":"https:\/\/dylanmc.ca\/wp-content\/uploads\/Screenshot-from-2013-07-26-192037.png","type":"","width":"","height":""}],"author":"Dylan McCall","twitter_misc":{"Written by":"Dylan McCall","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/26\/gnome-break-timer-week-6\/#article","isPartOf":{"@id":"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/26\/gnome-break-timer-week-6\/"},"author":{"name":"Dylan McCall","@id":"https:\/\/dylanmc.ca\/\/-\/#\/schema\/person\/c244419a779c5414c768bc53ac5fb2d5"},"headline":"GNOME Break Timer: Week 6","datePublished":"2013-07-27T02:09:47+00:00","dateModified":"2021-12-01T19:26:18+00:00","mainEntityOfPage":{"@id":"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/26\/gnome-break-timer-week-6\/"},"wordCount":753,"image":{"@id":"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/26\/gnome-break-timer-week-6\/#primaryimage"},"thumbnailUrl":"https:\/\/dylanmc.ca\/wp-content\/uploads\/Screenshot-from-2013-07-26-192037.png","articleSection":["GSoC 2013"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/26\/gnome-break-timer-week-6\/","url":"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/26\/gnome-break-timer-week-6\/","name":"GNOME Break Timer: Week 6 - Dylan McCall","isPartOf":{"@id":"https:\/\/dylanmc.ca\/\/-\/#website"},"primaryImageOfPage":{"@id":"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/26\/gnome-break-timer-week-6\/#primaryimage"},"image":{"@id":"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/26\/gnome-break-timer-week-6\/#primaryimage"},"thumbnailUrl":"https:\/\/dylanmc.ca\/wp-content\/uploads\/Screenshot-from-2013-07-26-192037.png","datePublished":"2013-07-27T02:09:47+00:00","dateModified":"2021-12-01T19:26:18+00:00","author":{"@id":"https:\/\/dylanmc.ca\/\/-\/#\/schema\/person\/c244419a779c5414c768bc53ac5fb2d5"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/26\/gnome-break-timer-week-6\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/dylanmc.ca\/\/-\/blog\/2013\/07\/26\/gnome-break-timer-week-6\/#primaryimage","url":"https:\/\/dylanmc.ca\/wp-content\/uploads\/Screenshot-from-2013-07-26-192037.png","contentUrl":"https:\/\/dylanmc.ca\/wp-content\/uploads\/Screenshot-from-2013-07-26-192037.png"},{"@type":"WebSite","@id":"https:\/\/dylanmc.ca\/\/-\/#website","url":"https:\/\/dylanmc.ca\/\/-\/","name":"Dylan McCall","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/dylanmc.ca\/\/-\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/dylanmc.ca\/\/-\/#\/schema\/person\/c244419a779c5414c768bc53ac5fb2d5","name":"Dylan McCall","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/dylanmc.ca\/\/-\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/c94ab3a7e6a884542205e0408711cd54bb1fd5f4e90e7a5f621a54656a18a037?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c94ab3a7e6a884542205e0408711cd54bb1fd5f4e90e7a5f621a54656a18a037?s=96&d=mm&r=g","caption":"Dylan McCall"},"description":"Software developer, tea drinker, GNOME contributor. Occasionally a raving fanatic.","sameAs":["https:\/\/dylanmc.ca\/\/-"],"url":"https:\/\/dylanmc.ca\/\/-\/blog\/author\/dylan\/"}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/pcXOQX-nk","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/dylanmc.ca\/\/-\/wp-json\/wp\/v2\/posts\/1446","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dylanmc.ca\/\/-\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dylanmc.ca\/\/-\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dylanmc.ca\/\/-\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/dylanmc.ca\/\/-\/wp-json\/wp\/v2\/comments?post=1446"}],"version-history":[{"count":57,"href":"https:\/\/dylanmc.ca\/\/-\/wp-json\/wp\/v2\/posts\/1446\/revisions"}],"predecessor-version":[{"id":11009,"href":"https:\/\/dylanmc.ca\/\/-\/wp-json\/wp\/v2\/posts\/1446\/revisions\/11009"}],"wp:attachment":[{"href":"https:\/\/dylanmc.ca\/\/-\/wp-json\/wp\/v2\/media?parent=1446"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dylanmc.ca\/\/-\/wp-json\/wp\/v2\/categories?post=1446"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dylanmc.ca\/\/-\/wp-json\/wp\/v2\/tags?post=1446"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}