source: branches/port5/WINDOW/AW_global_awars.cxx

Last change on this file was 6589, checked in by westram, 15 years ago
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 4.1 KB
Line 
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
23static GBDATA *gb_main4awar = 0; // gb_main used for global awars
24
25inline const char *get_db_path(const AW_awar *awar) {
26    return GBS_global_string("%s/%s", TEMP_DB_PATH, awar->awar_name);
27}
28
29static bool in_global_awar_cb = false;
30
31static 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
49static 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
60GB_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
94static bool initialized = false;
95
96bool ARB_global_awars_initialized() {
97    return initialized;
98}
99
100static 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
114GB_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
Note: See TracBrowser for help on using the repository browser.