{"id":298,"date":"2017-03-29T03:18:34","date_gmt":"2017-03-29T03:18:34","guid":{"rendered":"http:\/\/www.piboxproject.com\/?p=298"},"modified":"2017-03-29T03:30:26","modified_gmt":"2017-03-29T03:30:26","slug":"pipics-slideshow-app-with-touchscreen-support","status":"publish","type":"post","link":"https:\/\/www.piboxproject.com\/index.php\/2017\/03\/29\/pipics-slideshow-app-with-touchscreen-support\/","title":{"rendered":"PiPics:  slideshow app with touchscreen support"},"content":{"rendered":"<div id=\"dslc-theme-content\"><div id=\"dslc-theme-content-inner\"><p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"327\" data-permalink=\"https:\/\/www.piboxproject.com\/index.php\/2017\/03\/29\/pipics-slideshow-app-with-touchscreen-support\/img_0029\/\" data-orig-file=\"https:\/\/i0.wp.com\/www.piboxproject.com\/wp-content\/uploads\/2017\/03\/IMG_0029.png?fit=1600%2C1330&amp;ssl=1\" data-orig-size=\"1600,1330\" data-comments-opened=\"1\" 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;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"IMG_0029\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/www.piboxproject.com\/wp-content\/uploads\/2017\/03\/IMG_0029.png?fit=300%2C249&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/www.piboxproject.com\/wp-content\/uploads\/2017\/03\/IMG_0029.png?fit=1024%2C851&amp;ssl=1\" class=\"size-medium wp-image-327 alignleft\" src=\"https:\/\/i0.wp.com\/www.piboxproject.com\/wp-content\/uploads\/2017\/03\/IMG_0029.png?resize=300%2C249&#038;ssl=1\" alt=\"\" width=\"300\" height=\"249\" srcset=\"https:\/\/i0.wp.com\/www.piboxproject.com\/wp-content\/uploads\/2017\/03\/IMG_0029.png?resize=300%2C249&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.piboxproject.com\/wp-content\/uploads\/2017\/03\/IMG_0029.png?resize=768%2C638&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.piboxproject.com\/wp-content\/uploads\/2017\/03\/IMG_0029.png?resize=1024%2C851&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.piboxproject.com\/wp-content\/uploads\/2017\/03\/IMG_0029.png?w=1600&amp;ssl=1 1600w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/>On February 5th, we lost out oldest dog Reba.\u00a0 Reba was a 14 1\/2 year old rescue and the prettiest Golden Retriever (or more likely <a href=\"https:\/\/en.wikipedia.org\/wiki\/Nova_Scotia_Duck_Tolling_Retriever\">Nova Scotia Duck Tolling<\/a> retriever) mix we&#8217;ve ever seen.\u00a0 Adopted from a shelter when she was perhaps 3 or 4 months old with her twin sister Phoebe (who died very young, sadly), Reba was a lover and a sneak who for some reason thought she was a cat.\u00a0 She was a joy and friend for many years.\u00a0 You will be sorely missed, our love.<\/p>\n<p>Reba passed a couple of days before a <a href=\"https:\/\/www.meetup.com\/PiBox-Embedded-Developers\/\">PiBox Meetup<\/a> meeting.\u00a0 Being very close to my dogs &#8211; we still have <a href=\"http:\/\/www.rpawd.com\/\">Bailey and Cody<\/a> &#8211; I was very distraught and wasn&#8217;t sure I would make the meeting.\u00a0 So I decided to dive into a PiBox project that was well suited the situation:\u00a0 creating a digital photo frame with PiBox and a Raspberry Pi 7&#8243; touchscreen display.\u00a0 Having some work to focus on was the only way to help ease the thoughts of Reba&#8217;s passing.\u00a0 And it gave me a way to help remember her always.<\/p>\n<p>The photo frame project (which I noted as the <em>In Memoriam<\/em> project on the Meetup group) needed two new apps:\u00a0 a photo slideshow and a video player that looped a video collection.\u00a0 The existing video player, <a href=\"https:\/\/gitlab.com\/pibox\/videofe\">VideoFE<\/a>, got a kiosk mode to handle cycling through random videos without user interaction.\u00a0 That work led to the long needed scalability update to the launcher app, a task that turned out to be easier than expected using <a href=\"https:\/\/developer.gnome.org\/gdk-pixbuf\/\">gdk_pixbuf<\/a> and <a href=\"https:\/\/www.cairographics.org\/\">Cairo<\/a>. Both of these tasks I&#8217;ll cover in separate articles.\u00a0 That left just the slideshow app, which I call <em>PiPics<\/em>.<\/p>\n<p><a href=\"https:\/\/gitlab.com\/pibox\/pipics\">PiPics<\/a> is an app that searches for images on USB media sticks and displays each one for 10 seconds before moving to the next image, looping back to the start when it has shown all images.\u00a0 The fact that the app would need to find all files of a given type on a USB media stick made it appear to be a near duplicate of what VideoFE does.\u00a0 VideoFE searches for database files (created with the <a href=\"https:\/\/gitlab.com\/pibox\/videolib\">VideoLib<\/a> java app) and calls an external player, <a href=\"https:\/\/github.com\/popcornmix\/omxplayer\">omxplayer<\/a>, to play a user selected file.<\/p>\n<p>The first pass at PiPics utilized a large amount of VideoFE.\u00a0 I switched to looking for a variety of static image file formats instead of video file formats.\u00a0\u00a0 Also, I no longer needed a database because I only have filenames to track.\u00a0 There is no photo metadata.\u00a0 VideoFE&#8217;s code for launching an external player was modified to launch a different app, <a href=\"https:\/\/feh.finalrewind.org\/\">feh<\/a>.\u00a0 This is a static image player that utilized a simple signal-based mechanism for moving to the next or previous image in a list.\u00a0 Seemed like a perfect fit for this use case.\u00a0 But it didn&#8217;t work.<\/p>\n<p>Feh, as good as it is, crashed often.\u00a0 While it displayed images fine it wasn&#8217;t happy moving to and fro between images using the signal mechanism.\u00a0 So I dropped that plan pretty quick.<\/p>\n<p>Thinking about how much I&#8217;d learned about the Cairo graphics library recently I decided I could easily build an app to draw images with that library, but only if I found some way to read more than just PNG format files.\u00a0 Cairo is limited in this respect.\u00a0 It reads PNG files, but nothing else.\u00a0 The average user would probably be using JPEG or GIF files and perhaps a few others.\u00a0 So I started looking for other libraries.<\/p>\n<table>\n<tbody>\n<tr>\n<td>\n<p><div id=\"attachment_333\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/smile.amazon.com\/gp\/product\/B01FZ2RJN8\/ref=oh_aui_detailpage_o01_s00?ie=UTF8&amp;psc=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-333\" data-attachment-id=\"333\" data-permalink=\"https:\/\/www.piboxproject.com\/index.php\/2017\/03\/29\/pipics-slideshow-app-with-touchscreen-support\/memoriam-backedge\/\" data-orig-file=\"https:\/\/i0.wp.com\/www.piboxproject.com\/wp-content\/uploads\/2017\/03\/memoriam-backedge.png?fit=2048%2C1536&amp;ssl=1\" data-orig-size=\"2048,1536\" data-comments-opened=\"1\" 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;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"memoriam-backedge\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/www.piboxproject.com\/wp-content\/uploads\/2017\/03\/memoriam-backedge.png?fit=300%2C225&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/www.piboxproject.com\/wp-content\/uploads\/2017\/03\/memoriam-backedge.png?fit=1024%2C768&amp;ssl=1\" class=\"wp-image-333 size-medium\" src=\"https:\/\/i0.wp.com\/www.piboxproject.com\/wp-content\/uploads\/2017\/03\/memoriam-backedge.png?resize=300%2C225&#038;ssl=1\" width=\"300\" height=\"225\" srcset=\"https:\/\/i0.wp.com\/www.piboxproject.com\/wp-content\/uploads\/2017\/03\/memoriam-backedge.png?resize=300%2C225&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.piboxproject.com\/wp-content\/uploads\/2017\/03\/memoriam-backedge.png?resize=768%2C576&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.piboxproject.com\/wp-content\/uploads\/2017\/03\/memoriam-backedge.png?resize=1024%2C768&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.piboxproject.com\/wp-content\/uploads\/2017\/03\/memoriam-backedge.png?w=2048&amp;ssl=1 2048w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-333\" class=\"wp-caption-text\">The wooden stand for this project comes from Eleduino and was purchased through Amazon.<\/p><\/div><\/td>\n<td><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"332\" data-permalink=\"https:\/\/www.piboxproject.com\/index.php\/2017\/03\/29\/pipics-slideshow-app-with-touchscreen-support\/memoriam-back\/\" data-orig-file=\"https:\/\/i0.wp.com\/www.piboxproject.com\/wp-content\/uploads\/2017\/03\/memoriam-back.png?fit=2048%2C1030&amp;ssl=1\" data-orig-size=\"2048,1030\" data-comments-opened=\"1\" 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;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"memoriam-back\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/www.piboxproject.com\/wp-content\/uploads\/2017\/03\/memoriam-back.png?fit=300%2C151&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/www.piboxproject.com\/wp-content\/uploads\/2017\/03\/memoriam-back.png?fit=1024%2C515&amp;ssl=1\" class=\"size-medium wp-image-332 aligncenter\" src=\"https:\/\/i0.wp.com\/www.piboxproject.com\/wp-content\/uploads\/2017\/03\/memoriam-back.png?resize=300%2C151&#038;ssl=1\" alt=\"\" width=\"300\" height=\"151\" srcset=\"https:\/\/i0.wp.com\/www.piboxproject.com\/wp-content\/uploads\/2017\/03\/memoriam-back.png?resize=300%2C151&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.piboxproject.com\/wp-content\/uploads\/2017\/03\/memoriam-back.png?resize=768%2C386&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.piboxproject.com\/wp-content\/uploads\/2017\/03\/memoriam-back.png?resize=1024%2C515&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.piboxproject.com\/wp-content\/uploads\/2017\/03\/memoriam-back.png?w=2048&amp;ssl=1 2048w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>GDK Pixbuf and Cairo<\/h3>\n<p>Enter gdk_pixbuf.\u00a0 For a digital frame we really want the most popular formats:\u00a0 gif, jpeg, png and perhaps tiff.\u00a0 The gdk_pixbuf library has a <a href=\"https:\/\/developer.gnome.org\/gdk-pixbuf\/stable\/gdk-pixbuf-File-Loading.html#gdk-pixbuf-new-from-file\">single function<\/a> for reading a <a href=\"http:\/\/stackoverflow.com\/a\/40740651\">multitude of file formats<\/a> including the ones I needed.\u00a0 More importantly it provided two additional features.\u00a0 The first was an easy way to translate gdk_pixbuf data to Cairo data and the other was an easy way to scale the image data.<\/p>\n<p>Loading an image starts with passing a filename to gdk_pixbuf.\u00a0 The pointer returned is then passed to another gdk_pixbuf function to handle automatic rotation based on image metadata.<\/p>\n<pre>\u00a0\u00a0\u00a0 image\u00a0 = gdk_pixbuf_new_from_file(imagePath, NULL);\r\n\u00a0\u00a0\u00a0 newimage = gdk_pixbuf_apply_embedded_orientation (image);\r\n\u00a0\u00a0\u00a0 g_object_unref(image);\r\n\u00a0\u00a0\u00a0 image = newimage;<\/pre>\n<p>The second call returns a new pointer or a new reference.\u00a0 By removing the reference to the original we keep from leaking references.\u00a0 We then return the new pointer\/reference to the original variable for later use.<\/p>\n<p>The size of the image is retrieved so we can choose a scaling factor.\u00a0 We want to fit the image to the display without losing the aspect ratio.\u00a0 I found a <a href=\"http:\/\/stackoverflow.com\/a\/6565988\">good algorithm for scaling while keeping aspect ratio<\/a> online.<\/p>\n<pre>\u00a0\u00a0\u00a0 iwidth\u00a0 = gdk_pixbuf_get_width(image);\r\n\u00a0\u00a0\u00a0 iheight = gdk_pixbuf_get_height(image);\r\n\r\n\u00a0\u00a0\u00a0 \/* Compute scaling to keep aspect ratio but fit in the screen *\/\r\n\u00a0\u00a0\u00a0 ri = iwidth \/ iheight;\r\n\u00a0\u00a0\u00a0 rs = req.width \/ req.height;\r\n\u00a0\u00a0\u00a0 if ( rs &gt; ri )\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 swidth = (gint)(iwidth * req.height\/iheight);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 sheight = req.height;\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 else\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 swidth = req.width;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 sheight = (gint)(iheight * req.width\/iwidth);\r\n\u00a0\u00a0\u00a0 }<\/pre>\n<p>The gdk_pixbuf is scaled first, then it&#8217;s set as the source for a Cairo surface and the surface is displayed.<\/p>\n<pre>\u00a0\u00a0\u00a0 newimage = gdk_pixbuf_scale_simple(image, swidth, sheight, GDK_INTERP_BILINEAR);\r\n\u00a0\u00a0\u00a0 iwidth\u00a0 = gdk_pixbuf_get_width(newimage);\r\n\u00a0\u00a0\u00a0 iheight = gdk_pixbuf_get_height(newimage);\r\n\u00a0\u00a0\u00a0 piboxLogger(LOG_INFO, \"image w\/h: %d \/ %d\\n\", iwidth, iheight);\r\n\r\n\u00a0\u00a0\u00a0 \/* Center on the display *\/\r\n\u00a0\u00a0\u00a0 offset_x = (double) (((double)req.width - (double)iwidth) \/ (double)2.0);\r\n\u00a0\u00a0\u00a0 offset_y = (double) (((double)req.height - (double)iheight) \/ (double)2.0);\r\n\u00a0\u00a0\u00a0 gdk_cairo_set_source_pixbuf(cr, newimage, offset_x, offset_y);<\/pre>\n<p>Cairo is not strictly required here but it&#8217;s easier than working within the bounds of widget layout of GTK+.\u00a0 With Cairo and a drawing area widget I can just paint on the screen.<\/p>\n<h3>Touchscreen Navigation<\/h3>\n<div id=\"attachment_334\" style=\"width: 310px\" class=\"wp-caption alignleft\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-334\" data-attachment-id=\"334\" data-permalink=\"https:\/\/www.piboxproject.com\/index.php\/2017\/03\/29\/pipics-slideshow-app-with-touchscreen-support\/memoriam-distro\/\" data-orig-file=\"https:\/\/i0.wp.com\/www.piboxproject.com\/wp-content\/uploads\/2017\/03\/memoriam-distro.png?fit=2048%2C1156&amp;ssl=1\" data-orig-size=\"2048,1156\" data-comments-opened=\"1\" 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;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"memoriam-distro\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/www.piboxproject.com\/wp-content\/uploads\/2017\/03\/memoriam-distro.png?fit=300%2C169&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/www.piboxproject.com\/wp-content\/uploads\/2017\/03\/memoriam-distro.png?fit=1024%2C578&amp;ssl=1\" class=\"wp-image-334 size-medium\" src=\"https:\/\/i0.wp.com\/www.piboxproject.com\/wp-content\/uploads\/2017\/03\/memoriam-distro.png?resize=300%2C169&#038;ssl=1\" width=\"300\" height=\"169\" srcset=\"https:\/\/i0.wp.com\/www.piboxproject.com\/wp-content\/uploads\/2017\/03\/memoriam-distro.png?resize=300%2C169&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.piboxproject.com\/wp-content\/uploads\/2017\/03\/memoriam-distro.png?resize=768%2C434&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.piboxproject.com\/wp-content\/uploads\/2017\/03\/memoriam-distro.png?resize=1024%2C578&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.piboxproject.com\/wp-content\/uploads\/2017\/03\/memoriam-distro.png?w=2048&amp;ssl=1 2048w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><p id=\"caption-attachment-334\" class=\"wp-caption-text\">The digital photo frame uses the same launcher as the PiBox Media Center, but it only has two apps: the new PiPics app and the updated VideoFE in kiosk mode.<\/p><\/div>\n<p>PiPics is very simplistic.\u00a0 It&#8217;s designed to run in a kiosk mode where images are simply displayed but little user interaction is needed.\u00a0 However, it does support skipping forward and backward in the list of pictures.\u00a0 The usual PiBox key presses are supported &#8211; ESC to exit, left and right arrows do what you&#8217;d expect &#8211; but the point here was to integrate the new touch screen support from <a href=\"https:\/\/www.piboxproject.com\/index.php\/2017\/03\/22\/introduction-to-libpibox\/\">libpibox<\/a>.\u00a0 The original implementation of this support was tested with VideoFE so, again, I was able to port example code from that project.<\/p>\n<p>The touchscreen support provides two ways to identify touches.\u00a0 The first is an absolute screen coordinate.\u00a0 This is useful for the launcher which needs to know exactly which icon was touched in order to launch a specific application.\u00a0 The other method is to get a screen region.\u00a0 The touchscreen is divided into 9 equal regions in a 3&#215;3 cell matrix.\u00a0 This provides a nice consumer orientation for the touchscreen while using as much screen space as possible.<\/p>\n<p>The first thing you need is to initialize the touch screen library.<\/p>\n<pre>\u00a0\u00a0\u00a0 if ( piboxGetDisplayType() == PIBOX_LCD )\r\n\u00a0\u00a0\u00a0 {\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 piboxLogger(LOG_INFO, \"Registering imageTouch.\\n\");\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 piboxTouchRegisterCB(imageTouch, TOUCH_REGION);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 piboxTouchStartProcessor();\r\n\u00a0\u00a0\u00a0 }<\/pre>\n<p>The pibox functions are a new libpibox features.\u00a0 Here we register a callback that will use touch regions from the touch screen library and starts the thread that handles touch screen notifications.<\/p>\n<p>Due to the way GTK+ works with threads, you can&#8217;t update the screen directly in the <em>imageTouch<\/em> callback.\u00a0 Instead, this callback simply adds a callback to the glib idle loop so it gets called the next chance the main loop has an opportunity.<\/p>\n<p>PiPics uses the region feature of the touch screen library.\u00a0 Prev and next images are accessed using cells in the middle of the display on the left and right, respectively.\u00a0 Exit, to be consistent with other apps ported to use the touchscreen library, is the upper right and causes the launcher to regain control of the UI.\u00a0 Pause and play are in the middle of the screen.<\/p>\n<pre>\u00a0--------------------------------\r\n\u00a0| 0: N\/A | 1: N\/A\u00a0\u00a0\u00a0 | 2: Exit |\r\n\u00a0--------------------------------\r\n\u00a0| 3: Prev| 4: N\/A\u00a0\u00a0\u00a0 | 5: Next |\r\n\u00a0--------------------------------\r\n\u00a0| 6: N\/A | 7: N\/A\u00a0\u00a0\u00a0 | 8: N\/A\u00a0 |\r\n\u00a0--------------------------------<\/pre>\n<p><em>Deployment<\/em><\/p>\n<p>PiPics, like all PiBox apps, is built as an opkg.\u00a0 Installation just requires copying the package over as root and running the installation.<\/p>\n<p style=\"padding-left: 30px;\"><em>opkg-cl install pipics_0.10_arm.opk<\/em><\/p>\n<p>The recent updates to the launcher app allow me to use only a couple of apps and they will be displayed centered on their section of the launcher display.\u00a0 So the digital photo frame now has a more polished appearance, all based on the original PiBox Media Center work.<\/p>\n<p><iframe loading=\"lazy\" width=\"1170\" height=\"658\" src=\"https:\/\/www.youtube.com\/embed\/FBXtgG1t0is?feature=oembed\" frameborder=\"0\" allowfullscreen><\/iframe><\/p>\n<p>&nbsp;<\/p>\n<\/div><\/div>","protected":false},"excerpt":{"rendered":"<p>On February 5th, we lost out oldest dog Reba.\u00a0 Reba was a 14 1\/2 year old rescue and the prettiest Golden Retriever (or more likely Nova Scotia Duck Tolling retriever) mix we&#8217;ve ever seen.\u00a0 Adopted from a shelter when she was perhaps 3 or 4 months old with her twin sister Phoebe (who died very [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":327,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"footnotes":"","jetpack_publicize_message":"PiPics:  slideshow app with touchscreen support","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[1],"tags":[],"class_list":{"0":"post-298","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-uncategorized","8":"czr-hentry"},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/www.piboxproject.com\/wp-content\/uploads\/2017\/03\/IMG_0029.png?fit=1600%2C1330&ssl=1","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p8du2Y-4O","jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/www.piboxproject.com\/index.php\/wp-json\/wp\/v2\/posts\/298","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.piboxproject.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.piboxproject.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.piboxproject.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.piboxproject.com\/index.php\/wp-json\/wp\/v2\/comments?post=298"}],"version-history":[{"count":12,"href":"https:\/\/www.piboxproject.com\/index.php\/wp-json\/wp\/v2\/posts\/298\/revisions"}],"predecessor-version":[{"id":342,"href":"https:\/\/www.piboxproject.com\/index.php\/wp-json\/wp\/v2\/posts\/298\/revisions\/342"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.piboxproject.com\/index.php\/wp-json\/wp\/v2\/media\/327"}],"wp:attachment":[{"href":"https:\/\/www.piboxproject.com\/index.php\/wp-json\/wp\/v2\/media?parent=298"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.piboxproject.com\/index.php\/wp-json\/wp\/v2\/categories?post=298"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.piboxproject.com\/index.php\/wp-json\/wp\/v2\/tags?post=298"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}