typedef struct _OSDIcon OSDIcon;
struct _OSDIcon {
- gint x;
+ gint reset; /* reset on new image */
+ gint x; /* x, y offset */
gint y;
- gchar *key;
+ gchar *key; /* inline pixbuf */
};
static OSDIcon osd_icons[] = {
- { 0, -10, PIXBUF_INLINE_ICON },
- { -10, -10, "IMAGE_OSD_ROTATE_USER" },
- { -10, -10, "IMAGE_OSD_ROTATE_AUTO" },
- { -40, -10, "IMAGE_OSD_COLOR" },
- { -70, -10, "IMAGE_OSD_FIRST" },
- { -70, -10, "IMAGE_OSD_LAST" },
- { 0, 0, NULL }
+ { TRUE, 0, 0, NULL }, /* none */
+ { TRUE, -10, -10, NULL }, /* auto rotated */
+ { TRUE, -10, -10, NULL }, /* user rotated */
+ { TRUE, -40, -10, NULL }, /* color embedded */
+ { TRUE, -70, -10, NULL }, /* first image */
+ { TRUE, -70, -10, NULL }, /* last image */
+ { FALSE, -70, -10, NULL }, /* osd enabled */
+ { FALSE, 0, 0, NULL }
};
#define OSD_DATA "overlay-data"
if (!icons) icons = g_new0(GdkPixbuf *, IMAGE_OSD_COUNT);
if (icons[flag]) return icons[flag];
- icon = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, 24, 24);
- pixbuf_set_rect_fill(icon, 1, 1, 22, 22, 255, 255, 255, 200);
- pixbuf_set_rect(icon, 0, 0, 24, 24, 0, 0, 0, 128, 1, 1, 1, 1);
- switch (flag)
+ if (osd_icons[flag].key)
{
- case IMAGE_OSD_COLOR:
- pixbuf_set_rect_fill(icon, 3, 3, 18, 6, 200, 0, 0, 255);
- pixbuf_set_rect_fill(icon, 3, 9, 18, 6, 0, 200, 0, 255);
- pixbuf_set_rect_fill(icon, 3, 15, 18, 6, 0, 0, 200, 255);
- break;
- case IMAGE_OSD_FIRST:
- pixbuf_set_rect(icon, 3, 3, 18, 18, 0, 0, 0, 200, 3, 3, 3, 0);
- pixbuf_draw_triangle(icon, 6, 5, 12, 6,
- 12, 5, 18, 11, 6, 11,
- 0, 0, 0, 255);
- break;
- case IMAGE_OSD_LAST:
- pixbuf_set_rect(icon, 3, 3, 18, 18, 0, 0, 0, 200, 3, 3, 0, 3);
- pixbuf_draw_triangle(icon, 6, 12, 12, 6,
- 12, 18, 6, 12, 18, 12,
- 0, 0, 0, 255);
- break;
- default:
- break;
+ icon = pixbuf_inline(osd_icons[flag].key);
+ }
+
+ if (!icon)
+ {
+ icon = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, 24, 24);
+ pixbuf_set_rect_fill(icon, 1, 1, 22, 22, 255, 255, 255, 200);
+ pixbuf_set_rect(icon, 0, 0, 24, 24, 0, 0, 0, 128, 1, 1, 1, 1);
+ switch (flag)
+ {
+ case IMAGE_OSD_ROTATE_AUTO:
+ pixbuf_set_rect(icon, 3, 8, 11, 12,
+ 0, 0, 0, 255,
+ 3, 0, 3, 0);
+ pixbuf_draw_triangle(icon, 14, 3, 6, 12,
+ 20, 9, 14, 15, 14, 3,
+ 0, 0, 0, 255);
+ break;
+ case IMAGE_OSD_ROTATE_USER:
+ break;
+ case IMAGE_OSD_COLOR:
+ pixbuf_set_rect_fill(icon, 3, 3, 18, 6, 200, 0, 0, 255);
+ pixbuf_set_rect_fill(icon, 3, 9, 18, 6, 0, 200, 0, 255);
+ pixbuf_set_rect_fill(icon, 3, 15, 18, 6, 0, 0, 200, 255);
+ break;
+ case IMAGE_OSD_FIRST:
+ pixbuf_set_rect(icon, 3, 3, 18, 18, 0, 0, 0, 200, 3, 3, 3, 0);
+ pixbuf_draw_triangle(icon, 6, 5, 12, 6,
+ 12, 5, 18, 11, 6, 11,
+ 0, 0, 0, 255);
+ break;
+ case IMAGE_OSD_LAST:
+ pixbuf_set_rect(icon, 3, 3, 18, 18, 0, 0, 0, 200, 3, 3, 0, 3);
+ pixbuf_draw_triangle(icon, 6, 12, 12, 6,
+ 12, 18, 6, 12, 18, 12,
+ 0, 0, 0, 255);
+ break;
+ case IMAGE_OSD_ICON:
+ pixbuf_set_rect_fill(icon, 11, 3, 3, 12, 0, 0, 0, 255);
+ pixbuf_set_rect_fill(icon, 11, 17, 3, 3, 0, 0, 0, 255);
+ break;
+ default:
+ break;
+ }
}
icons[flag] = icon;
if (osd->changed_states & IMAGE_STATE_IMAGE)
{
- for (i = 0; i < IMAGE_OSD_COUNT; i++) osd->icon_time[i] = 0;
+ for (i = 0; i < IMAGE_OSD_COUNT; i++)
+ {
+ if (osd_icons[i].reset) osd->icon_time[i] = 0;
+ }
}
if (osd->changed_states & IMAGE_STATE_COLOR_ADJ)
image_osd_timer_schedule(osd);
}
+ if (osd->changed_states & IMAGE_STATE_ROTATE_AUTO)
+ {
+ gint n = 0;
+
+ if (osd->imd->state & IMAGE_STATE_ROTATE_AUTO)
+ {
+ n = 1;
+ if (!osd->imd->cm) n += IMAGE_OSD_DEFAULT_DURATION;
+ }
+
+ osd->icon_time[IMAGE_OSD_ROTATE_AUTO] = n;
+ image_osd_timer_schedule(osd);
+ }
+
for (i = 0; i < IMAGE_OSD_COUNT; i++)
{
if (osd->icon_time[i] > 0)
*----------------------------------------------------------------------------
*/
-static void layout_image_overlay_set(LayoutWindow *lw, gint enable)
+void layout_image_overlay_toggle(LayoutWindow *lw)
{
- lw->full_screen_overlay_on = enable;
-
- if (!lw->full_screen) return;
-
- image_osd_set(lw->image, enable, enable);
+ if (image_osd_get(lw->image, NULL, NULL))
+ {
+ image_osd_set(lw->image, FALSE, FALSE);
+ }
+ else
+ {
+ image_osd_set(lw->image, (lw->full_screen != NULL), TRUE);
+ image_osd_icon(lw->image, IMAGE_OSD_ICON, -1);
+ }
}
void layout_image_overlay_update(LayoutWindow *lw)
{
- if (!lw || !lw->full_screen) return;
+ if (!lw) return;
image_osd_update(lw->image);
}
layout_image_full_screen_menu_popup(lw);
break;
case 'I': case 'i':
- layout_image_overlay_set(lw, !(lw->full_screen_overlay_on));
+ layout_image_overlay_toggle(lw);
break;
default:
stop_signal = FALSE;
if (lw->tools) gtk_widget_set_sensitive(lw->tools, FALSE);
#endif
- layout_image_overlay_set(lw, lw->full_screen_overlay_on);
+ if (image_osd_get(lw->full_screen->normal_imd, NULL, NULL))
+ {
+ image_osd_set(lw->image, TRUE, TRUE);
+ image_osd_set(lw->full_screen->normal_imd, FALSE, FALSE);
+ }
}
void layout_image_full_screen_stop(LayoutWindow *lw)
if (!layout_valid(&lw)) return;
if (!lw->full_screen) return;
+ if (image_osd_get(lw->image, NULL, NULL))
+ {
+ image_osd_set(lw->full_screen->normal_imd, FALSE, TRUE);
+ }
fullscreen_stop(lw->full_screen);
#if 0
if (cd && info)
{
info = collection_next_by_info(cd, info);
- if (info) layout_image_set_collection_real(lw, cd, info, TRUE);
+ if (info)
+ {
+ layout_image_set_collection_real(lw, cd, info, TRUE);
+ }
+ else
+ {
+ image_osd_icon(lw->image, IMAGE_OSD_LAST, -1);
+ }
return;
}
{
layout_image_set_index(lw, current + 1);
}
+ else
+ {
+ image_osd_icon(lw->image, IMAGE_OSD_LAST, -1);
+ }
}
else
{
if (cd && info)
{
info = collection_prev_by_info(cd, info);
- if (info) layout_image_set_collection_real(lw, cd, info, FALSE);
+ if (info)
+ {
+ layout_image_set_collection_real(lw, cd, info, FALSE);
+ }
+ else
+ {
+ image_osd_icon(lw->image, IMAGE_OSD_FIRST, -1);
+ }
return;
}
{
layout_image_set_index(lw, current - 1);
}
+ else
+ {
+ image_osd_icon(lw->image, IMAGE_OSD_FIRST, -1);
+ }
}
else
{