Skip to content

Commit

Permalink
examples: Add multiple viewports example program
Browse files Browse the repository at this point in the history
Add a new multiple viewports example program which shows how to attach
2 viewports to the CogShell. Each viewport iterates over a couple
of views.
  • Loading branch information
psaavedra committed Nov 27, 2023
1 parent f63d9e8 commit 9aee57e
Show file tree
Hide file tree
Showing 2 changed files with 92 additions and 0 deletions.
7 changes: 7 additions & 0 deletions examples/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,10 @@ executable('viewport',
dependencies: cogcore_dep,
install: false,
)

executable('viewports',
'viewports.c',
c_args: examples_c_args,
dependencies: cogcore_dep,
install: false,
)
85 changes: 85 additions & 0 deletions examples/viewports.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
/*
* viewports.c
* Copyright (C) 2023 Igalia S.L.
*
* SPDX-License-Identifier: MIT
*/

#include "../core/cog.h"

typedef struct {
CogViewport *views;
gsize current_index;
} TimeoutData;

static gboolean
on_timeout_tick(TimeoutData *data)
{
if (++data->current_index >= cog_viewport_get_n_views(data->views))
data->current_index = 0;

CogView *view = cog_viewport_get_nth_view(data->views, data->current_index);
g_message("Set visible view %zu <%p>", data->current_index, view);
cog_viewport_set_visible_view(data->views, view);

return G_SOURCE_CONTINUE;
}

int
main(int argc, char *argv[])
{
if (argc < 2) {
g_printerr("Usage: %s <URL> [URL...]\n", argv[0]);
return EXIT_FAILURE;
}

g_set_prgname("view-stacks");

g_autoptr(CogShell) shell = cog_shell_new(NULL, FALSE);
g_autoptr(GError) error = NULL;

g_autoptr(CogPlatform) platform = cog_platform_get();
if (!cog_platform_setup(platform, shell, NULL, &error))
g_error("Cannot configure platform: %s", error->message);

g_autoptr(GMainLoop) loop = g_main_loop_new(NULL, FALSE);

CogViewport *viewport0 = cog_viewport_new();
cog_shell_add_viewport(shell, viewport0);

for (int i = 1; i < argc; i++) {
g_autoptr(CogView) view = cog_view_new(NULL);
cog_platform_init_web_view(platform, WEBKIT_WEB_VIEW(view));
cog_viewport_add(viewport0, view);
webkit_web_view_load_uri(WEBKIT_WEB_VIEW(view), argv[i]);
g_message("Viewport #0. Created view %p, URI %s", view, argv[i]);
}

TimeoutData data0 = {
.views = viewport0,
.current_index = SIZE_MAX,
};
g_timeout_add_seconds(5, (GSourceFunc) on_timeout_tick, &data0);
on_timeout_tick(&data0);

CogViewport *viewport1 = cog_viewport_new();
cog_shell_add_viewport(shell, viewport1);

for (int i = 1; i < argc; i++) {
g_autoptr(CogView) view = cog_view_new(NULL);
cog_platform_init_web_view(platform, WEBKIT_WEB_VIEW(view));
cog_viewport_add(viewport1, view);
webkit_web_view_load_uri(WEBKIT_WEB_VIEW(view), argv[i]);
g_message("Viewport #1. Created view %p, URI %s", view, argv[i]);
}

TimeoutData data1 = {
.views = viewport1,
.current_index = SIZE_MAX,
};
g_timeout_add_seconds(7, (GSourceFunc) on_timeout_tick, &data1);
on_timeout_tick(&data1);

g_main_loop_run(loop);
return EXIT_SUCCESS;
}

0 comments on commit 9aee57e

Please sign in to comment.