Mercurial > pidgin
annotate plugins/gtik.c @ 2583:ce3df2c43f46
[gaim-migrate @ 2596]
thanks to Dennis Lambe Jr. (malsyned).
Several of you will probably wonder why I put it in gtkimhtml.c instead of conversation.c like the rest of the smilies. (Dennis also put it in gtkimhtml.c.)
gtkimhtml.c strives to be more or less compatible and identical with winaim (though fewer bugs ;) ). winaim parses out :-d. winaim doesn't parse any of the ones in conversation.c though. So if winaim parses it, it goes in gtkimhtml.c.
committer: Tailor Script <tailor@pidgin.im>
author | Eric Warmenhoven <eric@warmenhoven.org> |
---|---|
date | Tue, 23 Oct 2001 04:59:46 +0000 |
parents | 0e0a54e5819a |
children | cd938f18f3f8 |
rev | line source |
---|---|
426 | 1 /* |
2 * GNOME Stock Ticker | |
3 * (C) 2000 Jayson Lorenzen, Jim Garrison, Rached Blili | |
4 * | |
5 * based on: | |
6 * desire, and the old great slash applet. | |
7 * | |
8 * | |
9 * Authors: Jayson Lorenzen (jaysonl@pacbell.net) | |
10 * Jim Garrison (garrison@users.sourceforge.net) | |
11 * Rached Blili (striker@Dread.net) | |
12 * | |
13 * The Gnome Stock Ticker is a free, Internet based application. | |
14 * These quotes are not guaranteed to be timely or accurate. | |
15 * | |
16 * Do not use the Gnome Stock Ticker for making investment decisions, | |
17 * it is for informational purposes only. | |
18 * | |
2142
4bd8e3b65402
[gaim-migrate @ 2152]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2130
diff
changeset
|
19 * Modified by EWarmenhoven to become a gaim plugin. There was little |
426 | 20 * enough that needed to be changed that I can't really claim any credit. |
21 * (you need to add -lghttp to the GTK_LIBS part of the Makefile) | |
22 * TODO: config, saving info | |
23 * | |
24 */ | |
25 | |
26 #define GAIM_PLUGINS | |
27 #include "gaim.h" | |
28 | |
29 #include <gtk/gtk.h> | |
30 #include <time.h> | |
31 #include <stdlib.h> | |
32 #include <stdio.h> | |
33 #include <string.h> | |
34 | |
35 #include "ghttp.h" | |
36 #include <sys/stat.h> | |
37 #include <unistd.h> | |
38 #include <dirent.h> | |
39 #include <gdk/gdkx.h> | |
40 | |
41 | |
42 GtkWidget *applet; /* this will become the main window */ | |
43 GtkWidget *label; | |
44 | |
45 | |
46 static GdkPixmap *pixmap = NULL; | |
47 GtkWidget * drawing_area; | |
48 | |
49 int location; | |
50 int MOVE; | |
51 | |
52 char output[64]; | |
53 | |
54 /** | |
55 * FOR COLOR | |
56 * LEN and the length of output, and colorNum must match | |
57 */ | |
58 const int LEN = 20; | |
59 char outputArray[20][64]; | |
60 char changeArray[20][64]; | |
61 int colorArray[20]; | |
62 | |
63 const int RED = 1; | |
64 const int GREEN = 2; | |
65 | |
66 static const int max_rgb_str_len = 7; | |
67 static const int max_rgb_str_size = 8; | |
68 | |
69 int setCounter, getCounter, setColorCounter,getColorCounter; | |
70 | |
71 GdkGC *gc; | |
72 GdkColor gdkUcolor,gdkDcolor; | |
73 | |
74 /* end of COLOR vars */ | |
75 | |
76 | |
77 char configFileName[256]; | |
78 | |
79 | |
80 /* properties vars */ | |
81 | |
82 GtkWidget *tik_syms_entry; | |
83 gchar tik_syms[256]; | |
84 | |
85 GtkWidget * pb = NULL; | |
86 | |
87 typedef struct | |
88 { | |
89 char *tik_syms; | |
90 char *output; | |
91 char *scroll; | |
92 gint timeout; | |
93 gchar dcolor[8]; | |
94 gchar ucolor[8]; | |
95 | |
96 } gtik_properties; | |
97 | |
98 gtik_properties props = {"cald+rhat+corl","default","right2left", | |
99 5,"#ff0000","#00ff00"}; | |
100 | |
101 /* end prop vars */ | |
102 | |
103 | |
104 gint timeout = 0; | |
105 gint drawTimeID, updateTimeID; | |
106 GdkFont * my_font; | |
107 GdkFont * extra_font; | |
108 GdkFont * small_font; | |
109 static gint symbolfont = 1; | |
110 static gint destroycb; | |
111 | |
112 | |
113 int configured(); | |
114 void timeout_cb( GtkWidget *widget, GtkWidget *spin ); | |
115 static int http_get_to_file(gchar *a_host, gint a_port, | |
116 gchar *a_resource, FILE *a_file); | |
117 int http_got(); | |
118 void properties_save( char *path) ; | |
119 void gaim_plugin_remove(); | |
120 | |
121 | |
122 /* FOR COLOR */ | |
123 | |
124 void updateOutput() ; | |
125 static void reSetOutputArray() ; | |
126 static void setOutputArray(char *param1) ; | |
127 static void setColorArray(int theColor) ; | |
128 void setup_colors(void); | |
129 int create_gc(void) ; | |
130 | |
131 /* end of color funcs */ | |
132 | |
133 | |
134 | |
135 /*-----------------------------------------------------------------*/ | |
136 void remove_self(GtkWidget *w, void *handle) | |
137 { | |
138 gtk_signal_disconnect(GTK_OBJECT(applet), destroycb); | |
139 if (drawTimeID > 0) { gtk_timeout_remove(drawTimeID); } | |
140 if (updateTimeID >0) { gtk_timeout_remove(updateTimeID); } | |
141 gtk_widget_destroy(applet); | |
142 gaim_plugin_unload(handle); | |
143 } | |
144 | |
145 | |
146 /*-----------------------------------------------------------------*/ | |
147 void load_fonts() | |
148 { | |
149 my_font = gdk_font_load ("fixed"); | |
150 extra_font = gdk_font_load ("-urw-symbol-medium-r-normal-*-*-100-*-*-p-*-adobe-fontspecific"); | |
151 small_font = gdk_font_load ("-schumacher-clean-medium-r-normal-*-*-100-*-*-c-*-iso8859-1"); | |
152 | |
153 /* If fonts do not load */ | |
154 if (!my_font) | |
155 g_error("Could not load fonts!"); | |
156 if (!extra_font) { | |
157 extra_font = gdk_font_load("fixed"); | |
158 symbolfont = 0; | |
159 } | |
160 if (!small_font) | |
161 small_font = gdk_font_load("fixed"); | |
162 } | |
163 | |
164 /*-----------------------------------------------------------------*/ | |
165 /*void load_properties( char *path) { | |
166 | |
167 | |
168 gnome_config_push_prefix (path); | |
169 if( gnome_config_get_string ("gtik/tik_syms") != NULL ) | |
170 props.tik_syms = gnome_config_get_string("gtik/tik_syms"); | |
171 | |
172 | |
173 timeout = gnome_config_get_int("gtik/timeout") > 0 ? gnome_config_get_int ("gtik/timeout") : props.timeout; | |
174 | |
175 | |
176 if ( gnome_config_get_string ("gtik/output") != NULL ) | |
177 props.output = gnome_config_get_string("gtik/output"); | |
178 | |
179 if ( gnome_config_get_string ("gtik/scroll") != NULL ) | |
180 props.scroll = gnome_config_get_string("gtik/scroll"); | |
181 | |
182 if ( gnome_config_get_string ("gtik/ucolor") != NULL ) | |
183 strcpy(props.ucolor, gnome_config_get_string("gtik/ucolor")); | |
184 | |
185 if ( gnome_config_get_string ("gtik/dcolor") != NULL ) | |
186 strcpy(props.dcolor, gnome_config_get_string("gtik/dcolor")); | |
187 | |
188 gnome_config_pop_prefix (); | |
189 }*/ | |
190 | |
191 | |
192 | |
193 /*-----------------------------------------------------------------*/ | |
194 /*void properties_save( char *path) { | |
195 | |
196 gnome_config_push_prefix (path); | |
197 gnome_config_set_string( "gtik/tik_syms", props.tik_syms ); | |
198 gnome_config_set_string( "gtik/output", props.output ); | |
199 gnome_config_set_string( "gtik/scroll", props.scroll ); | |
200 gnome_config_set_string( "gtik/ucolor", props.ucolor ); | |
201 gnome_config_set_string( "gtik/dcolor", props.dcolor ); | |
202 | |
203 gnome_config_set_int("gtik/timeout",props.timeout); | |
204 | |
205 gnome_config_pop_prefix (); | |
206 gnome_config_sync(); | |
207 gnome_config_drop_all(); | |
208 }*/ | |
209 | |
210 | |
211 /*-----------------------------------------------------------------*/ | |
212 char * extractText(const char *line) { | |
213 | |
214 int i=0; | |
215 int j=0; | |
216 static char Text[256]=""; | |
217 | |
218 while (i < (strlen(line) -1)) { | |
219 if (line[i] != '>') | |
220 i++; | |
221 else { | |
222 i++; | |
223 while (line[i] != '<') { | |
224 Text[j] = line[i]; | |
225 i++;j++; | |
226 } | |
227 } | |
228 } | |
229 Text[j] = '\0'; | |
230 i = 0; | |
231 while (i < (strlen(Text)) ) { | |
232 if (Text[i] < 32) | |
233 Text[i] = '\0'; | |
234 i++; | |
235 } | |
236 return(Text); | |
237 | |
238 } | |
239 | |
240 /*-----------------------------------------------------------------*/ | |
241 char * parseQuote(FILE *CONFIG, char line[512]) { | |
242 | |
243 char symbol[512]; | |
244 char buff[512]; | |
245 char price[16]; | |
246 char change[16]; | |
247 char percent[16]; | |
248 static char result[512]=""; | |
249 int linenum=0; | |
250 int AllOneLine=0; | |
251 int flag=0; | |
252 char *section; | |
253 char *ptr; | |
254 | |
255 if (strlen(line) > 64) AllOneLine=1; | |
256 | |
257 if (AllOneLine) { | |
258 strcpy(buff,line); | |
259 while (!flag) { | |
260 if ((ptr=strstr(buff,"</td>"))!=NULL) { | |
261 ptr[0] = '|'; | |
262 } | |
263 else flag=1; | |
264 } | |
265 section = strtok(buff,"|"); | |
266 } | |
267 /* Get the stock symbol */ | |
268 if (!AllOneLine) strcpy(symbol,extractText(line)); | |
269 else strcpy(symbol,extractText(section)); | |
270 linenum++; | |
271 | |
272 /* Skip the time... */ | |
273 if (!AllOneLine) fgets(line,255,CONFIG); | |
274 else section = strtok(NULL,"|"); | |
275 linenum++; | |
276 | |
277 while (linenum < 8 ) { | |
278 if (!AllOneLine) { | |
279 fgets(line,255,CONFIG); | |
280 | |
281 if (strstr(line, | |
282 "<td align=center nowrap colspan=2>")) { | |
283 strcpy(change,""); | |
284 strcpy(percent,""); | |
285 linenum=100; | |
286 } | |
287 } | |
288 else { | |
289 section = strtok(NULL,"|"); | |
290 if (strstr(section, | |
291 "<td align=center nowrap colspan=2>")) { | |
292 strcpy(change,""); | |
293 strcpy(percent,""); | |
294 linenum=100; | |
295 } | |
296 } | |
297 | |
298 if (linenum == 2) { | |
299 if (!AllOneLine) | |
300 strcpy(price,extractText(line)); | |
301 else | |
302 strcpy(price,extractText(section)); | |
303 } | |
304 else if (linenum == 3) { | |
305 if (!AllOneLine) | |
306 strcpy(change,extractText(line)); | |
307 else | |
308 strcpy(change,extractText(section)); | |
309 | |
310 if (strstr(change,"-")) { | |
311 setColorArray(RED); | |
312 } | |
313 else if (strstr(change,"+")) { | |
314 setColorArray(GREEN); | |
315 } | |
316 else { | |
317 setColorArray(0); | |
318 } | |
319 | |
320 } | |
321 else if (linenum == 4) { | |
322 if (!AllOneLine) | |
323 strcpy(percent,extractText(line)); | |
324 else | |
325 strcpy(percent,extractText(section)); | |
326 } | |
327 linenum++; | |
328 } | |
329 sprintf(result,"%s:%s:%s:%s", | |
330 symbol,price,change,percent); | |
331 return(result); | |
332 | |
333 } | |
334 | |
335 | |
336 | |
337 /*-----------------------------------------------------------------*/ | |
338 int configured() { | |
339 int retVar; | |
340 | |
341 char buffer[512]; | |
342 static FILE *CONFIG; | |
343 | |
344 CONFIG = fopen((const char *)configFileName,"r"); | |
345 | |
346 retVar = 0; | |
347 | |
348 /* clear the output variable */ | |
349 reSetOutputArray(); | |
350 | |
351 if ( CONFIG ) { | |
352 while ( !feof(CONFIG) ) { | |
353 fgets(buffer,511,CONFIG); | |
354 | |
355 if (strstr(buffer, | |
356 "<td nowrap align=left><a href=\"/q\?s=")) { | |
357 | |
358 setOutputArray(parseQuote(CONFIG,buffer)); | |
359 retVar = 1; | |
360 } | |
361 else { | |
362 retVar = (retVar > 0) ? retVar : 0; | |
363 } | |
364 } | |
365 fclose(CONFIG); | |
366 | |
367 } | |
368 else { | |
369 retVar = 0; | |
370 } | |
371 | |
372 return retVar; | |
373 } | |
374 | |
375 | |
376 /*-----------------------------------------------------------------*/ | |
377 /* Shamelessly stolen from the Slashapp applet | |
378 */ | |
379 static int http_get_to_file(gchar *a_host, gint a_port, | |
380 gchar *a_resource, FILE *a_file) { | |
381 int length = -1; | |
382 ghttp_request *request = NULL; | |
383 gchar s_port[8]; | |
384 gchar *uri = NULL; | |
385 gchar *body; | |
386 gchar *proxy = g_getenv("http_proxy"); | |
387 | |
388 g_snprintf(s_port, 8, "%d", a_port); | |
389 uri = g_strconcat("http://", a_host, ":", s_port, | |
390 a_resource, NULL); | |
391 | |
392 fprintf(stderr,"Asking for %s\n", uri); | |
393 | |
394 request = ghttp_request_new(); | |
395 if (!request) | |
396 goto ec; | |
397 if (proxy && (ghttp_set_proxy(request,proxy) != 0)) | |
398 goto ec; | |
399 | |
400 if (ghttp_set_uri(request, uri) != 0) | |
401 goto ec; | |
402 ghttp_set_header(request, http_hdr_Connection, "close"); | |
403 if (ghttp_prepare(request) != 0) | |
404 goto ec; | |
405 if (ghttp_process(request) != ghttp_done) | |
406 goto ec; | |
407 length = ghttp_get_body_len(request); | |
408 body = ghttp_get_body(request); | |
409 if (body != NULL) | |
410 fwrite(body, length, 1, a_file); | |
411 | |
412 ec: | |
413 if (request) | |
414 ghttp_request_destroy(request); | |
415 if (uri) | |
416 | |
417 g_free(uri); | |
418 return length; | |
419 } | |
420 | |
421 | |
422 | |
423 | |
424 /*-----------------------------------------------------------------*/ | |
425 int http_got() { | |
426 | |
427 int retVar; | |
428 FILE *local_file; | |
429 | |
430 char tmpBuff[256]; | |
431 memset(tmpBuff,0,sizeof(tmpBuff)); | |
432 | |
433 strcat(tmpBuff,"/q?s="); | |
434 strcat(tmpBuff, props.tik_syms); | |
435 strcat(tmpBuff,"&d=v2"); | |
436 | |
437 retVar = 0; | |
438 | |
439 local_file = fopen(configFileName, "w"); | |
440 retVar = http_get_to_file("finance.yahoo.com", 80, | |
441 tmpBuff, local_file); | |
442 | |
443 fclose(local_file); | |
444 | |
445 return retVar; | |
446 } | |
447 | |
448 | |
449 | |
450 | |
451 | |
452 /*-----------------------------------------------------------------*/ | |
453 gint expose_event (GtkWidget *widget,GdkEventExpose *event) { | |
454 | |
455 gdk_draw_pixmap(widget->window, | |
456 widget->style->fg_gc[GTK_WIDGET_STATE(widget)], | |
457 pixmap, | |
458 event->area.x, event->area.y, | |
459 event->area.x, event->area.y, | |
460 event->area.width,event->area.height); | |
461 | |
462 return FALSE; | |
463 } | |
464 | |
465 | |
466 | |
467 /*-----------------------------------------------------------------*/ | |
468 static gint configure_event(GtkWidget *widget,GdkEventConfigure *event){ | |
469 | |
470 if(pixmap) { | |
471 gdk_pixmap_unref (pixmap); | |
472 } | |
473 | |
474 pixmap = gdk_pixmap_new(widget->window, | |
475 widget->allocation.width, | |
476 widget->allocation.height, | |
477 -1); | |
478 | |
479 return TRUE; | |
480 } | |
481 | |
482 | |
483 | |
484 | |
485 | |
486 | |
487 /*-----------------------------------------------------------------*/ | |
488 gint Repaint (gpointer data) { | |
489 GtkWidget* drawing_area = (GtkWidget *) data; | |
490 GdkRectangle update_rect; | |
491 int comp; | |
492 | |
493 /* FOR COLOR */ | |
494 char *tmpSym; | |
495 int totalLoc; | |
496 int totalLen; | |
497 int i; | |
498 | |
499 | |
500 totalLoc = 0; | |
501 totalLen = 0; | |
502 | |
503 /* clear the pixmap */ | |
504 gdk_draw_rectangle (pixmap, | |
505 drawing_area->style->black_gc, | |
506 TRUE, | |
507 0,0, | |
508 drawing_area->allocation.width, | |
509 drawing_area->allocation.height); | |
510 | |
511 | |
512 for(i=0;i<LEN;i++) { | |
513 totalLen += strlen(outputArray[i]); | |
514 } | |
515 if (!strcmp(props.output,"default")) { | |
516 for(i=0;i<LEN;i++) { | |
517 totalLen += strlen(changeArray[i]); | |
518 } | |
519 } | |
520 | |
521 comp = 1 - ( totalLen *8 ); | |
522 | |
523 if (MOVE == 1) { MOVE = 0; } else { MOVE = 1; } | |
524 | |
525 if (MOVE == 1) { | |
526 | |
527 | |
528 if (!strcmp(props.scroll,"right2left")) { | |
529 if (location > comp) { | |
530 location--; | |
531 } | |
532 else { | |
533 location = drawing_area->allocation.width; | |
534 } | |
535 | |
536 } | |
537 else { | |
538 if (location < drawing_area->allocation.width) { | |
539 location ++; | |
540 } | |
541 else { | |
542 location = comp; | |
543 } | |
544 } | |
545 | |
546 | |
547 | |
548 } | |
549 | |
550 for (i=0;i<LEN;i++) { | |
551 | |
552 /* COLOR */ | |
553 if (colorArray[i] == GREEN) { | |
554 gdk_gc_set_foreground( gc, &gdkUcolor ); | |
555 } | |
556 else if (colorArray[i] == RED) { | |
557 gdk_gc_set_foreground( gc, &gdkDcolor ); | |
558 } | |
559 else { | |
560 gdk_gc_copy( gc, drawing_area->style->white_gc ); | |
561 } | |
562 | |
563 tmpSym = outputArray[i]; | |
564 gdk_draw_string (pixmap,my_font, | |
565 gc, | |
566 location + (totalLoc * 6 ) ,12,outputArray[i]); | |
567 totalLoc += (strlen(tmpSym) + 1); | |
568 | |
569 | |
570 if (!strcmp(props.output,"default")) { | |
571 tmpSym = changeArray[i]; | |
572 if (*(changeArray[i])) | |
573 gdk_draw_text (pixmap,extra_font, | |
574 gc, location + (totalLoc * 6) , | |
575 12,changeArray[i],1); | |
576 gdk_draw_string (pixmap,small_font, | |
577 gc, location + ((totalLoc +2) * 6) , | |
578 12, &changeArray[i][1]); | |
579 totalLoc += (strlen(tmpSym) + 1); | |
580 } | |
581 | |
582 } | |
583 update_rect.x = 0; | |
584 update_rect.y = 0; | |
585 update_rect.width = drawing_area->allocation.width; | |
586 update_rect.height = drawing_area->allocation.height; | |
587 | |
588 gtk_widget_draw(drawing_area,&update_rect); | |
589 return 1; | |
590 } | |
591 | |
592 | |
593 | |
594 | |
595 /*-----------------------------------------------------------------*/ | |
596 char *description() { | |
597 return | |
598 " This program uses ghttp to connect to " | |
599 "a popular stock quote site, then downloads " | |
600 "and parses the html returned from the " | |
601 "site to scroll delayed quotes" | |
602 "\n\n The Gnome Stock Ticker is a free, Internet based application. These quotes are not " | |
603 "guaranteed to be timely or accurate. " | |
604 "Do not use the Gnome Stock Ticker for making investment decisions; it is for " | |
605 "informational purposes only." | |
606 "\n\n (C) 2000 Jayson Lorenzen, Jim Garrison, Rached Blili"; | |
607 } | |
608 | |
609 char *name() { | |
2536
0e0a54e5819a
[gaim-migrate @ 2549]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2142
diff
changeset
|
610 return "The Gnome Stock Ticker for Gaim"; |
426 | 611 } |
612 | |
613 | |
614 | |
615 | |
616 | |
617 | |
618 /*-----------------------------------------------------------------*/ | |
619 void changed_cb(GtkWidget *pb, gpointer data) { | |
620 /* gnome_property_box_changed(GNOME_PROPERTY_BOX(pb)); */ | |
621 } | |
622 | |
623 | |
624 /*-----------------------------------------------------------------*/ | |
625 void toggle_output_cb(GtkWidget *widget, gpointer data) { | |
626 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) | |
627 props.output = g_strdup("nochange"); | |
628 else | |
629 props.output = g_strdup("default"); | |
630 | |
631 } | |
632 | |
633 /*-----------------------------------------------------------------*/ | |
634 void toggle_scroll_cb(GtkWidget *widget, gpointer data) { | |
635 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) | |
636 props.scroll = g_strdup("left2right"); | |
637 else | |
638 props.scroll = g_strdup("right2left"); | |
639 | |
640 } | |
641 | |
642 /*-----------------------------------------------------------------*/ | |
643 void timeout_cb( GtkWidget *widget, GtkWidget *spin ) { | |
644 timeout=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spin)); | |
645 /* gnome_property_box_changed(GNOME_PROPERTY_BOX(pb)); */ | |
646 } | |
647 | |
648 | |
649 | |
650 | |
651 /*-----------------------------------------------------------------*/ | |
652 static void apply_cb( GtkWidget *widget, void *data ) { | |
653 char *tmpText; | |
654 | |
655 | |
656 tmpText = gtk_entry_get_text(GTK_ENTRY(tik_syms_entry)); | |
657 props.tik_syms = g_strdup(tmpText); | |
658 if (props.timeout) { | |
659 props.timeout = timeout > 0 ? timeout : props.timeout; | |
660 } | |
661 | |
662 /* properties_save(APPLET_WIDGET(applet)->privcfgpath); */ | |
663 | |
664 setup_colors(); | |
665 updateOutput(); | |
666 } | |
667 | |
668 | |
669 | |
670 | |
671 /*-----------------------------------------------------------------*/ | |
672 gint destroy_cb( GtkWidget *widget, void *data ) { | |
673 pb = NULL; | |
674 return FALSE; | |
675 } | |
676 | |
677 | |
678 | |
679 /*-----------------------------------------------------------------*/ | |
680 void gaim_plugin_config() { | |
681 GtkWidget * vbox; | |
682 GtkWidget *urlcheck, *launchcheck; | |
683 | |
684 GtkWidget *panela, *panel1 ,*panel2, *panel3, *panel4; | |
685 GtkWidget *label1,*label2,*label3 ; | |
686 | |
687 | |
688 GtkWidget *timeout_label,*timeout_c; | |
689 GtkObject *timeout_a; | |
690 | |
691 GtkWidget *upColor, *downColor, *upLabel, *downLabel; | |
692 GtkWidget *check,*check2; | |
693 | |
694 int ur,ug,ub, dr,dg,db; | |
695 | |
696 if (pb) return; | |
697 pb = gtk_window_new(GTK_WINDOW_TOPLEVEL); | |
698 | |
699 gtk_window_set_title(GTK_WINDOW(pb), _("Gnome Stock Ticker Properties")); | |
700 | |
701 vbox = gtk_vbox_new(FALSE, 8); | |
702 | |
703 panela = gtk_hbox_new(FALSE, 5); | |
704 panel1 = gtk_hbox_new(FALSE, 5); | |
705 panel2 = gtk_hbox_new(FALSE, 5); | |
706 panel3 = gtk_hbox_new(FALSE, 5); | |
707 panel4 = gtk_hbox_new(FALSE, 5); | |
708 | |
709 gtk_container_set_border_width(GTK_CONTAINER(vbox), 8); | |
710 | |
711 timeout_label = gtk_label_new(_("Update Frequency in min")); | |
712 timeout_a = gtk_adjustment_new( timeout, 0.5, 128, 1, 8, 8 ); | |
713 timeout_c = gtk_spin_button_new( GTK_ADJUSTMENT(timeout_a), 1, 0 ); | |
714 | |
715 gtk_box_pack_start_defaults( GTK_BOX(panel2), timeout_label ); | |
716 gtk_box_pack_start_defaults( GTK_BOX(panel2), timeout_c ); | |
717 | |
718 gtk_signal_connect_object(GTK_OBJECT(timeout_c), "changed",GTK_SIGNAL_FUNC(changed_cb),GTK_OBJECT(pb)); | |
719 | |
720 gtk_signal_connect( GTK_OBJECT(timeout_a),"value_changed", | |
721 GTK_SIGNAL_FUNC(timeout_cb), timeout_c ); | |
722 gtk_signal_connect( GTK_OBJECT(timeout_c),"changed", | |
723 GTK_SIGNAL_FUNC(timeout_cb), timeout_c ); | |
724 gtk_spin_button_set_update_policy( GTK_SPIN_BUTTON(timeout_c), | |
725 GTK_UPDATE_ALWAYS ); | |
726 | |
727 label1 = gtk_label_new(_("Enter symbols delimited with \"+\" in the box below.")); | |
728 | |
729 tik_syms_entry = gtk_entry_new_with_max_length(60); | |
730 | |
731 /* tik_syms var is her if want a default value */ | |
732 gtk_entry_set_text(GTK_ENTRY(tik_syms_entry), props.tik_syms ? props.tik_syms : tik_syms); | |
733 gtk_signal_connect_object(GTK_OBJECT(tik_syms_entry), "changed",GTK_SIGNAL_FUNC(changed_cb),GTK_OBJECT(pb)); | |
734 | |
735 /* OUTPUT FORMAT and SCROLL DIRECTION */ | |
736 | |
737 label2 = gtk_label_new(_("Check this box to display only symbols and price:")); | |
738 label3 = gtk_label_new(_("Check this box to scroll left to right:")); | |
739 check = gtk_check_button_new(); | |
740 check2 = gtk_check_button_new(); | |
741 gtk_box_pack_start_defaults(GTK_BOX(panel3),label2); | |
742 gtk_box_pack_start_defaults(GTK_BOX(panel3),check); | |
743 gtk_box_pack_start_defaults(GTK_BOX(panel4),label3); | |
744 gtk_box_pack_start_defaults(GTK_BOX(panel4),check2); | |
745 | |
746 /* Set the checkbox according to current prefs */ | |
747 if (strcmp(props.output,"default")!=0) | |
748 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), | |
749 TRUE); | |
750 gtk_signal_connect_object(GTK_OBJECT(check),"toggled", | |
751 GTK_SIGNAL_FUNC(changed_cb),GTK_OBJECT(pb)); | |
752 gtk_signal_connect(GTK_OBJECT(check),"toggled", | |
753 GTK_SIGNAL_FUNC(toggle_output_cb),NULL); | |
754 | |
755 /* Set the checkbox according to current prefs */ | |
756 if (strcmp(props.scroll,"right2left")!=0) | |
757 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check2), | |
758 TRUE); | |
759 gtk_signal_connect_object(GTK_OBJECT(check2),"toggled", | |
760 GTK_SIGNAL_FUNC(changed_cb),GTK_OBJECT(pb)); | |
761 gtk_signal_connect(GTK_OBJECT(check2),"toggled", | |
762 GTK_SIGNAL_FUNC(toggle_scroll_cb),NULL); | |
763 | |
764 /* COLOR */ | |
765 /* upLabel = gtk_label_new(_("+ Color")); | |
766 upColor = gnome_color_picker_new(); | |
767 | |
768 sscanf( props.ucolor, "#%02x%02x%02x", &ur,&ug,&ub ); | |
769 | |
770 gnome_color_picker_set_i8(GNOME_COLOR_PICKER (upColor), | |
771 ur, ug, ub, 255); | |
772 | |
773 gtk_signal_connect(GTK_OBJECT(upColor), "color_set", | |
774 GTK_SIGNAL_FUNC(ucolor_set_cb), NULL); | |
775 | |
776 gtk_box_pack_start_defaults( GTK_BOX(panela), upLabel ); | |
777 gtk_box_pack_start_defaults( GTK_BOX(panela), upColor ); | |
778 | |
779 downLabel = gtk_label_new(_("- Color")); | |
780 downColor = gnome_color_picker_new(); | |
781 | |
782 sscanf( props.dcolor, "#%02x%02x%02x", &dr,&dg,&db ); | |
783 | |
784 gnome_color_picker_set_i8(GNOME_COLOR_PICKER (downColor), | |
785 dr, dg, db, 255); | |
786 | |
787 gtk_signal_connect(GTK_OBJECT(downColor), "color_set", | |
788 GTK_SIGNAL_FUNC(dcolor_set_cb), NULL); | |
789 | |
790 gtk_box_pack_start_defaults( GTK_BOX(panela), downLabel ); | |
791 gtk_box_pack_start_defaults( GTK_BOX(panela), downColor ); | |
792 | |
793 */ | |
794 gtk_box_pack_start(GTK_BOX(panel1), label1, FALSE, | |
795 FALSE, 8); | |
796 | |
797 gtk_box_pack_start(GTK_BOX(vbox), panel2, FALSE, | |
798 FALSE, 8); | |
799 gtk_box_pack_start(GTK_BOX(vbox), panel3, FALSE, | |
800 FALSE, 8); | |
801 gtk_box_pack_start(GTK_BOX(vbox), panel4, FALSE, | |
802 FALSE, 8); | |
803 gtk_box_pack_start(GTK_BOX(vbox), panela, FALSE, | |
804 FALSE, 8); | |
805 gtk_box_pack_start(GTK_BOX(vbox), panel1, FALSE, | |
806 FALSE, 8); | |
807 | |
808 gtk_box_pack_start(GTK_BOX(vbox), tik_syms_entry, | |
809 FALSE, FALSE, 8); | |
810 | |
811 gtk_container_add(GTK_CONTAINER(pb), vbox); | |
812 | |
813 gtk_signal_connect_object(GTK_OBJECT(tik_syms_entry), | |
814 "changed",GTK_SIGNAL_FUNC(changed_cb), | |
815 GTK_OBJECT(pb)); | |
816 | |
817 gtk_signal_connect(GTK_OBJECT(pb), "apply", | |
818 GTK_SIGNAL_FUNC(apply_cb), NULL); | |
819 | |
820 gtk_widget_show_all(pb); | |
821 } | |
822 | |
823 | |
824 | |
825 | |
826 | |
827 /*-----------------------------------------------------------------*/ | |
1047
ece2d1543b20
[gaim-migrate @ 1057]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
426
diff
changeset
|
828 char *gaim_plugin_init(GModule *handle) { /* used to be main() */ |
426 | 829 GtkWidget *label; |
830 | |
831 GtkWidget * vbox; | |
832 | |
833 memset(configFileName,0,sizeof(configFileName)); | |
834 strcat(configFileName, getenv("HOME")); | |
835 strcat(configFileName, "/.gtik.conf"); | |
836 | |
837 applet = gtk_window_new(GTK_WINDOW_TOPLEVEL); /* or not */ | |
838 | |
839 vbox = gtk_hbox_new (FALSE,0); | |
840 | |
841 drawing_area = gtk_drawing_area_new(); | |
842 gtk_drawing_area_size(GTK_DRAWING_AREA (drawing_area),200,20); | |
843 | |
844 gtk_widget_show(drawing_area); | |
845 gtk_box_pack_start(GTK_BOX (vbox), drawing_area,TRUE,TRUE,0); | |
846 | |
847 gtk_widget_show(vbox); | |
848 | |
849 /* applet_widget_add (APPLET_WIDGET (applet), vbox); */ | |
850 gtk_container_add(GTK_CONTAINER(applet), vbox); | |
851 | |
852 gtk_signal_connect(GTK_OBJECT(drawing_area),"expose_event", | |
853 (GtkSignalFunc) expose_event, NULL); | |
854 | |
855 gtk_signal_connect(GTK_OBJECT(drawing_area),"configure_event", | |
856 (GtkSignalFunc) configure_event, NULL); | |
857 | |
858 | |
859 destroycb = gtk_signal_connect(GTK_OBJECT(applet), "destroy", | |
860 GTK_SIGNAL_FUNC(remove_self), handle); | |
861 | |
862 | |
863 | |
864 gtk_widget_show (applet); | |
865 create_gc(); | |
866 | |
867 /* load_properties(APPLET_WIDGET(applet)->privcfgpath); */ | |
868 | |
869 setup_colors(); | |
870 load_fonts(); | |
871 updateOutput(); | |
872 | |
873 | |
874 /* KEEPING TIMER ID FOR CLEANUP IN DESTROY */ | |
875 drawTimeID = gtk_timeout_add(2,Repaint,drawing_area); | |
876 updateTimeID = gtk_timeout_add(props.timeout * 60000, | |
877 (gpointer)updateOutput,"NULL"); | |
878 | |
879 | |
1047
ece2d1543b20
[gaim-migrate @ 1057]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
426
diff
changeset
|
880 return NULL; |
426 | 881 } |
882 | |
883 | |
884 | |
885 /*-----------------------------------------------------------------*/ | |
886 void updateOutput() { | |
887 if ( http_got() == -1 || !(configured()) ) { | |
888 reSetOutputArray(); | |
889 printf("No data!\n"); | |
890 setOutputArray("No data available or properties not set"); | |
891 } | |
892 } | |
893 | |
894 | |
895 | |
896 | |
897 /* JHACK */ | |
898 /*-----------------------------------------------------------------*/ | |
899 void gaim_plugin_remove() { | |
900 gtk_signal_disconnect(GTK_OBJECT(applet), destroycb); | |
901 if (drawTimeID > 0) { gtk_timeout_remove(drawTimeID); } | |
902 if (updateTimeID >0) { gtk_timeout_remove(updateTimeID); } | |
903 gtk_widget_destroy(applet); | |
904 } | |
905 | |
906 | |
907 | |
908 | |
909 | |
910 /*HERE*/ | |
911 /*-----------------------------------------------------------------*/ | |
912 static void reSetOutputArray() { | |
913 int i; | |
914 | |
915 for (i=0;i<LEN;i++) { | |
916 /* CLEAR EACH SYMBOL'S SPACE */ | |
917 memset(outputArray[i],0,sizeof(outputArray[i])); | |
918 | |
919 /* CLEAR ASSOC COLOR ARRAY */ | |
920 colorArray[i] = 0; | |
921 | |
922 /* CLEAR ADDITIONAL INFO */ | |
923 memset(changeArray[i],0,sizeof(changeArray[i])); | |
924 | |
925 } | |
926 | |
927 setCounter = 0; | |
928 getCounter = 0; | |
929 setColorCounter = 0; | |
930 getColorCounter = 0; | |
931 | |
932 } | |
933 | |
934 | |
935 /*-----------------------------------------------------------------*/ | |
936 char *splitPrice(char *data) { | |
937 char buff[128]=""; | |
938 static char buff2[128]=""; | |
939 char *var1, *var2; | |
940 int i; | |
941 | |
942 strcpy(buff,data); | |
943 var1 = strtok(buff,":"); | |
944 var2 = strtok(NULL,":"); | |
945 | |
946 sprintf(buff2," %s %s",var1,var2); | |
947 return(buff2); | |
948 } | |
949 | |
950 /*-----------------------------------------------------------------*/ | |
951 char *splitChange(char *data) { | |
952 char buff[128]=""; | |
953 static char buff2[128]=""; | |
954 char *var1, *var2, *var3, *var4; | |
955 int i; | |
956 | |
957 strcpy(buff,data); | |
958 var1 = strtok(buff,":"); | |
959 var2 = strtok(NULL,":"); | |
960 var3 = strtok(NULL,":"); | |
961 var4 = strtok(NULL,""); | |
962 | |
963 if (var3[0] == '+') { | |
964 if (symbolfont) | |
965 var3[0] = 221; | |
966 var4[0] = '('; | |
967 } | |
968 else if (var3[0] == '-') { | |
969 if (symbolfont) | |
970 var3[0] = 223; | |
971 var4[0] = '('; | |
972 } | |
973 else { | |
974 var3 = strdup(_("(No")); | |
975 var4 = strdup(_("Change")); | |
976 } | |
977 | |
978 sprintf(buff2,"%s %s)",var3,var4); | |
979 return(buff2); | |
980 } | |
981 | |
982 /*-----------------------------------------------------------------*/ | |
983 static void setOutputArray(char *param1) { | |
984 char *price; | |
985 char *change; | |
986 | |
987 price = splitPrice(param1); | |
988 change = splitChange(param1); | |
989 | |
990 if (setCounter < LEN) { | |
991 | |
992 strcpy(outputArray[setCounter],price); | |
993 strcpy(changeArray[setCounter],change); | |
994 } | |
995 setCounter++; | |
996 } | |
997 | |
998 | |
999 | |
1000 /*-----------------------------------------------------------------*/ | |
1001 static void setColorArray(int theColor) { | |
1002 if (setColorCounter < LEN) { | |
1003 colorArray[setColorCounter] = theColor; | |
1004 } | |
1005 setColorCounter++; | |
1006 } | |
1007 | |
1008 void setup_colors(void) { | |
1009 GdkColormap *colormap; | |
1010 | |
1011 colormap = gtk_widget_get_colormap(drawing_area); | |
1012 | |
1013 gdk_color_parse(props.ucolor, &gdkUcolor); | |
1014 gdk_color_alloc(colormap, &gdkUcolor); | |
1015 | |
1016 gdk_color_parse(props.dcolor, &gdkDcolor); | |
1017 gdk_color_alloc(colormap, &gdkDcolor); | |
1018 } | |
1019 | |
1020 | |
1021 int create_gc(void) { | |
1022 gc = gdk_gc_new( drawing_area->window ); | |
1023 gdk_gc_copy( gc, drawing_area->style->white_gc ); | |
1024 return 0; | |
1025 } |