Skip to content

Commit 274f0a2

Browse files
committed
Add C API and example for MessageDialog
Introduces a C API for MessageDialog with creation, property access, modality, open/close, and resource management functions. Adds a comprehensive C example demonstrating usage and updates build files to include the new example and API header.
1 parent cb792bb commit 274f0a2

File tree

14 files changed

+560
-105
lines changed

14 files changed

+560
-105
lines changed

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ add_subdirectory(examples/keyboard_example)
1515
add_subdirectory(examples/menu_example)
1616
add_subdirectory(examples/menu_c_example)
1717
add_subdirectory(examples/message_dialog_example)
18+
add_subdirectory(examples/message_dialog_c_example)
1819
add_subdirectory(examples/storage_example)
1920
add_subdirectory(examples/storage_c_example)
2021
add_subdirectory(examples/tray_icon_example)
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
cmake_minimum_required(VERSION 3.10)
2+
3+
project(message_dialog_c_example VERSION 0.0.1 LANGUAGES CXX)
4+
5+
# Set C++ standard
6+
set(CMAKE_CXX_STANDARD 17)
7+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
8+
9+
# Add example program
10+
add_executable(message_dialog_c_example
11+
"main.c"
12+
)
13+
14+
# Link main library
15+
target_link_libraries(message_dialog_c_example PRIVATE nativeapi)
16+
17+
# Set example program properties
18+
set_target_properties(message_dialog_c_example PROPERTIES
19+
OUTPUT_NAME "message_dialog_c_example"
20+
)
21+
22+
# Set example program compile options (macOS only)
23+
if(APPLE)
24+
set_source_files_properties("main.c"
25+
PROPERTIES
26+
COMPILE_FLAGS "-x objective-c++"
27+
)
28+
endif()
29+
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
#include <stdio.h>
2+
#include <stdlib.h>
3+
#include <string.h>
4+
5+
#include "../../src/capi/application_c.h"
6+
#include "../../src/capi/message_dialog_c.h"
7+
#include "../../src/capi/string_utils_c.h"
8+
9+
int main() {
10+
printf("=== MessageDialog C API Example ===\n\n");
11+
12+
// Initialize application
13+
native_application_t app = native_application_get_instance();
14+
if (!app) {
15+
fprintf(stderr, "Failed to get application instance\n");
16+
return 1;
17+
}
18+
19+
printf("Application instance obtained successfully\n\n");
20+
21+
// Example 1: Create a simple informational dialog
22+
printf("1. Creating a simple informational dialog...\n");
23+
native_message_dialog_t info_dialog = native_message_dialog_create(
24+
"Information",
25+
"This is an informational message dialog.\n\n"
26+
"MessageDialog can be used to display various types of messages to users.");
27+
28+
if (!info_dialog) {
29+
fprintf(stderr, "Failed to create informational dialog\n");
30+
return 1;
31+
}
32+
33+
// Get and print dialog properties
34+
char* title = native_message_dialog_get_title(info_dialog);
35+
char* message = native_message_dialog_get_message(info_dialog);
36+
if (title) {
37+
printf("Dialog title: %s\n", title);
38+
free_c_str(title);
39+
}
40+
if (message) {
41+
printf("Dialog message: %s\n", message);
42+
free_c_str(message);
43+
}
44+
45+
// Set modality to Application modal
46+
native_message_dialog_set_modality(info_dialog, NATIVE_DIALOG_MODALITY_APPLICATION);
47+
native_dialog_modality_t modality = native_message_dialog_get_modality(info_dialog);
48+
printf("Modality: %s\n",
49+
modality == NATIVE_DIALOG_MODALITY_APPLICATION ? "Application" : "Unknown");
50+
51+
printf("Opening dialog...\n");
52+
if (native_message_dialog_open(info_dialog)) {
53+
printf("Dialog was opened successfully\n\n");
54+
} else {
55+
printf("Failed to open dialog\n\n");
56+
}
57+
58+
// Clean up first dialog
59+
native_message_dialog_destroy(info_dialog);
60+
61+
// Example 2: Create a warning dialog
62+
printf("2. Creating a warning dialog...\n");
63+
native_message_dialog_t warning_dialog = native_message_dialog_create(
64+
"Warning",
65+
"This is a warning message.\n\n"
66+
"Warning dialogs are used to alert users about potential issues.");
67+
68+
if (warning_dialog) {
69+
native_message_dialog_set_modality(warning_dialog, NATIVE_DIALOG_MODALITY_APPLICATION);
70+
native_message_dialog_open(warning_dialog);
71+
native_message_dialog_destroy(warning_dialog);
72+
}
73+
printf("\n");
74+
75+
// Example 3: Create a dialog with updated content
76+
printf("3. Creating a dialog with updated content...\n");
77+
native_message_dialog_t dynamic_dialog =
78+
native_message_dialog_create("Update Available", "Initial message");
79+
80+
if (dynamic_dialog) {
81+
// Update the title and message before opening
82+
native_message_dialog_set_title(dynamic_dialog, "System Update");
83+
native_message_dialog_set_message(dynamic_dialog,
84+
"A new version of the application is available.\n\n"
85+
"Version 2.0 includes:\n"
86+
"• Improved performance\n"
87+
"• New features\n"
88+
"• Bug fixes\n\n"
89+
"Would you like to update now?");
90+
91+
title = native_message_dialog_get_title(dynamic_dialog);
92+
if (title) {
93+
printf("Updated title: %s\n", title);
94+
free_c_str(title);
95+
}
96+
97+
native_message_dialog_set_modality(dynamic_dialog, NATIVE_DIALOG_MODALITY_APPLICATION);
98+
printf("Opening updated dialog...\n");
99+
native_message_dialog_open(dynamic_dialog);
100+
native_message_dialog_destroy(dynamic_dialog);
101+
}
102+
printf("\n");
103+
104+
// Example 4: Demonstrate different modality types
105+
printf("4. Demonstrating different modality types...\n");
106+
107+
// Non-modal dialog
108+
native_message_dialog_t non_modal_dialog = native_message_dialog_create(
109+
"Non-Modal Dialog",
110+
"This dialog does not block interaction.\n\n"
111+
"The application continues running and users can interact with other windows.");
112+
if (non_modal_dialog) {
113+
native_message_dialog_set_modality(non_modal_dialog, NATIVE_DIALOG_MODALITY_NONE);
114+
modality = native_message_dialog_get_modality(non_modal_dialog);
115+
printf("Modality: %s (non-modal)\n",
116+
modality == NATIVE_DIALOG_MODALITY_NONE ? "None" : "Unknown");
117+
native_message_dialog_open(non_modal_dialog);
118+
native_message_dialog_destroy(non_modal_dialog);
119+
}
120+
121+
// Application modal dialog
122+
native_message_dialog_t app_modal_dialog = native_message_dialog_create(
123+
"Application Modal",
124+
"This dialog blocks interaction with all windows in the current application.");
125+
if (app_modal_dialog) {
126+
native_message_dialog_set_modality(app_modal_dialog, NATIVE_DIALOG_MODALITY_APPLICATION);
127+
modality = native_message_dialog_get_modality(app_modal_dialog);
128+
printf("Modality: %s\n",
129+
modality == NATIVE_DIALOG_MODALITY_APPLICATION ? "Application" : "Unknown");
130+
native_message_dialog_open(app_modal_dialog);
131+
native_message_dialog_destroy(app_modal_dialog);
132+
}
133+
134+
// Window modal dialog (behaves as Application on macOS)
135+
native_message_dialog_t window_modal_dialog = native_message_dialog_create(
136+
"Window Modal",
137+
"This dialog blocks interaction with a specific parent window.\n\n"
138+
"Note: On macOS, this behaves as Application.");
139+
if (window_modal_dialog) {
140+
native_message_dialog_set_modality(window_modal_dialog, NATIVE_DIALOG_MODALITY_WINDOW);
141+
modality = native_message_dialog_get_modality(window_modal_dialog);
142+
printf("Modality: %s\n", modality == NATIVE_DIALOG_MODALITY_WINDOW ? "Window" : "Unknown");
143+
native_message_dialog_open(window_modal_dialog);
144+
native_message_dialog_destroy(window_modal_dialog);
145+
}
146+
147+
printf("\n=== MessageDialog C API Example Complete ===\n");
148+
printf("This example demonstrated:\n");
149+
printf("1. Creating MessageDialog instances\n");
150+
printf("2. Setting and getting title and message\n");
151+
printf("3. Updating dialog content programmatically\n");
152+
printf("4. Opening dialogs with different modality types (None, Application, Window)\n");
153+
printf("5. Modal vs non-modal dialog behavior\n");
154+
printf("6. Proper cleanup of dialog resources\n");
155+
156+
printf("\nExiting MessageDialog C API Example...\n");
157+
return 0;
158+
}

