media.mod 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. MODULE media ;
  2. (*
  3. m2-GTK4 example - media: a GdkTexture shown in a GtkPicture.
  4. Generates a PNG with Cairo at run time, loads it as a texture and
  5. displays it; a GtkVideo widget is added as a placeholder.
  6. Build: make examples
  7. Run: ./build/examples/media
  8. *)
  9. FROM Gio IMPORT g_application_run;
  10. FROM GtkApplication IMPORT gtk_application_new;
  11. FROM GtkWindow IMPORT gtk_application_window_new, gtk_window_set_title,
  12. gtk_window_set_default_size, gtk_window_set_child, gtk_window_present;
  13. FROM GtkBox IMPORT gtk_box_new, gtk_box_append, gtk_box_set_spacing;
  14. FROM GtkEnums IMPORT GtkVertical;
  15. FROM GtkPicture IMPORT gtk_picture_new, gtk_picture_set_paintable;
  16. FROM GtkVideo IMPORT gtk_video_new;
  17. FROM GdkTexture IMPORT gdk_texture_new_from_filename;
  18. FROM GError IMPORT GError;
  19. FROM Cairo IMPORT cairo_image_surface_create, cairo_create, cairo_destroy,
  20. cairo_surface_destroy, cairo_set_source_rgb, cairo_rectangle, cairo_fill,
  21. cairo_surface_write_to_png, CairoFormatARGB32;
  22. FROM GtkClosures IMPORT Connect2;
  23. FROM GtkUtils IMPORT ClearError;
  24. FROM SYSTEM IMPORT ADDRESS, ADR;
  25. FROM libc IMPORT printf;
  26. CONST
  27. AppId = "org.example.m2gtk4.Media";
  28. PngPath = "/tmp/opencode/m2media_demo.png";
  29. PROCEDURE MakePng;
  30. VAR
  31. surface, cr: ADDRESS;
  32. BEGIN
  33. surface := cairo_image_surface_create(CairoFormatARGB32, 200, 120);
  34. cr := cairo_create(surface);
  35. cairo_set_source_rgb(cr, 0.16, 0.50, 0.72);
  36. cairo_rectangle(cr, 0.0, 0.0, 200.0, 120.0);
  37. cairo_fill(cr);
  38. cairo_destroy(cr);
  39. cairo_surface_write_to_png(surface, PngPath);
  40. cairo_surface_destroy(surface)
  41. END MakePng;
  42. PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS);
  43. VAR
  44. window, box, picture, video, texture: ADDRESS;
  45. err: GError;
  46. BEGIN
  47. MakePng();
  48. err := NIL;
  49. texture := gdk_texture_new_from_filename(PngPath, err);
  50. picture := gtk_picture_new();
  51. IF texture # NIL THEN
  52. gtk_picture_set_paintable(picture, texture)
  53. ELSE
  54. printf("could not load %s\n", PngPath);
  55. ClearError(err)
  56. END;
  57. video := gtk_video_new();
  58. box := gtk_box_new(GtkVertical, 8);
  59. gtk_box_set_spacing(box, 8);
  60. gtk_box_append(box, picture);
  61. gtk_box_append(box, video);
  62. window := gtk_application_window_new(application);
  63. gtk_window_set_title(window, "m2-GTK4 Media");
  64. gtk_window_set_default_size(window, 320, 320);
  65. gtk_window_set_child(window, box);
  66. gtk_window_present(window)
  67. END OnActivate;
  68. VAR
  69. app: ADDRESS;
  70. BEGIN
  71. app := gtk_application_new(AppId, 0);
  72. IF app = NIL THEN
  73. printf("gtk_application_new failed\n");
  74. HALT(1)
  75. END;
  76. Connect2(app, "activate", OnActivate, NIL);
  77. g_application_run(app, 0, NIL)
  78. END media.