1 | // ==================================================================== // |
---|
2 | // // |
---|
3 | // File : AW_global_awars.cxx // |
---|
4 | // Purpose : Make some awars accessible from ALL arb applications // |
---|
5 | // // |
---|
6 | // Coded by Ralf Westram (coder@reallysoft.de) in January 2003 // |
---|
7 | // Copyright Department of Microbiology (Technical University Munich) // |
---|
8 | // // |
---|
9 | // Visit our web site at: http://www.arb-home.de/ // |
---|
10 | // // |
---|
11 | // ==================================================================== // |
---|
12 | |
---|
13 | #define TEMP_DB_PATH "tmp/global_awars" |
---|
14 | |
---|
15 | #include <stdio.h> |
---|
16 | #include <stdlib.h> |
---|
17 | #include <arbdb.h> |
---|
18 | #include <aw_root.hxx> |
---|
19 | #include <aw_global_awars.hxx> |
---|
20 | #include <aw_awars.hxx> |
---|
21 | #include <aw_window.hxx> |
---|
22 | |
---|
23 | static GBDATA *gb_main4awar = 0; // gb_main used for global awars |
---|
24 | |
---|
25 | inline const char *get_db_path(const AW_awar *awar) { |
---|
26 | return GBS_global_string("%s/%s", TEMP_DB_PATH, awar->awar_name); |
---|
27 | } |
---|
28 | |
---|
29 | static bool in_global_awar_cb = false; |
---|
30 | |
---|
31 | static void awar_updated_cb(AW_root */*aw_root*/, AW_CL cl_awar) { |
---|
32 | if (!in_global_awar_cb) { |
---|
33 | AW_awar *awar = (AW_awar*)cl_awar; |
---|
34 | char *content = awar->read_as_string(); |
---|
35 | const char *db_path = get_db_path(awar); |
---|
36 | GB_transaction dummy(gb_main4awar); |
---|
37 | GBDATA *gbd = GB_search(gb_main4awar, db_path, GB_FIND); |
---|
38 | |
---|
39 | aw_assert(gbd); // should exists |
---|
40 | |
---|
41 | in_global_awar_cb = true; |
---|
42 | GB_write_string(gbd, content); |
---|
43 | in_global_awar_cb = false; |
---|
44 | |
---|
45 | free(content); |
---|
46 | } |
---|
47 | } |
---|
48 | |
---|
49 | static void db_updated_cb(GBDATA *gbd, int *cl_awar, GB_CB_TYPE /*cbtype*/) { |
---|
50 | if (!in_global_awar_cb) { |
---|
51 | AW_awar *awar = (AW_awar*)cl_awar; |
---|
52 | GB_transaction dummy(gb_main4awar); |
---|
53 | |
---|
54 | in_global_awar_cb = true; |
---|
55 | awar->write_as_string(GB_read_char_pntr(gbd)); |
---|
56 | in_global_awar_cb = false; |
---|
57 | } |
---|
58 | } |
---|
59 | |
---|
60 | GB_ERROR AW_awar::make_global() { |
---|
61 | #if defined(DEBUG) |
---|
62 | aw_assert(!is_global); // don't make awars global twice! |
---|
63 | aw_assert(gb_main4awar); |
---|
64 | is_global = true; |
---|
65 | #endif // DEBUG |
---|
66 | |
---|
67 | add_callback(awar_updated_cb, (AW_CL)this); |
---|
68 | |
---|
69 | GB_transaction dummy(gb_main4awar); |
---|
70 | const char *db_path = get_db_path(this); |
---|
71 | GBDATA *gbd = GB_search(gb_main4awar, db_path, GB_FIND); |
---|
72 | GB_ERROR error = 0; |
---|
73 | |
---|
74 | if (gbd) { // was already set by another ARB application |
---|
75 | // -> read db value and store in awar |
---|
76 | |
---|
77 | const char *content = GB_read_char_pntr(gbd); |
---|
78 | write_as_string(content); |
---|
79 | } |
---|
80 | else { |
---|
81 | // store awar value in db |
---|
82 | |
---|
83 | char *content = read_as_string(); |
---|
84 | gbd = GB_search(gb_main4awar, db_path, GB_STRING); |
---|
85 | if (!gbd) error = GB_await_error(); |
---|
86 | else error = GB_write_string(gbd, content); |
---|
87 | free(content); |
---|
88 | } |
---|
89 | |
---|
90 | if (!error) GB_add_callback(gbd, GB_CB_CHANGED, db_updated_cb, (int*)this); |
---|
91 | return error; |
---|
92 | } |
---|
93 | |
---|
94 | static bool initialized = false; |
---|
95 | |
---|
96 | bool ARB_global_awars_initialized() { |
---|
97 | return initialized; |
---|
98 | } |
---|
99 | |
---|
100 | static void AWAR_AWM_MASK_changed_cb(AW_root *awr) { |
---|
101 | int mask = awr->awar(AWAR_AWM_MASK)->read_int(); |
---|
102 | #if defined(DEBUG) |
---|
103 | printf("AWAR_AWM_MASK changed, calling apply_sensitivity(%i)\n", mask); |
---|
104 | #endif |
---|
105 | awr->apply_sensitivity(mask); |
---|
106 | } |
---|
107 | |
---|
108 | #if defined(DARWIN) |
---|
109 | #define OPENURL "open" |
---|
110 | #else |
---|
111 | #define OPENURL "xdg-open" |
---|
112 | #endif // DARWIN |
---|
113 | |
---|
114 | GB_ERROR ARB_init_global_awars(AW_root *aw_root, AW_default aw_def, GBDATA *gb_main) { |
---|
115 | aw_assert(!initialized); // don't call twice! |
---|
116 | |
---|
117 | initialized = true; |
---|
118 | gb_main4awar = gb_main; |
---|
119 | |
---|
120 | GB_ERROR error = aw_root->awar_string(AWAR_WWW_BROWSER, OPENURL " \"$(URL)\"", aw_def)->make_global(); |
---|
121 | |
---|
122 | if (!error) { |
---|
123 | AW_awar *awar_awm_mask = aw_root->awar_int(AWAR_AWM_MASK, AWM_MASK_UNKNOWN, aw_def); |
---|
124 | |
---|
125 | awar_awm_mask->add_callback(AWAR_AWM_MASK_changed_cb); |
---|
126 | error = awar_awm_mask->make_global(); |
---|
127 | } |
---|
128 | |
---|
129 | return error; |
---|
130 | } |
---|
131 | |
---|
132 | |
---|
133 | |
---|
134 | |
---|
135 | |
---|