Op de mailinglist van onze programmeerzooi hadden we hier zojuist wat over.......
Nogal cru eigenlijk. De persoon in kwestie flamede Gnome, Gtk+, gstreamer en alles helemaal af op een ongestructureerd en belachelijk model.......
Voor degenen die linux proggen is gobject misschien wel bekend, voor de overigen: het is de manier die Gtk+ gebruikt om object georienteerde code te schrijven in C. Gnome is bijvoorbeeld 100% C-code. Net als GTK+ en gstreamer. Het model bestaat uit het "slim gebruiken" van structs, gecombineerd met bepaalde cast functies en de mogelijkheid om redelijk simpel objecten te kunnen inheriten (als een soort "parent class"). Een soort van benadering van bepaalde OO-functies vanuit C, dus.
Het exacte idee waarom dit ooit zo is gedaan ken ik niet. Ik ga ervan uit dat dit is gedaan omdat C gewoonweg sneller is dan C++, en C/Gobject is dan dus ook sneller dan C++.
De discussie (voorzover ik een flame een discussie kan noemen) ging voornamelijk om de vraag of dit ook wel werkelijk sneller was (wat mij uitzonderlijk moeilijk te testen lijkt) en over de coding style van GObject/C...... Dit laatste is voornamelijk iets persoonlijks, maar daarom niet minder interessant.Hij vond het er verneukt uitzien als een soort "nep-c++", met de vraag waarom je in hemelsnaam c++ namaakt en de code zo lelijk maakt als het veel mooier kan....
Uiteindelijk ging het erom dat hij iets als gstreamer wilde maken (
) maar dan in C++. Ik tien keer uitleggen dat dubbele code niet echt gewenst is maar dat hielp niet zo..... Hij vond die coding style een ramp en wilde het liever zelf doen.
Mijn discussiepunten voor hier: weet iemand, kent iemand een manier om snelheid van GObject/C met C++ te vergelijken? Ik kan wel roepen dat Gnome snel opstart en KDE sloom, maar daar schiet niemand iets mee op, een erg zinnige vergelijking is het niet...... Misschien heeft iemand ooit eens zulke vergelijkingen ergens gelezen? Tweede: wat is je mening over de coding style? Is die echt zo erg?
Hieronder een stukje header file uit een GObject/C iets. Een C-file zelf ziet er ongeveer net zo uit als een normale C-file, de header files zijn eigenlijk het meest "different"..... comments zijn weggelaten omdat de pagina-opbouw anders verneukt werd....
Korte toelichting:
GTK_SCENELIST() is bijvoorbeeld een cast functie voor cast van whatever naar GtkSceneList. Met GTK_WIDGET kun je bijvoorbeeld van whatever naar GtkWidget gaan (een widget is een "tekenobject" parentclass). GtkObject is een "algemeen object" met GTK_OBJECT() als cast-functie. Elk object heeft zo zijn eigen cast. Niet als in c++ automatische (ParentClass) of (ChildClass) casts, dus, maar in principe werkt het hetzelfde......
Voor de rest is het eerste argument van elke functie dus je object, zodat die overal available is. Libraries zijn re-entrant, dus je kan uiteraard multiple instances van een object aanmaken.
Nogal cru eigenlijk. De persoon in kwestie flamede Gnome, Gtk+, gstreamer en alles helemaal af op een ongestructureerd en belachelijk model.......
Voor degenen die linux proggen is gobject misschien wel bekend, voor de overigen: het is de manier die Gtk+ gebruikt om object georienteerde code te schrijven in C. Gnome is bijvoorbeeld 100% C-code. Net als GTK+ en gstreamer. Het model bestaat uit het "slim gebruiken" van structs, gecombineerd met bepaalde cast functies en de mogelijkheid om redelijk simpel objecten te kunnen inheriten (als een soort "parent class"). Een soort van benadering van bepaalde OO-functies vanuit C, dus.
Het exacte idee waarom dit ooit zo is gedaan ken ik niet. Ik ga ervan uit dat dit is gedaan omdat C gewoonweg sneller is dan C++, en C/Gobject is dan dus ook sneller dan C++.
De discussie (voorzover ik een flame een discussie kan noemen) ging voornamelijk om de vraag of dit ook wel werkelijk sneller was (wat mij uitzonderlijk moeilijk te testen lijkt) en over de coding style van GObject/C...... Dit laatste is voornamelijk iets persoonlijks, maar daarom niet minder interessant.Hij vond het er verneukt uitzien als een soort "nep-c++", met de vraag waarom je in hemelsnaam c++ namaakt en de code zo lelijk maakt als het veel mooier kan....
Uiteindelijk ging het erom dat hij iets als gstreamer wilde maken (
Mijn discussiepunten voor hier: weet iemand, kent iemand een manier om snelheid van GObject/C met C++ te vergelijken? Ik kan wel roepen dat Gnome snel opstart en KDE sloom, maar daar schiet niemand iets mee op, een erg zinnige vergelijking is het niet...... Misschien heeft iemand ooit eens zulke vergelijkingen ergens gelezen? Tweede: wat is je mening over de coding style? Is die echt zo erg?
Hieronder een stukje header file uit een GObject/C iets. Een C-file zelf ziet er ongeveer net zo uit als een normale C-file, de header files zijn eigenlijk het meest "different"..... comments zijn weggelaten omdat de pagina-opbouw anders verneukt werd....
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
| /* Scene List widget for Linux Video Studio
* Copyright (C) 2001 - Ronald Bultje
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
* USA.
*/
#ifndef __GTK_SCENELIST_H__
#define __GTK_SCENELIST_H__
#include <gdk/gdk.h>
#include <gtk/gtkwidget.h>
#include <gdk-pixbuf/gdk-pixbuf.h>
#include <glib.h>
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#define GTK_SCENELIST(obj) \
GTK_CHECK_CAST (obj, gtk_scenelist_get_type (), GtkSceneList)
#define GTK_SCENELIST_CLASS(klass) \
GTK_CHECK_CLASS_CAST (klass, gtk_scenelist_get_type (), GtkSceneListClass)
#define GTK_IS_SCENELIST(obj) \
GTK_CHECK_TYPE (obj, gtk_scenelist_get_type ())
typedef enum {
GTK_TRANSITION_BLEND,
GTK_TRANSITION_WIPE_LEFT_TO_RIGHT,
GTK_TRANSITION_WIPE_RIGHT_TO_LEFT,
GTK_TRANSITION_WIPE_TOP_TO_BOTTOM,
GTK_TRANSITION_WIPE_BOTTOM_TO_TOP,
GTK_TRANSITION_OVERLAY_ENLARGE,
GTK_TRANSITION_OVERLAY_ENSMALL
} GtkTransitionType;
typedef enum {
GTK_EFFECT_IMAGE,
GTK_EFFECT_TEXT
} GtkEffectType;
typedef struct _GtkScene GtkScene;
typedef struct _GtkTransition GtkTransition;
typedef struct _GtkEffect GtkEffect;
typedef struct _GtkSceneList GtkSceneList;
typedef struct _GtkSceneListClass GtkSceneListClass;
struct _GtkTransition
{
GtkTransitionType type;
gint length;
/* some blend-transition-only-options */
gint opacity_start;
gint opacity_end;
/* some wipe-transition-only-options */
gint num_rows;
gint reposition_1;
gint reposition_2;
/* some overlay-transition-only-options */
gint poo_x;
gint poo_y;
gint scaling;
};
struct _GtkEffect
{
GtkEffectType type;
gchar name[256];
gint length;
gint offset;
gint opacity;
gint x;
gint y;
gint w;
gint h;
/* some text-overlay-only-options */
gchar *font;
gdouble colors[3];
};
struct _GtkScene
{
gint view_start;
gint view_end;
gint scene_start;
gint scene_end;
gint start_total;
gint movie_num;
GdkPixbuf *image;
GtkEffect *effect;
};
struct _GtkSceneList
{
GtkWidget widget;
GdkPixbuf *background;
GList *items;
gint num_frames;
GList *scene;
GList *transition;
GList *movie;
gchar norm;
gint current_scene;
GtkAdjustment *adj;
gint selected_scene;
};
struct _GtkSceneListClass
{
GtkWidgetClass parent_class;
void (*scene_selected) (GtkWidget *widget,
gint scene_num);
};
/* scenelist widget object */
guint gtk_scenelist_get_type (void);
GtkWidget *gtk_scenelist_new(gchar *editlist);
/* open, save, new editlist handling */
void gtk_scenelist_new_editlist(GtkSceneList *scenelist);
gint gtk_scenelist_open_editlist(GtkSceneList *scenelist, gchar *editlist);
gint gtk_scenelist_write_editlist(GtkSceneList *scenelist, gchar *filename);
/* positioning */
void gtk_scenelist_set_adjustment(GtkSceneList *scenelist, GtkAdjustment *adj);
void gtk_scenelist_view(GtkSceneList *scenelist, gint num);
void gtk_scenelist_select(GtkSceneList *scenelist, gint scene);
void gtk_scenelist_get_num_drawn(GtkSceneList *scenelist,
gint *num, gint *left_border);
/* editing */
void gtk_scenelist_edit_move(GtkSceneList *scenelist,
gint scene, gint direction);
void gtk_scenelist_edit_add(GtkSceneList *scenelist,
char *movie, gint startframe, gint endframe, gint scene);
void gtk_scenelist_edit_delete(GtkSceneList *scenelist,
gint scene);
void gtk_scenelist_edit_split(GtkSceneList *scenelist,
gint scene, gint framenum);
/* get scenes, transitions and such */
GtkScene *gtk_scenelist_get_scene(GtkSceneList *scenelist, gint scene);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __GTK_SCENELIST_H__ */ |
Korte toelichting:
GTK_SCENELIST() is bijvoorbeeld een cast functie voor cast van whatever naar GtkSceneList. Met GTK_WIDGET kun je bijvoorbeeld van whatever naar GtkWidget gaan (een widget is een "tekenobject" parentclass). GtkObject is een "algemeen object" met GTK_OBJECT() als cast-functie. Elk object heeft zo zijn eigen cast. Niet als in c++ automatische (ParentClass) of (ChildClass) casts, dus, maar in principe werkt het hetzelfde......
Voor de rest is het eerste argument van elke functie dus je object, zodat die overal available is. Libraries zijn re-entrant, dus je kan uiteraard multiple instances van een object aanmaken.