Vuo  2.0.0
VuoScreen.c
Go to the documentation of this file.
1 
10 #include <string.h>
11 #include "type.h"
12 #include "VuoScreen.h"
13 #include "VuoScreenCommon.h"
14 
16 #ifdef VUO_COMPILER
18  "title" : "Screen",
19  "description" : "Information about a display screen.",
20  "keywords" : [ ],
21  "version" : "1.0.0",
22  "dependencies" : [
23  "VuoBoolean",
24  "VuoInteger",
25  "VuoPoint2d",
26  "VuoScreenCommon",
27  "VuoText"
28  ]
29  });
30 #endif
31 
44 {
45  VuoScreen value = {VuoScreenType_Active,-1,-1,"",false,{0,0},0,0,0,0};
46  json_object *o = NULL;
47 
48  if (json_object_object_get_ex(js, "type", &o))
49  value.type = VuoScreen_typeFromCString(json_object_get_string(o));
50 
51  if (json_object_object_get_ex(js, "id", &o))
52  value.id = VuoInteger_makeFromJson(o);
53 
54  if (json_object_object_get_ex(js, "name", &o))
55  value.name = VuoText_makeFromJson(o);
56  else
57  value.name = VuoText_make("");
58 
59  return value;
60 }
61 
66 {
67  json_object *js = json_object_new_object();
68 
69  json_object_object_add(js, "type", json_object_new_string(VuoScreen_cStringForType(value.type)));
70 
71  if (value.type == VuoScreenType_MatchName)
72  {
73  json_object *nameObject = VuoText_getJson(value.name);
74  json_object_object_add(js, "name", nameObject);
75  }
76  else if (value.type == VuoScreenType_MatchId)
77  {
78  json_object *idObject = VuoInteger_getJson(value.id);
79  json_object_object_add(js, "id", idObject);
80  }
81 
82  return js;
83 }
84 
88 char * VuoScreen_getSummary(const VuoScreen value)
89 {
90  if (value.isRealized)
91  return VuoText_format("<div>Screen \"%s\"</div><div>%lld x %lld points</div><div>%lld x %lld DPI</div>", value.name, value.width, value.height, value.dpiHorizontal, value.dpiVertical);
92 
93  if (value.type == VuoScreenType_Active)
94  return strdup("The screen with the active window.");
95  if (value.type == VuoScreenType_Primary)
96  return strdup("The primary screen (with the menu bar).");
97  else if (value.type == VuoScreenType_Secondary)
98  return strdup("A secondary screen.");
99  else if (value.type == VuoScreenType_MatchName)
100  return VuoText_format("The first screen whose name contains \"%s\"", value.name);
101  else if (value.type == VuoScreenType_MatchId)
102  return VuoText_format("Screen #%lld", value.id);
103  else
104  return strdup("Unknown");
105 }
106 
111 {
112  return value1.id == value2.id
113  && VuoText_areEqual(value1.name, value2.name)
114  && value1.isRealized == value2.isRealized
115  && VuoPoint2d_areEqual(value1.topLeft, value2.topLeft)
116  && value1.width == value2.width
117  && value1.height == value2.height
118  && value1.dpiHorizontal == value2.dpiVertical
119  && value1.dpiVertical == value2.dpiVertical;
120 }
121 
128 {
129  return a.id < b.id;
130 }
131 
139 bool VuoScreen_realize(VuoScreen screen, VuoScreen *realizedScreen)
140 {
141  // Already realized nothing to do.
142  if (screen.isRealized)
143  {
144  *realizedScreen = screen;
145  realizedScreen->name = VuoText_make(screen.name);
146  return true;
147  }
148 
149  // Otherwise, try to find a matching screen.
150 
151  if (screen.type == VuoScreenType_Active)
152  {
153  *realizedScreen = VuoScreen_getActive();
154  return true;
155  }
156  else if (screen.type == VuoScreenType_Primary)
157  {
158  *realizedScreen = VuoScreen_getPrimary();
159  return true;
160  }
161  else if (screen.type == VuoScreenType_Secondary)
162  {
163  *realizedScreen = VuoScreen_getSecondary();
164  return true;
165  }
166  else if (screen.type == VuoScreenType_MatchName
167  || screen.type == VuoScreenType_MatchId)
168  {
170  VuoRetain(screens);
171  unsigned long screenCount = VuoListGetCount_VuoScreen(screens);
172 
173  bool found = false;
174  for (unsigned long i = 1; i <= screenCount; ++i)
175  {
176  VuoScreen s = VuoListGetValue_VuoScreen(screens, i);
177  if ( (screen.type == VuoScreenType_MatchName && strstr(s.name, screen.name))
178  || (screen.type == VuoScreenType_MatchId && s.id == screen.id) )
179  {
180  *realizedScreen = s;
181  realizedScreen->type = VuoScreenType_MatchId;
182  realizedScreen->name = VuoText_make(s.name); // Copy, since we're releasing `screens` below.
183  found = true;
184  break;
185  }
186  }
187 
188  VuoRelease(screens);
189  return found;
190  }
191 
192  return false;
193 }