examples/message_dialog_example/main.cpp

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -12,44 +12,42 @@ int main() {
1212

1313
try {
1414
std::cout << "\n1. Creating a simple informational dialog..." << std::endl;
15-
15+
1616
// Create a simple informational message dialog
1717
auto info_dialog = std::make_shared<MessageDialog>(
1818
"Information",
1919
"This is an informational message dialog.\n\n"
2020
"MessageDialog can be used to display various types of messages to users.");
21-
21+
2222
info_dialog->SetModality(DialogModality::Application);
23-
23+
2424
std::cout << "Dialog title: " << info_dialog->GetTitle() << std::endl;
2525
std::cout << "Dialog message: " << info_dialog->GetMessage() << std::endl;
2626
std::cout << "Opening dialog..." << std::endl;
27-
27+
2828
// Open the dialog (this will block until user dismisses it)
2929
if (info_dialog->Open()) {
3030
std::cout << "Dialog was opened successfully" << std::endl;
3131
} else {
3232
std::cout << "Failed to open dialog" << std::endl;
3333
}
34-
34+
3535
std::cout << "\n2. Creating a warning dialog..." << std::endl;
36-
36+
3737
// Create a warning dialog
3838
auto warning_dialog = std::make_shared<MessageDialog>(
3939
"Warning",
4040
"This is a warning message.\n\n"
4141
"Warning dialogs are used to alert users about potential issues.");
42-
42+
4343
warning_dialog->SetModality(DialogModality::Application);
4444
warning_dialog->Open();
45-
45+
4646
std::cout << "\n3. Creating a dialog with updated content..." << std::endl;
47-
47+
4848
// Create a dialog and update its content
49-
auto dynamic_dialog = std::make_shared<MessageDialog>(
50-
"Update Available",
51-
"Initial message");
52-
49+
auto dynamic_dialog = std::make_shared<MessageDialog>("Update Available", "Initial message");
50+
5351
// Update the title and message before opening
5452
dynamic_dialog->SetTitle("System Update");
5553
dynamic_dialog->SetMessage(
@@ -59,15 +57,15 @@ int main() {
5957
"• New features\n"
6058
"• Bug fixes\n\n"
6159
"Would you like to update now?");
62-
60+
6361
dynamic_dialog->SetModality(DialogModality::Application);
64-
62+
6563
std::cout << "Updated title: " << dynamic_dialog->GetTitle() << std::endl;
6664
std::cout << "Opening updated dialog..." << std::endl;
6765
dynamic_dialog->Open();
68-
66+
6967
std::cout << "\n4. Demonstrating different modality types..." << std::endl;
70-
68+
7169
// Non-modal dialog (default)
7270
auto non_modal_dialog = std::make_shared<MessageDialog>(
7371
"Non-Modal Dialog",
@@ -76,15 +74,15 @@ int main() {
7674
non_modal_dialog->SetModality(DialogModality::None);
7775
std::cout << "Modality: None (non-modal)" << std::endl;
7876
non_modal_dialog->Open();
79-
77+
8078
// Application modal dialog
8179
auto app_modal_dialog = std::make_shared<MessageDialog>(
8280
"Application Modal",
8381
"This dialog blocks interaction with all windows in the current application.");
8482
app_modal_dialog->SetModality(DialogModality::Application);
8583
std::cout << "Modality: Application" << std::endl;
8684
app_modal_dialog->Open();
87-
85+
8886
// Window modal dialog (behaves as Application on macOS)
8987
auto window_modal_dialog = std::make_shared<MessageDialog>(
9088
"Window Modal",
@@ -93,15 +91,16 @@ int main() {
9391
window_modal_dialog->SetModality(DialogModality::Window);
9492
std::cout << "Modality: Window" << std::endl;
9593
window_modal_dialog->Open();
96-
94+
9795
std::cout << "\n=== MessageDialog Example Complete ===" << std::endl;
9896
std::cout << "This example demonstrated:" << std::endl;
9997
std::cout << "1. Creating MessageDialog instances" << std::endl;
10098
std::cout << "2. Setting title and message" << std::endl;
10199
std::cout << "3. Updating dialog content programmatically" << std::endl;
102-
std::cout << "4. Opening dialogs with different modality types (None, Application, Window)" << std::endl;
100+
std::cout << "4. Opening dialogs with different modality types (None, Application, Window)"
101+
<< std::endl;
103102
std::cout << "5. Modal vs non-modal dialog behavior" << std::endl;
104-
103+
105104
std::cout << "\nExiting MessageDialog Example..." << std::endl;
106105
return 0;
107106

@@ -110,4 +109,3 @@ int main() {
110109
return 1;
111110
}
112111
}
113-

include/nativeapi.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
#include "../src/accessibility_manager.h"
66
#include "../src/application.h"
77
#include "../src/application_event.h"
8+
#include "../src/dialog.h"
89
#include "../src/display.h"
910
#include "../src/display_event.h"
1011
#include "../src/display_manager.h"
11-
#include "../src/dialog.h"
1212
#include "../src/foundation/event.h"
1313
#include "../src/foundation/event_emitter.h"
1414
#include "../src/foundation/geometry.h"
@@ -38,6 +38,7 @@
3838
#include "../src/capi/image_c.h"
3939
#include "../src/capi/keyboard_monitor_c.h"
4040
#include "../src/capi/menu_c.h"
41+
#include "../src/capi/message_dialog_c.h"
4142
#include "../src/capi/preferences_c.h"
4243
#include "../src/capi/run_example_app_c.h"
4344
#include "../src/capi/secure_storage_c.h"

0 commit comments

Comments
 (0)